{"version":3,"sources":["kendo.web.js"],"names":["f","define","$","window","undefined","Class","compilePart","part","stringPart","split","join","replace","first","charAt","rest","substring","pad","number","digits","end","length","zeros","getShadows","element","shadow","css","kendo","support","transitions","radius","match","boxShadowRegExp","blur","math","max","left","right","bottom","wrap","autosize","percentage","width","height","percentWidth","percentHeight","wrapper","wrapperStyle","browser","outerWidth","_outerWidth","outerHeight","_outerHeight","parent","hasClass","style","is","show","percentRegExp","test","boxSizing","mozBoxSizing","webkitBoxSizing","addClass","msie","floor","version","zoom","children","deepExtend","destination","i","arguments","deepExtendOne","source","property","propValue","propType","propInit","destProp","ObservableArray","data","LazyObservableArray","DataSource","HierarchicalDataSource","OBJECT","constructor","Array","RegExp","Date","getTime","isFunction","clone","UNDEFINED","testRx","agent","rxs","dflt","rx","hasOwnProperty","toHyphens","str","g","toLowerCase","toCamelCase","strMatch","g1","toUpperCase","getComputedStyles","properties","computedStyle","styles","document","defaultView","getComputedStyle","each","idx","value","getPropertyValue","currentStyle","size","isScrollable","className","indexOf","overflow","scrollLeft","isRtl","webkit","mozila","mozilla","el","scrollWidth","clientWidth","Math","abs","obj","key","result","getOffset","type","positioned","offset","sign","top","pointers","msPointers","pageYOffset","documentElement","scrollTop","pageXOffset","parseEffects","input","effects","this","fx","Element","prepareAnimationOptions","options","duration","reverse","complete","STRING","BOOLEAN","extend","init","noop","teardown","hide","completeCallback","animate","instance","queue","promise","toggleClass","classes","add","htmlEncode","ampRegExp","ltRegExp","gtRegExp","quoteRegExp","aposRegExp","parseOption","option","dashRegExp","getAttribute","ns","numberRegExp","parseFloat","jsonRegExp","jsonFormatRegExp","Function","parseOptions","templateRegExp","template","html","containmentComparer","a","b","contains","resizableWidget","widget","inArray","attr","focusable","isTabIndexNotNaN","nodeName","disabled","href","visible","expr","filters","parents","addBack","filter","kendoJQuery","selector","context","fn","Template","preventDefault","isDefaultPrevented","Observable","argumentNameRegExp","encodeRegExp","escapedCurlyRegExp","curlyRegExp","escapedSharpRegExp","sharpRegExp","directions","eventTarget","wrapExpression","localUrlRe","Widget","DataBoundWidget","ContainerNullObject","MobileWidget","MOUSE_EVENTS","EXCLUDE_BUST_CLICK_SELECTOR","MouseEventNormalizer","eventMap","getEventMap","eventRegEx","on","rootjQuery","animationFrame","animationQueue","cultures","isArray","proxy","JSON","formatRegExp","FUNCTION","NUMBER","NULL","getterCache","setterCache","slice","proto","member","base","that","subclass","apply","prototype","Object","_initOptions","_defaultPrevented","_events","bind","eventName","handlers","one","original","handler","events","eventNames","handlersIsFunction","unbind","push","unshift","trigger","e","sender","call","splice","paramName","useWithBlock","render","compile","parts","settings","argumentName","functionBody","_slotCount","Error","format","quote","string","escapable","lastIndex","c","meta","charCodeAt","toString","holder","k","v","partial","mind","gap","toJSON","rep","isFinite","String","indent","\b","\t","\n","\f","\r","\"","\\","valueOf","getUTCFullYear","getUTCMonth","getUTCDate","getUTCHours","getUTCMinutes","getUTCSeconds","Number","Boolean","stringify","replacer","space","","findCulture","culture","numberFormat","getCulture","current","formatDate","date","calendar","calendars","standard","days","months","patterns","dateFormatRegExp","minutes","getDate","namesAbbr","getDay","names","getMonth","getFullYear","getHours","getMinutes","getSeconds","getMilliseconds","AM","PM","getTimezoneOffset","formatNumber","symbol","isCurrency","isPercent","customPrecision","formatAndPrecision","integer","fraction","integerLength","fractionLength","ch","hasGroup","hasNegativeFormat","decimalIndex","sharpIndex","zeroIndex","hasZero","hasSharp","percentIndex","currencyIndex","startZeroIndex","decimal","POINT","precision","decimals","pattern","literals","negative","replacement","EMPTY","start","name","toLocaleString","standardFormatRegExp","exec","currency","percent","toExponential","round","groupInteger","literalRegExp","quoteChar","literal","PLACEHOLDER","SHARP","ZERO","COMMA","commaRegExp","lastIndexOf","EN","objectToString",",",".","groupSize","abbr","namesShort","d","D","F","G","m","M","s","t","T","u","y","Y","/",":","firstDay","twoDigitYearMax","cultureName","newGroupSize","groupSizes","shift","toFixed","min","fmt","values","index","placeholderFormat","parseInt","_extractFormat","_activeElement","activeElement","_round","includeMargin","outOfRange","designatorPredicate","designator","mapDesignators","designators","map","adjustDST","hours","setHours","lowerArray","array","lowerLocalInfo","localInfo","newLocalInfo","parseExact","count","pmHour","UTC","matches","amDesignators","pmDesignators","hoursOffset","minutesOffset","hasTime","lookAhead","getNumber","rg","substr","valueIdx","getIndexByName","lower","nameLength","subValue","matchLength","matchIdx","checkLiteral","year","month","day","seconds","milliseconds","defaultYear","_lowerDays","_lowerMonths","longTimeZoneRegExp","shortTimeZoneRegExp","isNaN","setFullYear","parseMicrosoftFormatOffset","getDefaultFormats","cultureFormats","formatIdx","FORMATS_SEQUENCE","STANDARD_FORMATS","formats","concat","nonBreakingSpaceRegExp","exponentRegExp","dateRegExp","offsetRegExp","2","3","4","parseDate","tzoffset","timezone","convert","percentSymbol","table","docStyle","transforms","elementProto","mobileOS","documentMode","chrome","_scrollbar","scrollbar","refresh","div","createElement","cssText","innerHTML","body","appendChild","offsetWidth","removeChild","closest","tbodyInnerHtml","touch","HTMLElement","hasHW3D","WebKitCSSMatrix","cssFlexbox","lowPrefix","prefix","hasTransitions","event","devicePixelRatio","screenWidth","screen","availWidth","innerWidth","screenHeight","availHeight","innerHeight","detectOS","ua","minorVersion","os","notAndroidPhone","agentRxs","wp","fire","android","iphone","ipad","meego","webos","blackberry","playbook","windows","tizen","sailfish","ffos","osRxs","ios","flat","formFactorRxs","tablet","browserRxs","omini","omobile","firefox","mobilesafari","ie","navigator","device","majorVersion","flatVersion","cordova","PhoneGap","appMode","standalone","location","protocol","userAgent","wpDevicePixelRatio","hasNativeScrolling","delayedClick","mouseAndTouchPresent","detectBrowser","edge","safari","opera","detectClipboardAccess","commands","copy","queryCommandSupported","cut","paste","clipboard","zoomLevel","ie11WidthCorrection","docEl","scrollHeight","clientHeight","cssBorderSpacing","borderSpacing","cssClass","docElement","eventCapture","addEventListener","placeholder","propertyChangeEvent","types","setAttribute","cssFloat","stableSort","threshold","sorted","field","sort","matchesSelector","webkitMatchesSelector","mozMatchesSelector","msMatchesSelector","oMatchesSelector","nodeList","querySelectorAll","parentNode","pushState","history","hashChange","customElements","MSPointerEvent","PointerEvent","kineticScrollNeeded","down","up","in","out","enabled","display","dequeue","disable","promiseShim","enable","animatedPromise","kendoStop","clearQueue","gotoEnd","stop","kendoAnimate","kendoAddClass","kendoRemoveClass","kendoToggleClass","toggle","target","touches","originalEvent","changedTouches","elementFromPoint","clientX","clientY","callback","mousedown","mouseup","mousemove","mousecancel","click","resize","members","widgets","_widgetRegisteredCallbacks","ui","mobile","dataviz","drawing","spreadsheet","messages","keys","INSERT","DELETE","BACKSPACE","TAB","ENTER","ESC","LEFT","UP","RIGHT","DOWN","END","HOME","SPACEBAR","PAGEUP","PAGEDOWN","F2","F10","F12","NUMPAD_PLUS","NUMPAD_MINUS","NUMPAD_DOT","webComponents","isLocalUrl","url","expression","safe","getter","setter","accessor","get","set","guid","random","id","roleSelector","role","directiveSelector","directives","selectors","triggeredByInput","tagName","onWidgetRegistered","len","logToConsole","message","console","suppressLog","log","dataSource","jQuery","angular","_hasBindingTarget","kendoBindingTarget","_tabindex","TABINDEX","tabindex","removeAttr","setOptions","_setEvents","force","getSize","currentSize","_size","_resize","dimensions","setSize","destroy","removeData","_destroy","_muteAngularRebind","_muteRebind","dataItems","flatView","_angularItems","cmd","elements","items","dataItem","domElement","offsetHeight","notify","initWidget","roles","fullPath","widgetKeyRegExp","widgetKey","nodeType","isEmptyObject","rolesFromNamespaces","namespaces","find","widgetsArray","makeArray","widgetInstance","progress","container","leftRight","webkitCorrection","containerScrollLeft","mask","loading","prependTo","remove","plugin","register","widgetEntry","args","method","nullObject","autoApplyNS","kendoDestroy","view","viewElement","viewHasNativeScrolling","useNativeScrolling","eq","appLevelNativeScrolling","application","themes","views","touchScroller","useNative","Scroller","kendoMobileScroller","suites","onResize","setTimeout","unbindResize","off","attrValue","Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","kendoFocusable","setupMouseMute","mouseTrap","bustClick","captureMouse","stopPropagation","muteMouse","clearTimeout","mouseTrapTimeoutID","unMuteMouse","move","cancel","MSPointerEnter","MSPointerLeave","orig","fix","special","delegateType","bindType","handle","ret","related","relatedTarget","handleObj","origType","applyEventMap","pop","search","touchstart","touchend","ruleToDate","rule","targetDay","ourDay","time","cache","getUTCDay","setUTCDate","findRule","utcTime","rules","zone","grep","from","to","findZone","zones","until","zoneRules","zoneAndRule","info","fromOffset","toOffset","fromLocalOffset","toLocalOffset","toLocalDate","Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec","Sun","Mon","Tue","Wed","Thu","Fri","Sat","setDayOfWeek","dir","setDate","dayOfWeek","firstDayOfMonth","lastDayOfMonth","last","timeOffset","moveDateToWeekStart","weekStartDay","addDays","calcWeekInYear","firstWeekInYear","newDate","diffInMS","MS_PER_DAY","weekInYear","prevWeekDate","nextWeekDate","weekNumber","toUtcTime","isInTimeRange","msValue","msMin","msMax","isInDateRange","setTime","ignoreDST","difference","MS_PER_MINUTE","today","isToday","toInvariantTime","staticDate","nextDay","previousDay","MS_PER_HOUR","stripWhitespace","iterator","child","createNodeIterator","NodeFilter","SHOW_TEXT","node","FILTER_ACCEPT","FILTER_REJECT","nextNode","referenceNode","textContent","trim","childNodes","nodeValue","requestAnimationFrame","webkitRequestAnimationFrame","mozRequestAnimationFrame","oRequestAnimationFrame","msRequestAnimationFrame","queueAnimation","runNextAnimation","parseQueryStringParams","queryString","params","paramParts","decodeURIComponent","elementUnderCursor","x","client","wheelDeltaY","jQueryEvent","delta","deltaY","wheelDelta","detail","axis","VERTICAL_AXIS","throttle","delay","timeout","throttled","lastExecTime","elapsed","caret","rangeElement","rangeDuplicated","selectionStart","selectionEnd","isPosition","focus","setSelectionRange","selection","createTextRange","collapse","moveStart","moveEnd","select","duplicate","moveToBookmark","createRange","getBookmark","setEndPoint","text","compileMobileDirective","scope","injector","invoke","$compile","$$phase","$digest","antiForgeryTokens","tokens","csrf_token","csrf_param","cycleForm","form","firstElement","lastElement","keyCode","shiftKey","postToProxy","dataURI","fileName","proxyURL","proxyTarget","action","contentType","base64","appendTo","submit","saveAsBlob","blob","atob","Uint8Array","Blob","buffer","msSaveBlob","saveAsDataURI","URL","createObjectURL","fileSaver","download","createEvent","initMouseEvent","dispatchEvent","revokeObjectURL","downloadAttribute","saveAs","save","forceProxy","proxyModelSetters","observable","forEach","defineProperty","dirty","amd","a1","a2","a3","absoluteURL","path","pathPrefix","regEx","host","hashDelimiter","bang","locationHash","stripRoot","root","fixHash","fixBang","CHANGE","BACK","SAME","CHECK_URL_INTERVAL","BROKEN_BACK_NAV","hashStrip","HistoryAdapter","back","forward","replaceLocation","PushStateAdapter","navigate","title","replaceState","normalize","pathname","change","normalizeCurrent","fixedUrl","hash","hashBang","HashAdapter","_id","_interval","setInterval","clearInterval","History","_started","adapter","createAdapter","historyLength","locations","silent","_navigate","backCalled","decode","_checkUrl","newLength","navigatingInExisting","prev","backButtonPressed","namedParamReplace","optional","routeToRegExp","route","ignoreCase","escapeRegExp","optionalParam","namedParam","splatParam","stripUrl","INIT","ROUTE_MISSING","Route","_callback","queryStringParams","_back","worksWith","Router","routes","_urlChangedProxy","_sameProxy","_backProxy","initEventObject","sameProxy","_same","backProxy","urlChangedProxy","_urlChanged","same","toOdataFilter","useOdataFour","operator","logic","odataFilters","odataFiltersVersionFour","stripMetadata","neq","gt","gte","lt","lte","doesnotcontain","endswith","startswith","isnull","isnotnull","isempty","isnotempty","mappers","pageSize","page","useVersionFour","$filter","orderby","order","$orderby","skip","$skip","take","$top","defaultDataType","read","dataType","schemas","odata","results","total","transports","jsonp","update","create","parameterMap","$inlinecount","$format","odata-v4","$count","isPlainObject","XmlDataReader","idField","xmlParse","model","parse","errors","serialize","modelBase","Model","fields","xpathToMember","modelInstance","evaluate","record","_parse","xml","parseDOM","parsedNode","attribute","attributes","attributeCount","firstChild","nextSibling","intermediateResult","tree","parseXML","raw","readers","eventHandler","_notifyChange","equal","xtype","ytype","getFieldByName","fieldName","Query","normalizeSort","descriptor","descriptors","normalizeOperator","operatorMap","normalizeFilter","compareDescriptor","f1","f2","normalizeDescriptor","fieldComparer","compareFilters","expr1","expr2","filters1","filters2","normalizeAggregate","expressions","normalizeGroup","aggregates","groupValueComparer","calculateAggregate","accumulator","item","state","aggr","functionName","aggregate","functions","isNumber","val","isDate","serializeRecords","getters","originalFieldNames","fieldNames","originalName","setters","convertRecords","convertGroup","hasSubgroups","wrapDataAccess","originalFunction","converter","mergeGroups","dest","group","flattenGroups","itemIndex","at","wrapGroupItems","eachGroupItems","func","replaceInRanges","ranges","replaceInRange","replaceWithObservable","serverGrouping","viewIndex","removeModel","uid","indexOfPristineModel","_defaultId","indexOfModel","comparer","fieldNameFromModel","convertFilterDescriptorsField","convertDescriptorsField","inferSelect","firstField","secondField","optgroup","label","specified","inferTable","fieldIndex","cells","cell","empty","tbody","tBodies","rows","fieldCount","dataMethod","_data","_attachBubbleHandlers","inferList","list","collection","textChild","textField","urlField","spriteCssClassField","imageUrlField","_loaded","prop","hasChildren","ObservableObject","parsers","defaultValues","Comparer","StableComparer","operators","LocalTransport","RemoteTransport","Cache","DataReader","Transport","Node","Buffer","BatchBuffer","ajax","CREATE","READ","UPDATE","DESTROY","SYNC","GET","ERROR","REQUESTSTART","PROGRESS","REQUESTEND","crud","identity","o","wrapAll","json","object","howMany","reduce","reduceRight","every","some","Symbol","_parent","_handlers","shouldSerialize","_set","paths","composite","isSetPrevented","isObservableArray","isDataSource","boolean","default","defaults","_initializers","editable","initiator","accept","isNew","functionFields","nullable","defaultValue","compare","localeCompare","combine","comparers","asc","valueA","valueB","__position","desc","textOp","impl","ignore","op","getMatchRegexp","esc","doesnotstartwith","n","doesnotendwith","doesnotmatch","filterExpr","and","or","fieldFunctions","operatorFunctions","==","equals","isequalto","equalto","!=","ne","notequals","isnotequalto","notequalto","notequal","<","islessthan","lessthan","less","<=","le","islessthanorequalto","lessthanequal",">","isgreaterthan","greaterthan","greater",">=","isgreaterthanorequalto","greaterthanequal","ge","notsubstringof","toArray","range","orderBy","orderByDescending","compiled","predicate","allData","groupBy","currentValue","_sortForGrouping","groupValue","sum","average","process","query","filterCallback","success","setup","error","parameters","operation","_store","clear","store","inmemory","schema","dataFunction","groupsFunction","serializeFunction","serializeGetters","_dataAccessFunction","groups","fromName","_map","_prefetch","_pristineData","_ranges","_view","_pristineTotal","_destroyed","_pageSize","_page","_sort","_filter","_group","_aggregate","_total","_shouldDetachObservableParents","transport","pushCreate","_pushCreate","pushUpdate","_pushUpdate","pushDestroy","_pushDestroy","offlineStorage","_storage","getItem","localStorage","setItem","reader","_detachObservableParents","_observe","_online","serverSorting","serverPaging","serverFiltering","serverAggregates","batch","online","sync","Deferred","resolve","offlineData","_isServerGrouped","_push","_readData","_flatData","getByUid","_storeData","_addRange","_process","_observeView","insert","_createNewModel","_wrapInEmptyGroup","pushInsert","pushed","autoSync","pristine","_updatePristineForModel","_removeItems","destroyed","found","_eachItem","_removePristineForModel","hasGroups","_removeModelFromRanges","_updateRangesLength","created","updated","promises","_sendSubmit","_send","when","then","_accept","_change","cancelChanges","_cancelModel","_markOfflineUpdatesAsDirty","__state__","hasChanges","models","response","serverGroup","_handleCustomErrors","_executeOnPristineForModel","_eachPristineItem","_pristineForModel","_submit","status","reject","deferred","_promise","converted","_params","_queueRequest","isPrevented","_dequeueRequest","_readAggregates","itemIds","_aggregateResult","updatePristine","_skip","timestamp","xhr","errorThrown","_requestInProgress","_pending","_shouldWrap","arrayType","_changeHandler","_updateTotalForAction","_calculateAggregates","_take","_queryProcess","_mergeState","_currentRangeStart","remote","fetch","_query","next","totalPages","_emptyAggregates","ceil","inRange","_findRange","lastRange","firstItemUid","enableRequestsInProgress","_skipRequestsInProgress","_timeStamp","pageSkip","paging","sorting","filtering","_currentRequestTimeStamp","_rangeExists","prefetch","skipIdx","takeIdx","startIndex","endIndex","rangeData","rangeEnd","processed","flatData","_mergeGroups","prevGroup","temp","currentRangeStart","_prefetchSuccessHandler","_timeout","_multiplePrefetch","rangeLength","startOffset","transportOptions","hasChildrenObject","childrenField","childrenOptions","_childrenOptions","_initChildren","_updateChildrenField","append","loaded","level","_childrenLoaded","load","_matchFilter","_hierarchicalFilter","_markHierarchicalQuery","_updateHierarchicalFilter","_find","_dataSource","viewSize","disablePrefetch","_prefetching","_reset","_syncWithDataSource","setViewSize","_recalculate","itemPresent","useRanges","dataOffset","prefetchThreshold","midPageThreshold","nextMidRange","nextPageThreshold","nextFullRange","pullBackThreshold","previousMidRange","previousFullRange","_goToRange","nextRange","syncDataSource","prefetchOffset","expanding","_expanding","_syncPending","_firstItemUid","batchSize","batchBuffer","endreached","prefetching","prefetched","reset","dataSourceBinding","bindingName","Binder","bindings","_dataBinding","dataBinding","_dataBound","dataBound","_itemChange","itemChange","bindElement","_ns","_parents","removedItems","unbindElementTree","all","addedItems","hds","addedDataItems","multiselect","Select","MultiSelect","retrievePrimitiveValues","dataValueField","bindingTargetForRole","WidgetBindingTarget","parseBindings","token","colonIndex","keyValueRegExp","createBindings","binding","childrenCopy","deep","unbindElement","whiteSpaceRegExp","valueField","valueUpdate","valuePrimitive","autoBind","BindingTarget","Binding","TemplateBinding","EventBinding","dom","destroyWidget","bindingTarget","deleteExpando","removeAttribute","destroyWidgets","unbindElementChildren","namespace","TypedBinder","arraySplice","binders","VALUE","SOURCE","EVENTS","CHECKED","CSS","dependencies","_access","dependency","currentSource","parsedValue","_parseValue","removeClass","readonly","dataFormat","invisible","_initChange","cloneNode","reference","insertBefore","checked","selectedIndex","selected","valueIndex","sourceValue","optionIndex","optionValue","check","_valueIsObservableObject","_valueIsObservableArray","_source","valueLength","sourceItem","dataTextField","isObservableObject","cascadeFrom","listView","bound","_preselect","gantt","j","old","removeIndex","newValue","oldValues","newValues","selectedValue","_isBound","scheduler","arr","addLength","oldLength","shifted","shiftedLength","toDestroy","hasValue","hasSource","hasEvents","hasChecked","hasCss","widgetBinding","specificBinders","applyBinding","binder","observableHierarchy","recursiveRead","parseInteger","parseCSS","propertyName","acc","strip3DTransforms","transformProps","transform2d","normalizeCSS","lowerKey","isTransformed","transformation","cssValues","TRANSFORM","animationProperty","transform","computed","NONE","matrix3dRegExp","translateXRegExp","atan2","capitalize","word","createEffect","definition","effectClass","Effect","direction","opt1","opt2","opt3","theDirection","createToggleEffect","defaultStart","defaultEnd","IN_OUT","startValue","_startValue","endValue","_endValue","shouldHide","_shouldHide","prepare","_direction","startDataValue","startDataValueIsSet","_reverse","clipInHalf","vertical","HEIGHT","WIDTH","CLIPS","curProxy","EffectSet","FOUR_DIRECTIONS","TRANSFER_START_STATE","ROTATIONS","RESTORE_OVERFLOW","IGNORE_TRANSITION_EVENT_SELECTOR","Animation","Transition","scaleProperties","scale","scalex","scaley","scale3d","translateProperties","translate","translatex","translatey","translate3d","hasZoom","cssParamsRegExp","oldEffectsRegExp","singleEffectRegExp","unitRegExp","transform2units","rotate","skew","cssPrefix","BLANK","PX","AUTO","HIDDEN","ORIGIN","ABORT_ID","OVERFLOW","TRANSLATE","POSITION","COMPLETE_CALLBACK","TRANSITION","BACKFACE","PERSPECTIVE","DEFAULT_PERSPECTIVE","TRANSFORM_PERSPECTIVE","transition","modifier","horizontal","stopQueue","transformValue","step","elem","now","cur","exclusive","ease","mirror","redirectedEffect","resolved","$1","$2","effect","effectBody","timeoutID","stopTransitionCalled","stopTransition","oldKeys","speeds","merge","unique","taskKeys","retainPosition","restore","run","jdx","childrenLength","effectName","setReverse","addRestoreProperties","restoreCallback","effectSet","parsedEffects","useTransition","multiple","single","position","isFixed","originalPosition","dX","dY","marginLeft","marginTop","_additionalEffects","play","additional","_duration","compositeRun","_complete","divisor","tmp","previous","previousDivisor","slideIn","margin","origin","setLength","realLength","outerBox","box","innerBox","currentScale","fillScale","transformOrigin","_container","rotation","zIndex","_clipInHalf","clip","face","_face","temporary","opacity","reverseDirection","faceClone","backClone","staticPage","turningPage","transformStyle","_before","_after","transitionClass","_previous","_transitionClass","beforeTransition","afterTransition","_both","_element","_containerClass","containerClass","completeProxy","isAbsolute","originalOverflow","both","_tickProxy","_tick","tick","done","onEnd","onCancel","timePassed","startDate","moveTo","movable","initial","_easeProxy","moveAxis","easeOutExpo","pow","easeOutBack","inner","outer","fitScale","parseTransition","transitionRegExp","SCRIPT","SHOW","HIDE","TRANSITION_START","TRANSITION_END","ATTACH","DETACH","sizzleErrorRegExp","View","content","_wrap","_evalTemplate","evalTemplate","_fragments","notInitialized","_createElement","_eachFragment","ViewClone","triggerBeforeShow","triggerBeforeHide","showStart","showEnd","hideEnd","detach","fragments","methodName","getElementById","contents","replaceWith","Layout","containers","_createContainer","showIn","ViewContainer","Fragment","attach","running","after","locationID","previousEntry","theTransition","transitionData","NullNode","TextNode","HtmlNode","insertHtml","HTML_CONTAINER","attrs","Tree","NULL_NODE","cached","cachedChildren","cachedLength","replaceChild","syncAttributes","removeAttributes","cachedAttr","cachedValue","setStyle","removeStyle","cachedStyle","createTextNode","nodes","lastChild","numChar","colIndex","letter","fromCharCode","ref","rowIndex","$ref","filterRowIndex","frozenRows","freezePane","rowSplit","toWidth","px","toHeight","stripFunnyChars","convertColor","color","$0","borderStyle","alias","borderSideTemplate","borderTemplate","border","inflate","mergedCells","ctx","rowData","rowsByIndex","indexRows","row","sortByIndex","fillCells","pushUnique","getSpan","topLeft","bottomRight","parseRef","rowSpan","colSpan","col","getcol","getrow","cellIndex","topLeftRef","ri","nextRow","cellData","EMPTY_CELL","insertCell","spanCell","insertCellAt","appendCell","borderTop","borderRight","borderBottom","borderLeft","spreadsheetFilters","SPREADSHEET_FILTERS","columns","generators","custom","SPREADSHEET_CUSTOM_FILTER","dynamic","SPREADSHEET_DYNAMIC_FILTER","SPREADSHEET_TOP_FILTER","SPREADSHEET_VALUE_FILTER","RELS","CORE","APP","CONTENT_TYPES","WORKBOOK","WORKSHEET","WORKBOOK_RELS","WORKSHEET_RELS","SHARED_STRINGS","STYLES","DATE_EPOCH","Worksheet","sharedStrings","borders","_strings","_styles","_borders","_validations","relsToXML","hyperlinks","toXML","autoFilter","validations","defaultCellStyleId","mergeCells","_readCells","defaultCellStyle","_lookupStyle","frozenColumns","colSplit","showGridLines","_lookupString","indexes","uniqueCount","_lookupBorder","_cell","defStyle","column","displayValue","cellName","borderId","autoWidth","validation","_addValidation","formula","showErrorMessage","formula1","formula2","MAP_EXCEL_TYPE","MAP_EXCEL_OPERATOR","comparerType","allowBlank","allowNulls","showDropDown","showButton","messageTemplate","errorTitle","titleTemplate","sqref","greaterThanOrEqualTo","lessThanOrEqualTo","defaultFormats","General","0","0.00","#,##0","#,##0.00","0%","0.00%","0.00E+00","# ?/?","# ??/??","mm-dd-yy","d-mmm-yy","d-mmm","mmm-yy","h:mm AM/PM","h:mm:ss AM/PM","h:mm","h:mm:ss","m/d/yy h:mm","#,##0 ;(#,##0)","#,##0 ;[Red](#,##0)","#,##0.00;(#,##0.00)","#,##0.00;[Red](#,##0.00)","mm:ss","[h]:mm:ss","mmss.0","##0.0E+0","@","[$-404]e/m/d","m/d/yy","t0","t0.00","t#,##0","t#,##0.00","t0%","t0.00%","t# ?/?","t# ??/??","Workbook","_sheets","sheets","toDataURL","zip","docProps","sheetCount","rels","xl","xlRels","sheetIds","worksheets","sheetRels","sheet","sheetName","relsXml","hasFont","fonts","fills","JSZip","folder","file","creator","lastModifiedBy","modified","filterNames","localSheetId","userNames","def","localName","hidden","parseJSON","underline","bold","italic","fontFamily","fontSize","background","fontId","fillId","textAlign","verticalAlign","numFmtId","generate","compression","customOperator","customValue","dynamicFilterType","quarter1","quarter2","quarter3","quarter4","january","february","march","april","may","june","july","august","september","october","november","december","ooxml","ExcelExporter","_trimColumns","allColumns","_leafColumns","_prepareColumn","allPages","workbook","_columns","_rows","_freezePane","groupHeaderTemplate","groupFooterTemplate","footerTemplate","filterable","depth","_depth","_dataRow","li","dataCells","ci","_hierarchical","_dataRows","_footer","footer","groupData","_isColumnVisible","_visibleColumns","_headerRow","headers","_prependHeaderRows","headerRows","_prepareHeaderRows","parentCell","parentRow","childRow","totalColSpan","_headerDepth","locked","hierarchy","ExcelMixin","excel","saveAsExcel","exporter","book","hub","signalr","fail","callbacks","_crud","server","createPromise","promiseAll","util","hex","hue2rgb","p","q","parseColor","BaseColor","namedColorRegexp","RGB","namedColors","Bytes","HSV","HSL","Color","aliceblue","antiquewhite","aqua","aquamarine","azure","beige","bisque","black","blanchedalmond","blue","blueviolet","brown","burlywood","cadetblue","chartreuse","chocolate","coral","cornflowerblue","cornsilk","crimson","cyan","darkblue","darkcyan","darkgoldenrod","darkgray","darkgrey","darkgreen","darkkhaki","darkmagenta","darkolivegreen","darkorange","darkorchid","darkred","darksalmon","darkseagreen","darkslateblue","darkslategray","darkslategrey","darkturquoise","darkviolet","deeppink","deepskyblue","dimgray","dimgrey","dodgerblue","firebrick","floralwhite","forestgreen","fuchsia","gainsboro","ghostwhite","gold","goldenrod","gray","grey","green","greenyellow","honeydew","hotpink","indianred","indigo","ivory","khaki","lavender","lavenderblush","lawngreen","lemonchiffon","lightblue","lightcoral","lightcyan","lightgoldenrodyellow","lightgray","lightgrey","lightgreen","lightpink","lightsalmon","lightseagreen","lightskyblue","lightslategray","lightslategrey","lightsteelblue","lightyellow","lime","limegreen","linen","magenta","maroon","mediumaquamarine","mediumblue","mediumorchid","mediumpurple","mediumseagreen","mediumslateblue","mediumspringgreen","mediumturquoise","mediumvioletred","midnightblue","mintcream","mistyrose","moccasin","navajowhite","navy","oldlace","olive","olivedrab","orange","orangered","orchid","palegoldenrod","palegreen","paleturquoise","palevioletred","papayawhip","peachpuff","peru","pink","plum","powderblue","purple","red","rosybrown","royalblue","saddlebrown","salmon","sandybrown","seagreen","seashell","sienna","silver","skyblue","slateblue","slategray","slategrey","snow","springgreen","steelblue","tan","teal","thistle","tomato","turquoise","violet","wheat","white","whitesmoke","yellow","yellowgreen","toHSV","toRGB","toHex","toBytes","toCss","toCssRgba","rgb","r","toDisplay","diff","other","c1","c2","NaN","sqrt","h","toHSL","l","resolvedColor","formatRegex","processor","channels","this$1","resolveColor","re","normalizeByte","padDigit","brightness","percBrightness","fromBytes","fromRGB","fromHSV","fromHSL","objectKey","hashKey","zeroSize","baseline","measureText","measureBox","TextMetrics","measure","LRUCache","DEFAULT_OPTIONS","defaultMeasureBox","_length","put","entry","_head","_tail","newer","older","baselineMarkerSize","_cache","styleKey","cacheKey","cachedResult","baselineMarker","_baselineMarker","offsetTop","marker","second","arabicToRoman","roman","defined","definitionId","defId","deg","radians","DEG_TO_RAD","encodeUTF8","output","encodeBase64","chr1","chr2","chr3","enc1","enc2","enc3","enc4","utfInput","KEY_STR","eventCoordinates","pageX","pageY","eventElement","initialTouch","isTransparent","limitValue","mergeSort","cmp","ai","bi","rad","degrees","power","valueOrDefault","bindEvents","elementOffset","getBoundingClientRect","clientTop","clientLeft","elementStyles","stylesArray","getPixels","elementSize","size$1","unbindEvents","removeEventListener","setAccessor","geometryChange","getAccessor","defineAccessors","capitalized","toMatrix","matrix","Transformation","ellipseExtremeAngles","center","ry","extremeX","extremeY","geometryAccessor","_observerField","defineGeometryAccessors","close","tolerance","PRECISION","closeOrLess","lineIntersection","p0","p1","p2","p3","s1x","s2x","s1y","s2y","nx","ny","Point","calculateAngle","cx","cy","cos","sin","normalizeArcParameters","cosine","sine","xT","yT","xt2","yt2","rx2","ry2","constT","cxT","cyT","uX","uY","vX","vY","startAngle","angleCosine","angle","endAngle","signEndAngle","x1","y1","x2","y2","largeArc","swipe","acos","radiusX","radiusY","xRotation","bboxStartAngle","pointAccessor","definePointAccessors","isOutOfEndPoint","endPoint","controlPoint","point","rotatedPoint","transformCopy","calculateCurveAt","points","t1","toCubicPolynomial","numberSign","solveQuadraticEquation","squareRoot","solveCubicEquation","Q","b3a","y3","z1","z2","ComplexNumber","nthRoot","multiplyConstant","negate","multiply","isReal","real","hasRootsInRange","rootField","intersection","polynomial","roots","curveIntersectionsCount","bbox","rayIntersection","intersectsRay","lineIntersectionsCount","intersects","minX","maxX","minY","maxY","arrayLimits","MAX_NUM","MIN_NUM","elementsBoundingBox","applyTransform","boundingBox","elementBoundingBox","rawBBox","Rect","union","elementsClippedBoundingBox","clippedBBox","translateToPoint","transofrm","alignStart","rect","align","sizeField","alignElements","alignment","vAlign","stackElements","stackAxis","otherAxis","previousBBox","createStackElements","stack","vStack","getStacks","maxSize","stacks","stackSize","addElementToStack","wrapElements","startElement","elementIdx","vWrap","fit","rectSize","transform$$1","optionsAccessor","defineOptionsAccessors","swing","PI","linear","easeOutElastic","asin","toLineParamaters","isVertical","insertPosition","reflectionPoint","scaleCopy","quadraticToCubicControlPoints","scaledPoint","controlOut","translateWith","third","controlIn","parseParameters","SPLIT_REGEX","renderAttr","renderAllAttr","renderStyle","isDefinition","baseUrl","getElementsByTagName","hashIndex","refUrl","skipBaseHref","alignToScreen","ctm","getScreenCTM","decodeEntities","innerText","exportGroup","exportRoot","svg","RootNode","rootGroup","getOrigin","Group","SVG_NS","renderPath","segment","anchor","prevSeg","prevOut","segments","bezierCurveTo","lineTo","closed","closePath","zIndexComparer","_zIndex","addGradientStops","gradient","stops","addColorStop","exportImage","surfaceOptions","surface","cors","Surface$3","suspendTracking","draw","image","exportSVG","slice$1","thing","cls","classList","setCSS","getXY","drawDOM","doOne","pos","setTransform","nodeInfo","_clipbox","_matrix","Matrix","unit","_stackingContext","_avoidLinks","avoidLinks","renderElement","makeTemplate","template$$1","firstElementChild","handlePageBreaks","forceBreak","pageWidth","pageHeight","doPageBreak","whenImagesAreActuallyLoaded","pages","splitElement","makePage","pageNum","cacheImages","keepTogether","adjust","tag","bottomPadding","bottomBorder","saveAdjust","isFirst","fall","tableLayout","breakAtElement","fallsOnMargin","splitText","firstInParent","colgroup","thead","grid","gridHead","querySelector","repeatHeaders","doc","setStartBefore","setEndBefore","extractContents","preventBulletOnListItem","padding","pageClassName","available","nextnode","selectNodeContents","findEOP","setEnd","endOffset","ownerDocument","_destructive","cloneNodes","tfoot","ol","paddingLeft","paddingRight","beforePageBreak","pdf","defineFont","getFontFaces","forcePageBreak","hasPaperSize","paperSize","paperOptions","getPaperOptions","hasMargin","multiPage","_ignoreMargin","canceled","doStylesheet","ss","cssRules","ex","addRules","findFonts","font","src","splitProperty","getFontURL","styleSheet","family","addRule","styleSheets","getCounter","getAllCounters","getPrototypeOf","incCounter","inc","_root","resetCounter","doCounters","updateCounters","counterIncrement","counterReset","parseColor$1","pending","img","images","onload","onerror","IMAGE_CACHE","urls","dive","parseBackgroundImage","bg","Image","crossOrigin","alphaNumeral","pushNodeInfo","decoration","createsStackingContext","popNodeInfo","updateClipbox","intersect","emptyClipbox","cb","pseudoElt","defa","pleaseSetPropertyValue","important","setProperty","getBorder","side","saveStyle","getBorderRadius","sanitizeRadius","getContentBox","wt","wr","wb","wl","getTransform","radiansToDegrees","parseAngle","num","shape","setClipping","clipPath","addArcToPath","Arc$2","curvePoints","curveTo","adjustBorderRadiusForBox","rTL","rTR","rBR","rBL","tl_x","tl_y","tr_x","tr_y","br_x","br_y","bl_x","bl_y","tl","tr","br","bl","elementRoundBox","bt","bb","pt","pr","pb","pl","roundBox","rTL0","rTR0","rBR0","rBL0","Path","fill","stroke","formatCounter","evalPseudoElementContent","displayCounter","separator","getCssText","_renderWithPseudoElements","pseudo","kind","place","psel","KENDO_PSEUDO_ELEMENT","fake","saveClass","_renderElement","adjustBoxes","boxes","tableBorderLeft","tableBorderTop","tableBox","firstCell","firstCellBox","drawEdge","Wtop","Wleft","Wright","rl","rr","drawRoundCorner","anticlockwise","drawBackground","_pdfLink","backgroundColor","backgroundImage","drawOneBackground","backgroundRepeat","backgroundPosition","backgroundOrigin","backgroundSize","drawBackgroundImage","img_width","img_height","renderBG","rewX","rewY","repeatX","aspect_ratio","orgBox","Image$1","gradientRenderer","drawBullet","_drawBullet","bullet","listStylePosition","elementIndex","listStyleType","lineHeight","disc","circle","square","drawOneBox","isLast","inv","shouldDrawLeft","shouldDrawRight","innerbox","getClientRects","clipit","isFormField","maybeRenderWidget","renderContents","pxlen","scaledAngle","implicit","atan","fromRect","LinearGradient","userSpace","visual","wrap$$1","exportDOMVisual","exportVisual","renderImage","zIndexSort","sa","sb","za","zb","pa","getSelectedOption","selectedOptions","renderCheckbox","Circle","Circle$2","renderFormField","whiteSpace","floats","floating","renderText","actuallyGetRangeBoundingRect","rectangles","Infinity","prevLineBottom","doChunk","cc","code","origStart","setStart","isJustified","columnCount","findEOL","eol","estimateLineLength","drawText","getFontHeight","TextRect","decorate","line","ypos","lineThrough","overline","align$$1","textOverflow","saveTextOverflow","hasDecoration","selectNode","groupInStackingContext","main","_dom_zIndex","invert","visibility","mmul","multiplyCopy","b1","d1","e1","b2","d2","e2","kendoDrawing","kendoDrawingUtil","kendoUtil","ObserversMixin","OptionsStore","Size","Element$1","PI_DIV_2","GRADIENT","Paintable","IDENTITY_MATRIX_HASH","Measurable","DEFAULT_STROKE","MAX_INTERVAL","pow$1","ElementsArray","GeometryElementsArray","Segment","DEFAULT_STROKE$1","Arc","MultiPath","DEFAULT_FONT","DEFAULT_FILL","Text","Traversable","Rect$2","StopsArray","GradientStop","Gradient","RadialGradient","easingFunctions","AnimationFactory","ShapeMap","SEGMENT_REGEX","MOVE","CLOSE","PathParser","SurfaceFactory","Surface","BaseNode","NODE_MAP","renderSVG","testFragment","testContainer","hasParser","renderSVG$1","DefinitionMap","GradientStopNode","GradientNode","LinearGradientNode","RadialGradientNode","ClipNode","DefinitionNode","RTL","Surface$1","GroupNode","DASH_ARRAYS","SOLID","BUTT","ATTRIBUTE_MAP","SPACE","PathNode","ArcNode","CircleNode","RectNode","ImageNode","MultiPathNode","geometry","NODE_MAP$2","Node$2","GroupNode$2","FRAME_DELAY","RootNode$2","QuadRoot","QuadNode","ROOT_SIZE","LEVEL_STEP","MAX_LEVEL","ShapesQuadTree","SurfaceCursor","PathNode$2","ArcNode$2","CircleNode$2","RectNode$2","ImageNode$2","TextNode$2","MultiPathNode$2","canvas","observers","_observers","addObserver","removeObserver","observer","_suspended","optionsChange","suspend","resume","1","10","100","20","200","30","300","40","400","5","50","500","6","60","600","7","70","700","8","80","800","9","90","900","1000","MAX_VALUE","parentObj","_clear","wrapped","det","scaleX","scaleY","IDENTITY","originPoint","distanceTo","dx","dy","doRound","arg0","arg1","arguments$1","minPoint","maxPoint","defineProperties","setOrigin","topRight","bottomLeft","fromPoints","expand","expandCopy","containsPoint","_isOnPath","rectOuter","rectInner","rect1","rect2","_optionsChange","parentTransform","parentMatrix","currentTransform","elementTransform","elementMatrix","combinedMatrix","_clippedBBox","transformedPoint","_hasFill","_containsPoint","_hasStroke","setCenter","setRadius","getCenter","pointAt","_pointAt","currentPointX","currentPointY","currentPoint","extremeAngles","inCircle","pointDistance","newFill","strokeWidth","matrixHash","_bboxCache","_matrixHash","_bbox","_geometry","radian","nextAngle","interval","_arcInterval","intervalAngle","subIntervalsCount","subIntervalAngle","currentAngle","_intervalCurvePoints","cp1","cp2","currentAngleX","currentAngleY","oldStart","p1Derivative","_derivativeAt","p2Derivative","inAngleRange","distance","angleRad","pointRadius","startPoint","arcParameters","_splice","_add","_remove","_clearObserver","_setObserver","cNumber","addConstant","rad$$1","nthR","bboxTo","toSegment","segmentAnchor","toSegmentAnchor","_curveBoundingBox","_lineBoundingBox","extremesX","_curveExtremesFor","extremesY","xLimits","yLimits","extremes","_curveExtremes","x3","x4","t2","_intersectionsTo","intersectionsCount","_isOnCurveTo","endSegment","p4","rotatedPoints","_isOnLineTo","_isOnPathTo","isOnPath","lineJoin","lastSegment","arc","_addArcSegments","arcTo","pathWidth","segmentBox","fromArc","toPath","metrics","_rect","traverse","childrenChange","_reparent","insertAt","removeAt","newParent","alignContent","justifyContent","alignItems","spacing","orientation","lineSpacing","_fieldMap","_initMap","fieldMap","groupsSizeField","groupAxis","groupsAxis","reflow","groupsSize","ref$1","groupOrigin","elementOrigin","groupStart","elementStart","groupBox","groupIdx","scaledStart","scaledSize","newStart","_initGroups","lineSize","bboxes","_newGroup","addGroup","_addToGroup","arg","_createStops","_userSpace","addStop","removeStop","_radius","_fallbackFill","fallbackFill","easing","finish","abort","loop","wallTime","easingPosition","_stopped","_items","isRelative","lastControlIn","previousCommand","cubicControlPoints","multiPath","command","preferred","_click","_handler","_mouseenter","_mouseleave","_mousemove","_visual","_enableTracking","domNode","_kendoNode","parentElement","srcElement","_suspendedTracking","resumeTracking","_elementOffset","paddingTop","_surfacePoint","coord","observe","removeSelf","invalidate","DOMParser","namespaceURI","parser","chartDoc","parseFromString","importedDoc","adoptNode","definitions","clearDefinitions","childNode","createDefinitions","attachTo","setElement","childElement","renderChildren","updateDefinition","allAttr","allCss","mapTransform","renderTransform","transformChange","mapStyle","cursor","renderOpacity","hasDefinitions","definitionChange","renderDefinitions","mapDefinitions","renderOffset","loadStops","stopNode","mapCoordinates","renderCoordinates","mapSpace","definitionMap","addDefinitions","removeDefinitions","createDefinition","addDefinition","mapItem","removeDefinition","defs","rtl","_template","_rootElement","mouseover","mouseout","viewBox","_offset","implementation","hasFeature","dot","dash","longdash","dashdot","longdashdot","longdashdotdot","fill.opacity","stroke.color","stroke.width","stroke.opacity","renderData","mapFill","mapStroke","printPath","currentType","segmentType","printPoints","segmentStart","segmentEnd","renderLinecap","dashType","renderDashType","renderStroke","dashArray","lineCap","renderFill","mapPosition","mapSource","renderPosition","encode","renderSource","setY","renderContent","renderTextAnchor","initClip","clearClip","setClip","beginPath","loadElements","setOpacity","globalAlpha","opactity","renderTo","getContext","invalidateHandler","_invalidate","clearRect","shapes","_quadNode","pointShapes","inBounds","nodeRect","nodeBottomRight","inserted","halfWidth","halfHeight","initRoots","rootMap","rootElements","pointShape","sectorRoot","assignZindex","levelWeight","bboxChange","_insertShape","elementsArray","_insert","sectors","getSectors","inRoot","bottomX","bottomY","_resetCursor","_shapeCursor","_current","_defaultCursor","_getCursor","_setCursor","_mouseTrackHandler","_trackMouse","_searchTree","_cursor","resolveDataURL","rootElement","loadingStates","currentShape","_currentShape","renderPoints","setLineDash","setLineCap","setLineJoin","setFill","setStroke","hasFill","setGradientFill","fillStyle","createLinearGradient","createRadialGradient","strokeStyle","lineWidth","mozDash","webkitLineDash","onLoad","onError","drawImage","fillText","strokeText","_pdfRect","$el","$clone","canvases","canvas$$1","skip_ws","tok_whitespace","read_stop","tok_length","tok_percent","read_linear_gradient","propName","to1","to2","tok_popen","tok_angle","tok_comma","tok_keyword","tok_pclose","read_url","tok_content","tok","cache1","tok_linear_gradient","tok_url","cache2","looking_at","last$$1","in_paren","in_string","tabKeyTrapNS","focusableNodesSelector","TabKeyTrap","OPEN","DEACTIVATE","ACTIVATE","CENTER","TOP","BOTTOM","ABSOLUTE","BODY","LOCATION","VISIBLE","EFFECTS","ACTIVE","ACTIVEBORDER","ACTIVEBORDERREGEXP","ACTIVECHILDREN","MOUSEDOWN","DOCUMENT_ELEMENT","WINDOW","SCROLL","NS","Popup","parentPopup","collisions","collision","downEvent","_hovered","animation","open","_activated","_trigger","_animationClose","_mousedownProxy","_mousedown","_resizeProxy","toggleTarget","toggleEvent","viewport","copyAnchorStyles","modal","adjustSize","_hideDirClass","_closing","_toggleResize","fixed","flipped","_position","_openAnimation","_showDirClass","_location","dirClass","skipEffects","openEffects","closeEffects","popup","ev","_resizeTimeout","_scrollableParents","_fit","viewPortSize","_flip","anchorSize","boxSize","parentsUntil","siblingContainer","parentZIndex","viewportOffset","viewportWidth","viewportHeight","anchorParent","offsets","flipPos","elementHeight","wrapperHeight","isWindow","origins","positions","siblings","_align","offsetParent","appendToOffset","verticalOrigin","horizontalOrigin","verticalPosition","horizontalPosition","anchorOffset","anchorWidth","anchorHeight","trap","_keepInTrap","removeTrap","shouldTrap","focusableItems","focusableItemsCount","focusedItemIndex","which","prevEl","nextEl","tabIndex","utils","TOOLTIP_TEMPLATE","TOOLTIP_CLOSE_TEMPLATE","SurfaceTooltip","_tooltipOptions","popupOptions","_openPopupHandler","_openPopup","_bindEvents","showOn","autoHide","hideDelay","showAfter","_showHandler","_showEvent","_surfaceLeaveHandler","_surfaceLeave","_mouseleaveHandler","_mousemoveHandler","_hideClick","getPopup","shared","_tooltipShape","tooltip","_updateContent","tooltipOffset","_instance","surfaceOffset","_show","_showTimeout","_autoHide","_measure","_closeButton","_popupRelatedTarget","DrawingSurface","_triggerInstanceHandler","_triggerInstanceEvent","_bindHandler","hideTooltip","_tooltip","showTooltip","resolveRules","resolvers","validator","ruleResolvers","numberOfDecimalDigits","parseHtml","parseHTML","searchForMessageContainer","invalidMsgRegExp","Validator","INVALIDMSG","INVALIDINPUT","VALIDINPUT","emailRegExp","urlRegExp","INPUTSELECTOR","CHECKBOXSELECTOR","NUMBERINPUTSELECTOR","BLUR","NAME","FORM","NOVALIDATE","VALIDATE","VALIDATE_INPUT","patternMatcher","matcher","hasAttribute","validateAttributeSelector","_errorTemplate","errorTemplate","_inputSelector","_checkboxSelector","_errors","_attachEvents","_isValidated","required","email","dateCompare","checkbox","raise","validateOnBlur","validate","stopImmediatePropagation","_checkElement","validateInput","inputs","invalid","isValid","valid","lbl","messageText","wasValid","messageLabel","lblId","_checkValidity","_findMessageContainer","_extractMessage","_decorateMessageContainer","insertAfter","hideMessages","locators","messageLocators","locate","ruleKey","customMessage","touchDelta","touch1","touch2","getTouches","currentTarget","api","identifier","pointerId","withEachUpEvent","downEvents","OS","invalidZeroEvents","DEFAULT_MIN_HOLD","DEFAULT_THRESHOLD","PRESS","HOLD","SELECT","START","CANCEL","TAP","RELEASE","GESTURESTART","GESTURECHANGE","GESTUREEND","GESTURETAP","THRESHOLD","mouse","pointer","ENABLE_GLOBAL_SURFACE","TouchAxis","_updateLocationData","startLocation","velocity","timeStamp","timeDelta","initialDelta","Touch","userEvents","touchInfo","useClickAsTap","pressEvent","_moved","_finished","press","_holdTimeout","minHold","_hold","_withinIgnoreThreshold","UserEvents","dispose","_start","endTime","activeTouches","isMoved","startTime","xDelta","yDelta","surfaceElement","preventIfMovingProxy","_maxTouches","multiTouch","allowSelection","captureUpIfMoved","fastTap","eventNS","global","pressed","touchAction","preventDragEvent","preventIfMoving","_isMoved","_disposeAll","capture","_isMultiTouch","_apiCall","_maxTouchesReached","_select","_move","_eachTouch","_end","matchingTouch","dict","defaultThreshold","numericCssPropery","within","containerBoundaries","checkTarget","targets","areas","theTarget","theFilter","targetLen","areaLen","targetElement","destroyDroppable","groupName","droppables","scrollableViewPort","scrollableRoot","$window","findScrollableParent","autoScrollVelocity","mouseX","mouseY","AUTO_SCROLL_AREA","lastDropTarget","Movable","DropTarget","DropTargetArea","Draggable","draggables","dropTargets","dropAreas","KEYUP","DRAGSTART","DRAG","DRAGEND","DRAGCANCEL","HINTDESTROYED","DRAGENTER","DRAGLEAVE","DROP","TapCapture","_press","_release","attachEvent","captureNext","cancelCapture","PaneDimension","forcedEnabled","scrollSize","makeVirtual","virtual","_virtualMin","_virtualMax","virtualSize","outOfBounds","forceEnabled","getTotal","rescale","scaledTotal","minScale","centerOffset","PaneDimensions","forcedMinScale","maxScale","newScale","centerCoordinates","PaneAxis","dimension","dragMove","resistance","translateAxis","Pane","elastic","gesturestart","gesture","gesturechange","coordinates","offsetX","offsetY","previousGesture","previousCenter","scaleDelta","scaleWith","TRANSFORM_STYLE","webkitTransformOrigin","_saveCoordinates","by","scaleTo","newCoordinates","draggable","dropTarget","_over","_out","_drop","dropped","destroyGroup","hold","_drag","_cancel","_afterEndHandler","_afterEnd","_captureEscape","cursorOffset","holdToDrag","autoScroll","cancelHold","_updateHint","boundaries","hintOffset","hint","_shouldIgnoreTarget","ignoreSelector","currentTargetOffset","scopeTarget","scopeFrom","cursorElement","_elementUnderCursor","_cursorElement","_scrollableParent","_lastEvent","_processMovement","_scrollCompenstation","_scrollVelocity","_scrollInterval","_withDropTarget","_autoScroll","yIsScrollable","xIsScrollable","isRootNode","yInBounds","xInBounds","compensation","initialTarget","SNAPBACK_DURATION","SCROLLBAR_OPACITY","FRICTION","VELOCITY_MULTIPLIER","MAX_VELOCITY","OUT_OF_BOUNDS_FRICTION","ANIMATED_SCROLLER_PRECISION","RELEASECLASS","REFRESHCLASS","PULL","RESIZE","MOUSE_WHEEL_ID","ZoomSnapBack","tapCapture","DragInertia","freeze","_moveTo","paneAxis","_snapBack","velocityMultiplier","friction","snapBack","AnimatedScroller","_updateCoordinates","setCoordinates","setCallback","ScrollBar","scrollMovable","alwaysVisible","paneSize","sizeRatio","avoidScrolling","pane","zoomSnapBack","animatedScroller","_native","prepend","scrollElement","fixedContainer","wrapInner","velocityX","velocityY","horizontalSwipe","originatedFromFixedContainer","verticalSwipe","scrollTo","mousewheelScrolling","pulled","_initAxis","_wheelEnd","_wheel","_wheelY","pullToRefresh","_initPullToRefresh","_wheelScroll","_wheelTimeout","pullOffset","visibleScrollHints","pullTemplate","releaseTemplate","refreshTemplate","contentResized","_scale","zoomOut","animatedScrollTo","pullHandled","refreshHint","hintContainer","yinertia","xinertia","_paneChange","_dragEnd","scrollBar","dropCueOffsetTop","indicatorTmpl","paddingBottom","dropCue","Groupable","horizontalCuePosition","intializePositions","_intializePositions","dropCuePositions","_dropCuePositions","draggableElements","groupContainer","kendoDropTarget","dragenter","_canDrag","dragleave","drop","sourceIndicator","indicator","lastCuePosition","_dropCuePosition","_canDrop","before","buildIndicator","kendoDraggable","dragcancel","_dragCancel","dragstart","elementPosition","dragend","drag","_removeIndicator","newIndicator","marginRight","allowDrag","_refreshHandler","_invalidateGroupContainer","indicators","toggleHintClass","denied","KREORDERABLE","Reorderable","reorderDropCue","_draggable","_dropTargetAllowed","_isLastDraggable","inSameContainer","sourceIndex","_index","targetIndex","_dropTarget","oldIndex","newIndex","_elements","dropStartOffset","dragOverContainers","HORIZONTAL","VERTICAL","RESIZEEND","Resizable","_positionMouse","_sizingDom","draggableElement","_stop","_max","hintSize","_initialElementPosition","_min","_initialMousePosition","_maxPosition","_minPosition","maxPosition","minPosition","currentPosition","invalidClass","resizing","targetPosition","containsOrEqualTo","defaultHint","defaultPlaceholder","BEFORE_MOVE","ACTION_SORT","ACTION_REMOVE","ACTION_RECEIVE","DEFAULT_FILTER","MISSING_INDEX","Sortable","_createDraggable","connectWith","moveOnDragEnter","_dragstart","_dragcancel","_dragend","draggedElement","_placeholder","draggableEvent","targetCenter","offsetDelta","sibling","getSibling","_findTarget","axisDelta","eventData","_movementByAxis","_getElementCenter","appendToBottom","_movePlaceholder","appendAfterHidden","_isFloating","connectedList","connectedListEventData","draggedIndex","placeholderIndex","getKendoSortable","_findElementUnderCursor","has","sortable","_isEmpty","_isLastHidden","_searchConnectedTargets","sortableInstance","connected","_isCursorAfterLast","lastItemOffset","lastItem","cursorPosition","_originalCursorType","_cursorStylesheet","not","Selectable","ARIASELECTED","SELECTED","SELECTABLE","UNSELECTING","supportEventDelegation","_marquee","_lastActive","aria","tap","_tap","_isElement","ctrlKey","metaKey","whichCode","buttonCode","button","_allowSelection","selectRange","_firstSelectee","_unselect","_notify","_downTarget","currentElement","useAllItems","_selectElement","_invalidateSelectables","toSelect","selectElement","preventNotify","resetTouchEvents","continuousItems","selectable","asLowerString","CLICK","KBUTTON","KBUTTONICON","KBUTTONICONTEXT","DISABLED","DISABLEDSTATE","FOCUSEDSTATE","SELECTEDSTATE","Button","_graphics","_focus","_blur","_keydown","_keyup","icon","spriteCssClass","imageUrl","_isNativeButton","span","isEmpty","err","numeric","wrapClassName","iconTemplate","FIRST","PREV","NEXT","LAST","KEYDOWN","Pager","pageSizes","pageItems","linkTemplate","selectTemplate","currentPageTemplate","previousNext","of","itemsPerPage","DropDownList","kendoDropDownList","_refreshClick","_toggleActive","buttonCount","morePages","setDataSource","reminder","hasAll","selectAll","_hideList","KNOTIFICATION","KICLOSE","KHIDING","INFO","SUCCESS","WARNING","WRAPPER","TEMPLATE","SAFE_TEMPLATE","Notification","_compileTemplates","templates","_guid","_isRtl","_compileStacking","stacking","pinned","hideOnClick","allowHideAfter","autoHideAfter","kendoTemplate","_compiled","templateId","_defaultCompiled","_safeCompiled","_getCompiled","defaultCompiled","paddings","horizontalAlignment","_popupOrigin","_popupPosition","_popupPaddings","_attachPopupEvents","attachClick","_hidePopup","closeIcon","attachDelay","_showPopup","openPopup","_triggerHide","deactivate","_togglePin","pin","win","_attachStaticEvents","_hideStatic","_showStatic","insertionMethod","defaultArgs","typeIcon","showText","warning","openedNotifications","getNotifications","guidElements","newOptions","restoreTitle","restoreTitleAttributeForElement","saveTitleAttributeForElement","saveTitleAttributes","DOCUMENT","ARIAIDSUFFIX","DESCRIBEDBY","CONTENTLOAD","KCONTENTFRAME","IFRAMETEMPLATE","POSITIONS","REVERSE","DIRCLASSES","DIMENSIONS","DEFAULTCONTENT","Tooltip","_documentKeyDownHandler","_documentKeyDown","_showOn","callout","_appendContent","iframe","contentOptions","showIframe","_ajaxRequest","_initPopup","activate","ariaId","_positionCallout","arrow","_closeButtonClick","arrowBorder","offsetAmount","unifyType","mapChangedItems","itemsToMatch","itemsLength","selectedLength","changed","unchanged","isValidFilterExpr","removeFiltersForField","STATIC_LIST_NS","StaticList","ID","FOCUSED","HOVER","LOADING","HIDDENCLASS","GROUPHEADER","LABELIDPART","CASCADE","isIE","isIE8","quotRegExp","alternativeNames","ComboBox","List","_isSelect","ul","aria-hidden","_listMousedown","_header","_noData","_accessors","_initValue","headerTemplate","noDataTemplate","_renderFooter","_renderNoData","_focused","_editable","_listOptions","currentOptions","listBoundHandler","_listBound","_listChange","_activateItem","_deactivateItem","groupTemplate","fixedGroupTemplate","$angular","_initList","listOptions","selectedItemChange","VirtualList","_setListValue","_updateSelectionState","filterInput","_isFilterEnabled","_hideClear","_showClear","_clearValue","_clearText","_accessor","enforceMinLength","_clearFilter","_filterSource","newExpression","dataSourceState","resetPageSettings","removed","_cascading","setDSFilter","_angularElement","noData","_toggleNoData","_toggleHeader","groupHeader","header","_allowOpening","_old","_ignoreCase","candidate","widgetOptions","_open","_inputValue","_typingTimeout","minLength","_state","_searchByWord","_unbindDataSource","_form","_resetHandler","selectedDataItems","_text","_value","_aria","suggest","_ariaLabel","labelId","focusedElm","inputElm","inputId","labelElm","ariaLabel","ariaLabelledBy","_generateLabelId","_oldIndex","_typing","typing","_enable","_dataValue","_offsetHeight","prevAll","_height","popups","footerHeight","_adjustListWidth","computedWidth","borderLeftWidth","borderRightWidth","minWidth","_openHandler","_closeHandler","_focusItem","noFocusedItem","highlightFirst","scrollToIndex","_calculateGroupPadding","_calculatePopupHeight","_resizePopup","_popup","_makeUnselectable","_toggleHover","_toggle","preventFocus","touchEnabled","MSPointers","_prevent","_triggerCascade","_cascadeTriggered","userTriggered","_userTriggered","_triggerChange","_valueBeforeCascade","_requestStartHandler","_requestEndHandler","_errorHandler","requireValueMapper","valueMapper","_initial","_initialIndex","_parentWidget","_cascadeSelect","_accessorInput","_accessorSelect","_custom","_customOption","_hideBusy","_busy","_arrowIcon","_showBusy","_request","_requestEnd","_firstItem","focusFirst","_lastItem","focusLast","_nextItem","focusNext","_prevItem","focusPrev","activeFilter","shouldTrigger","altKey","_fetch","dataItemByIndex","getElementIndex","_focusElement","focusout","scrollWith","_fetchData","hasItems","_options","optionLabel","dataText","dataValue","htmlElement","formId","_cascade","cascade","_cascadeHandlerProxy","_cascadeHandler","_cascadeFilterRequests","_selectedValue","_toggleCascadeOnFocus","valueBeforeCascade","_clearSelection","_cascadeChange","filterValue","cascadeFromField","currentHandler","_optionID","_selectedIndices","_dataItems","_values","_getter","_templates","_onScroll","_scrollId","_renderHeader","_fixedHeader","_render","scroll","itemOffsetTop","itemOffsetHeight","contentScrollTop","contentOffsetHeight","bottomDistance","_getValues","_valueGetter","hasCandidate","_get","focusIndex","skipUpdate","_skipUpdate","indices","filtered","singleSelection","selectedIndices","added","isFiltered","_deselectFiltered","_deselect","_valueComparer","setValue","_valueDeferred","_valueIndices","_valueExpr","normalized","_valueType","_dataItemPosition","valueExpr","removedIndices","_normalizeIndices","newIndices","_firstVisibleItem","itemHeight","previousSibling","isGrouped","visibleItem","_renderItem","notFirstItem","newGroup","dataContext","_selected","_lastDSFilter","skipUpdateOnBind","isItemChange","_bound","modular","minYear","maxYear","build","weekNumberBuild","isWeekColumnVisible","cellsPerRow","perRow","weekNumberTemplate","cellTemplate","emptyCellTemplate","DATE","disableDates","isInRange","date1","date2","year1","getToday","restrictValue","shiftArray","multiplier","mousetoggle","MOUSEENTER","FOCUS","prevent","getCalendarInfo","extractFormat","MONTH","dates","makeUnselectable","addClassToViewContainer","currentView","isEqualDatePart","value1","value2","isEqualMonth","getDisabledExpr","createDisabledExpr","convertDatesArray","disabledDates","searchExpression","isEqualDate","oldValue","transitionOrigin","KEYDOWN_NS","MIN","SLIDE","CENTURY","NAVIGATE","OTHERMONTH","OTHERMONTHCLASS","TODAY","CELLSELECTOR","FOCUS_WITH_NS","MOUSEENTER_WITH_NS","MOUSELEAVE","PREVARROW","NEXTARROW","ARIA_DISABLED","ARIA_SELECTED","ARIA_LABEL","decade","century","Calendar","unescape","link","_toDateObject","_focusView","focusOnNav","_cellID","_addClassProxy","_active","todayString","toDateString","_cellByDate","_removeClassProxy","weekColumnHeader","_today","_title","_table","_bindTable","_option","navigateToPast","navigateToFuture","navigateUp","navigateDown","future","_oldTable","_changeView","_animate","_class","isDisabled","_nextNavigatable","navigatableDate","active","_horizontal","viewWidth","float","margin-left","unwrap","_vertical","disabledDate","links","isBigger","isTodayDisabled","_todayClick","firstVisibleDay","calendarInfo","tzOffsetBefore","resultDATE","tzOffsetDiff","navigateUrl","hasUrl","currentCalendar","firstDayIdx","shortNames","linkClass","dateString","currentDate","month1","month2","year2","setMonth","viewsEnum","parseFormats","DatePicker","DIV","SPAN","READONLY","DEFAULT","STATEDISABLED","HOVEREVENTS","MAX","ARIA_EXPANDED","ARIA_HIDDEN","DateView","_dateViewID","_calendar","_setOptions","selectIsClicked","handled","_initialOptions","_wrapper","dateView","_oldText","_updateARIA","_icon","aria-expanded","aria-owns","dateInput","_dateInput","DateInput","_update","ARIATemplate","_dateIcon","_inputWrapper","dateChanged","valueUpdated","textFormatted","aria-controls","formattedValue","isSameType","_ariaTemplate","approximateStringMatching","oldText","oldFormat","newText","deletedSymbol","oldTextSeparator","knownSymbols","customDateTime","INPUT_EVENT_NAME","STATEDEFAULT","STATEINVALID","insidePicker","weekday","hour","minute","dayperiod","_unbindInput","_bindInput","_updateElementValue","_formElement","_dateTime","getDateObject","_oldValue","stringAndFromat","toPair","_format","_paste","_input","_mouseUp","_scroll","navigationOnly","difSym","newEvent","stateInvalid","blinkInvalid","parsePart","_selectSegment","_blinkInvalidTimeout","_selectNearestSegment","returnValue","keycode","modifyPart","begin","initDate","initFormat","initCulture","initMessages","generateMatcher","retFormat","returnsFormat","setExisting","typedMonthPart","typedDayPeriodPart","sampleFormat","placeholders","mins","formatResult","getValue","newMonth","setMinutes","setSeconds","currentChar","newHours","monthNames","newYear","newMinutes","newSeconds","indexOfWordAtCaret","caretIdx","wordAtCaret","replaceWordAtCaret","defaultSeparator","words","placeholderSupported","ARIA_READONLY","AutoComplete","_loader","_clearButton","_keypress","_search","_prev","autocomplete","aria-haspopup","_resetFocusItemHandler","_resetFocusItem","_toggleCloseVisibility","clearButton","_progressHandler","_separator","_mute","_unifySeparators","_last","wordIndex","groupsLength","isActive","_touchScroller","_muted","_selectValue","_defaultSeparator","itemSelected","_loading","DOMelement","assign","normalizeIndex","sameCharsOnly","character","STATE_FILTER","STATE_ACCEPT","MSG_INVALID_OPTION_LABEL","_focusHandler","_focusInputHandler","_focusInput","_optionLabel","_inputTemplate","_word","_span","_mobile","_filterHeader","_textAccessor","valueTemplate","optionLabelTemplate","hasOptionLabel","_arrow","_resizeFilterInput","isInputActive","originalPrevent","_optionLabelDataItem","loweredText","_valueSetter","_optionLabelText","_assignInstance","_buildOptions","optionLabelValue","initialIndex","_presetValue","_filterPaste","_focusinHandler","_focusoutHandler","isIFrame","self","_wrapperMousedown","_wrapperClick","dropDownWrapper","isPopupVisible","_getElementDataItem","_matchText","_shuffleData","splitIndex","optionDataItem","_selectNext","oldFocusedItem","dataLength","isInLoop","charCode","_popupOpen","compareElement","jQueryCandidate","_resetOptionLabel","focusedItem","mapValueTo","additionalClass","keepState","SELECTOR","accesskey","unselectable","getElements","optionLabelText","STATE_REBIND","_setText","syncValueAndText","_pasteTimeout","hasText","isCustom","_arrowClick","_inputFocus","_inputFocusout","_inputPaste","_scrollToFocusedItem","_updateSelection","hasInitialIndex","_updateItemFocus","isFirstPage","_setDomInputValue","caretStart","currentCaret","maxLength","accessKey","LI","ACCEPT","FILTER","REBIND","DESELECT","FOCUSEDCLASS","HOVERCLASS","_optionsMap","_customOptions","_tagList","_textContainer","_tagID","tagList","_tagTemplate","tagMode","autoClose","maxSelectedItems","itemTemplate","tagTemplate","currentTag","_currentTag","_selectedItemChange","_initialValues","optionsMap","valueGetter","tagTextTemplate","notInput","closeButton","_removeTag","customIndex","_close","_tagListClick","_clearClick","_retrieveData","inputValue","clearFilters","_normalizeValues","_setOption","isEmptyArray","_showBusyHandler","skipCaret","caretPos","textWidth","wrapperWidth","selectedItems","_buildSelectedItems","_selectedItemIndex","_angularTagItems","removedItem","addedItem","_maxTotal","maxTotal","currentTotal","isSelected","_innerWrapper","defaultTemplate","hasDataSource","isMultiple","computedStyles","createWrapper","isHorizontal","orientationCssClass","cssClasses","tickPlacementCssClass","tickPlacement","showButtons","createButton","buttonCssClass","createSliderItems","smallStep","createTrack","dragHandleCount","firstDragHandleTitle","leftDragHandleTitle","dragHandleTitle","rightDragHandleTitle","stepValue","formatValue","calculatePrecision","parseAttr","removeFraction","RangeSlider","MOUSE_DOWN","TRACK_MOUSE_DOWN","MOUSE_UP","TRACK_MOUSE_UP","MOVE_SELECTION","KEY_DOWN","MOUSE_OVER","DRAG_HANDLE","TRACK_SELECTOR","TICK_SELECTOR","STATE_SELECTED","STATE_FOCUSED","STATE_DEFAULT","STATE_DISABLED","SliderBase","rtlDirectionSign","_isHorizontal","_sizeFn","_outerSize","_createHtml","_trackDiv","_setTrackDivWidth","_maxSelection","_sliderItemsInit","_keyMap","37","39","38","35","36","33","largeStep","34","_distance","_refresh","sizeBetweenTicks","pixelWidths","_calculateItemsWidth","_setItemsWidth","_setItemsTitle","_calculateSteps","_setItemsLargeTick","trackDivPosition","bordersWidth","titleNumber","limit","increment","valueWithoutFraction","itemsCount","itemWidth","trackDivSize","pixelStep","_roundWidths","pixelWidthsArray","balance","_addAdditionalSize","additionalSize","_pixelSteps","_getValueFromPosition","mousePosition","dragableArea","halfStep","_getFormattedValue","tooltipTemplate","_getDraggableArea","_firstHandleDrag","_activeHandle","_lastHandleDrag","_activeHandleDrag","_updateTooltip","_focusWithMouse","_setTooltipTimeout","_removeTooltip","_tooltipTimeout","_clearTooltipTimeout","tooltipDiv","_formResetHandler","Slider","dragHandle","_selection","Selection","Drag","increaseButtonTitle","decreaseButtonTitle","clickHandler","mouseDownHandler","newVal","_nextValueByIndex","_valueIndex","_setValueInRange","timer","_clearTimer","_refreshAriaAttr","_tooltipDiv","moveSelection","selectionValue","selectionDiv","halfDragHanndle","rtlCorrection","owner","_activeDragHandle","_setZIndex","oldVal","_createTooltip","colloutCssClass","wnd","tooltipInnerDiv","_scrollOffset","moveTooltip","slideParams","constrainValue","noAnimation","fadeOut","dragHandles","sdhOffset","viewPortEnd","maxOverflow","firstInput","secondInput","warn","dragSelectionStart","dragSelectionEnd","activeHandleDrag","selectionStartValue","selectionEndValue","selectionStartIndex","selectionEndIndex","halfHandle","makeSelection","selectionPosition","triggerEvent","relative","KEYS","BACKGROUNDCOLOR","ITEMSELECTEDCLASS","SIMPLEPALETTE","WEBPALETTE","WHITE","MESSAGES","noColor","clearColor","previewInput","CLICK_NS","ColorSelector","_tabIndex","_ariaId","_standalone","_triggerSelect","_updateUI","_onEnable","nohooks","_selectOnHide","ColorPalette","colors","tileSize","palette","_selectedID","FlatColorPicker","_hueElements","_selectedColor","_colorAsText","_sliders","_hsvArea","autoupdate","_clearedColor","_getHSV","_applyIEFilter","_hueSlider","_opacitySlider","_hsvRect","_hsvHandle","buttons","preview","track","hueChange","opacityChange","hueSlider","opacitySlider","kendoSlider","slide","rw","rh","_svChange","hsvRect","hsvHandle","_hsvEvents","hue","handlePosition","dontChangeInput","ColorPicker","_selector","innerWrapper","toolIcon","_getPopup","selOptions","_noColorIcon","_isInputTypeColor","selectorType","kendoPopup","kendoButton","selectorColor","buttonHtml","CLASS_ICON","truncate","INPUT","SPIN","TOUCHEND","STATE_INVALID","INTEGER_REGEXP","NumericTextBox","isStep","_focusout","_arrows","_validation","_toggleText","factor","restrictDecimals","spinners","upArrowText","downArrowText","_upArrowEventHandler","_downArrowEventHandler","_spin","_upArrow","_downArrow","adjusted","_adjust","_focusin","arrows","_spinning","release","_validationIcon","_focusing","groupRegExp","extractRegExp","caretPosition","_culture","_removeInvalidState","CLASSNAME","_initialTitle","aria-valuemin","aria-valuemax","_key","_step","isNumPadDecimal","_numericRegex","_addInvalidState","fractionRule","_floatRegExp","rounder","isNotNull","DOMElement","convertItems","clearFilter","nested","filterValuesForField","flatFilterValues","distinct","seen","removeDuplicates","dataSelector","POPUP","REFRESH","EQ","NEQ","mobileRoles","booleanTemplate","defaultMobileTemplate","booleanMobileTemplate","FilterMenu","appendToElement","_defaultFilter","_init","setUI","_isMobile","_createMobileForm","_createForm","extra","_activate","closeCallback","useRole","inputType","_closeForm","defaultFilters","defaultOperator","filterModel","_bind","purge","currentFilter","_stripFilters","_merge","animations","enums","isTrue","isFalse","selectValue","additionalValue","additionalOperator","multiCheckNS","multiCkeckMobileTemplate","FilterMultiCheck","checkSource","_foreignKeyValues","forceUnique","_createLink","_link","_attachProgress","checkChangeHandler","_progressHideHandler","_clearTypingTimeout","labelText","searchString","searchTextBox","labels","checkAll","selectedItemsFormat","createCheckAllItem","checkAllContainer","checkBoxAll","checkAllHandler","updateCheckAllState","getFilterArray","createCheckBoxes","checkValues","flatValues","itemsHtml","templateOptions","ele","checkBoxVal","valueFormat","getEffectDirection","parseDirection","updateItemClasses","IMG","IMAGE","LINK","DEFAULTSTATE","excludedNodesRegExp","updateArrow","updateFirstLast","arrowCssClass","getArrowCssClass","MENU","storeItemSelectEventHandler","selectHandler","getItemSelectEventHandler","setItemData","popupOpenerSelector","popupGroupSelector","getChildPopups","currentPopup","overflowWrapper","childPopupOpener","opener","popupId","POPUP_OPENER_ATTR","popupParentItem","popupElement","POPUP_ID_ATTR","itemPopup","animationContainerSelector","overflowMenuParents","getParents","mousewheelDelta","parentsScroll","scrollDirection","isPointerTouch","allPointers","pointerType","touchPointerTypes","isTouch","removeSpacesBetweenItems","ContextMenu","DELAY","SCROLLSPEED","TIMER","ZINDEX","POINTERDOWN","MOUSEWHEEL","SCROLLWIDTH","SCROLLHEIGHT","OFFSETWIDTH","OFFSETHEIGHT","KENDOPOPUP","HOVERSTATE","menuSelector","groupSelector","popupSelector","allItemsSelector","disabledSelector","itemSelector","linkSelector","exclusionSelector","nextSelector","lastSelector","templateSelector","scrollButtonSelector","itemWrapper","scrollButton","sprite","rendering","wrapperCssClass","firstLevel","itemCssAttributes","imageCssAttributes","imageAttr","contentCssAttributes","contentAttr","defaultClasses","textClass","textAttributes","arrowClass","encoded","groupAttributes","expanded","groupCssClass","Menu","_initData","_updateClasses","_animations","nextItemZIndex","_initOverflow","_attachMenuEventsHandlers","openOnClick","clicked","closeOnClick","hoverDelay","scrollable","popupCollision","_overflowWrapper","_preventClose","_removeHoverItem","_checkActiveElement","_mouseleavePopup","_mouseenterPopup","_documentClickHandler","_documentClick","_detachMenuEventsHandlers","backwardBtn","forwardBtn","initialWidth","initialCssWidth","_openedPopups","_scrollWrapper","_initScrolling","_setOverflowWrapperWidth","_toggleScrollButtons","_popupsWrapper","menuWidth","wrapperCssWidth","_reinitOverflow","overflowChanged","_destroyOverflow","popupWrapper","popupParentLi","isNumeric","mouseWheelDistance","backward","backwardDouble","forwardDouble","scrolling","touchEvents","scrollValue","mouseenterHandler","mousedownHandler","scrollSpeed","_closeChildPopups","currentScroll","_toggleDisabled","referenceItem","plain","renderGroup","renderItem","visiblePopups","closePopup","overflowPopup","windowHeight","setScrolling","nextZindex","parentHorizontal","_triggerEvent","maxHeight","_configurePopupOverflow","_initPopupScrolling","popupOpener","groupId","_wrapPopupElement","skipMouseEvents","_initPopupScrollButtons","scrollButtons","_closeParentPopups","_setPopupHeight","popupOuterHeight","popupOffsetTop","bottomScrollbar","canFit","_initialHeight","dontClearClose","hasChildPopupsHovered","isPopupMouseLeaved","_isRootItem","_forceClose","isEnter","_closurePrevented","hoverItem","_hoverItem","_findRootParent","hasFocus","oldHoverItem","_oldHoverItem","nonContentGroupsSelector","_itemHasChildren","pointerTouch","delegateTarget","_","toElement","_closePopups","rootPopup","groupParent","innerPopup","_innerPopup","openHandle","childGroup","childGroupVisible","shouldCloseTheRootItem","childPopupId","formNode","itemElement","targetHref","sampleHref","isLink","isLocalLink","isTargetLink","_parentsUntil","enterKey","itemSelectEventData","isSelectItemDefaultPrevented","isSelectDefaultPrevented","_getEventData","_moveHover","belongsToVertical","_itemBelongsToVertival","_itemDown","_itemUp","_itemEsc","menuIsVertical","nextItem","_scrollToItem","_itemRight","parentItem","_childPopupElement","nextAll","_itemLeft","scrollDir","currentScrollOffset","itemSize","itemOffset","ulSize","scrollButtonSize","itemPosition","menu","subGroup","renderItems","_marker","_wire","_initialWidth","alignToAnchor","_showProxy","_closeProxy","_configurePopupScrolling","_setPopupWidth","windowWidth","popupOuterWidth","popupOffsetLeft","maxWidth","_closeTimeoutProxy","_eventOrigin","_targetChild","normalClick","sameTarget","containment","_triggerProxy","toHash","leafColumns","ASC","DESC","FILTERMENU","ColumnMenu","_createMobileMenu","_createMenu","_lockColumns","sortAscending","sortDescending","lock","unlock","_ownerColumns","showColumns","lockedColumns","mobileTemplate","MobileMenu","_updateLockedColumns","_originalObject","filterMenu","_updateColumnsMenuHandler","_updateColumnsLockedStateHandler","menuColumns","originalField","_sortDataSource","allowUnsort","mode","_updateColumnsMenu","_updateColumnsLockedState","showColumn","hideColumn","checkboxes","fieldAttr","lockedAttr","visibleDataFields","lockedCount","nonLockedCount","multi","lockColumn","unlockColumn","lockItem","unlockItem","_filterExist","DIR","SINGLE","FIELD","sorterNS","TLINK","ARIASORT","ColumnSorter","initialDirection","showIndexes","sortOrder","_toggleSortDirection","fieldType","convertToValueBinding","bindAttr","createAttributes","ruleName","DATATYPE","BINDING","specialRules","addValidationRules","modelField","oldIE","nameSpecialCharRegExp","ERRORTEMPLATE","editors","kendoNumericTextBox","kendoDatePicker","Editable","_validateProxy","_validate","clearContainer","editor","isObject","isValuesEditor","isCustomEditor","preventChangeTrigger","_validationEventInProgress","bindAttribute","bindingRegex","validatable","modelFields","constrain","low","high","executableScript","WindowResizing","_preventDragging","KWINDOWRESIZEHANDLES","addOverlay","removeOverlay","getPosition","parentOverflowX","parentOverflowY","offsetLeft","WindowDragging","KWINDOW","KWINDOWTITLE","KWINDOWTITLEBAR","KWINDOWCONTENT","KOVERLAY","KHOVERSTATE","KFOCUSEDSTATE","MAXIMIZEDSTATE","CURSOR","MINIMIZE","MAXIMIZE","RESIZESTART","MINIMIZE_MAXIMIZE","KPIN","KUNPIN","PIN_UNPIN","TITLEBAR_BUTTONS","REFRESHICON","zero","Window","windowContent","isVisible","suppressActions","actions","_createWindow","_dimensions","toFront","_overlay","_buttonEnter","_buttonLeave","_windowActionHandler","_resizable","aria-labelledby","_resizeHandler","_onDocumentResize","_tabKeyTrap","minHeight","_animationOptions","basicAnimation","resizable","toggleMaximization","resizeHandle","dragging","_actions","titlebar","windowSpecificCommands","fade","autoFocus","isMaximized","isMinimized","_closable","newWidth","newHeight","w","overlay","_actionForIcon","iconClass","k-i-close","k-i-window-maximize","k-i-window-minimize","k-i-window-restore","k-i-refresh","k-i-pin","k-i-unpin","_modals","zStack","_object","newTop","newLeft","documentWindow","titleBarHeight","titleBar","scrollContainer","otherModalsVisible","overlayFx","showOptions","contentElement","Fade","fadeIn","_documentScrollTop","_documentScrollLeft","_removeOverlay","suppressAnimation","modals","hideOverlay","hideOptions","systemTriggered","_deactivate","lastModal","_actionable","_shouldFocus","windowTop","currentWindow","originalZIndex","windowObject","zIndexNew","restoreOptions","_sizingAction","actionId","maximize","minimize","unpin","initOptions","contentFrame","_triggerRefresh","_ajaxComplete","_loadingIconTimeout","_ajaxError","_ajaxSuccess","contentTemplate","_showLoading","iframeSrcAttributes","contentHtml","wrapperPosition","relativeElMarginLeft","relativeElMarginTop","elementPadding","initialPosition","resizeDirection","initialSize","containerOffset","_relativeElMarginLeft","_relativeElMarginTop","windowBottom","windowRight","newWindowTop","initialWindowPosition","initialPointerPosition","startPosition","minLeftPosition","minTopPosition","_finishDrag","initPopOvers","popovers","preventScrollIfNotInput","initWidgets","UI_OVERLAY","BEFORE_SHOW","AFTER_SHOW","BEFORE_HIDE","defaultTransition","_layout","_scroller","_model","layout","getLayout","reload","stretch","modelScope","scroller","$destroy","inited","_invokeNgController","_padIfNativeScrolling","isAndroid","skin","isAndroidForced","hasPlatformIndependentSkin","topContainer","bottomContainer","scrollerContent","idAttrValue","contentSelector","controller","$apply","_callController","$scope","_locate","platform","previousView","bodyRegExp","LOAD_START","LOAD_COMPLETE","SHOW_START","SAME_VIEW_REQUESTED","VIEW_SHOW","VIEW_TYPE_DETERMINED","AFTER","ViewEngine","errorMessage","sandbox","_hideViews","rootView","rootNeeded","layouts","viewContainer","getLayoutProxy","_setupLayouts","viewOptions","loader","showView","remoteViewURLPrefix","showClosure","_findViewElement","_createView","serverNavigation","_loadView","modalViews","urlPath","_getLayout","_xhr","always","_xhrComplete","responseText","CAPTURE_EVENTS","Loader","captureEvents","_attachCapture","changeMessage","transitionDone","EXTERNAL","HREF","DUMMY_HREF","SKIP_TRANSITION_ON_BACK_BUTTON","WIDGET_RELS","collapsible","historyCallback","viewEngine","_historyNavigate","_historyReplace","closeActiveDialogs","viewShow","loadStart","loadComplete","sameViewRequested","viewTypeDetermined","_setPortraitWidth","_setupAppLinks","dialogs","navigateToInitial","portraitWidth","bindToRouter","router","attrUrl","hideLoading","showLoading","changeLoadingMessage","linkRoles","pressedButtonSelector","buttonSelectors","_mouseup","_appLinkClick","rel","delayedTouchEnd","openFor","paneContainer","ARROW","OVERLAY","DIRECTION_CLASSES","DIRECTIONS","ANIMATION","containerPopup","PopOver","initialOpen","SHIM","Shim","app","osname","ioswp","shim","prevented","_hide","COMMAND","BUTTONS","CONTEXT_DATA","WRAP","cancelTemplate","ActionSheet","ShimClass","_shimHideProxy","actionData","_shimHide","DEFAULTMIN","DEFAULTMAX","DEFAULTVALUE","DEFAULTCHUNKCOUNT","KPROGRESSBAR","KPROGRESSBARREVERSE","KPROGRESSBARINDETERMINATE","KPROGRESSBARCOMPLETE","KPROGRESSWRAPPER","KPROGRESSSTATUS","KCOMPLETEDCHUNK","KUPCOMINGCHUNK","KSTATEDISABLED","PROGRESSTYPE","PERCENT","CHUNK","COMPLETE","HUNDREDPERCENT","DEFAULTANIMATIONDURATION","progressStatus","ProgressBar","_progressProperty","_fields","_validateValue","_validateType","_progressAnimation","_updateProgress","chunkCount","showStatus","_isStarted","progressWrapper","initialStatusValue","_addChunkProgressWrapper","_calculatePercentage","validated","_roundValue","_updateChunks","_onProgressUpdateAlways","_updateProgressWrapper","completedChunks","percentagesPerChunk","percentageParsed","completedChunksCount","animationDuration","_animation","animationCssOptions","_addRegularProgressWrapper","_onProgressAnimateStart","_onProgressAnimate","_onProgressAnimateComplete","progressStatusWrapSize","progressInPercent","progressValue","progressWrapperSize","chunkSize","_normalizeChunkSize","lastChunk","_calculateChunkSize","chunkContainer","_onePercent","BinaryStream","eof","readByte","writeByte","ensure","readShort","writeShort","readShort_","writeShort_","readLong","writeLong","readLong_","writeLong_","readFixed","writeFixed","readFixed_","writeFixed_","times","readString","writeString","write","stream","HAS_TYPED_ARRAYS$1","bytes","nbytes","saveExcursion","writeBase64","BASE64","ucs2decode","counter","ucs2encode","hasOwnProperty$1","sortedKeys","Directory","tables","scalerType","tableCount","searchRange","entrySelector","rangeShift","checksum","deftable","methods","Ctor","rawData","nextSubsetTag","subsetTag","Subfont","subset","unicodes","ogid2ngid","ngid2ogid","ncid2ogid","firstChar","nextGid","psName","TTFFont","numFonts","makeOutput","PDFValue","beforeRender","renderArray","renderDate","PDFDictionary","indentLevel","writeData","withIndent","NL","wrapObject","renderValue","renderFull","getOption","PAPER_SIZE","a4","unitsToPoints","PDFDocument","defval","catalog","pageTree","objcount","objects","FONTS","IMAGES","GRAD_COL_FUNCTIONS","GRAD_OPC_FUNCTIONS","GRAD_COL","GRAD_OPC","PDFCatalog","PDFPageTree","setPages","addPage","props","contentWidth","contentHeight","PDFStream","Contents","Parent","MediaBox","PDFPage","_content","xrefOffset","zeropad","Root","Info","Producer","PDFString","Title","Author","Subject","Keywords","Creator","CreationDate","loadBinary","cont","req","XMLHttpRequest","HAS_TYPED_ARRAYS","responseType","VBArray","responseBody","send","loadFont","FONT_CACHE","loadImage","_load","_onload","_onerror","imgdata","hasAlpha","alpha","rawbytes","FileReader","PDFJpegImage","bloburl","readAsArrayBuffer","getImageData","PDFRawImage","manyLoader","loadOne","mm2pt","mm","cm2pt","cm","in2pt","inch","defclass","Base","PDFName_cache","PDFName","colorSpace","bitsPerComponent","soi","ff","SOF_CODES","Type","Subtype","Width","Height","BitsPerComponent","Filter","ColorSpace","Decode","asStream","_resourceName","RESOURCE_COUNTER","SMask","makeHash","cacheColorGradientFunction","r1","r2","g2","FunctionType","Domain","Range","N","C0","C1","cacheOpacityGradientFunction","makeGradientFunctions","assemble","funcs","Functions","Bounds","Encode","prevColor","curColor","opacities","cacheColorGradient","isRadial","coords","shading","ShadingType","Coords","Extend","cacheOpacityGradient","AIS","CA","ca","S","FormType","BBox","CS","I","Resources","ExtGState","a0","Shading","s0","cacheGradient","unquote","parseFontDef","fontdef","variant","mkFamily","FONT_MAPPINGS","fontAlias","isIdentityMatrix","doIt","drawPage","addMargin","optimize","kendoGeometry","landscape","drawElement","producer","author","subject","keywords","dispatch","loadFonts","loadImages","toBlob","saveAs$1","filename","supportBrowser","dataURL","_pdfDebug","comment","setStrokeOptions","setFillOptions","drawPath","drawMultiPath","drawCircle","drawArc","drawGroup","drawRect","setStrokeColor","setStrokeOpacity","setLineWidth","setDashPattern","DASH_PATTERNS","LINE_CAP","LINE_JOIN","setFillColor","setFillOpacity","_drawPath","shouldDraw","maybeGradient","clipStroke","maybeFillStroke","fillStroke","nop","maybeDrawRect","isRect","seg","bezier","TEXT_RENDERING_MODE$1","fillAndStroke","beginText","setFont","setTextRenderingMode","endText","addLink","sz","newShape","optArray","opt","withClipping","saveclipbox","clipbox","savematrix","inClipbox","currentBox","exportPDF","HeadTable","LocaTable","HheaTable","MaxpTable","HmtxTable","GlyfTable","NameTable","PostTable","CmapTable","OS2Table","PDFHexString","PDFStandardFont","PDFFont","PDFToUnicodeCmap","TEXT_RENDERING_MODE","keyStr","readTable","directoryLength","headOffset","tableData","adjustment","maxpow2","LN2","revision","checkSumAdjustment","magicNumber","flags","unitsPerEm","xMin","yMin","xMax","yMax","macStyle","lowestRecPPEM","fontDirectionHint","indexToLocFormat","glyphDataFormat","head","offsetOf","lengthOf","needsLongFormat","ascent","descent","lineGap","advanceWidthMax","minLeftSideBearing","minRightSideBearing","xMaxExtent","caretSlopeRise","caretSlopeRun","caretOffset","metricDataFormat","numOfLongHorMetrics","ids","numGlyphs","maxPoints","maxContours","maxComponentPoints","maxComponentContours","maxZones","maxTwilightPoints","maxStorage","maxFunctionDefs","maxInstructionDefs","maxStackElements","maxSizeOfInstructions","maxComponentElements","maxComponentDepth","glyphIds","hhea","lsbCount","advance","lsb","maxp","leftSideBearings","forGlyph","SimpleGlyph","CompoundGlyph","idOffsets","MORE_COMPONENTS","ARG_1_AND_2_ARE_WORDS","WE_HAVE_A_TWO_BY_TWO","WE_HAVE_AN_X_AND_Y_SCALE","WE_HAVE_A_SCALE","compound","old2new","glyphFor","loca","numberOfContours","glyph","glyphs","oldIds","NameEntry","platformID","platformSpecificID","languageID","nameID","stringOffset","nameRecords","strings","rec","postscriptEntry","postscriptName","strTable","strCount","POSTSCRIPT_GLYPHS","numberOfGlyphs","italicAngle","underlinePosition","underlineThickness","isFixedPitch","minMemType42","maxMemType42","minMemType1","maxMemType1","glyphNameIndex","mapping","post","CmapEntry","codeMap","segCount","endCode","startCode","idDelta","idRangeOffset","glyphId","ngroups","endCharCode","glyphCode","language","renderCharmap","new_gid","charcode","gid","segCountX2","deltas","rangeOffsets","startGlyph","codes","startCodes","endCodes","averageCharWidth","weightClass","widthClass","ySubscriptXSize","ySubscriptYSize","ySubscriptXOffset","ySubscriptYOffset","ySuperscriptXSize","ySuperscriptYSize","ySuperscriptXOffset","ySuperscriptYOffset","yStrikeoutSize","yStrikeoutPosition","familyClass","panose","charRange","vendorID","firstCharIndex","lastCharIndex","winAscent","winDescent","codePageRange","xHeight","capHeight","defaultChar","breakChar","maxContext","use","old_gid","cmap","encodeText","glyphsFor","glyf","new_gid_ids","old_gid_ids","lastChar","hmtx","OS/2","os2","directory","cidToGidMap","cid","widthOfGlyph","makeSubset","a5","a6","a7","a8","a9","a10","b0","b3","b4","b5","b6","b7","b8","b9","b10","c0","c3","c4","c5","c6","c7","c8","c9","c10","executive","folio","legal","tabloid","Times-Roman","Times-Bold","Times-Italic","Times-BoldItalic","Helvetica","Helvetica-Bold","Helvetica-Oblique","Helvetica-BoldOblique","Courier","Courier-Bold","Courier-Oblique","Courier-BoldOblique","ZapfDingbats","getFont","getImage","getOpacityGS","forStroke","gs","_opacityGSCache","txt","escape","compress","pako","deflate","Length","pagesObj","Pages","Kids","Count","pageObj","BaseFont","Encoding","_pdf","_font","_sub","stemV","isSerif","isScript","getTextWidth","descendant","unimap","unimapStream","sub","fontStream","Length1","FontName","FontBBox","Flags","StemV","ItalicAngle","Ascent","Descent","CapHeight","XHeight","FontFile2","charWidths","chunk","CIDSystemInfo","Registry","Ordering","Supplement","FontDescriptor","FirstChar","LastChar","DW","W","CIDToGIDMap","_makeCidToGidMap","DescendantFonts","ToUnicode","unicode","_rcount","_textMode","_fontResources","_gsResources","_xResources","_patResources","_shResources","_opacity","_annotations","_fontSize","_contextStack","ProcSet","Font","XObject","Pattern","Annots","sx","sy","_requireTextMode","_requireFont","setTextLeading","requestedWidth","outputWidth","showTextNL","uri","ll","_toPage","ur","Border","A","URI","sname","oname","dashPhase","setMitterLimit","mitterLimit","_context","bezier1","bezier2","ellipse","_X","_Y","closeStroke","serif","serif|bold","serif|italic","serif|bold|italic","sans-serif","sans-serif|bold","sans-serif|italic","sans-serif|bold|italic","monospace","monospace|bold","monospace|italic","monospace|bold|italic","zapfdingbats","zapfdingbats|bold","zapfdingbats|italic","zapfdingbats|bold|italic","fillAndClip","strokeAndClip","fillStrokeClip","dashDot","longDash","longDashDot","longDashDotDot","solid","butt","miter","bevel","Document","PDFMixin","saveAsPDF","_drawPDF","_drawPDFShadow","pageNumber","drawOptions","defer","groupCells","stringifyAttributes","reorder","lockedContent","attachCustomCommandEvent","commandName","normalizeColumns","addHiddenStyle","footerAttributes","headerAttributes","columnParent","columnParents","setColumnVisibility","removeHiddenStyle","isCellVisible","visibleColumns","toJQuery","updateCellRowSpan","sourceLockedColumnsCount","lockedColumnDepth","nonLockedColumnDepth","nonLockedColumns","moveCellsBetweenContainers","sources","leafs","sourcesDepth","targetDepth","addRowSpanValue","moveCells","updateCellIndex","columnPosition","sourcePosition","columnVisiblePosition","ths","cellCounts","findParentColumnWithChildren","findReorderTarget","parentColumns","flatColumnsInDomOrder","flatColumns","hiddenLeafColumnsCount","columnsWidth","cols","colWidth","removeRowSpanValue","removeEmptyRows","emptyRowsCount","mapColumnToCellRows","visibleNonLockedColumns","visibleLockedColumns","visibleLeafColumns","leafDataCells","indexAttr","indexA","indexB","parentColumnsCells","parentCellsWithChildren","prevCells","childColumnsCells","colSpanAttr","appendContent","tbodySupportsInnerHtml","normalizeCols","hasDetails","normalizeHeaderCells","th","convertToObject","formatGroupValue","columnValues","isForeignKey","setCellVisibility","nonDataCellsRegExp","hideColumnCells","columnIndex","groupRows","groupFooters","showColumnCells","updateColspan","toAdd","toRemove","tableWidth","syncTableHeight","table1","table2","lockedHeigth","tableHeigth","filterRowRegExp","adjustRowHeight","row1","row2","offsetHeight1","offsetHeight2","getCommand","focusTable","direct","setActive","isColumnEditable","isInputElement","tableClick","isHeader","lockedTable","headerTable","lockedHeader","isInput","currentTable","_setCurrent","navigatable","isInEdit","groupRowBuilder","colspan","ARIALABEL","COLLAPSE","groupRowLockedContentBuilder","DATA_CELL","SELECTION_CELL_SELECTOR","NAVROW","NAVCELL","ITEMROW","FIRSTNAVITEM","HEADERCELLS","EDIT","BEFOREEDIT","SAVE","REMOVE","DETAILINIT","FILTERMENUINIT","COLUMNMENUINIT","FILTERMENUOPEN","COLUMNMENUOPEN","CELLCLOSE","COLUMNHIDE","COLUMNSHOW","SAVECHANGES","DATABOUND","DETAILEXPAND","DETAILCOLLAPSE","CHECKBOX","CHECKBOXINPUT","NORECORDSCLASS","COLUMNRESIZE","COLUMNREORDER","COLUMNLOCK","COLUMNUNLOCK","DELETECONFIRM","NORECORDS","CONFIRMDELETE","CANCELDELETE","EXPAND","templateHashRegExp","whitespaceRegExp","COMMANDBUTTONTMPL","SELECTCOLUMNTMPL","SELECTCOLUMNHEADERTMPL","isIE7","VirtualScrollable","verticalScrollbar","delayLoading","rowHeight","_rangeStart","isScrollingUp","_scrollbarTop","firstItemIndex","lastItemIndex","_scrollTop","_scrolling","_scrollingTimeout","rangeStart","scrollIntoView","containerHeight","containerScroll","scrollingUp","currentSkip","fetching","prefetchAt","_fetching","repaintScrollbar","wrapperElement","addScrollBarHeight","totalHeight","defaultCommands","imageClass","edit","canceledit","Grid","_tbody","_pageable","_thead","_groupable","_toolbar","_setContentHeight","_navigatable","_selectable","_clipboard","_details","_attachCustomCommandsEvent","_minScreenSupport","_groups","groupable","virtualScrollable","toolbar","allowCopy","pageable","persistSelection","rowTemplate","altRowTemplate","noRecords","reorderable","columnMenu","detailTemplate","columnResizeHandleWidth","cancelDelete","confirmation","confirmDelete","expandCollapseColumnHeader","_destroyColumnAttachments","_navigatableTables","pager","kendoGroupable","clearArea","_selectedIds","copyHandler","updateClipBoardState","clearAreaHandler","_resizeUserEvents","_resizeHandleDocumentClickHandler","_destroyEditable","_removeLockedContainers","minScreenResizeHandler","_draggableInstance","lockedRowTemplate","lockedAltRowTemplate","lockedGroupFooterTemplate","noRecordsTemplate","scrollables","lockedFooter","_groupableClickHandler","_setContentWidthHandler","getOptions","initialData","mobileWrapper","_cellId","_hasDetails","_createResizeHandle","headerWrap","ieCorrection","firefoxCorrection","indicatorWidth","_autoFitLeafColumn","_positionColumnResizeHandle","lockedHead","getPageZoomStyle","bodyZoom","docZoom","winScrollLeft","_resizeHandleDocumentClick","_hideResizeHandle","_positionColumnResizeHandleTouch","columnStart","columnWidth","columnMinWidth","gridWidth","isLocked","isMobile","contentTable","minResizableWidth","totalWidth","rtlMultiplier","currentWidth","_footerWidth","resizeend","oldWidth","_applyLockedContainersWidth","_syncLockedContentHeight","_syncLockedHeaderHeight","_reorderable","targetParentContainerIndex","kendoReorderable","lockable","reorderColumn","_reorderHeader","sourceLockedColumns","targetLockedColumns","destPosition","_reorderContent","footerCol","lockedRows","visibleSources","destIndex","colSourceIndex","colDest","headerCol","_hasFilterRow","leafIndex","autoFitColumn","contentDiv","footerTable","oldColumnWidth","newColumnWidth","visibleLocked","notGroupOrHierarchyCol","notGroupOrHierarchyVisibleCell","lockChanged","sourceColumns","destColumn","_updateColumnCellIndex","_updateTablesWidth","_updateFirstColumnClass","td","lockedColumnOffset","_modelForContainer","_editMode","_editContainer","closeCell","isLockedCell","editCell","editRow","removeRow","_confirmation","_attachModelChange","kendoEditable","_relatedRow","_adjustLockedHorizontalScrollBar","_adjustRowsHeight","_syncLockedFooterHeight","editView","_editCancelClickHandler","_editUpdateClickHandler","_detachModelChange","_destroyEditView","_actionSheet","_modelChangeHandler","_modelChange","isCancel","_displayCell","storage","templateSettings","tmpl","_cellTmpl","_removeRow","cancelRow","_createPopupEditor","_createInlineEditor","_editCancelClick","_editUpdateClick","saveRow","currentIndex","updateText","cancelText","tempCommand","_createButton","kendoWindow","_openPopUpEditor","_editAnimation","_displayRow","newRow","angularElements","angularData","isAlt","_showMessage","actionSheet","_actionSheetPopupOptions","confirm","saveChanges","addRow","createAt","_firstEditableColumnIndex","_toolbarTmpl","attributeClassMatch","_hasFooters","collapseGroup","expandGroup","_isLocked","_attachGroupable","_continuousItems","lockedItems","nonLockedItems","notString","dataSourceOptions","_persistSelectedRows","copySelection","areaClipBoard","getTSV","Event","getSelection","cellsOffset","lockedCols","inLockedArea","rowsOffset","delimeter","onlyVisible","cellText","any","hideMinScreenCols","_iterateMinScreenCols","minScreenWidth","clearSelection","_deselectCheckRows","_toggleHeaderCheckState","allRows","modelId","selectedViewIds","selectedKeyNames","_updateCurrentAttr","headerId","_scrollCurrent","tableContainer","isInLockedContainer","isInContent","scrollableContainer","_rowVirtualIndex","_scrollTo","preventTrigger","_removeCurrent","elementToLowercase","elementOffsetDir","containerOffsetDir","dataTables","headerTables","_openHeaderMenu","_tableFocus","_tableBlur","_tableKeyDown","_setTabIndex","requestInProgress","canHandle","_moveUp","_moveDown","_moveRight","_moveLeft","_handlePageDown","_handlePageUp","_handleEnterKey","_handleEscKey","_handleTabKey","collapseRow","_prevHorizontalCell","_tabNext","_horizontalContainer","expandRow","_nextHorizontalCell","_prevVerticalCell","_verticalContainer","_nextVerticalCell","isInCell","_handleEditing","_toggleCurrent","originalIndex","_currentDataIndex","lockedColumnsCount","switchRow","isEdited","editContainer","triggerHandler","_initMobile","_scrollable","hasVirtualScroll","_averageRowHeight","_renderNoRecordsContent","noRecordsElement","_setContentWidth","expander","hiddenDivClass","hiddenDiv","footerWrap","nonLockedCols","nonLockedColsWidth","isGridHeightSet","initialHeight","currentRowHeight","_rowHeight","_sum","_measures","_requestStart","_error","_progress","relatedRow","selectableRow","childCells","originalCells","_wrapFooter","_appendLockedColumnFooter","footerRow","_appendCols","_columnMenu","menuOptions","hasMultiColumnHeaders","initCallback","openCallback","sortHandler","filterHandler","kendoColumnMenu","_headerCells","_filterable","columnFilterable","filterInit","filterOpen","kendoFilterMultiCheck","kendoFilterMenu","_filterRow","rowheader","suggestDataSource","customDataSource","cellOptions","_updateHeader","inputWidth","suggestionOperator","showOperators","kendoFilterCell","_sortable","sorterInstance","kendoColumnSorter","initialColumns","_checkboxClick","_headerCheckboxClick","checkBox","parentGrid","getKendoGrid","isSelecting","_tmpl","alt","skipGroupCells","_headerCellText","columnLeafs","columnsLocked","_detailTmpl","_footerTmpl","_noRecordsTmpl","scrollableNoGridHeightStyles","templateName","rowClass","fieldsMap","templateFunctionStorage","templateFunctionCount","hasFiltering","columnsWithoutFiltering","detailRow","masterRow","ariaLabelText","detailCell","correctIdx","classesRegEx","sectionRowIndex","_createHeaderCells","_appendLockedColumnContent","spanIdx","skipHiddenCount","colOffset","lockedCells","_appendLockedColumnHeader","trFilter","hasFilterRow","filterCellOffset","filterCells","leafColumnsCount","filtercellCells","filterRow","existingFilterRow","syncHeight","hasLockedColumns","hasTHead","_prepareColumns","_updateCols","_retrieveFirstColumn","_updateHeaderCols","_updateLockedCols","_autoColumns","_rowsHtml","_groupRowHtml","groupHeaderBuilder","skipColspan","footerData","footerDefaults","_groupAggregatesDefaultObject","groupItems","headerData","showFooter","footerCount","relatedGroup","toHide","footersVisibility","groupsCount","_firstDataItem","grouped","headerCellIndex","_setParentsVisibility","_isActiveInTable","isCurrentInHeader","hasCheckBoxColumn","_renderContent","_renderLockedContent","_restoreCurrent","_restoreSelection","selectedRows","dataItemKey","_cleanupDetailItems","_angularGroupItems","_angularGroupFooterItems","rows2","containersLength","heights","_drawPDF_autoPageBreak","startingPage","renderPage","origBody","_initPDFProgress","exportPage","kendoProgressBar","DATABINDING","FOCUSSELECTOR","KEDITITEM","ListView","_itemId","_crudHandlers","altTemplate","editTemplate","_item","pagerId","scrollDirectionFunc","UseJQueryoffset","elementDimension","containerScrollAmount","containerDimension","clickCallback","focusAgain","isTextBox","editItem","_modelFromElement","_closeEditable","clickNS","getSortedDomIndices","isUndefined","DRAGGEDCLASS","SELECTED_STATE_CLASS","RESET","DRAG_CLUE_CLASS","DROP_HINT_CLASS","CommandFactory","ListBoxCommand","RemoveItemsCommand","MoveItemsCommand","MoveUpItemsCommand","MoveDownItemsCommand","TransferItemsCommand","TransferItemsToCommand","TransferItemsFromCommand","TransferAllItemsToCommand","TransferAllItemsFromCommand","ToolBar","kendoAttr","DASH","DOT","HASH","KENDO_LISTBOX","DISABLED_STATE_CLASS","ENABLED_ITEM_SELECTOR","ENABLED_ITEMS_SELECTOR","TOOLBAR_CLASS","TOOL_SELECTOR","FOCUSED_CLASS","LIST_CLASS","LIST_SELECTOR","ADD","REORDER","MOVE_UP","MOVE_DOWN","TRANSFER_TO","TRANSFER_FROM","TRANSFER_ALL_TO","TRANSFER_ALL_FROM","UNIQUE_ID","MOVE_UP_OFFSET","MOVE_DOWN_OFFSET","TOOLBAR_POSITION_CLASS_NAMES","ListBox","_list","_createToolbar","_createNavigatable","_listTabIndex","_getList","_destroySelectable","_destroyToolbar","_target","dropSources","tools","moveUp","moveDown","transferTo","transferFrom","transferAllTo","transferAllFrom","_addItem","_bindDataSource","_syncElement","itemContent","_addItemAt","_insertElementAt","_keyDown","_getTabIndex","oldTarget","_getNavigatableItem","_scrollIntoView","shouldPreventDefault","_shiftSelecting","_executeCommand","elementNode","listBox","_searchConnectedListBox","connectedListBox","closestContainer","originalElement","getKendoListBox","draggableOptions","draggedItem","dataItemAtIndex","itemAtIndex","listItem","_removeElement","_updateToolbar","listItems","_getItems","_removeItem","_updateAllToolbars","uniqueIdAttr","enabledItems","_enableItem","_dataChangeHandler","_setItemIds","viewLength","selectableOptions","_onSelect","toolbarElement","toolbarOptions","toolbarInsertion","execute","_updateToolStates","listBoxElements","elementsLength","_commands","commandType","getItems","canExecute","moveItems","movedItem","indecesInDom","movedItems","itemComparer","moveAction","item1","item2","indexItem1","indexItem2","domIndices","sourceListBox","getSourceListBox","destinationListBox","getDestinationListBox","updatedSelection","getUpdatedSelection","updateSelection","itemFilter","lastEnabledItem","containsLastItem","itemToSelect","_initTemplates","_createTools","_attachEventHandlers","_detachEventHandlers","tool","toolsLength","toolsMessages","toolList","_createToolList","defaultTools","_onToolClick","_executeToolCommand","_updateToolState","toolName","toolElement","getFileName","inputFiles","$input","files","getAllFileInfo","stripPath","extension","getFileExtension","rawFiles","getFileInfo","rawFile","fileSize","rFileExtension","slashIndex","assignGuidToFiles","validateFiles","validationInfo","allowedExtensions","parseAllowedExtensions","maxFileSize","minFileSize","validateFileExtension","validateFileSize","extensions","ext","parsedExt","validationErrors","INVALIDFILEEXTENSION","INVALIDMINFILESIZE","INVALIDMAXFILESIZE","getTotalFilesSizeMessage","totalSize","shouldRemoveFileEntry","upload","removeUploadedFile","fileEntry","eventArgs","shouldSendRemoveRequest","fileNames","_supportsRemove","_removeFileEntry","_submitRemove","textStatus","tryParseJSON","onSuccess","normalizeJSON","stopEvent","bindDragEventWrappers","onDragEnter","onDragLeave","hideInterval","lastDrag","sinceLastDrag","isFileUploadStarted","getFileEntry","iframeUploadModule","formDataUploadModule","UPLOAD","CLEAR","PAUSE","RESUME","VALIDATIONERRORS","PROGRESSHIDEDELAY","PROGRESSHIDEDURATION","headerStatusIcon","Upload","activeInput","initialFiles","localization","_wrapInput","_activeInput","_onParentFormSubmit","_onParentFormReset","async","saveUrl","_module","_supportsFormData","_async","_renderInitialFiles","syncUploadModule","_supportsDrop","dropZone","_setupCustomDropZone","_setupDropZone","_onFileAction","_onClearSelected","_onUploadSelected","_onInputChange","showFileList","autoRetryAfter","bufferChunkSize","maxAutoRetries","removeVerb","autoUpload","withCredentials","useArrayBuffer","retry","pause","clearSelectedFiles","uploadSelectedFiles","dropFilesHere","invalidFiles","statusUploading","statusUploaded","statusWarning","statusFailed","headerStatusUploading","headerStatusPaused","headerStatusUploaded","invalidMaxFileSize","invalidMinFileSize","invalidFileExtension","_supportsMultiple","customDropZone","onPause","pauseIcon","onResume","playIcon","onSaveSelected","getFiles","filesData","allFiles","clearAllFiles","_removeFileByDomElement","removeAllFiles","removeFileByUid","_removeFileByUid","clearFileByUid","clearFile","_removeFile","removeFile","fileData","onRemove","_hideHeaderUploadstatus","_updateHeaderUploadStatus","_addInput","sourceInput","_onInputKeyDown","firstButton","_inputFiles","_isAsyncNonBatch","onSelect","_readDirectory","dirReader","createReader","readEntries","entries","_readFile","fullpath","relativePath","droppedFolderFiles","droppedFolderCounter","_proceedDroppedItems","_traverseFileTree","skipCounter","isFile","isDirectory","_onDrop","dt","dataTransfer","droppedFiles","directoryDrop","webkitGetAsEntry","_filesContainValidationErrors","hasErrors","currentFile","_enqueueFile","_fileAction","_prepareTemplateData","templateData","_prepareDefaultSingleFileEntryTemplate","_prepareDefaultMultipleFileEntriesTemplate","filesHaveValidationErrors","totalFileSize","existingFileEntries","removeEventArgs","fileUid","fileList","allCompletedFiles","allInvalidFiles","_hideUploadButton","fileElement","actionKey","skipClear","firstActionButton","classDictionary","iconsClassDictionary","_clearFileAction","_renderAction","_fileState","stateKey","states","uploading","uploaded","failed","currentState","actionClass","actionText","hasValidationErrors","_checkAllComplete","onRetry","clearEventArgs","_onFileProgress","percentComplete","progressPct","warningPct","_onUploadSuccess","_setUploadErrorState","_hideUploadProgress","_onUploadError","module","_decreasePosition","_autoRetryAfter","retries","performUpload","uploadPercentage","_updateUploadProgress","fileMetaData","metaData","totalChunks","chunkIndex","_showUploadButton","uploadButton","_showHeaderUploadStatus","isUploading","headerUploadStatus","failedUploads","headerUploadStatusIcon","currentlyUploading","currentlyInvalid","currentlyFailed","currentlyPaused","concurrent","onAbort","FormData","_userAgent","isChrome","isSafari","isWindowsSafari","_bindDocumentDragEventWrappers","removeUrl","removeField","dataFilter","traditional","xhrFields","filesContainErrors","relatedInput","iframes","_frameId","prepareUpload","saveField","createFrame","registerFrame","createForm","frame","dataInput","cleanupFrame","unregisterFrame","onIframeLoad","started","processResponse","fakeXHR","jsonResult","statusText","stopFrameSubmit","execCommand","cancelled","paused","sourceElement","fileEntries","prepareChunk","enqueueFiles","filesLength","webkitRelativePath","formData","createFormData","createXHR","removeFileEntry","populateFormData","postFormData","fileArrayBuffer","_appendBuffer","_getCurrentChunk","buffer1","buffer2","byteLength","prevEntry","stopUploadRequest","_increaseChunkIndex","onRequestSuccess","onRequestError","onRequestProgress","setRequestHeader","serializedMetaData","raiseError","parseSuccess","cleanupFileEntry","_resetChunkIndex","uploadComplete","uploadUid","_decreaseChunkIndex","methodToInvoke","oldPosition","_getChunker","mozSlice","webkitSlice","concatPaths","sizeFormatter","suffix","FileBrowser","SearchBox","Breadcrumbs","trimSlashesRegExp","APPLY","BREADCRUBMSNS","SEARCHBOXNS","NAMEFIELD","SIZEFIELD","TYPEFIELD","DEFAULTSORTORDER","EMPTYTILE","TOOLBARTMPL","filebrowser","_call","_deleteClick","_addClick","_directoryKeyDown","_directoryBlur","uploadFile","orderByName","orderBySize","directoryNotFound","emptyFolder","deleteFile","invalidFileType","overwriteFile","fileTypes","_selectedItem","fileUrl","encodeURIComponent","arrangeBy","showUpload","uploadUrl","showCreate","showDelete","kendoUpload","_fileUpload","_attachDropzoneEvents","_dropEnter","_dropLeave","_scrollHandler","_positionDropzone","_removeDropzone","createDirectory","_getFieldName","filterRegExp","fileNameField","_createFile","_insertFileToList","_tiles","_findFile","typeField","nameField","_override","lastDirectoryIdx","_nameDirectory","_nameExists","directoryNames","_dblClick","_itemTmpl","_editTmpl","_listViewChange","breadcrumbs","typeSortOrder","nameSortOrder","_navigation","navigation","kendoBreadcrumbs","searchBox","kendoSearchBox","_path","_updateValue","_toggleLabel","_rootClick","_adjustSectionWidth","trail","ImageBrowser","imagebrowser","_uploading","_loadImage","thumbnailUrl","urlJoin","viewTop","viewBottom","updateTabClasses","tabs","ACTIVESTATE","TABONTOP","tabGroup","scrollButtonHtml","buttonClass","CONTENT","CONTENTURL","NAVIGATABLEITEMS","HOVERABLEITEMS","contentAttributes","contentUrl","TabStrip","_contentUrls","contentUrls","_tabPosition","_keyDownProxy","contentHolder","activateTab","_endItem","endItem","focused","tab","dataContentField","dataContentUrlField","dataImageUrlField","dataUrlField","dataSpriteCssClass","tabPosition","scrollWrap","_scrollableModeActive","_scrollPrevButton","_scrollNextButton","ajaxRequest","_create","_updateContentElements","_appendUrlItem","_moveUrlItem","_removeUrlItem","referenceTab","referenceContent","fromIndex","newTabsCreated","activeItem","activeTab","contentElements","_elementId","tabStripID","elementId","wrapperId","isInitialUpdate","currentContent","contentAnimators","tabsHeight","_setContentElementsDimensions","contentDivs","activeDiv","marginStyleProperty","_sizeScrollWrap","isAnchor","deactivateTab","wrapperOffsetWidth","tabGroupScrollWidth","scrollPrevButton","scrollNextButton","mouseDown","mouseUp","_scrollableAllowed","_nowScrollingTabs","_scrollTabsByDelta","_scrollTabsToItem","tabGroupWidth","tabGroupPadding","scrLeft","animationSettings","hasCloseAnimation","neighbours","oldTab","visibleContents","isAjaxContent","showContentElement","showContent","inRequest","fakeProgress","statusIcon","endState","oldProgressAnimation","ajaxOptions","ajaxSettings","request","progressUpload","evt","noProgress","lengthComputable","stopProgress","tabStrip","UndoRedoStack","currentCommandIndex","undo","canUndo","redo","canRedo","Tool","FormatTool","bomFill","emptyElementContent","emptyTableCellContent","SELECT_OVERLAY_SELECTOR","ToolTemplate","getHtml","EditorUtils","editorWrapperTemplate","buttonTemplate","colorPickerTemplate","comboBoxTemplate","dropDownListTemplate","separatorTemplate","overflowAnchorTemplate","formatByName","tags","getToolCssClass","toolCssClassNames","superscript","subscript","justifyLeft","justifyCenter","justifyRight","justifyFull","insertUnorderedList","insertOrderedList","import","outdent","createLink","unlink","insertImage","insertFile","viewHtml","foreColor","backColor","createTable","addColumnLeft","addColumnRight","addRowAbove","addRowBelow","deleteRow","deleteColumn","tableWizard","tableWizardInsert","cleanFormatting","registerTool","toolOptions","Editor","registerFormat","formatName","strikethrough","fontName","fontNameInherit","fontSizeInherit","formatBlock","formatting","editAreaTitle","overflowAnchor","imageWebAddress","imageAltText","imageWidth","imageHeight","fileWebAddress","fileTitle","fileText","linkWebAddress","linkText","linkToolTip","linkOpenInNewWindow","dialogUpdate","dialogInsert","dialogOk","dialogCancel","createTableHint","tableTab","cellTab","accessibilityTab","caption","summary","units","cellSpacing","cellPadding","cellMargin","collapseBorders","wrapText","associateCellsWithHeaders","alignLeft","alignCenter","alignRight","alignLeftTop","alignCenterTop","alignRightTop","alignLeftMiddle","alignCenterMiddle","alignRightMiddle","alignLeftBottom","alignCenterBottom","alignRightBottom","alignRemove","selectAllCells","exportAs","supportedBrowser","contentEditable","toolGroups","basic","lists","indenting","toolbarContainer","editorNS","Dom","_registerHandler","_wrapTextarea","Toolbar","bindTo","heightStyle","expectedHeight","actualHeight","_initializeContentElement","keyboard","Keyboard","BackspaceHandler","TypingHandler","SystemHandler","SelectAllHandler","Clipboard","undoRedoStack","textarea","_endTyping","_initializeImmutables","isTypingInProgress","endTyping","saveSelection","_selectionChange","_selectionStarted","isResizable","kendoResizable","newSize","getKendoResizable","_initializeTableResizing","TableResizing","_showTableResizeHandlesProxy","_showTableResizeHandles","_destroyTableResizing","tableResizing","showResizeHandles","_initializeColumnResizing","ColumnResizing","_destroyColumnResizing","columnResizing","_initializeRowResizing","RowResizing","_destroyRowResizing","rowResizing","editorWrap","editArea","_createContentElement","stylesheets","specifiedDomain","domain","domainScript","hostname","frameBorder","contentWindow","contentDocument","decorateFrom","encodedValue","_spellCorrect","beforeCorrection","falseTrigger","contextmenu","_spellCorrectTimeout","RestorePoint","getRange","_finishUpdate","_deregisterHandlers","blurTrigger","mousedownTrigger","keydown","nextChar","toolFromShortcut","keyPressCommand","_runPostContentKeyCommands","keypress","keyup","selectionCodes","cut copy paste","focusin","toolbarContainerElement","preventPopupHide","immutables","Immutables","gecko","toolsFromShortcut","changesContent","_destroyResizings","deserialization","serialization","entities","semantic","scripts","pasteCleanup","keepNewLines","msAllFormatting","msConvertLists","msTags","none","dialogOptions","imageBrowser","fileBrowser","_focusOutside","_destroyUploadWidget","tempInput","_uploadWidget","textNodes","finder","RangeUtils","collapsed","startContainer","getFormat","isFormatted","currentHtml","Serializer","domToXhtml","htmlToDom","selectionRestorePoint","refreshTools","commonAncestorContainer","_focusBody","restoreSelection","toRange","SelectionUtils","selectionFromDocument","removeAllRanges","addRange","rangeCount","getRangeAt","endContainer","_containsRange","isAncestorOrSelf","selectedHtml","cloneContents","InsertHtmlCommand","_range","toolById","managesUndoRedo","ctrl","initialize","commandArguments","FormatCommand","formatter","_bomFill","makeMap","whitespace","emptyspace","bom","whitespaceOrBom","persistedScrollTop","cssAttributes","htmlRe","entityRe","entityTable","STYLE","FLOAT","CSSFLOAT","STYLEFLOAT","CLASS","KMARKER","nonListBlockElements","blockElements","block","inlineElements","inline","fillAttrs","62","160","161","162","163","164","165","166","167","168","169","170","171","172","173","174","175","176","177","178","179","180","181","182","183","184","185","186","187","188","189","190","191","192","193","194","195","196","197","198","199","201","202","203","204","205","206","207","208","209","210","211","212","213","214","215","216","217","218","219","220","221","222","223","224","225","226","227","228","229","230","231","232","233","234","235","236","237","238","239","240","241","242","243","244","245","246","247","248","249","250","251","252","253","254","255","402","913","914","915","916","917","918","919","920","921","922","923","924","925","926","927","928","929","931","932","933","934","935","936","937","945","946","947","948","949","950","951","952","953","954","955","956","957","958","959","960","961","962","963","964","965","966","967","968","969","977","978","982","8226","8230","8242","8243","8254","8260","8472","8465","8476","8482","8501","8592","8593","8594","8595","8596","8629","8656","8657","8658","8659","8660","8704","8706","8707","8709","8711","8712","8713","8715","8719","8721","8722","8727","8730","8733","8734","8736","8743","8744","8745","8746","8747","8756","8764","8773","8776","8800","8801","8804","8805","8834","8835","8836","8838","8839","8853","8855","8869","8901","8968","8969","8970","8971","9001","9002","9674","9824","9827","9829","9830","338","339","352","353","376","710","732","8194","8195","8201","8204","8205","8206","8207","8211","8212","8216","8217","8218","8220","8221","8222","8224","8225","8240","8249","8250","8364","findNodeIndex","skipText","isDataNode","isAncestorOf","findClosestAncestor","getNodeLength","splitDataNode","newNode","denormalizedText","deleteData","attrEquals","blockParentOrBody","parentOfType","blockParents","blocks","windowFromDocument","parentWindow","nodeTypes","ELEMENT_NODE","ATTRIBUTE_NODE","TEXT_NODE","CDATA_SECTION_NODE","ENTITY_REFERENCE_NODE","ENTITY_NODE","PROCESSING_INSTRUCTION_NODE","COMMENT_NODE","DOCUMENT_NODE","DOCUMENT_TYPE_NODE","DOCUMENT_FRAGMENT_NODE","NOTATION_NODE","encodableChars","entity","isBom","stripBom","stripBomNode","insignificant","_moz_dirty","_moz_editor_bogus_node","tableCell","significantNodes","emptyTextNode","emptyNode","significantChildNodes","isWhitespace","lastTextNode","isMarker","allWhitespaceContent","isEmptyspace","htmlIndentSpace","isPrevBlock","isNextBlock","isBlock","isInline","compatMode","elementTop","persistScrollTop","restoreScrollTop","newElement","referenceElement","removeChildren","removeTextSiblings","closestBy","condition","rootCondition","ofType","changeTag","skipAttributes","editableParent","unstyle","inlineStyle","getEffectiveBackground","backgroundStyle","classNames","commonAncestor","ancestors","minPathLength","closestSplittableParent","editableParents","editableAncestor","closestEditable","closestEditableOfType","filterFn","filterBy","ensureTrailingBreaks","ensureTrailingBreak","removeTrailingBreak","supportsLeadingWhitespace","TD","fontSizeMappings","quoteRe","brRe","pixelRe","emptyPRe","cssDeclaration","sizzleAttr","scriptAttr","onerrorRe","toEditableHtml","_toEditableImmutables","immutable","_fillEmptyElements","_removeSystemElements","_resetOrderedLists","originalStart","ols","_preventScriptExecution","legacyIE","originalSrc","originalHref","deserialize","semanticFilter","cssProperties","styleAttr","specifiedAttributes","$node","skipEncoding","isEmptyBomNode","mapper","jqNode","tagMap","textOnly","childrenCount","runCustom","k:script","semanticAttributes","textDecoration","strong","em","script","compareBoundaries","startAncestor","endAncestor","fixIvalidRange","toStart","isInvalidRange","updateRangeProperties","textRangeContainer","textRange","adoptContainer","cursorNode","textOffset","isData","anchorNode","moveToElementText","adoptEndPoint","comparison","appended","compareEndPoints","RangeIterator","W3CSelection","RangeEnumerator","ImmutablesRangeIterator","ImmutablesRangeEnumerator","Marker","boundary","selectionFromWindow","selectionFromRange","rangeDocument","documentFromRange","W3CRange","setStartAfter","setEndAfter","deleteContents","cloneRange","deleteSubtree","hasPartialSubtree","getSubtreeIterator","cloneSubtree","frag","createDocumentFragment","extractSubtree","originalRange","insertNode","startNodeName","endNodeName","fromNode","_next","hasNext","nodeIndex","inStartContainer","inEndContainer","getSubRange","subRange","movedStart","movedEnd","enumerate","visit","rootNode","getEditable","nodeToPath","serializedImmutables","removeImmutables","restoreImmutables","lastType","restoreHtml","toRangePoint","denormalizedOffset","addCaret","removeCaret","containerIndex","textNode","rangeBoundary","isExpandable","_removeDeadMarkers","_normalizedIndex","shouldNormalizeStart","shouldNormalizeEnd","shouldNormalize","collapsedToStart","startParent","endParent","editableTextNodes","immutableParent","partition","partitionRange","mapAll","mapped","getAll","getMarkers","isStartOf","isEndOf","wrapSelectedElements","isEnd","startEditable","endEditable","beforeCaret","afterCaret","finishUpdate","startRestorePoint","endRestorePoint","GenericCommand","PREVIOUS_SIBLING","Command","restorePoint","lockRange","releaseRange","createDialog","expandImmutablesIn","genericCommand","postProcess","InsertHtmlTool","_selectBox","SelectBox","selectbox","tableCells","tableCellsWrappers","tableElements","inTable","RemoveTableContent","cellsTypes","startCell","endCell","_removeContent","forwards","getNext","removeTableContent","backspaceHandler","isTypingKey","immutablesContext","deleteSelection","startTyping","_addCaret","_restoreCaret","_handleDelete","_cleanBomBefore","_handleBackspace","linkRange","previousNode","isEndOfLink","ListFormatter","UnlinkCommand","_handleSelection","ancestor","emptyParagraphContent","_handleImmutables","_surroundFullySelectedAnchor","_join","startImmutable","endImmutable","_mergeWithTextNode","appendedNode","_isCaret","backspace","del","systemCommandIsInProgress","createUndoCommand","isModifierKey","isSystem","_toSelectableImmutables","_selectEditorBody","typingInProgress","isCharacter","_getShortcutModifier","mac","matchesKey","matchKey","toolKey","onEndTyping","stopTyping","what","cleaners","ScriptCleaner","TabCleaner","MSWordFormatCleaner","WebkitFormatCleaner","HtmlTagsCleaner","HtmlAttrCleaner","HtmlContentCleaner","CustomCleaner","htmlToFragment","fragment","_startModification","_inProgress","_endModification","modificationInfo","_contentModification","_removeBomNodes","_onBeforeCopy","oncopy","oncut","_fileToDataURL","File","getAsFile","readAsDataURL","_triggerPaste","_handleImagePaste","clipboardData","onpaste","clipboardRange","clipboardNode","_decoreateClipboardNode","_moveToCaretPosition","clean","borderWidth","fontVariant","fontWeight","nodeOffset","_caretOffset","translateX","translateY","-webkit-transform","rangeChanged","isStartTextNode","prevLength","bomNode","splittableParent","splittable","fragmentsHtml","skipCleaners","applicable","Cleaner","replacements","customReplacements","junkReplacements","convertFontMatch","closing","faceRe","stripEmptyAnchors","listType","listData","startingSymbol","matchSymbol","trimStartText","_guessUnorderedListStyle","_guessOrderedListStyle","_convertToLi","extractListLevels","msoListRegExp","rootMargin","listContainer","listIndex","levelType","blockChildren","lastMargin","levels","removeAttributeNode","createColGroup","convertHeaders","boldedCells","removeParagraphs","paragraphs","removeDefaultColors","spans","firstRow","longestRow","titles","removeFormatting","DomCleaner","cleanDom","collectTags","collectAttr","TextContainer","HtmlTextLines","separators","lines","inlineBlockText","resetLine","appendText","textContainer","appendInlineBlockText","flashInlineBlockText","endLine","il","il1","jl","jl1","DomEnumerator","preventDown","enumerator","buildText","getDefaultSeparators","htmlLines","cleaner","tdCleaner","PrintCommand","print","ExportPdfCommand","initialValue","MOUSEDOWN_NS","InlineFormatFinder","numberOfSiblings","textNodesCount","elementNodesCount","markerCount","findSuitable","sourceNode","findFormat","InlineFormatter","formatNode","formatNodes","consolidate","GreedyInlineFormatFinder","greedyProperty","getInlineCssValue","attributeValue","pair","cssIndex","propertyAndValue","getFormatInner","GreedyInlineFormatter","InlineFormatTool","DelayedExecutionTool","FontTool","cssAttr","domAttr","newRange","ColorTool","_widget","picker","fontStyle","listElements","BlockFormatFinder","suitable","_resolveListsItems","ImmutablesNS","BlockFormatter","imageFormat","imageAttributes","nonImages","applyFormatting","immutableFormat","namedFormat","GreedyBlockFormatter","immutalbeParent","blockFormatter","formatTag","BlockFormatTool","ParagraphCommand","_insertMarker","_moveFocus","focusNode","shouldTrim","startInBlock","endInBlock","_blankAfter","paragraph","heading","rng","parentChildrenLength","NewLineCommand","filler","ListFormatFinder","unwrapTag","isList","isImmutable","containsAny","_parentLists","breakable","applyOnSection","section","pushAncestor","addLastSection","lastSection","sections","lastNodes","ListCommand","ListTool","lastIndexOfRegExp","indexOfRegExp","HTTP_PROTOCOL","protocolRegExp","endLinkCharsRegExp","LinkFormatFinder","LinkFormatter","markers","LinkCommand","_dialogTemplate","dialog","_initialText","_apply","linkUrl","_dialog","textInput","AutoLinkCommand","linkMarker","detectedLink","detectLink","_ensureWebProtocol","traverser","LeftDomTextTraverser","cancelAtNode","detection","DomTextLinkDetection","hasProtocol","_hasProtocolPrefix","_prefixWithWebProtocol","UnlinkTool","DomPos","puntuationOptions","puntuationTraverser","_detectEnd","blank","_detectStart","_isLinkDetected","extendOptions","RightDomTextTraverser","_skipStartPuntuation","ii","DomTextTraverser","_traverse","edgeNode","subText","KEDITORFILEURL","KEDITORFILETEXT","KEDITORFILETITLE","FileCommand","showBrowser","applied","keyDown","_fileBrowser","KEDITORIMAGEURL","KEDITORIMAGETITLE","KEDITORIMAGEWIDTH","KEDITORIMAGEHEIGHT","ImageCommand","removeIEAttributes","_imageBrowser","_initSelectOverlay","autoSize","listWidth","_listWidth","selectBox","indentDirection","IndentFormatter","parentList","siblingList","nestedList","mapImmutables","targetNode","listParent","IndentCommand","indentFormatter","OutdentCommand","OutdentTool","isOutdentable","listParentsCount","suitableNodes","ViewHtmlCommand","unwrapListItem","listFormatter","FormattingTool","toFormattingItem","kendoSelectBox","getFormattingValue","_ancestor","CleanFormatCommand","tagsToClean","OVERFLOWANCHOR","toolNamesByCssClass","k-i-sup-script","k-i-sub-script","k-i-align-left","k-i-align-center","k-i-align-right","k-i-align-justify","k-i-list-unordered","k-i-list-ordered","k-i-login","k-i-indent-increase","k-i-indent-decrease","k-i-link-horizontal","k-i-unlink-horizontal","k-i-image","k-i-file-add","k-i-html","k-i-foreground-color","k-i-paint","k-i-table-insert","k-i-table-column-insert-left","k-i-table-column-insert-right","k-i-table-row-insert-above","k-i-table-row-insert-below","k-i-table-row-delete","k-i-table-column-delete","k-i-table-properties","k-i-table-wizard","k-i-clear-css","OverflowAnchorTool","advanced","overflowFlaseTools","_toggleOverflowStyles","_initOverflowPopup","popupTemplate","focusOverflowPopup","toolGroupFor","isCustomTool","_editor","expandTools","combobox","dropDown","isOpened","inheritText","_toolName","description","_appendShortcutSequence","editorElement","editorOffset","editorOptions","_overlaps","toolbarWrapper","toolbarWrapperOffset","toolbarWrapperLeft","toolbarWrapperTop","boxOffset","boxOffsetLeft","boxOffsetTop","localizedText","res","_nativeTools","currentTool","nativeTools","endGroup","groupPosition","startGroup","newGroupName","toolConfig","updateGroups","attachToolsEvents","enabledButtons","disabledButtons","dropdown","colorpicker","editorTools","focusElement","currentContainer","toolname","_immutablesContext","_updateImmutablesState","uiData","groupUi","uiElement","trackImmutables","toolsToBeUpdated","containerWidth","_refreshWidths","_shrink","_stretch","visibleGroups","_groupsWidth","_visibleGroups","_hideGroup","hiddenGroups","_hiddenGroups","_showGroup","columnTemplate","tableFormatFinder","TableCommand","_tableHtml","columnHtml","insertedTable","PopupTool","twTool","TableWizardTool","TableWizardCommand","insertNewTable","InsertTableTool","tableFromLocation","cellHeight","cellWidth","lastCell","_setTableSize","_exec","_valid","selectedColumns","tableSize","InsertRowCommand","cellCount","InsertColumnCommand","newCell","DeleteRowCommand","DeleteColumnCommand","TableModificationTool","defaultExportAsItems","ExportAsCommand","exportType","generateForm","exportAsOptions","valueInput","exportTypeInput","fileNameInput","ExportAsTool","changeHandler","loadingOverlay","ImportCommand","_initializeUploadWidget","importOptions","_onUploadProgress","_onUploadSelect","_onUploadComplete","proxyUrl","getKendoUpload","_removeLoadingOverlay","_initLoadingOverlay","eventType","uploadEvent","_iframeWrapper","lowerBound","upperBound","getScrollBarWidth","calculatePercentageRatio","inPercentages","REGEX_NUMBER_IN_PERCENTAGES","inPixels","REGEX_NUMBER_IN_PIXELS","toPercentages","PERCENTAGE","toPixels","PIXEL","ResizingUtils","MOUSE_ENTER","MOUSE_LEAVE","MOUSE_MOVE","LAST_CHILD","TABLE","TableElementResizing","eventNamespace","_destroyResizeHandle","dataAttribute","detectElementBorderHovering","resizingInProgress","handleOptions","tableElement","elementBorderHovered","showResizeHandle","_initResizeHandle","setResizeHandlePosition","setResizeHandleDimensions","setResizeHandleDataAttributes","_attachResizeHandleEventHandlers","_initResizable","_hideResizeMarker","markerClass","_destroyResizable","onResizeStart","onResizeEnd","_disableKeyboard","setResizeHandleDragPosition","_enableKeyboard","_forceResizing","ResizingFactory","resizingName","_destroyResizing","_initResizing","parentTable","resizingType","RESIZE_HANDLE_CLASS","RESIZE_MARKER_CLASS","TBODY","TH","TR","handleWidth","borderOffset","tableBody","scrollTopOffset","scrollLeftOffset","columnWidthOffset","scrollBarWidth","columnLeftOffset","adjacentColumnWidth","handleOffset","initialAdjacentColumnWidth","initialColumnWidth","rtlModifier","initialDeltaX","_setTableComputedWidth","_setColumnsComputedWidth","_resizeColumn","_resizeTopAndBottomColumns","_resizeAdjacentColumns","tableBodyWidth","currentColumnsWidths","topAndBottomColumns","deltaWidth","adjacentColumns","_resizeAdjacentColumn","adjacentColumn","RESIZE_HANDLE_MARKER_WRAPPER_CLASS","handleHeight","rowPosition","tableBodyTopOffset","initialTableHeight","tableBodyHeight","initialStyleHeight","newRowHeight","_setRowsHeightInPixels","_setTableHeight","_setRowsHeightInPercentages","currentRowsHeights","HandlePositioningStrategy","EastPositioningStrategy","NorthPositioningStrategy","NortheastPositioningStrategy","NorthwestPositioningStrategy","SouthPositioningStrategy","SoutheastPositioningStrategy","SouthwestPositioningStrategy","WestPositioningStrategy","DraggingStrategyFactory","HandleDraggingStrategy","HorizontalDraggingStrategy","EastDraggingStrategy","WestDraggingStrategy","VerticalDraggingStrategy","NorthDraggingStrategy","SouthDraggingStrategy","HorizontalAndVerticalDraggingStrategy","NorthEastDraggingStrategy","NorthWestDraggingStrategy","SouthEastDraggingStrategy","SouthWestDraggingStrategy","DRAG_START","DRAG_END","HALF_INSIDE","MOUSE_OUT","EAST","NORTH","NORTHEAST","NORTHWEST","SOUTH","SOUTHEAST","SOUTHWEST","WEST","TableResizeHandle","_addStyles","_initDraggable","_initPositioningStrategy","_initDraggingStrategy","resizableElement","_destroyDraggable","_setPosition","_positioningStrategy","_onMouseOver","_onMouseOut","_onDragStart","_onDrag","_onDragEnd","_draggingStrategy","adjustDragDelta","deltaX","initialDeltaY","StrategyFactory","PositioningStrategyFactory","calculatePosition","handleOffsetPosition","applyHandleOffset","scrollOffsetPosition","applyScrollOffset","xAxisAdjustment","yAxisAdjustment","RESIZE_HANDLE_WRAPPER_CLASS","TABLE_CLASS","TABLE_RESIZING_CLASS","COLUMN","ROW","handles","_destroyResizeHandles","appendHandlesTo","_resizeWidth","_resizeHeight","ratioValue","ratioTotalValue","constrainedWidth","styleWidth","parentWidth","_getMaxDimensionValue","_initialElementWidth","_setColumnsWidth","constrainedHeight","styleHeight","currentHeight","parentHeight","hasRowsInPixels","_hasRowsInPixels","_initialElementHeight","dimensionLowercase","parentDimension","parentScrollOffset","isWidthInPercentages","parentColumn","columnsLength","_initResizeHandles","_showResizeHandles","_bindToResizeHandlesEvents","_onResizeHandleDragStart","_onResizeHandleDrag","_onResizeHandleDragEnd","_onResizeHandleMouseOver","_onResizeHandleMouseOut","TableResizingFactory","factory","eventCurrentTarget","isResizeHandleOrChild","complexBlocks","IMMUTABALE","IMMUTABALE_MARKER_SELECTOR","IMMUTABLE_SELECTOR","startImmutableParent","endImmutableParent","editableNodes","randomId","chars","serialized","deletingKey","updateToolOptions","_toHtml","serializationType","isDeleting","shouldCancelEvent","_cancelDeleting","_cancelTyping","cancelDeleting","closestSelectionLi","closestImmutableLi","nextImmutable","_removeImmutable","commonContainer","_nextNode","cellsFormatFinder","reUnit","selectedTable","_sourceTable","_selectedTable","selectedCells","_selectedTableCells","_selectedCells","onDialogClose","parseTable","TableWizardDialog","insertTable","createNewTable","updateTable","lastSelectedRow","cellsLength","newRowsCount","cellProp","tableRows","tableProp","tableProperties","_deleteTableRows","insertRow","_insertCells","deleteCell","_updateTableProperties","cellProperties","_updateCellProperties","_updateCaption","cellsWithHeaders","cellsWithHeadersAssociated","associateCellsWithHeader","_isHeadingRow","associate","isDataRow","generateIds","modifySellsIds","modifyCellsHeadings","isHeadingRow","associatedCells","headingIds","headersAttr","rowParent","cellPropToAll","createTBody","_getStylesData","captionContent","deleteCaption","createCaption","_getAlignmentData","captionAlignment","widthUnit","heightUnit","bgColor","borderColor","borderCollapse","tStyle","captionClone","tableAlignment","tableJson","_getAlignment","_getUnit","parseTableRows","parseCell","cStyle","horizontalOnly","hAlign","TableWizardEditTool","numericTextBoxSettings","borderStyles","tableAlignmentDropDownSettings","cellAlignmentDropDownSettings","accessibilityAlignmentDropDownSettings","dialogTemplate","okHandler","collectDialogValues","closeHandler","_initTabStripComponent","_initTableViewComponents","_initCellViewComponents","_initAccessibilityViewComponents","components","kendoTabStrip","_collectTableViewValues","_collectCellViewValues","_collectAccessibilityViewValues","tableView","cellView","accessibilityView","_addUnit","_initNumericTextbox","_initDropDownList","_initTableAlignmentDropDown","_initColorPicker","_initInput","_initCheckbox","_initCellAlignmentDropDown","_initAccessibilityAlignmentDropDown","component","_setComponentValue","_initAlignmentDropDown","kendoColorPicker","_destroyComponents","stringDiffStart","str1","str2","MOUSEUP","PASTE","MaskedTextBox","_rules","_tokenize","_togglePrompt","_emptyMask","_timeoutId","_maskLength","clearPromptChar","unmaskOnPost","promptChar","#","L","?","&","C","_submitHandler","unmasked","_unmask","emptyMask","_mask","_unmaskedValue","_trackChange","_inputHandler","_legacyIEInputHandler","__changing","inputChange","contentStart","endContent","lengthDiff","__dropping","_trimStartPromptChars","_findCaretPosBackwards","__backward","__pasting","chr","chrIdx","tokenIdx","tokensLength","_blinkInvalidState","_invalidStateTimeout","maskChars","adjustPopupWidth","min-width","toggleActive","STATE_ACTIVE","actionSheetWrap","preventClick","findFocusableSibling","Item","ToolBarButton","OverflowButton","ButtonGroup","ToolBarButtonGroup","OverflowButtonGroup","ToolBarSplitButton","OverflowSplitButton","ToolBarSeparator","OverflowSeparator","TemplateItem","OverflowTemplateItem","TOOLBAR","BUTTON","OVERFLOW_BUTTON","TOGGLE_BUTTON","BUTTON_GROUP","SPLIT_BUTTON","SEPARATOR","RESIZABLE_TOOLBAR","STATE_HIDDEN","GROUP_START","GROUP_END","PRIMARY","ICON","ICON_PREFIX","BUTTON_ICON","BUTTON_ICON_TEXT","LIST_CONTAINER","SPLIT_BUTTON_ARROW","OVERFLOW_ANCHOR","OVERFLOW_CONTAINER","FIRST_TOOLBAR_VISIBLE","LAST_TOOLBAR_VISIBLE","TOGGLE","OVERFLOW_OPEN","OVERFLOW_CLOSE","OVERFLOW_NEVER","OVERFLOW_AUTO","OVERFLOW_ALWAYS","OVERFLOW_HIDDEN","KENDO_UID_ATTR","overflowContainer","registerComponent","addOverflowAttr","addUidAttr","addIdAttr","addOverflowIdAttr","isEnabled","twin","useButtonTag","primary","togglable","addToGroup","toggleHandler","propagate","getParentGroup","isChild","_addGraphics","hasIcon","showIcon","overflowHidden","createButtons","buttonConstructor","buttonGroup","mainButton","arrowButton","createMenuButtons","createPopup","splitButton","menuButtons","rootUid","_renderOverflow","overflowUserEvents","_toggleOverflow","_buttonClick","_toggleOverflowAnchor","overflowTool","itemClasses","overflowTemplate","_getItem","toolbarItem","overflowItem","getSelectedFromGroup","horizontalDirection","isComplexTool","hasVisibleChildren","splitContainer","urlTarget","isSplitButtonArrow","lastHasFocus","firstHasFocus","isFirstTool","prevFocusable","isOverflowAnchor","_getPrevFocusable","elementToFocus","prevElement","prevElements","_markVisibles","_childrenWidth","childrenWidth","commandElement","visibleCommands","_hideItem","hiddenCommands","_showItem","overflowItems","toolbarItems","visibleOverflowItems","visibleToolbarItems","PLAY","READY","TIMECHANGE","VOLUMECHANGE","FULLSCREEN_ENTER","FULLSCREEN_EXIT","MUTE","LOW_VOLUME","HIGH_VOLUME","VIDEO_QUALITY","STATE_PLAY","STATE_PAUSE","TITLEBAR","TITLE","TOOLBARWRAP","SLIDER","VOLUME_SLIDER","MEDIA","YTPLAYER","baseTime","timeZoneSec","timeFormats","shortTime","longTime","htmlPlayer","toolBar","youtubePlayer","toolBarTime","slider","volumeSlider","qualityDropDown","toolTip","MediaPlayer","_currentIndex","_createTitlebar","_createDropDown","_createSlider","_createVolumeSlider","_timers","media","autoPlay","autoRepeat","volume","fullScreen","mute","forwardSeek","unmute","quality","fullscreen","_msToTime","ms","_timeToSec","curTime","_titleBar","sliderElement","_slider","_sliderDragChangeHandler","_sliderDragChange","_sliderDraggingHandler","_sliderDragging","volumeSliderElement","_volumeSlider","_volumeDraggingHandler","_volumeDragging","_volumeChangeHandler","_volumeChange","_resetTime","_youTubeVideo","_ytmedia","seekTo","_media","currentTime","_mediaTimeUpdate","_toolBar","_currentUrl","_isYouTubeUrl","_setPlayerUrl","initialized","oldPlayer","_initializePlayer","_videoOverlay","loadVideoById","_getMediaId","_playStateToggle","cueVideoById","toolBarElement","_toolbarClickHandler","_toolbarClick","class","_volumeButton","_fullscreenButton","_currentTimeElement","_durationElement","_playButton","_playButtonSpan","dropDownElement","_dropDownSelectHandler","_dropDownSelect","_dropDown","muted","isPaused","_isInFullScreen","_isDragging","tzOffset","_sliderChangeFired","_seekBarLastPosition","_preventPlay","_changeVolumeButtonImage","volumeButton","volumeElement","getCurrentTime","timeInMs","_timeFormat","isPlaying","_mediaEnded","_mediaPlay","_mediaReady","_mediaDurationChange","durationTime","getDuration","_isFirstRun","_createYoutubePlayer","_mediaTimeUpdateHandler","_mediaDurationChangeHandler","_ytPlayer","YT","Player","_configurePlayer","onYouTubeIframeAPIReadyRegister","getScript","onYouTubeIframeAPIReady","_youtubeApiReady","_poll","callLater","player","vars","autoplay","wmode","controls","showinfo","_onYouTubePlayerReady","onYouTubePlayerReady","_onPlayerStateChangeHandler","_onPlayerStateChange","onPlayerStateChange","videoId","playerVars","onReady","onStateChange","getIframe","_updateTitle","_paused","setVolume","_uiDisplay","regExp","_mouseClick","_mouseMoveHandler","_mouseMove","_mouseInHandler","_mouseIn","_mouseOutHandler","_mouseOut","_createHtmlPlayer","_mouseClickHanlder","_mediaEndedHandler","_mediaCanPlayHandler","_mediaPlayHandler","ontimeupdate","ondurationchange","oncanplay","onplay","onended","_mouseIdle","animationSpeed","uiElements","_keyDownHandler","_fullscreenHandler","_youtubeApiReadyHandler","_mouseMoveTimer","seek","playVideo","stopVideo","pauseVideo","enterFullScreen","requestFullscreen","webkitRequestFullscreen","mozRequestFullScreen","msRequestFullscreen","cancelFullscreen","webkitCancelFullScreen","mozCancelFullScreen","msCancelFullscreen","exitFullscreen","msExitFullscreen","_volume","isMuted","unMute","getVolume","isEnded","getPlayerState","ended","_mediaData","_fullscreen","isFullScreen","mozFullScreen","webkitIsFullScreen","fsButton","normalizeMeasures","normalizeMembers","normalizeName","accumulateMembers","rootTuple","tuple","buildPath","descriptorsForAxes","tuples","addMissingPathMembers","tupleMembers","firstTuple","getName","tupleToDescriptors","descriptorsForMembers","measures","tupletoSearch","MEASURES","findExistingTuple","createAggregateGetter","measureGetter","aggregatorContext","addEmptyDataItem","fmtValue","ordinal","validateAxis","newAxis","membersCount","adjustDataByColumn","sourceTuples","targetTuples","rowsLength","columnIdx","rowIdx","dataIdx","targetColumnsLength","measuresLength","tupleIndex","adjustDataByRow","normalizeAxis","findDataIndex","memberIndex","mergeTuples","targetMembers","sourceMembers","parsedRoot","equalTuples","toFind","membersLength","addMembers","findParentMember","parentMember","parentPath","parentName","measurePosition","normalizeTupleMeasures","dataIndex","parseSource","measureIndex","prepareDataOnRows","calcIndex","buildDataIndices","prepareDataOnColumns","spliceIndex","baseHierarchyPath","memberName","expandMemberDescriptor","sortDescriptor","sortDescriptorForMember","crossJoin","crossJoinCommand","measureNames","getRootNames","mapNames","rootNames","rootName","rootLength","expandedIdx","uniquePath","parseDescriptors","hierarchyName","serializeMembers","crossJoinCommands","serializeExpression","filterFunctionFormats","serializeFilters","cube","serializeOptions","parentTagName","asArray","memberIdx","captionGetter","unameGetter","levelNameGetter","levelNumGetter","childrenGetter","hierarchyGetter","parentNameGetter","Member","levelName","levelNum","xmlaDiscoverCommands","convertersMap","XmlaTransport","schemaDataReaderMap","xmlaReaderMethods","XmlaDataReader","sortExpr","removeExpr","PivotGrid","htmlNode","createMetadata","tupleName","ColumnBuilder","RowBuilder","ContentBuilder","PivotExcelMixin","STATERESET","ROW_TOTAL_KEY","EXPANDMEMBER","COLLAPSEMEMBER","STATE_EXPANDED","STATE_COLLAPSED","HEADER_TEMPLATE","KPISTATUS_TEMPLATE","KPITREND_TEMPLATE","DATACELL_TEMPLATE","LAYOUT_TABLE","AXIS_ROWS","AXIS_COLUMNS","PivotCubeBuilder","_normalizeDescriptors","keyField","_rootTuples","measureAggregators","aggregatorsLength","dimensionsSchema","measureIdx","rootNamesLength","_expandedTuples","currentKeys","memberInfo","expandedNames","accumulatorKeys","_findExpandedMember","_asTuples","rootInfo","expandedInfo","_measuresInfo","rowAxis","aggregateNames","resultFuncs","_toDataArray","measuresInfo","rowKeys","columnKeys","columnKey","columnMeasureNames","rowMeasureNamesLength","rowMeasureNames","rowLength","columnLength","_addData","resultFunc","_matchDescriptors","parentField","expectedValue","_calculateAggregate","totalItem","aggregator","_processColumns","rowTotal","updateColumn","_measureAggregators","defaultAggregate","measureDescriptors","aggregators","_buildGetters","_parseDescriptors","parsedDescriptors","_normalizeFilter","measuresRowAxis","columnDescriptors","rowDescriptors","aggregatedData","rowValue","columnGetters","rowGetters","expandedColumns","expandedRows","hasExpandedRows","rowDescriptor","rowName","columnsInfo","rowsInfo","measuresAxis","axes","PivotTransport","discover","connection","PivotDataSource","cubes","catalogs","hierarchies","_cubeSchema","cubeBuilder","_measuresAxis","_skipNormalize","_axes","uniqueName","defaultHierarchy","restrictions","levelUniqueName","memberUniqueName","schemaData","dataGetter","_rawData","treeOp","childrenCardinality","dimensionUniqueName","hierarchyUniqueName","_clearAxesData","rowsAxisDescriptors","columnsAxisDescriptors","_expandPath","memberToExpand","_lastExpanded","_descriptorsForAxis","_updateLocalData","expandColumn","originalData","_processResult","processedData","columnIndexes","rowIndexes","resultAxis","axisToSkip","hasColumnTuples","_requestData","_rowMeasures","_normalizeTuples","_columnMeasures","_normalizeData","_mergeAxes","newData","_createTuple","buildRoot","_hasRoot","isRoot","sourceAxes","mergedColumns","mergedRows","columnMeasures","rowMeasures","oldRowsLength","newRowsLength","oldColumnsLength","newColumnsLength","_mergeColumnData","_mergeRowData","_addMissingDataItems","metadata","_normalizeOrdinals","lastOrdinal","schemaMeasures","catalogName","cubeName","schemaKPIs","kpis","schemaDimensions","schemaHierarchies","dimensionName","schemaLevels","schemaCubes","schemaCatalogs","schemaMembers","Catalog","originalOptions","displayFolder","defaultFormat","goal","trend","statusGraphic","trendGraphic","defaultMember","orderingProperty","_extend","fault","faultstring","faultcode","ordinalGetter","fmtValueGetter","_mapSchema","xmla","PivotSettingTarget","emptyTemplate","fieldMenu","PivotFieldMenu","setting","kendoSortable","_indexOf","_isKPI","isMeasure","sortExpressions","skipExpr","sortIcon","_sortIcon","columnBuilder","rowBuilder","_bindConfigurator","_createLayout","_columnBuilder","_rowBuilder","_contentBuilder","columnsHeader","rowsHeader","builder","childrenLoaded","maxChildren","configurator","columnHeaderTemplate","rowHeaderTemplate","dataCellTemplate","kpiStatusTemplate","kpiTrendTemplate","measureFields","columnFields","rowFields","dataTemplate","kendoPivotConfigurator","cellInfoByElement","cellInfo","contentBuilder","columnInfo","rowInfo","columnTuple","rowTuple","measuresTarget","rowsTarget","columnsTarget","_headerReflowTimeout","_stateResetHandler","_stateReset","_measureFields","_createSettingTarget","icons","_initSettingTargets","layoutTable","leftContainer","rightContainer","gridWrapper","columnsHeaderTree","rowsHeaderTree","contentTree","_setSectionsWidth","_setSectionsHeight","_columnHeaderReflow","columnTable","leftColumn","measureFieldsHeight","columnFieldsHeight","rowFieldsHeight","columnsHeight","firstRowHeight","secondRowHeight","calculatedWidth","_resetColspan","skipScrollbar","_colspan","_layoutTimeout","_axisMeasures","hasMeasure","columnAxis","_indexes","maxMembers","_colGroup","_rowLength","_buildRows","_normalize","cellIdx","tupleAll","_rowIndex","_row","rowKey","notFirst","measureRow","allCell","cellAttr","nextMember","cellChildren","memberCollapsed","rootLevelNum","maxcolSpan","allRow","firstMemberName","expandIconAttr","tuplePath","hasChild","axisInfo","axisInfoMember","skipChildren","firstEmpty","_buildRow","templateInfo","cellContent","startIdx","PivotExcelExporter","columnHeaderTable","rowHeaderTable","columnHeaderLength","rowHeaderLength","_cells","dataCallback","rowRows","columnHeaderRows","rowHeaderRows","contentRows","columnRows","VISIBILITY","KSTATEHOVER","HierarchicalDragAndDrop","hovered","_hint","hintText","_removeTouchHover","_hintStatus","newStatus","statusElement","dropHint","hoveredItem","itemTop","insertOnTop","insertOnBottom","addChild","itemData","allowedContainers","itemFromTarget","_lastHover","dropHintContainer","setStatus","dropPrevented","dropPositionFrom","setValid","newValid","contentChild","templateNoWith","insertAction","indexOffset","nodeData","NODE","_dataSourceMove","moveContents","spriteRe","updateNodeHtml","toggleButton","TreeView","nodeContents","nodeIcon","CHECK","INDETERMINATE","KTREEVIEW","ARIADISABLED","isDomElement","inferred","loadOnDemand","_dragging","_syncHtmlAndDataSource","checkChildren","updateIndeterminate","clickableItems","_toggleButtonClick","_checkboxChange","_checkboxLabelClick","_retryRequest","itemCheckbox","uidAttr","expandedAttr","checkboxesEnabled","animationOptions","hasCollapseAnimation","dragAndDrop","_hintText","statusClass","setStatusClass","destinationNode","dropPosition","triggerDragEnd","dragClue","treeview","fieldAccessor","_fieldAccessor","_checkboxes","groupLength","toggleButtonClass","silentRead","requestFailed","fieldBindings","_setChecked","datasource","_setIndeterminate","indeterminate","subnodes","_bubbleIndeterminate","isChecked","_clickTarget","_focusable","clickTarget","_nextVisible","_enabled","skipSelf","wrapperRe","itemRe","nextParent","_expanded","_previousVisible","shouldNavigate","wrapperClasses","groupElement","_nodes","_updateNodeClasses","textWrap","_processNodes","_insertNode","insertCallback","childrenData","updatedGroupLength","nodeHtml","_renderGroup","_updateNodes","setCheckedState","nodeWrapper","isCollapsed","findByUid","_appendItems","_refreshChildren","_refreshRoot","groupHtml","bubble","retryHtml","showProgress","loadingText","_objectOrSelf","referenceDataItem","destTreeview","destDataSource","loadPromise","_toObservableData","loadModel","keepData","prevSibling","findByText","expandPath","proceed","nodeIds","_parentIds","expandTo","findFilters","filterOperator","checkNodes","checkedNodeIds","checkedNodes","FILTER_ITEM","filterFields","include","ok","MENUTEMPLATE","_menuOpen","_initFilterForm","filterForm","filterProxy","_filterOperator","_filterValue","_updateFilterAriaLabel","_setFilterForm","_clearFilters","_convert","currentMember","selectedOperator","selectedOperatorName","includeWindow","WINDOWTEMPLATE","_applyIncludes","_closeWindow","_windowOpen","resultExpression","treeView","rootChecked","existingExpression","_treeViewDataSource","_createTreeView","LABELMENUTEMPLATE","isNonValueFilter","nonValueOperators","findFilterForField","BOOL","ENUM","FilterCell","viewModel","passedOptions","operatorVisible","_clearInProgress","updateDsFilter","initSuggestDataSource","_getColumnTitle","_setInputType","_createOperatorDropDown","_createClearIcon","setAutoCompleteSource","setComboBoxSource","_refreshUI","radioInput","inputName","labelTrue","labelFalse","operatorDropDown","autoComplete","comboBox","manuallyUpdatingVM","mergeResult","updateItemHtml","LINKSELECTOR","ITEM","GROUP","VISIBLEGROUP","ACTIVECLASS","GROUPS","CONTENTS","DISABLEDCLASS","SELECTEDCLASS","SELECTEDSELECTOR","HIGHLIGHTCLASS","ACTIVEITEMSELECTOR","disabledItems","selectableItems","defaultState","itemIcon","PanelBar","_first","_angularCompile","expandMode","_angularCompileElements","_angularCleanup","useAnimation","animBackup","_animating","_addGroupElement","_collapseAllExpanded","_toggleItem","rootItemsHtml","_toggleGroup","tempItem","_updateItems","_hasChildItems","currentNode","panelBar","skipChange","_updateSelected","isReferenceItem","_updateItemsClasses","panels","_updateItemClasses","wrapElement","_animationCallback","stopExpand","loadingIconTimeout","ACTIVATE_EVENTS","ResponsivePanel","_toggleHandler","_registerBreakpoint","_mediaQuery","_registerStyle","breakpoint","offsetDiff","dst","midnight","noon","TimeView","TimePicker","ARIA_ACTIVEDESCENDANT","_dates","_timeViewID","_heightHandler","dataBind","_html","msStart","lastIdx","msInterval","startDay","_distinctSelection","selectionIndex","timeView","lastTimeOption","timeFormat","ARIA_OWNS","dateViewParams","timeViewParams","DateTimePicker","_views","_icons","_midnight","_calculateMidnight","dateButtonText","timeButtonText","dateIcon","timeIcon","_timeIcon","secondView","minDateEqual","maxDateEqual","timeViewOptions","rebind","isDateViewVisible","adjustedDate","_timeSelected","isPercentageSize","percentageUnitsRegex","isPixelSize","pxUnitsRegex","isFluid","calculateSize","panePropertyAccessor","triggersResize","splitter","paneConfig","PANE","PaneResizing","horizontalDefaults","verticalDefaults","_createHint","LAYOUTCHANGE","KPANE","PANECLASS","Splitter","_dimension","_keys","decrease","increase","_resizeStep","_initPanes","_addOverlays","_panes","_removeOverlays","_togglePane","_detachEvents","panes","navigationKeys","isResizing","_triggerAction","panesConfig","_initPane","config","arrowType","_updateSplitBar","splitbar","previousPane","nextPane","catIconIf","iconType","prevCollapsible","prevCollapsed","nextCollapsible","nextCollapsed","_updateSplitBars","_removeSplitBars","sizedPanesWidth","sizedPanesCount","freeSizedPanes","freeSizePanesCount","freeSizePaneWidth","alternateSizingProperty","positioningProperty","sizingDomProperty","lastNonCollapsedPane","splitBars","splitBarsCount","sizingProperty","collapsedSize","_addPane","paneElement","referencePane","mousePositioningProperty","previousPaneConfig","nextPaneConfig","prevBoundary","nextBoundary","toPx","prevMinSize","prevMaxSize","nextMinSize","nextMaxSize","ghostPosition","previousPaneNewSize","nextPaneNewSize","fluidPanesCount","buttonKeyTrigger","PopupBox","Alert","kendoAlert","Confirm","kendoConfirm","Prompt","kendoPrompt","KDIALOG","KICONCLOSE","KCONTENTCLASS","KCONTENT","KTITLELESS","KDIALOGTITLE","KDIALOGTITLEBAR","KBUTTONGROUP","KALERT","KCONFIRM","KPROMPT","KTEXTBOX","INITOPEN","okText","promptInput","overlaySelector","DialogBase","_centerCallback","_center","wrapperTemplate","_createDialog","_defaultFocus","_triggerInitOpen","_focusDialog","closable","_closeClick","_closeKeyHandler","_setElementMaxHeight","_setElementHeight","paddingBox","elementMaxHeight","_paddingBox","_uiHeight","actionbar","actionbarHeight","titlebarHeight","_waiAriaOverlay","_removeWaiAriaOverlay","_overlayedNodes","jthis","hiddenValue","titlebarActions","titleId","_createActionbar","isStretchedLayout","buttonLayout","_addButtons","_normalizeButtonSize","btn","actionClick","_actionClick","actionKeyHandler","_actionKeyHandler","buttonSize","_mergeTextWithOptions","lastButton","closeBtn","actionButtons","_runActionBtn","preventClose","_openAnimationEnd","_initOpenTriggered","_stopCenterOnResize","_closeAnimationEnd","_centerOnResize","_trackResize","encodedHtml","Dialog","alertWrapper","_ensureContentId","_ariaDescribedBy","_initFocus","_chooseEntryFocus","alert","confirmDialog","_createPrompt","promptContainer","promptInputContainer","promptDialog","prompt","lastFrom","isPrimitive","getItemCount","listScreens","getDefaultItemHeight","mockList","bufferSizes","opposite","listValidator","downThreshold","upThreshold","lastScrollTop","scrollCallback","syncList","webkitTransform","map2","arr1","arr2","ITEMCHANGE","reshift","placeholderTemplate","GROUPITEM","isActivePromise","VIRTUALLIST","LIST","HEADER","VIRTUALITEM","HEIGHTCONTAINER","LISTBOUND","VIRTUAL_LIST_NS","_selectedDataItems","_selectedIndexes","_rangesList","_promisesList","_renderItems","_triggerListBound","oppositeBuffer","_selectProxy","_clean","_deferValueSet","_selectingValue","_createList","_forcePrefetch","shouldClear","_prefetchByValue","dataView","_dataView","forSelection","mapValueToIndex","mapValueToDataItem","deferredRange","itemCount","existingRange","isEmptyList","_activeDeferred","_getSkip","_findDataItem","_getRange","_getElementByIndex","_focusedIndex","_getElementLocation","_screenHeight","heightContainer","isAlreadySelected","prefetchStarted","_selectDeferred","_getIndecies","_deselectCurrentValues","_listCreated","_getElementByDataItem","_lastScrollTop","hasData","setScreenHeight","yPosition","yDownPostion","screenEnd","_generateItems","_saveInitialRanges","_buildValueGetter","_setHeight","getList","_listItems","_whenChanged","_reorderList","padHeight","lastRequestedRange","lastRangeStart","flatGroups","flatGroup","_getterDeferred","_indexConstraint","firstVisibleGroup","currentVisibleGroup","firstVisibleDataItemIndex","firstVisibleDataItem","_itemMapper","_currentGroup","_getDataItemsCollection","_listIndex","theValidator","theNew","currentOffset","list2","range2","_bufferSizes","buffers","selectedIndexes","removedindexesCounter","_deselectSingleItem","oldSkip","_clickHandler","firstItem","collect","cellspacing","allDayTable","timesHeader","columnLevelCount","allDaySlot","rowCount","datesHeader","columnLevels","columnLevelIndex","allDayTableRows","lastLevel","dateTableRows","rowLevels","rowLevelIndex","rowspan","allDay","scrollbarWidth","collidingEvents","overlaps","rangeIndex","eventsForSlot","slotStart","slotEnd","createColumns","eventElements","_createColumns","createRows","eventRange","endOverlaps","createDateLayoutConfiguration","configuration","minorTicks","createLayoutConfiguration","resources","resource","dataColorField","groupEqFilter","addSelectedState","selectedStateRegExp","HINT","ResourceView","_timeSlotCollections","_daySlotCollections","addTimeSlotCollection","endDate","_addCollection","addDaySlotCollection","collections","SlotCollection","timeSlotCollectionCount","daySlotCollectionCount","daySlotByPosition","byDate","_slotByPosition","timeSlotByPosition","collectionIndex","slotIndex","slot","nextSlot","horizontalEnd","verticalEnd","timeSlotRanges","_startSlot","_endSlot","_continuousRange","TimeSlotRange","daySlotRanges","isAllDay","DaySlotRange","tail","startSlot","endSlot","slotRanges","isDay","_startTime","_endTime","isMultiDay","_startCollection","startInRange","_endCollection","endInRange","_getCollections","continuousSlot","isDaySlot","firstSlot","lastSlot","upSlot","keepCollection","groupByDateVertically","moveToDaySlot","isFirstCell","_verticalSlot","downSlot","moveToTimeSlot","leftSlot","_horizontalSlot","rightSlot","swapCollection","_collection","multiday","slotByStartDate","slotByEndDate","getSlotCollection","getTimeSlotCollection","getDaySlotCollection","SlotRange","addEvent","outerRect","snap","startSlotDuration","endSlotDuration","innerRect","groupIndex","_slots","_groupIndex","_collectionIndex","allday","addTimeSlot","TimeSlot","addDaySlot","eventCount","DaySlot","Slot","firstChildHeight","firstChildTop","SchedulerView","_normalizeOptions","_resizeHint","_moveHint","_resourcesForGroups","_selectedSlots","setMilliseconds","workDayStart","workDayEnd","_isMobilePhoneView","_addResourceView","resourceView","dateForTitle","selectedDateFormat","shortDateForTitle","selectedShortDateFormat","_changeGroup","_isGroupedByDate","_changeDate","_changeGroupContinuously","_changeViewPeriod","_horizontalSlots","tempSlot","horizontalRange","_isVerticallyGrouped","_normalizeHorizontalSelection","_getNextHorizontalRange","_continuousSlot","_verticalSlots","verticalRange","_normalizeVerticalSelection","_getNextVerticalRange","constrainSelection","slots","verticalByDate","_updateDirection","moveToEventInGroup","selectedEvents","_continuousEvents","moveToEvent","allEvents","uniqueAllEvents","sortedEvents","eventIndex","_getAllEvents","_getUniqueEvents","_getSortedEvents","_getNextEventIndexBySlot","_getStartIdx","_getSelectedSlot","_selectEvents","_selectSlots","eventStartDate","tempIndex","slotStartDate","selectedEventIndex","exists","firstStartDate","secondStartDate","groupEvents","_resourceValue","_resourceBySlot","resourceIndex","groupedResources","_createResizeHint","_removeResizeHint","_removeMoveHint","_shouldInverseResourceColor","resourceColorIsDark","isDark","currentColor","currentColorIsDark","_eventTmpl","eventResources","eventResource","resourceColor","createLayout","allDayIndex","_topSection","_bottomSection","refreshLayout","datesHeaderRows","isSchedulerHeightSet","timesTable","headerHeight","paddingDirection","_createDateLayout","_createColumnsLayout","_groupOrientation","_createRowsLayout","selectionByElement","prevGroupSlot","nextGroupSlot","_eventOptionsForMove","_updateEventForResize","_updateEventForSelection","brightnessValue","addContinuousEvent","lastEvent","getWorkDays","workDays","dayIndex","workWeekStart","workWeekEnd","CURRENT_TIME_MARKER_CLASS","CURRENT_TIME_MARKER_ARROW_CLASS","BORDER_SIZE_COEFF","DAY_VIEW_EVENT_TEMPLATE","DAY_VIEW_ALL_DAY_EVENT_TEMPLATE","DATA_HEADER_TEMPLATE","ALLDAY_EVENT_WRAPPER_STRING","EVENT_WRAPPER_STRING","MultiDayView","_workDays","calculateDateRange","_currentTime","_currentTimeMarkerUpdater","_updateCurrentTimeMarker","timezoneOffset","firstTimesCell","lastTimesCell","currentGroup","utcCurrentTime","slotElement","elementHtml","timesTableMarker","markerTopPosition","timesTableMarkerCss","currentTimeMarker","useLocalTimezone","setUpdateTimer","markerOptions","updateInterval","_currentTimeUpdateTimer","_updateResizeHint","slotIdx","_updateMoveHint","_createEventElement","_appendMoveHint","_groupCount","_columnCountForLevel","_rowCountForLevel","_columnOffsetForResource","_columnCountInResourceView","_timeSlotGroups","groupCount","rowMultiplier","cellMultiplier","timeIndex","_timeSlotInterval","verticalViews","_addTimeSlotGroup","_addDaySlotGroup","_daySlotGroups","showWorkHours","minorTickCount","majorTick","majorTimeHeaderTemplate","minorTimeHeaderTemplate","slotTemplate","allDaySlotTemplate","eventTemplate","allDayEventTemplate","dateHeaderTemplate","showFullDay","showWorkDay","_touchEditable","_mouseEditable","resourceInfo","eventInfo","_addUserEvents","_allDayUserEvents","_editUserEvents","_forTimeRange","middleRow","lastSlotRow","isWorkDay","msMajorInterval","majorTickDivider","isMajorTickRow","isMiddleRow","isLastSlotRow","allDayVerticalGroupRow","appendRow","isVerticalGroupped","dateID","dateGroupIndex","dateIndex","_addCellsToContent","tmplDate","_isWorkDay","allDayHeader","_startDate","_endDate","_allDayHeaderHeight","additioanlWidth","additionalHeight","nextDate","previousDate","_timeSlotIndex","eventStartTime","timeSlotInterval","_slotIndex","_dateSlotIndex","_positionAllDayEvent","slotRange","rowEvents","eventLength","slotWidth","allDayEvents","currentColumnCount","_headerColumnCount","leftOffset","rightOffset","eventHeight","_arrangeColumns","eventRightOffset","columnEvents","slotEvents","_positionEvent","isOneDayEvent","middle","eventEndDate","_time","eventEndTime","singleDay","inverseColor","_isInTimeSlot","slotStartTime","slotEndTime","_date","_isInDateSlot","_updateAllDayHeaderHeight","allDaySlots","_renderEvents","isMultiDayEvent","occurrence","newEnd","dateRange","allDayEventContainer","eventsByResource","eventsPerDate","_eventsByResource","itemIdx","eventsFilteredByResource","columnLevel","rowLevel","endMilliseconds","DayView","WeekView","selectedDate","WorkWeekView","weekStart","tasks","resourceValue","flattenTaskGroups","flattenGroup","EVENT_WRAPPER_FORMAT","AgendaGroupedView","_getColumns","groupHeaders","_getGroupsInDay","_getSumOfItemsForDate","_renderTaskGroupsCells","headerCells","taskGroupIndex","taskIndex","_renderDateCell","tableRow","tasksGroups","_dateTemplate","_renderDates","_getParents","parentGroups","_getGroupsByDate","_renderTaskGroups","AgendaGroupedByDateView","columnsWithoutDate","_compareDateGroups","tasksGroupIdx","itemsIdx","lastItemValue","groupsInDay","sumOfItemsForDate","groupsRowSpanIndex","isPhoneView","_groupTemplate","sortedArray","_groupsByDate","dateExists","AgendaView","_groupedView","_getGroupedView","delete","_eventTemplate","eventDateTemplate","eventGroupTemplate","_timeTemplate","eventTimeTemplate","_renderLayout","_tasks","eventDurationInDays","task","_createGroupConfiguration","_renderGroups","_eventsList","firstVisibleMonthDay","NUMBER_OF_ROWS","NUMBER_OF_COLUMNS","DAY_TEMPLATE","EVENT_TEMPLATE","MORE_BUTTON_TEMPLATE","MonthGroupedView","_verticalRowCountForLevel","_horizontalGroupCountForLevel","_getCalendarRowsLength","_createRows","horizontalGroupCount","verticalGroupIndex","isVerticallyGrouped","_createRow","_adjustStartDate","_getContent","_getTimeSlotByPosition","_nextSlotStartDate","_createVerticalColumnsLayout","_verticalGroupCount","_horizontalGroupCount","isMobilePhoneView","_positionMobileEvent","_addDaySlotCollections","_changePeriodGroupIndex","_appendResizeHint","_createMoveHint","MonthGroupedByDateView","verticalStart","dateIdx","isLastRow","subColumns","currentSlot","currentTableIndex","currentCellIndex","currentGroupIndex","selectionGroupIndex","MonthView","isSameSlot","isSameCollection","updateDirection","lastGroupIndex","dayTemplate","_firstDayOfMonth","_lastDayOfMonth","verticalGroupIdx","verticalGroupCount","groupedView","_createCalendar","calendarRowsLength","weekStartDates","_slotIndices","_weekStartDates","weekDayNames","eventTop","more","moreButtonHeight","intervalExcess","excess","dayInYear","leapYear","DAYS_IN_LEAPYEAR","DAYS_IN_YEAR","weekInMonth","firstWeekDay","firstWeekLength","normalizeDayIndex","weekDay","normalizeOffset","lastDate","weeksInMonth","skipFirst","skipLast","numberOfWeeks","isInWeek","ruleWeekValues","weekDays","ruleWeekOffset","currentDay","ruleValues","ruleValue","availableRules","parseArray","numberSortPredicate","parseWeekDayList","WEEK_DAYS_IDX","serializeWeekDayList","valueString","WEEK_DAYS","getMonthLength","MONTHS","parseExceptions","exceptions","parseUTCDate","isException","dateTime","toExceptionString","RECURRENCE_DATE_FORMAT","startPeriodByFreq","freq","endPeriodByFreq","eventsByPosition","periodEvents","periodEventsLength","removeExceptionDates","exceptionDates","durationMS","startPeriod","inPeriod","ruleStart","ruleEnd","useEventStart","freqName","eventStartMS","eventStart","currentIdx","parseRule","recurrenceRule","recurrenceException","exdates","frequencies","_startPeriod","kendoDate","_endPeriod","toOccurrence","DATE_FORMATS","parseDateRule","dateRule","tzid","pairs","recur","splits","day1","day2","monthDays","yearDays","weeks","_hasRuleValue","serializeDateRule","ruleString","weekDayCheckBoxes","RECURRENCE_VIEW_TEMPLATE","DAY_RULE","WEEKDAY_RULE","WEEKEND_RULE","BaseRecurrenceEditor","RecurrenceEditor","RECURRENCE_HEADER_TEMPLATE","RECURRENCE_REPEAT_PATTERN_TEMPLATE","RECURRENCE_END_PATTERN_TEMPLATE","RECURRENCE_GROUP_BUTTON_TEMPLATE","MobileRecurrenceEditor","SU","MO","TU","WE","FR","SA","RULE_NAMES","RULE_NAMES_LENGTH","limitation","monthRules","monthLength","monthDay","yearDay","week","weekDayRule","weekDayRules","hourRules","startHours","minuteRules","currentMinutes","secondRules","BaseFrequency","_hour","firstRule","startTimeHours","normalizedCurrentIndex","normalizedStartIndex","frequency","_getNumberOfWeeksBetweenDates","exactWeeks","HourlyFrequency","DailyFrequency","WeeklyFrequency","MonthlyFrequency","YearlyFrequency","hourly","daily","weekly","monthly","yearly","recurrence","_namespace","recurrenceEditorTitle","never","repeatEvery","repeatOn","mobileLabel","offsetPositions","fourth","weekdays","weekend","_initInterval","_weekDayRule","_weekDay","_weekDayOffset","_weekDayView","weekDayOffset","weekDayValue","weekDayOffsetWidget","_initWeekDay","weekdayMessage","offsetMessage","weekDayInput","dayName","_initWeekDays","_initMonthDay","monthDayInput","_monthDay","_initCount","_count","_initUntil","_until","_initFrequency","_initContainer","_frequency","_initView","ddl","_initMonth","_period","monthInputs","monthName","_month1","_month2","endRule","_toggleEnd","_buttonNever","_buttonCount","_buttonUntil","toggleRule","_toggleMonthDay","_toggleYear","radioButtons","_buttonMonthDay","_buttonWeekDay","enableCount","enableUntil","monthRule","enableMonthDay","enableWeekDay","yearRule","enableMonth1","enableMonth2","_optionTemplate","_pane","_initRepeatButton","_initRepeatEnd","_defaultValue","endTitle","repeatTitle","headerTitle","repeatBy","dayOfMonth","_destroyView","_endFields","_repeatButton","endLabelField","endEditField","_endButton","_endText","frequencyMessages","_initRepeatView","_initEndNavigation","endMessages","_initEndView","viewType","returnViewId","endPattern","weekDaySelect","monthSelect","_monthSelect","repeatRuleGroupButton","weekDayView","monthDayView","weekDayName","setColspan","endPosition","rectLeft","rectRight","TimelineView","SCHEDULER_HEADER_WRAP_CLASS","TimelineGroupedView","_hideHeaders","_setColspan","timeColumn","_getRowCount","_getGroupsCount","_addContent","isVerticalGrouped","_addTimeSlotsCollections","datesCount","cellsPerGroup","cellsPerDay","cellOffset","_addTimeSlotToCollection","_getVerticalGroupCount","_getVerticalRowCount","eventGroups","maxRowCount","_renderEvent","eventGroup","adjustedEvent","eventObject","_arrangeRows","_verticalCountForLevel","_horizontalCountForLevel","_updateCurrentVerticalTimeMarker","_adjustLeftPosition","_prevGroupSlot","_nextGroupSlot","_verticalMethod","_isHorizontallyGrouped","_changeVerticalViewPeriod","_changeHorizontalViewPeriod","TimelineGroupedByDateView","isMajorTickColumn","isMiddleColumn","isLastSlotColumn","minorTickColumns","workDateIndex","tempStart","eventObjects","startEnd","eventMinWidth","defaultRowText","_calculateSlotRanges","_slotRanges","isLastMajorSlot","minorTickIndex","timeColumns","minorTickSlots","middleColumn","lastSlotColumn","minorSlotsCount","_setRowsHeight","_positionEvents","eventsForGroup","eventUid","rowsCount","timesRow","eventBottomOffset","_getBottomRowOffset","_refreshSlots","minOffset","maxOffset","slotsCollection","offsetRight","_adjustEvent","adjustedStartDate","adjustedEndDate","clonedEvent","eventDuraton","startRect","TimelineWeekView","TimelineWorkWeekView","TimelineMonthView","timezoneButtonText","startTimezone","endTimezone","appendTimezoneAttr","appendDateCompareValidator","dateCompareRule","validationRules","convertData","wrapDataSerialization","removeUid","getOccurrenceByUid","applyZone","fromZone","toZone","dateCompareValidator","startInput","endInput","startPicker","endPicker","expandAll","trimOptions","createValidationAttributes","datatype","dropDownResourceEditor","descriptionEditor","multiSelectResourceEditor","kendoMultiSelect","multiSelectResourceEditorMobile","moveEventRange","MobileEditor","PopupEditor","Scheduler","defaultViews","SCHEDULER_EXPORT","TimezoneEditor","ZONETITLEOPTIONTEMPLATE","ZONEOPTIONTEMPLATE","MobileTimezoneEditor","input_support","valueStartEndBoundRegex","EXCEPTION_SEPARATOR","OLD_EXCEPTION_SEPARATOR_REGEXP","RECURRENCE_EXCEPTION","DELETERECURRING","EDITRECURRING","DELETERECURRINGCONFIRM","DELETESERIESCONFIRM","VIEWBUTTONTEMPLATE","TOOLBARTEMPLATE","MOBILETOOLBARTEMPLATE","MOBILEDATERANGEEDITOR","datepicker_role","datetimepicker_role","dateTimeValidate","dateValidate","DATERANGEEDITOR","RECURRENCEEDITOR","kendoRecurrenceEditor","MOBILERECURRENCEEDITOR","kendoMobileRecurrenceEditor","MOBILETIMEZONEPOPUP","noTimezone","TIMEZONEPOPUP","timezoneEditorButton","MOBILETIMEZONEEDITOR","kendoMobileTimezoneEditor","TIMEZONEEDITOR","kendoTimezoneEditor","SchedulerDataReader","SchedulerEvent","fieldTime","updateUid","recurrenceId","isOccurrence","isRecurring","isRecurrenceHead","SchedulerDataSource","_removeExceptionDate","_pushCreated","_addExceptionDate","_removeExceptions","replaceRegExp","newException","timezonePopUp","multipleResources","desktop","toggleDateValidationHandler","_toggleDateValidation","isDateTimeInput","shouldValidate","_initTimezoneEditor","allDayEvent","windows_zones","repeat","recurrenceEditor","_buildEditTemplate","editableFields","separateTimezones","_createEndTimezoneButton","_revertTimezones","_startTimezone","_endTimezone","_actionSheetButtonTemplate","timezoneView","endTimezoneRow","startTimezoneChange","timezoneTitle","_createActionSheetButton","showDialog","buttonIndex","kendoMobileActionSheet","editEvent","removeText","titleText","editorTitle","deleteText","_timezonePopup","getKendoWindow","activator","saveButton","cancelButton","timezonePopup","timezoneEditorTitle","_initModel","_resources","_movable","_bindResize","_createEditor","_unbindResize","eventsCount","sortedData","eventsUids","eventsUidsLength","_groupsByResource","groupsArray","parentFieldValue","prevIndex","fieldValue","selectedGroups","groupsByResource","_selectedEvents","collIdx","dayCollIdx","eventsLength","_createSelection","mouseMoveHandler","selectEvent","isRight","_selectFirstSlot","_ctrlKey","_shiftKey","currentUid","labelFormat","ariaEventLabel","ariaSlotLabel","uids","occurrenceByUid","_moveTimer","_viewByIndex","removeEvent","_adjustSelectedDate","deleteWindowTitle","workWeek","agenda","timeline","timelineWeek","timelineWorkWeek","timelineMonth","recurrenceMessages","deleteWindowOccurrence","deleteWindowSeries","editWindowTitle","editWindowOccurrence","editWindowSeries","_moveDraggable","_resizeDraggable","originSlot","endResources","startResources","updatedEventOptions","eventOptions","_updateEvent","k-resize-e","k-resize-w","k-resize-n","k-resize-s","originalEnd","updateEvent","_preventRefresh","_convertDates","recurrenceHead","updateSeries","updateOccurrence","exception","_showRecurringDialog","editRecurring","occurrenceText","seriesText","_isEditorOpened","deleteRecurringConfirmation","deleteSeriesConfirmation","cancelEvent","_editEvent","saveEvent","_editRecurringDialog","editOccurrence","editSeries","editRecurringMode","_deleteRecurringDialog","_removeEvent","occurrencesInRange","deleteOccurrenceConfirmation","seriesCallback","occurrenceCallback","currentModel","deleteOccurrence","deleteSeries","deleteRecurring","_unbindView","_bindView","_viewRemoveHandler","_viewAddHandler","_viewEditHandler","_viewNavigateHandler","switchWorkDay","_workDayMode","_selectView","_viewActivateHandler","viewButton","viewButtons","_selectedView","_renderView","_selectedViewName","_viewsCount","viewName","_initializeView","isSettings","hasType","formattedDate","formattedShortDate","viewsCount","_showCalendar","hover","slotByPosition","slotByElement","resourcesBySlot","zones_titles","_zonesQuery","_zoneTitleId","_zoneTitlePicker","_zonePicker","_zoneTitle","_zone","zoneTitle","other_zone","_bindZones","zonePicker","zone_value","MAX_DOUBLE_TAP_DISTANCE","eventProxy","_triggerTouch","gestureEventProxy","gestureend","enableSwipe","minXDelta","maxYDelta","maxDuration","doubleTapTimeout","lastTap","_swipestart","_swipemove","createPlaceholders","kendoDomElement","blurActiveElement","kendoDom","kendoTextElement","titleFromField","parentId","orderId","SIZE_CALCULATION_TEMPLATE","listStyles","gridHeader","gridHeaderWrap","gridContent","gridContentWrap","iconCollapse","iconExpand","iconHidden","iconPlaceHolder","resizeHandleInner","dropPositions","dropTop","dropBottom","dropAdd","dropMiddle","dropDenied","dragStatus","dragClueText","GanttList","_domTrees","_adjustHeight","headerCols","tableCols","_reorderDraggable","_tableDropArea","_contentDropArea","_columnResizable","headerTree","calculateRowHeight","domTree","_cols","_ths","tableAttr","_trs","data-field","data-title","_levels","data-uid","data-level","_tds","_td","formatedValue","resourcesField","aria-label","selectedClassName","_setDataSource","iconSelector","finishEdit","_closeCell","_startEditHandler","_columnFromElement","_editCell","_editableContainer","kendoTouch","doubletap","modelCopy","FORMAT","_editableContent","kendoDateTimePicker","cancelUpdate","taskInfo","updateInfo","draggedTask","dropAllowed","allowDrop","taskParent","defineLimits","beforeLimit","afterLimit","defineAction","coordinate","kendoDropTargetArea","positionResizeHandle","colSelector","minColumnWidth","timelineStyles","GanttTimeline","kendoHtmlElement","DBLCLICK","MOUSEMOVE","TIME_HEADER_TEMPLATE","DAY_HEADER_TEMPLATE","WEEK_HEADER_TEMPLATE","MONTH_HEADER_TEMPLATE","YEAR_HEADER_TEMPLATE","RESIZE_HINT","RESIZE_TOOLTIP_TEMPLATE","PERCENT_RESIZE_TOOLTIP_TEMPLATE","TASK_TOOLTIP_TEMPLATE","viewStyles","nonWorking","tasksWrapper","rowsTable","columnsTable","tasksTable","dependenciesWrapper","resourceAlt","taskSingle","taskMilestone","taskSummary","taskWrap","taskMilestoneWrap","resourcesWrap","taskDot","taskDotStart","taskDotEnd","taskDragHandle","taskContent","taskTemplate","taskActions","taskDelete","taskComplete","taskDetails","taskDetailsPercent","iconDelete","taskResizeHandle","taskResizeHandleWest","taskResizeHandleEast","taskSummaryProgress","taskSummaryComplete","lineHorizontal","lineVertical","arrowWest","arrowEast","dragHint","dependencyHint","tooltipWrapper","tooltipContent","tooltipCallout","marquee","marqueeColor","GanttView","_headerTree","_taskTree","taskTree","_taskTemplate","_dependencyTree","dependencyTree","_taskCoordinates","headerRow","_dragHint","_resizeTooltip","_taskTooltip","_percentCompleteResizeTooltip","showWorkDays","hourSpan","slotSize","renderLayout","_createSlots","_tableWidth","_calculateTableWidth","_slotDimensions","_headers","_colgroup","_timeSlots","taskCount","_rowsTable","_columnsTable","_tasksTable","calculatedSize","_contentHeight","_renderCurrentTime","_createTable","slotSpan","slotsCount","totalSpan","isNonWorking","resourcesPosition","resourceStyle","_calculateMilestoneWidth","milestoneWidth","resourcesMargin","_calculateResourcesMargin","taskBorderWidth","_calculateTaskBorderWidth","addCoordinates","taskLeft","taskRight","isMilestone","_taskPosition","_renderTask","_renderResources","currentSpan","maxSpan","boundingClientRect","milestone","taskWrapper","taskElement","progressHandleOffset","dragHandleStyle","taskWrapAttr","_renderSummary","_renderMilestone","_renderSingleTask","dependencyCreate","dragPercentComplete","progressWidth","taskChildren","startLeft","endLeft","slotDuration","slotOffset","endIdx","_timeByPosition","snapToEnd","_renderDependencies","_renderDependency","predecessor","predecessorId","successor","successorId","_renderFF","_dependencyFF","_renderSS","_renderFS","_dependencyFS","_renderSF","overlap","arrowOverlap","minLineWidth","fromTop","toTop","addHorizontal","_line","addVertical","minLineHeight","minDistance","_createDragHint","_updateDragHint","_removeDragHint","tooltipHeight","tooltipTop","taskTop","resizeTooltipFormat","_resizeTooltipWidth","_resizeTooltipTop","resizeStart","tooltipLeft","tablesWidth","tooltipWidth","tableOffset","_updatePercentCompleteTooltip","tooltipMiddle","arrowHeight","_removePercentCompleteTooltip","_updateDependencyDragHint","useVML","_removeDependencyDragHint","_creteVmlDependencyDragHint","_creteDependencyDragHint","transform-origin","-ms-transform-origin","-webkit-transform-origin","-ms-transform","outerHTML","_createTaskTooltip","mouseLeft","contentOffset","contentScrollLeft","rowOffset","_removeTaskTooltip","elementLeft","elementWidth","elementRight","rowTop","rowBottom","contentTop","contentBottom","contentLeft","contentRight","_scrollToDate","viewStart","viewEnd","headerText","levelIndex","levelCount","_hours","isWorkHour","_days","_weeks","daySlots","_months","endMonth","_years","monthSpan","_slotHeaders","_getCurrentTime","tablesWrap","GanttDayView","timeHeaderTemplate","dayHeaderTemplate","optionsRange","daySlot","hourSlots","GanttWeekView","weekHeaderTemplate","endDay","GanttMonthView","monthHeaderTemplate","GanttYearView","yearHeaderTemplate","monthSlots","taskWrapActive","_percentResizeDraggable","_createDependencyDraggable","_percentDraggable","_dependencyDraggable","calculatedRowHeight","calculatedCellHeight","_calculatedSize","startOrder","endOrder","_taskByUid","currentStart","cleanUp","dragInProgress","updateHintDate","currentEnd","taskElementOffset","timelineOffset","originalPercentWidth","maxPercentWidth","currentPercentComplete","updateElement","originalHandle","startX","startY","hoveredHandle","hoveredTask","toggleHandles","tablesOffset","currentX","currentY","fromStart","selectDependency","selectedDependency","dependencyDestroy","currentMousePosition","tooltipOptions","scrollPositions","scrollableParents","GanttTask","GanttDataSource","ResourceEditor","Gantt","supportsMedia","defaultIndicatorWidth","PERCENTAGE_FORMAT","ARIA_DESCENDANT","ACTIVE_CELL","ACTIVE_OPTION","TASK_DELETE_CONFIRM","DEPENDENCY_DELETE_CONFIRM","TOGGLE_BUTTON_TEMPLATE","BUTTON_TEMPLATE","COMMAND_BUTTON_TEMPLATE","HEADER_VIEWS_TEMPLATE","TASK_DROPDOWN_TEMPLATE","RESOURCESEDITOR","assignButton","ganttStyles","listWrapper","timelineWrapper","splitBarWrapper","splitBar","splitBarHover","popupList","buttonDelete","buttonCancel","buttonSave","buttonToggle","editForm","formContainer","resourcesFormContainer","buttonsContainer","editField","editLabel","headerWrapper","footerWrapper","viewsWrapper","iconPlus","iconPdf","iconToggle","viewButtonDefault","pdfButton","appendButton","TaskDropDown","appendButtonSelector","aria-activedescendant","listOuterWidth","_focusTimeout","createDataSource","GanttDependency","GanttDependencyDataSource","successors","_dependencies","predecessors","taskAllChildren","_childRemoved","_toGanttTask","taskSiblings","_reorderSiblings","_resolveSummaryFields","taskId","taskLevel","offsetChildren","parentTask","modelChangeHandler","_resolveSummaryStart","_resolveSummaryEnd","_resolveSummaryPercentComplete","_updateSummary","getSummaryStart","currentMin","_updateSummaryRecursive","getSummaryEnd","currentMax","getSummaryPercentComplete","oldOrderId","childCount","popupStyles","editTask","editableWidget","_attachHandlers","_dettachHandlers","_cancelProxy","_saveProxy","_save","_updateModel","resourcesEditorTitle","_resourceGrid","_createButtons","resourcesHeader","unitsHeader","_timeline","_adjustDimensions","_assignments","_dropDowns","_dataBind","assignments","deleteTaskConfirmation","deleteDependencyConfirmation","deleteTaskWindowTitle","deleteDependencyWindowTitle","_dependencyRefreshHandler","_dependencyErrorHandler","footerDropDown","headerDropDown","removeListener","_mediaQueryHandler","selectedView","splitBarHandleClassName","viewsSelector","pdfSelector","toggleSelector","treelist","hoveredClassName","actionsWrap","max-width","matchMedia","addListener","listSelector","timelineSelector","splitBarSelector","toolbarHeight","splitBarWidth","treeListWidth","scrollTarget","actionsSelector","actionMessages","_createTask","toggleButtons","restoreFocus","_cachedCurrent","_createResourceEditor","_updateTask","currentViewSelector","_createDependency","removeTask","removeDependency","refreshDependencies","dataFormatField","_assignmentsRefreshHandler","dataTaskIdField","dataResourceIdField","_createPopupButton","cancelTask","saveTask","_onDialogClose","_resourceEditor","_wrapResourceData","_updateAssignments","setDependenciesDataSource","assignment","resourceId","hasMatch","_updateAssignment","_removeAssignment","_createAssignment","taskCopy","_editTask","_syncDataSource","resourceValueField","_taskConfirm","_removeTask","_scrollToUid","_preventDependencyRefresh","_dependencyConfirm","_removeDependency","_removeTaskDependencies","_removeTaskAssignments","_confirm","scrollToUid","cachedUid","cachedIndex","_assignResources","groupAssigments","assigments","applyTaskResource","wrapTask","resourcedId","taskAssignments","valuePerResource","timelineWidth","timelineScroll","treeListWrapper","headerSelector","timelineHeader","timelineContent","treeListHeader","treeListContent","expandState","moveVertical","subling","moveHorizontal","toggleExpandedState","deleteAction","selectedTask","isCell","listClass","TreeListDataSource","TreeList","PARENTIDFIELD","gridToolbar","gridFilter","withIcon","iconFilter","createchild","TreeListModel","parentIdField","fromModel","_replaceData","sourceLength","_defaultParentId","_subtree","_childrenMap","_filterCallback","defaultParentId","subtree","hasLoadedChildren","_modelLoaded","_modelError","requestParams","defaultPromise","rootId","_byParentId","defaultId","rootNodes","baseFilter","createEditable","_isEditable","formContent","_appendTemplate","_appendFields","_appendButtons","fieldRenderer","commandRenderer","_hasLockedColumns","itemFor","lockedDiv","_showStatus","_cancelEditor","_angularFooters","allAggregates","footerRows","_footerItems","_angularFooter","_contentTree","_lockedContentTree","_hideStatus","isHeightSet","contentWrap","_destroyEditor","_autoExpandable","_dataSourceFetchProxy","_statusTree","_lockedHeaderColsTree","_lockedContentColsTree","_lockedHeaderTree","noRows","_toggleChildren","retryButton","_commandClick","_commandByName","currentName","_ensureExpandableColumn","expandableColumns","expandable","_lockedColumns","_nonLockedColumns","_columnTemplates","_columnAttributes","convertStyle","declaration","camelCase","_initVirtualTrees","_renderCols","_headerColsTree","_contentColsTree","_buildCommands","_templateColumns","_flushCache","_absoluteIndex","lockedHeaderRows","cellClasses","headerContent","lockedWidth","nonLockedWidth","_edit","_hasFooterTemplate","data-parentId","_footerTd","renderer","_cellContent","_button","data-command","_positionResizeHandle","filterMenuInstance","_selectableTarget","ds","_cancelEdit","_insertAt","_toggleColumnVisibility","_findColumn","_adjustTablesWidth","_allowDragOverContainers","nonLockedColumnsLength","initHandler","_columnMenuInit","lockedColumnsLength","sqr","renderSize","renderPos","romanToArabic","memoize","isUnicodeLetter","RX_UNICODE_LETTER","CODE","UCS2","readChar","croak","msg","readWhile","pred","readAsciiWhile","skipWhitespace","eat","isDigit","isHexDigit","isNameStart","isName","xmlComment","END_COMMENT","xmlTag","QUESTION_MARK","xmlDecl","START_COMMENT","xmlName","xmlAttrs","END_SHORT_TAG","GREATER_THAN","xmlContent","END_TAG","START_CDATA","END_CDATA","LESS_THAN","AMPERSAND","xmlEntity","xmlString","QUOTE","APOSTROPHE","LOWERCASE_X","UPPERCASE_X","ENTITIES","SEMICOLON","END_DECLARATION","$tag","EQUAL","arg2","exit","EXIT","amp","quot","apos","nbsp","copyToClipboard","TargetValueCommand","PropertyChangeCommand","ApplyFilterCommand","DeleteCommand","AddCommand","NameCommand","_workbook","_property","_setRange","setState","getState","_forEachCell","_ref","toRangeRef","ColumnWidthCommand","RowHeightCommand","HyperlinkCommand","_prevLink","_prevUnderline","_hasSetValue","GridLinesChangeCommand","skipHiddenCells","ClearContentCommand","clearContent","EditCommand","rejectState","validationState","reason","_adjustRowHeight","_getValidationState","calc","ParseError","TextWrapCommand","forEachRow","AdjustDecimalsCommand","_decimals","forEachCell","adjustDecimals","BorderChangeCommand","_type","_style","_batch","noBorders","insideBorders","outsideBorders","allBorders","leftBorder","rightBorder","rightColumn","topBorder","topRow","bottomRow","insideHorizontalBorders","insideVerticalBorders","MergeCellCommand","activeCell","unmerge","horizontally","vertically","forEachColumn","FreezePanesCommand","_topLeft","unfreeze","PasteCommand","_event","activeSheet","pasteRef","canPaste","menuInvoked","pasteOnMerged","pasteOnDisabled","AdjustRowHeightCommand","ToolbarPasteCommand","CopyCommand","canCopy","multiSelection","ToolbarCopyCommand","CutCommand","AutoFillCommand","_origin","fillFrom","FillError","ToolbarCutCommand","FilterCommand","hasFilter","SortCommand","ascending","expandRange","cantSort","_sheetRef","filterRule","valueFilter","ValueFilter","customFilter","CustomFilter","ClearFilterCommand","HideLineCommand","setAxisState","getAxisState","axisManager","hideSelectedRows","hideSelectedColumns","UnHideLineCommand","unhideSelectedRows","unhideSelectedColumns","deleteSelectedRows","deleteSelectedColumns","AddColumnCommand","preventAddColumn","AddRowCommand","preventAddRow","EditValidationCommand","OpenCommand","cannotUndo","fromFile","excelImportErrors","openDialog","SaveAsCommand","_name","nameDefinition","recalc","DefineNameCommand","defineName","DeleteNameCommand","undefineName","FormulaBar","formulaInput","FormulaInput","isOpenParen","isCloseParen","isMatchingParen","knownFunction","runtime","FUNCS","isEqualToken","tok1","tok2","KEY_NAMES","PRIVATE_FORMULA_CHECK","27","32","autoScale","_highlightedRefs","_staticTokens","_formulaSource","_formulaList","scalePadding","getPos","lookup","lookupNode","sel","focusOffset","setPos","differ","currentRange","eiv","home","formulaSource","_formulaListChange","activeToken","completion","tokenCtx","_tokenContext","nextToken","_replaceAt","_focusId","_isFormula","_navigated","_keyDownTimeout","_syntaxHighlight","getData","tokenize","_sync","_editorToSync","_cellTooltip","toggleTooltip","rectangle","canInsertRef","isKeyboardAction","_canInsertRef","afterPoint","canReplace","canInsertBetween","strictMode","refAtPoint","simplify","setSheet","syncWith","iehandler","highlightedRefs","refClasses","series","refIndex","parens","colorClass","_setStaticTokens","insertNewline","Mac","isAlphaNum","keyName","EventListener","13","46","113","_observer","keyDownProxy","mouseProxy","_pressLocation","handleEvent","rightClick","catchAllHandler","eventKey","mod","passThrough","NilNode","RangeTreeNode","heir","intersecting","RangeTree","RangeList","Iterator","SparseRangeList","findrange","firstRange","rangeValue","expandedValues","sortedIndices","valueComparer","sourceStart","sourceEnd","targetStart","ValueRange","toExcelFormat","Property","JsonProperty","ValueProperty","dateToNumber","PropertyBag","specs","serializable","depends","spec","fromJSON","si","iter","iterators","addBorder","hBorders","leftBorders","rightBorders","forEachProperty","ALL_PROPERTIES","columnName","displaySheet","displayRef","aa","Ref","NameRef","CellRef","RangeRef","UnionRef","hasSheet","_hasSheet","absolute","toRow","toColumn","rangeAt","nextRangeIndex","previousRangeIndex","refs1","refs2","refs","replaceAt","forEachColumnIndex","forEachAxisIndex","forEachRowIndex","renameSheet","oldSheetName","newSheetName","trow","tcol","arow","acol","forRow","endSheet","_containsCell","_intersectRange","a_left","a_top","a_right","a_bottom","b_left","b_top","b_right","b_bottom","rr1","rc1","rr2","rc2","changes","relTL","relBR","toCell","startRow","endRow","startCol","endCol","topLeftRow","topLeftCol","bottomRightRow","bottomRightCol","theRef","newRefs","NULLREF","SHEETREF","FIRSTREF","AutoFillCalculator","_grid","rectIsVertical","endRect","autoFillDest","quadrant","pivot","cornerResult","further","EdgeNavigator","SheetNavigator","rangeGetter","prevLeft","prevVisible","nextRight","nextVisible","nextLeft","prevRight","_sheet","autoFillCalculator","colEdge","columnRange","rowEdge","rowRange","_viewPortHeight","unionWithMerged","leftCol","rightCol","selectionIncludesMergedCells","_mergedCells","setSelectionValue","addToExisting","refForMode","rowRef","colRef","startSelection","startAutoFill","completeSelection","selectForContextMenu","modifySelection","scrollInto","newSelection","determineDirection","viewPortHeight","originalSelection","currentOriginalSelectionRange","prevPage","nextPage","firstVisible","lastVisible","updateCurrentSelectionRange","moveActiveCell","originalActiveCell","navigateInSelection","currentNavigationRange","selTopLeft","selBottomRight","nextNavigationRange","previousNavigationRange","shouldSkip","singleCellSelection","extendSelection","resizeAutoFill","isMerged","forEachMergedCell","merged","_autoFillOrigin","punch","_previewFillFrom","updateAutoFill","currentSelectionRange","leftMode","rightMode","topMode","bottomMode","originalSelect","selectionRangeIndex","bottomCol","AxisManager","forEachSelectedColumn","forEachSelectedRow","includesHiddenColumns","includesHidden","includesHiddenRows","selectionIncludesHiddenColumns","selectionIncludesHiddenRows","hasRight","hasLeft","isHiddenColumn","hasBottom","hasTop","hideRow","isHiddenRow","unhideColumn","unhideRow","insertColumn","preventInsertRow","preventInsertColumn","newState","foreign","origRef","setStateData","stripStyle","borderObject","cellState","blankCell","address","parseTSV","_externalContent","_internalContent","_uid","intersectsMerged","originActiveCell","rowDelta","colDelta","triggerChange","external","isExternal","_isInternal","internalHTML","internalPlain","looksLikeANumber","getTextHeight","font-size","word-break","white-space","PROPERTIES","skipHiddenRows","skipHiddenCols","noTrigger","_resizedRef","existingFormat","existingFormatType","editorChange","isInEditMode","numberToDate","__","mergedRef","vi","_properties","setProp","clearAll","contentsOnly","formatOnly","keepBorders","clearFormat","isSortable","mc","secondary","cant","_getMergedCells","hasMerged","_sortBy","isFilterable","_filterBy","intersectingMerged","dr","dc","cellRange","yesItHas","_defaultCellStyle","flag","CalcError","argmax","compileArgumentChecks","comp","allowError","arrayArgs","cond","canBeArrayArg","hasArrayArgs","typeCheck","forced","haveForced","forceNum","roundFloatErrors","maybeRoundFloatErrors","withErrorHandling","makeSyncFunction","doit","xargs","arrays","makeAsyncFunction","makeCallback","defineFunction","kendoSpreadsheetArgs","argsAsync","dateToJulianDays","julianDaysToDate","jd","ord","ORDINAL_ADD_DAYS","isLeapYear","yr","daysInYear","daysInMonth","mo","DAYS_IN_MONTH","unpackDate","serial","BASE_DATE","packDate","unpackTime","frac","MS_IN_DAY","MS_IN_HOUR","MS_IN_MIN","serialToDate","packTime","hh","dateToSerial","binaryCompare","exports","Context","Formula","NUMBER_OR_ZERO","ARGS_NUMERIC","ARGS_ANYVALUE","resolveCells","_resolve","asMatrix","onFormula","formulas","getRefCells","cellValues","getRefData","fetchName","nameValue","ValidationFormulaContext","fname","bool","isRange","hiddenInfo","includeEmpty","eachRow","eachCol","mapRow","mapCol","transpose","va","vb","adds","determinant","inverse","imax","augment","printer","absrefs","forceRefs","lcsheet","parentContext","affectedSheet","formulaRow","formulaCol","formulaSheet","formulaMoves","newFormulaRow","newFormulaCol","co","comatrix","thmatrix","elmatrix","defineAlias","kendoSpreadsheetAliases","compileValidation","validationHandler","parsedFromDate","parsedToDate","fromIsListValue","TRANSPOSE_FORMAT","DATE_FORMAT","fromIsDateValue","parseFormula","toIsDateValue","validationComparers","valueToCompare","toValue","to_value","from_value","_getListData","Validation","tooltipMessageTemplate","tooltipTitleTemplate","_formatMessages","fromFormula","toFormula","_setMessages","tooltipTitle","tooltipMessage","_getOptions","compareValue","compareFormat","calculateFromCallBack","greaterThan","lessThan","between","equalTo","notEqualTo","notBetween","Sheet","_activeCell","currentOriginalNavigationRange","changeActiveCell","triggerSelect","_reinit","headerWidth","Axis","_frozenRows","_frozenColumns","_suspendChanges","_showGridLines","_gridLinesColor","_sorter","Sorter","_viewSelection","_editSelection","_formulaSelections","_selectionState","_inEdit","_navigator","_axisManager","_sheetName","_field","suspendChanges","dataSourceBinder","SheetDataSourceBinder","unhide","_copyRange","sourceRangeRef","targetRef","nextRefTopLeft","nextRefBottomRight","nextIndex","nextBottomIndex","_adjustReferences","_forFormulas","_forValidations","adjustNames","selectedHeaders","allCols","nextRef","isEnabledRow","isEnabledColumn","gridLinesColor","numRows","numColumns","parseReference","cellRef","forEachFilterHeader","columnRef","startCellIndex","endCellIndex","startResizing","_initialPosition","_resizeInProgress","_autoFillInProgress","_autoFillDest","_autoFillPunch","_autoFillHint","_autoFillDirection","autoFillRef","autoFillPunch","autoFillInProgress","completeResizing","hintPosition","resizeHintPosition","resizeHandlePosition","_resizeHandlePosition","_resizeHintPosition","removeResizeHandle","_selectionInProgress","operatingRange","selectionInProgress","expandedRef","selectionState","isAxis","trims","activeCellSelection","maxRow","maxCol","rowSelection","colSelection","rowState","colState","_setFormulaSelections","_viewActiveCell","clearDefaultStyle","viewSelection","activeCellRef","_compileFormula","_compileValidation","_refreshFilter","cellRefIndex","resetFormulas","resetValidations","revalidate","_copyValuesInRange","suspended","sortBy","filterColumn","filterRef","ALL_REASONS","currentRef","EMPTYCHAR","sheetsBarClassNames","SheetsBar","sheetsBarWrapper","sheetsBarSheetsWrapper","sheetsBarActive","sheetsBarInactive","sheetsBarAdd","sheetsBarRemove","sheetsBarItems","sheetsBarEditor","sheetsBarScrollable","sheetsBarNext","sheetsBarPrev","sheetsBarKItem","sheetsBarKActive","sheetsBarKTextbox","sheetsBarKLink","sheetsBarKIcon","sheetsBarKFontIcon","sheetsBarKButton","sheetsBarKButtonBare","sheetsBarKArrowW","sheetsBarKArrowE","sheetsBarKReset","sheetsBarKIconX","sheetsBarKSprite","sheetsBarKIconPlus","sheetsBarHintWrapper","sheetsBarKResetItems","_openDialog","_tree","_addButton","_createSheetsWrapper","_toggleScrollEvents","_createSortable","_onSheetReorderStart","_onSheetReorderEnd","_onSheetRemove","_onSheetSelect","_onAddSelect","_renderSheets","_selectedIndex","_onEditorKeydown","_onEditorBlur","_onSheetRename","renderSheets","sheetsGroupScrollWidth","sheetsWrapper","gapWidth","addButton","addButtonWidth","scrollPrevButtonWidth","sheetsGroup","scrollNextButtonRight","_renderHtml","_sheetsWrapper","_sheetsGroup","_nowScrollingSheets","_scrollSheetsByDelta","renderScrollButtons","isSelectedSheet","elementContent","deleteIcon","sheetElements","maxlength","baseButtonClass","childrenElements","removedSheetName","dlg","isConfirmed","selectedSheetText","_scrollSheetsToItem","isAddButton","sheetIndex","sheetsGroupWidth","sheetsGroupPadding","noThrow","OUT","TokenStream","addReference","allowEOF","peek","parseExpression","commas","maybeBinary","maybeIntersect","parseAtom","parseSymbol","upper","TRUE","FALSE","parseFuncall","fixReference","exp","maybePercent","my_prec","his_prec","OPERATORS","ast","parseNameDefinition","defAST","nameRef","makeFormula","makePrinter","prec","withParens","needParens","parenthesize","makeClosure","toCPS","cps","cpsRef","cpsAtom","cpsUnary","cpsBinary","cpsFunc","cpsLambda","cpsMatrix","cpsNameRef","makeContinuation","cpsIf","thenK","gensym","elseK","cpsAnd","cpsOr","isMatrix","GENSYM","js","jsArray","FORMULA_CACHE","readNext","ahead","refRange3D","refCell3D","refSheetRange","refSheetCell","refRange","refCell","funcall","forEditor","fixCell","addPos","RawTokenStream","InputStream","startToken","endToken","isIdStart","isId","isOpChar","isPunc","readNumber","has_dot","getRC","readSymbol","lookingAt","readEscaped","readSheetName","readOperator","readPunc","EOF","escaped","parseSqref","getNumberRegexp","comma","NUMBER_FORMAT_RX","FORMAT_PARSERS","registerFormatParser","ops","rxnum","rxcur","has_currency","readExcel","readWorkbook","relationships","theme","ERROR_LOG","readStrings","readRelationships","readTheme","byType","readStyles","enter","relId","dim","SEL_SHEET","byId","sheetDimensions","SEL_VIEW","SEL_DEFINED_NAME","vbProcedure","withErrorLog","recalcSheets","loadSheets","ready","insertSheet","queueSheet","readSheet","defaultColWidth","toColWidth","defaultRowHeight","toRowHeight","SEL_ROW","maximumDigitWidth","pts","formulaRange","customFilterLogic","customFilterCriteria","valueFilterBlanks","valueFilterValues","nCols","prevCellRef","relsFile","styleIndex","acRef","SEL_CELL","applyStyle","SEL_MERGE","SEL_COL","ht","SEL_SELECTION","SEL_PANE","xSplit","ySplit","SEL_SHEET_VIEW","SEL_HYPERLINK","colId","getCustomFilter","DynamicFilter","TopFilter","getFilterVal","leave","SEL_VALIDATION","criteria","blanks","SEL_VALUE","SEL_STRING","SEL_FORMULA","SEL_VALIDATION_FORMULA1","SEL_VALIDATION_FORMULA2","ourOp","notEqual","greaterThanOrEqual","lessThanOrEqual","Q1","Q2","Q3","Q4","M1","M2","M3","M4","M5","M6","M7","M8","M9","M10","M11","M12","setFormat","formatCode","setBorder","BORDER_WIDTHS","shouldSet","applyName","xf","inlineStyles","xfId","namedStyles","numFmts","DEFAULT_FORMATS","asUint8Array","SEL_SHARED_STRING","SEL_TEXT","Id","Target","getXf","addBool","pivotButton","quotePrefix","getColor","themeColor","tint","toCSSColor","indexed","INDEXED_COLORS","colorScheme","SEL_NUM_FMT","SEL_FONT","SEL_FILL","patternType","SEL_BORDER","SEL_NAMED_STYLE","SEL_INLINE_STYLE","swap","scheme","SEL_SCHEME_SYSCLR","SEL_SCHEME_RGBCLR","thin","medium","dashed","dotted","thick","double","hair","mediumDashed","mediumDashDot","dashDotDot","mediumDashDotDot","slantDashDot","11","12","14","15","16","17","18","19","21","22","45","47","48","49","_readSheet","_readStrings","_readStyles","_readTheme","_readWorkbook","sheetParamsFromJSON","_sheetsSearchCache","_onUndoRedo","FormulaContext","_validationContext","_names","_sheetChange","_sheetInsertRow","_sheetInsertColumn","_sheetDeleteRow","_sheetDeleteColumn","_sheetHideRow","_sheetHideColumn","_sheetUnhideRow","_sheetUnhideColumn","_sheetSelect","_sheetCommandRequest","_inputForRef","commandOptions","editActiveCell","sheetByName","moveSheetToIndex","toIndex","sheetSelection","insertIndex","getUniqueSheetName","sheetNameSuffix","_bindSheetEvents","sheetByIndex","forEachName","nameref","removeSheet","newSheet","_clearSheets","nameForRef","area","fsheet","frow","fcol","currentFormula","_formulaContextRefresh","toActionSelector","alphaNumRegExp","ACTIONS","ENTRY_ACTIONS","CONTAINER_EVENTS","CLIPBOARD_EVENTS","EDITOR_EVENTS","FORMULABAR_EVENTS","FORMULAINPUT_EVENTS","SELECTION_MODES","COMPOSITE_UNAVAILABLE_ACTION_SELECTORS","UNHIDE_ACTION_SELECTORS","ACTION_KEYS","SHIFT_ACTION_KEYS","ENTRY_ACTION_KEYS","Controller","ctrl+left","ctrl+right","ctrl+up","ctrl+down","ctrl+home","ctrl+end","pageup","pagedown","shift+tab","shift+enter","shift+:alphanum",":alphanum","ctrl+:alphanum","alt+ctrl+:alphanum",":edit","wheel","*+mousedown","*+mousedrag","*+mouseup","*+dblclick","*+pageup","*+pagedown","*+cut","*+paste","*+copy","alt+enter","columnheader","topcorner","autofill","clipboardElement","cellContextMenu","rowHeaderContextMenu","colHeaderContextMenu","tabstrip","sheetsbar","nameEditor","onNameEditorEnter","onNameEditorCancel","onNameEditorSelect","onNameEditorDelete","onEditorChange","onEditorActivate","onEditorDeactivate","onEditorUpdate","onScroll","listener","_enableEditorEvents","onSheetBarSelect","onSheetBarReorder","onSheetBarRename","onSheetBarRemove","onContextMenuSelect","onCommandRequest","onDialogRequest","keyListener","barKeyListener","barElement","inputKeyListener","cellElement","_execute","editorClose","_preventNavigation","showError","activateEditor","_lastEditorValue","_activeTooltip","isEditorDisabled","onWheel","deltaMode","onAction","onPageUp","scrollDown","onPageDown","onEntryAction","shouldPrevent","onShiftAction","appendSelection","onMouseMove","objectAt","onMouseDown","originFrame","onEditorEsc","openCustomEditor","_selectionMode","openFilterMenu","onContextMenu","isComposite","showUnhide","showUnmerge","constrainResize","onMouseDrag","startAutoScroll","selectToLocation","onMouseUp","stopAutoScroll","activeEditor","onDblClick","activeCellRectangle","onCut","clipBoardValue","onPaste","hasHTML","hasPlainText","DOMStringList","onCopy","scrollRight","cellLocation","lastKnownCellLocation","_autoScrollTarget","scrollStep","finalLocation","viewObject","createFilterMenu","onEditorBarFocus","onEditorCellFocus","resetEditorValue","onEditorBlur","onEditorAction","onEditorShiftAction","deactivateEditor","additionalOptions","pdfExport","excelExport","selectElementContents","cellBefore","trs","cellAbove","prevRow","cellBorder","asURL","drawCell","showGrid","maybeLink","defaultBorder","outline","overflowWrap","wordWrap","__dataType","paneClassNames","addCell","wordBreak","borderRightColor","borderBottomColor","borderLeftColor","borderTopColor","RESIZE_HANDLE_WIDTH","viewClassNames","HtmlTable","CELL_CONTEXT_MENU","ROW_HEADER_CONTEXT_MENU","COL_HEADER_CONTEXT_MENU","VIEW_CONTENTS","cellEditor","barEditor","topCorner","filterHeadersWrapper","filterRange","filterButton","filterButtonActive","horizontalResize","verticalResize","iconFilterDefault","sheetsBar","nameBox","openUnsupported","shiftingNonblankCells","insertColumnWhenRowIsSelected","insertRowWhenColumnIsSelected","filterRangeContainingMerges","sortRangeContainingMerges","cantSortMultipleSelection","cantSortNullRef","cantSortMixedCells","validationError","cannotModifyDisabled","_width","addColumn","toDomTree","contextMenuConfig","_chrome","_dialogs","_formulaInput","clipboardContents","SheetEditor","_sheetsbar","enableClipboard","isClipboardDeactivated","tabstripHeight","formulaBarHeight","formulaBar","sheetsBarHeight","quickAccessAdjust","NameEditor","_tabstrip","cellRectangle","_rectangle","boundingRectangle","isColumnResizer","_headerWidth","isRowResizer","_headerHeight","isFilterIcon","theGrid","frozen","filterIconRect","isAutoFill","isEditButton","ed","activeCellCustomEditor","selecting","paneAt","indexVisible","containingPane","_destroyFilterMenu","_filterMenu","selectClipBoardContents","willScroll","scrollBoundaries","scrollBottom","_destroyDialog","reopenEditor","errorMessages","focusButton","onClose","_retry","registered","_filterMenuColumn","renderResizeHint","renderClipboardContents","resizeHint","resizeHintVertical","resizeHintHandle","resizeHintMarker","selectionView","primaryMergedCells","secondaryMergedCells","rangeDimensions","mergedCell","vaxis","haxis","vborder","hborder","rowHeader","columnHeader","mergedCellsWrapper","selectionWrapper","autoFillWrapper","columnResizeHandle","rowResizeHandle","selectionHighlight","paneClasses","_currentView","_currentRect","_selectedHeaders","renderSelection","renderAutoFill","renderEditorSelection","renderFilterHeaders","hasRowHeader","headerClassName","hasColumnHeader","columnOffset","renderResizeHandle","itemSelection","allHeaders","doLayout","forScreen","xCoords","yCoords","Borders","vert","rendered","horiz","BUTTON_SIZE","BUTTON_OFFSET","Rectangle","_addDiv","selections","activeCellClasses","selectionClasses","activeFormulaColor","_activeFormulaColor","_directionClasses","_addTable","autoFillRectangle","toDiv","activeFormulaSelection","colorClasses","mergedCellLeft","mergedCellTop","EDITORS","registerEditor","kendoCalendar","getKendoCalendar","getKendoPopup","kendoStaticList","getKendoStaticList","PaneGrid","rangeRef","headerSize","hasHeader","paneSegment","_viewSize","widthCompensation","heightCompensation","_hidden","scrollBarSize","firstHidden","lastHidden","startSegment","lastPage","_pixelValues","_axis","quarter","sameYear","sameMonth","sameWeek","firstWeek","secondWeek","_blanks","_logic","_criteria","_matches","criterionValue","criterionType","valueType","_predicate","_average","aboveAverage","belowAverage","tomorrow","yesterday","nextWeek","thisWeek","lastWeek","nextMonth","thisMonth","lastMonth","nextQuarter","thisQuarter","lastQuarter","nextYear","thisYear","lastYear","yearToDate","_lists","ascendingComparer","descendingComparer","typeA","typeB","maybeColor","RX_COLORS","maybeCondition","RX_CONDITION","readFormat","maybeFraction","sep","decimalPart","am","pm","readSection","haveConditional","sec","printSection","printToken","padLeft","restart","compileFormatPart","checkComma","scaleCount","hasDate","hasAmpm","percentCount","separeThousands","declen","intFormat","decFormat","preamble","CACHE","TEXT","ampm","fraclen","eltime","formatInt","iv","chf","formatDec","textAndColor","_cosh","_sinh","_tanh","_gcd","_lcm","forIFS","chunks","parseCriteria","COL","_avg","numbers","_var_sp","avg","_stdev_sp","_percentrank","exc","nlt","ngt","_covariance","ax","ay","_percentile","rank","_percentile_inc","_percentile_exc","fetchValuesForAggregate","opt_ignore_hidden_rows","opt_ignore_errors","opt_use_aggregates","fetchValues","_binom_dist","cumulative","_combinations","weeksInYear","_days_360","Hyperlink","numericPredicate","descending","ARGS_COUNTIFS","ARGS_SUMIFS","ARGS_SUMIF","ARGS_PERCENTRANK","_fact","AGGREGATE_FUNCS","RX_NON_PRINTABLE","mult","prod","coef","m1","sumRange","nth","discard","bins","variance","stddev","significance","fact","funcId","ignoreHidden","s2","approx","resultCol","areanum","colRange","resultRow","fw","dow","wk","holidays","rom","radix","minLen","dec","noCommas","valueIfError","makeComparator","lc","compLT","compLTE","compGT","compGTE","compNE","compEQ","RXCACHE","ERF","an","f_abs","ERFC","GAMMALN","cof","ser","GAMMA","pi","BETALN","BETA","gamma_inc","g_series","g_contfrac","ap","gln","MAX_IT","EPS","FP_MIN","aj","bj","GAMMA_DIST","GAMMA_INV","ab","NORM_S_DIST","NORM_S_INV","plow","phigh","NORM_DIST","NORM_INV","betastd_pdf","betastd_cdf","beta_lentz","m2","qab","qap","qam","betastd_inv","BETADIST","BETA_DIST","cdf","BETA_INV","chisq_left","cds","chisq_right","chisq_left_inv","chisq_right_inv","chisq_test","obsv","expect","eij","expon","poisson","lnf","Fdist","Fdist_right","Finv_right","Finv","_mean","me","_var_sq","Ftest","n1","n2","va1","va2","fisher","fisherinv","Tdist","Tdist_right","Tdist_2tail","Tdist_inv","Tdist_2tail_inv","Tdist_test","gr1","gr2","t_st","df","md","v1","v2","u1","u2","q1","q2","confidence_t","confidence_norm","gauss","z","phi","lognorm_dist","lognorm_inv","prob","x_","p_","lw","slope","y_","mx","my","intercept","pearson","s1","s3","rsq","steyx","forecast","_mat_mean","Mat","_mat_devsq","mean","sq","linest","X","konst","stats","Xt","B","line_1","Y1","y_y1","mp","SSreg","SSresid","line_5","R2","degfre","err_est","line_3","F_sta","line_4","SCP","line_2","logest","growth","new_X","root_newton","guess","max_it","eps","f_d","FV","rate","nper","pmt","pv","h1","h2","PV","fv","PMT","NPER","RATE","xfd","IPMT","per","ipmt","PPMT","CUMPRINC","tn","ts","te","monthlyPayment","remainingBalanceAtStart","remainingBalanceAtEnd","CUMIPMT","cip","NPV","flows","npv","IRR","npv1","EFFECT","nominal_rate","npery","NOMINAL","effect_rate","XNPV","XIRR","ISPMT","DB","cost","salvage","life","period","db","DDB","prior","dep","SLN","SYD","VDB","no_switch","_getGDA","gda","interest","_interVDB","life1","term","remValue","intEnd","lia","vdb","nowLia","intStart","_edate","_daysBetween","basis","_borderCoupons","settlement","maturity","sett","periods","_borderCoupons_fw","COUPDAYBS","COUPDAYS","settl","matur","COUPDAYSNC","COUPPCD","COUPNCD","COUPNUM","mat","ACCRINTM","issue","par","year_days","ACCRINT","_numCoupons","annual","brace","prev1","next1","nrc","accr","DISC","redemption","INTRATE","investment","RECEIVED","discount","PRICE","yld","beg_settl","settl_end","beg_end","den","yf","PRICEDISC","dsm","COUPS_ARGS","ac","withPreventDefault","BORDER_TYPES","BORDER_PALETTE_MESSAGES","ColorChooser","BorderPalette","borderPalette","customColor","_resetButton","_colorPalette","_customColorPalette","_customColorButton","resetButton","resetColor","customColorButton","colorPalette","flatColorPicker","kendoColorPalette","maximizable","kendoFlatColorPicker","_borderTypePalette","_borderColorPalette","colorChooser","_colorChange","toolDefaults","SpreadsheetToolBar","DropDownTool","OverflowDialogButton","ColorPickerButton","FONT_SIZES","DEFAULT_FONT_SIZE","FontSize","FontSizeButton","FONT_FAMILIES","DEFAULT_FONT_FAMILY","FontFamily","FontFamilyButton","Format","FormatButton","BorderChangeTool","BorderChangeButton","AlignmentTool","AlignmentButton","MergeTool","MergeButton","FreezeTool","FreezeButton","Sort","SortButton","FilterButton","Open","alignmentButtons","justtifyLeft","alignTop","alignMiddle","alignBottom","colorPicker","formatTypes","automatic","financial","moreFormats","formatDecreaseDecimal","formatIncreaseDecimal","freezeButtons","freezePanes","freezeRows","freezeColumns","mergeButtons","mergeHorizontally","mergeVertically","quickAccess","toggleGridlines","sortAsc","sortDesc","sortButtons","sortSheetAsc","sortSheetDesc","sortRangeAsc","sortRangeDesc","textColor","hyperlink","dialogName","formatCells","_expandTools","toolbarName","handleClick","_addSeparators","expandTool","typeDefaults","setToggle","_tools","dropDownList","data-property","popupName","_dialogName","iconName","kendoComboBox","_valueChange","fontSizes","sizes","defaultSize","fontFamilies","defaultFont","_revertTitle","dataValuePrimitive","sample","_borderPalette","_action","_commandPalette","_quickAccessButtons","toolbars","quickAccessToolBar","uniqueBy","basicErrorDialog","MessageDialog","messageId","registry","SpreadsheetDialog","FormatCellsViewModel","FormatCellsDialog","ConfirmationDialog","ValidationErrorDialog","FontFamilyDialog","FontSizeDialog","BordersDialog","ColorPickerDialog","CustomColorDialog","AlignmentDialog","MergeDialog","FreezeDialog","ValidationViewModel","ValidationDialog","ExportAsDialog","ImportErrorDialog","UseKeyboardDialog","HyperlinkDialog","revert","formatCellsDialog","categories","fontFamilyDialog","fontSizeDialog","bordersDialog","alignmentDialog","mergeDialog","freezeDialog","confirmationDialog","validationDialog","hintMessage","hintTitle","comparerMessages","onInvalidData","rejectInput","showWarning","showHint","ignoreBlank","showListButton","showCalendarButton","typeTitle","typeMessage","exportAsDialog","saveAsType","exportArea","margins","guidelines","modifyMergedDialog","rangeDisabledDialog","incompatibleRangesDialog","noFillDirectionDialog","duplicateSheetNameDialog","overflowDialog","useKeyboardDialog","forCopy","forCut","forPaste","unsupportedSelectionDialog","linkDialog","removeLink","dialogClass","_onDialogActivate","_onDialogDeactivate","useCategory","category","formatCurrency","currencies","allFormats","useFirstFormat","_currency","iso","categoryFilter","defaultOptions","_generateFormats","calendarPatterns","currenciesFrom","numberFormats","dateFormats","currencyFilter","_confirmed","_colorPicker","ValidationCellsViewModel","criterion","setHintMessageTemplate","shouldBuild","buildMessages","hintTitleTemplate","hintMessageTemplate","setComparers","defaultHintTitle","text_comparers","defaultComparers","defaultHintMessage","isAny","showToForNumber","showTo","showToForDate","isText","showRemove","fromValidationObject","useCustomMessages","toValidationObject","fileFormats","fitWidth","paperSizes","hCenter","vCenter","_normalizeColumns","_boundRowsCount","_sheetChangeHandler","_sheetDeleteRowHandler","_sheetInsertRowHandler","normalizedRef","_skipRebind","colValueIndex","getterIdx","distinctValues","itemVisible","filterSpread","anyVisibleChildren","valuesFilter","uncheckAll","flattenOperators","FILTERMENU_MESSAGES","Details","FilterMenuViewModel","FilterMenuController","details","detailsSummary","detailsContent","iconSearch","textbox","filterByCondition","filterByValue","valuesTreeViewWrapper","_summary","addToCurrent","operatorNone","spreadsheetFilterValue","menuItem","valuesChange","valuesDataSource","appendToSearch","valueSelect","hasActiveSearch","filterValues","operatorChange","isNone","isString","valuesTree","filterType","topValue","filterForColumn","allFilters","columnFilters","_filterInit","_filterByCondition","_filterByValue","_actionButtons","valuesTreeView","kendoMenu","compiledTemplate","_detailToggle","isExpanded","activeContainer","oldRect","newRect","barInput","cellInput","_triggerUpdate","linearRegression","findSeries","findStep","forEachSeries","formatType","getType","lst","findStringList","stringLists","strl","ERR_INCOMPATIBLE","ERR_NO_DIRECTION","srcRange","srcIdx","destRange","CLASS_NAMES","comboBoxTitle","comboElement","combo","_on_listChange","getKendoComboBox","_on_keyDown","_on_focus","_deleteItem","_prevValue","distributeCoords","curr","rowHeights","colWidths","scaleFactor","boxWidth","boxHeight","nonEmpty","relrow","relcol","cw","shouldDrawCell","emptyCells","orlast","normalOrder","sameBorder","drawLayout","bordersGroup","endbottom","endright","geo","GUIDELINE_WIDTH","ncols","nrows","r2d2","vtrans","text_group","CONT","makeFontDef","paper","addVert","addHoriz","Spreadsheet","_controller","_autoRefresh","_bindWorkbookEvents","_workbookChange","_workbookCut","_workbookCopy","_workbookPaste","autoRefresh","_workbookExcelExport","_workbookExcelImport","_initProgress","_workbookPdfExport","_workbookInsertSheet","_workbookRemoveSheet","_workbookSelectSheet","_workbookRenameSheet","_workbookInsertRow","_workbookInsertColumn","_workbookDeleteRow","_workbookDeleteColumn","_workbookHideRow","_workbookHideColumn","_workbookUnhideRow","_workbookUnhideColumn","_workbookSelect","_workbookChangeFormat","addKPI","kpiNode","normalizeKPIs","settingTargetFromNode","kpiMeasure","kpi","buildKPImeasures","SETTING_CONTAINER_TEMPLATE","PivotConfigurator","measuresLabel","columnsLabel","rowsLabel","fieldsLabel","_targets","kendoTreeView","_createTarget","columnsContainer","rowsContainer","measuresContainer","_cube","_catalog","withoutTimeout","$timeout","createWidget","origAttr","controllers","createIt","destroyRegister","kNgDisabled","kNgReadonly","isReadonly","kRebind","ctor","OPTIONS_NOW","exposeWidget","$emit","destroyWidgetOnScopeDestroy","setupRebind","$eval","bindToKNgDisabled","bindToKNgReadonly","kNgModel","bindToKNgModel","ngModel","bindToNgModel","ngForm","propagateClassToWidgetWrapper","kNgDelay","delayValue","parsed","unresolved","unwatch","$watch","$root","unregister","$attr","addOption","scopeValue","widgetEvents","optionsPath","kOptions","optionsValue","dataName","optionName","ignoredOwnProperties","ignoredAttributes","kDataSource","$log","kendoWidget","$parse","formValue","isForm","formRegExp","haveChangeOnElement","viewRender","onChange","currentVal","$viewValue","$modelValue","$render","formPristine","$pristine","$setViewValue","$setPristine","digest","$isEmpty","updating","valueIsCollection","currentValueLength","watchHandler","$angular_setLogicValue","$watchCollection","$setDirty","$angular_getLogicValue","deregister","$on","disconnect","prevClassList","MutationObserver","chg","currClassList","attributeName","rebindAttr","isUpload","_cleanUp","WIDGET_TEMPLATE_OPTIONS","templateContents","setTemplate","createDirectives","klass","make","directiveName","widgetName","directive","directiveFactory","shortcut","SKIP_SHORTCUTS","restrict","TAGNAMES","scopeField","kScopeField","MANUAL_DIRECTIVES","kendoWidgetInstance","isDigesting","destroyScope","defadvice","origMethod","pendingPatches","$injector","$defaultCompile","toDataSource","mew","kendoRenderedTimeout","RENDERED","require","$attrs","$element","roleattr","MobileButton","MobileBackButton","MobileDetailButton","MobileListView","$angular_scope","$angular_init","itemScope","$$kendoScope","$new","$angular_makeEventHandler","kendoEvent","elems","colIdx","locals","angularDataItem","terminal","pre","kAttr","priority","TreeMap","MobileScrollView","templateDirectives","attrName"],"mappings":"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","file":"kendo.web.min.js","sourcesContent":["/*!\n                                                                                                                                                                                                       \n                                                                                                                                                                                                       \n                                                                                                                                                                                                       \n                                                                                                                                                                                                       \n                                                                                                                                                                                                       \n                                                                                                                                                                                                       \n                                                                                                                                                                                                       \n                                                                                                                                                                                                       \n                                                                                                                                                                                                       \n                                                                                                                                                                                                       \n                                                                                                                                                                                                       \n                                                                                                                                                                                                       \n                                                                                                                                                                                                       \n                                                                                                                                                                                                       \n                                                                                                                                                                                                       \n                                                                                                                                                                                                       \n                                                                                                                                                                                                       \n                                                                                                                                                                                                       \n                                                                                                                                                                                                       \n                                                                                                                                                                                                       \n                                                                                                                                                                                                       \n\n*/\n(function (f, define) {\n    define('kendo.core', ['jquery'], f);\n}(function () {\n    var __meta__ = {\n        id: 'core',\n        name: 'Core',\n        category: 'framework',\n        description: 'The core of the Kendo framework.'\n    };\n    (function ($, window, undefined) {\n        var kendo = window.kendo = window.kendo || { cultures: {} }, extend = $.extend, each = $.each, isArray = $.isArray, proxy = $.proxy, noop = $.noop, math = Math, Template, JSON = window.JSON || {}, support = {}, percentRegExp = /%/, formatRegExp = /\\{(\\d+)(:[^\\}]+)?\\}/g, boxShadowRegExp = /(\\d+(?:\\.?)\\d*)px\\s*(\\d+(?:\\.?)\\d*)px\\s*(\\d+(?:\\.?)\\d*)px\\s*(\\d+)?/i, numberRegExp = /^(\\+|-?)\\d+(\\.?)\\d*$/, FUNCTION = 'function', STRING = 'string', NUMBER = 'number', OBJECT = 'object', NULL = 'null', BOOLEAN = 'boolean', UNDEFINED = 'undefined', getterCache = {}, setterCache = {}, slice = [].slice;\n        kendo.version = '2017.2.621'.replace(/^\\s+|\\s+$/g, '');\n        function Class() {\n        }\n        Class.extend = function (proto) {\n            var base = function () {\n                }, member, that = this, subclass = proto && proto.init ? proto.init : function () {\n                    that.apply(this, arguments);\n                }, fn;\n            base.prototype = that.prototype;\n            fn = subclass.fn = subclass.prototype = new base();\n            for (member in proto) {\n                if (proto[member] != null && proto[member].constructor === Object) {\n                    fn[member] = extend(true, {}, base.prototype[member], proto[member]);\n                } else {\n                    fn[member] = proto[member];\n                }\n            }\n            fn.constructor = subclass;\n            subclass.extend = that.extend;\n            return subclass;\n        };\n        Class.prototype._initOptions = function (options) {\n            this.options = deepExtend({}, this.options, options);\n        };\n        var isFunction = kendo.isFunction = function (fn) {\n            return typeof fn === 'function';\n        };\n        var preventDefault = function () {\n            this._defaultPrevented = true;\n        };\n        var isDefaultPrevented = function () {\n            return this._defaultPrevented === true;\n        };\n        var Observable = Class.extend({\n            init: function () {\n                this._events = {};\n            },\n            bind: function (eventName, handlers, one) {\n                var that = this, idx, eventNames = typeof eventName === STRING ? [eventName] : eventName, length, original, handler, handlersIsFunction = typeof handlers === FUNCTION, events;\n                if (handlers === undefined) {\n                    for (idx in eventName) {\n                        that.bind(idx, eventName[idx]);\n                    }\n                    return that;\n                }\n                for (idx = 0, length = eventNames.length; idx < length; idx++) {\n                    eventName = eventNames[idx];\n                    handler = handlersIsFunction ? handlers : handlers[eventName];\n                    if (handler) {\n                        if (one) {\n                            original = handler;\n                            handler = function () {\n                                that.unbind(eventName, handler);\n                                original.apply(that, arguments);\n                            };\n                            handler.original = original;\n                        }\n                        events = that._events[eventName] = that._events[eventName] || [];\n                        events.push(handler);\n                    }\n                }\n                return that;\n            },\n            one: function (eventNames, handlers) {\n                return this.bind(eventNames, handlers, true);\n            },\n            first: function (eventName, handlers) {\n                var that = this, idx, eventNames = typeof eventName === STRING ? [eventName] : eventName, length, handler, handlersIsFunction = typeof handlers === FUNCTION, events;\n                for (idx = 0, length = eventNames.length; idx < length; idx++) {\n                    eventName = eventNames[idx];\n                    handler = handlersIsFunction ? handlers : handlers[eventName];\n                    if (handler) {\n                        events = that._events[eventName] = that._events[eventName] || [];\n                        events.unshift(handler);\n                    }\n                }\n                return that;\n            },\n            trigger: function (eventName, e) {\n                var that = this, events = that._events[eventName], idx, length;\n                if (events) {\n                    e = e || {};\n                    e.sender = that;\n                    e._defaultPrevented = false;\n                    e.preventDefault = preventDefault;\n                    e.isDefaultPrevented = isDefaultPrevented;\n                    events = events.slice();\n                    for (idx = 0, length = events.length; idx < length; idx++) {\n                        events[idx].call(that, e);\n                    }\n                    return e._defaultPrevented === true;\n                }\n                return false;\n            },\n            unbind: function (eventName, handler) {\n                var that = this, events = that._events[eventName], idx;\n                if (eventName === undefined) {\n                    that._events = {};\n                } else if (events) {\n                    if (handler) {\n                        for (idx = events.length - 1; idx >= 0; idx--) {\n                            if (events[idx] === handler || events[idx].original === handler) {\n                                events.splice(idx, 1);\n                            }\n                        }\n                    } else {\n                        that._events[eventName] = [];\n                    }\n                }\n                return that;\n            }\n        });\n        function compilePart(part, stringPart) {\n            if (stringPart) {\n                return '\\'' + part.split('\\'').join('\\\\\\'').split('\\\\\"').join('\\\\\\\\\\\\\"').replace(/\\n/g, '\\\\n').replace(/\\r/g, '\\\\r').replace(/\\t/g, '\\\\t') + '\\'';\n            } else {\n                var first = part.charAt(0), rest = part.substring(1);\n                if (first === '=') {\n                    return '+(' + rest + ')+';\n                } else if (first === ':') {\n                    return '+$kendoHtmlEncode(' + rest + ')+';\n                } else {\n                    return ';' + part + ';$kendoOutput+=';\n                }\n            }\n        }\n        var argumentNameRegExp = /^\\w+/, encodeRegExp = /\\$\\{([^}]*)\\}/g, escapedCurlyRegExp = /\\\\\\}/g, curlyRegExp = /__CURLY__/g, escapedSharpRegExp = /\\\\#/g, sharpRegExp = /__SHARP__/g, zeros = [\n                '',\n                '0',\n                '00',\n                '000',\n                '0000'\n            ];\n        Template = {\n            paramName: 'data',\n            useWithBlock: true,\n            render: function (template, data) {\n                var idx, length, html = '';\n                for (idx = 0, length = data.length; idx < length; idx++) {\n                    html += template(data[idx]);\n                }\n                return html;\n            },\n            compile: function (template, options) {\n                var settings = extend({}, this, options), paramName = settings.paramName, argumentName = paramName.match(argumentNameRegExp)[0], useWithBlock = settings.useWithBlock, functionBody = 'var $kendoOutput, $kendoHtmlEncode = kendo.htmlEncode;', fn, parts, idx;\n                if (isFunction(template)) {\n                    return template;\n                }\n                functionBody += useWithBlock ? 'with(' + paramName + '){' : '';\n                functionBody += '$kendoOutput=';\n                parts = template.replace(escapedCurlyRegExp, '__CURLY__').replace(encodeRegExp, '#=$kendoHtmlEncode($1)#').replace(curlyRegExp, '}').replace(escapedSharpRegExp, '__SHARP__').split('#');\n                for (idx = 0; idx < parts.length; idx++) {\n                    functionBody += compilePart(parts[idx], idx % 2 === 0);\n                }\n                functionBody += useWithBlock ? ';}' : ';';\n                functionBody += 'return $kendoOutput;';\n                functionBody = functionBody.replace(sharpRegExp, '#');\n                try {\n                    fn = new Function(argumentName, functionBody);\n                    fn._slotCount = Math.floor(parts.length / 2);\n                    return fn;\n                } catch (e) {\n                    throw new Error(kendo.format('Invalid template:\\'{0}\\' Generated code:\\'{1}\\'', template, functionBody));\n                }\n            }\n        };\n        function pad(number, digits, end) {\n            number = number + '';\n            digits = digits || 2;\n            end = digits - number.length;\n            if (end) {\n                return zeros[digits].substring(0, end) + number;\n            }\n            return number;\n        }\n        (function () {\n            var escapable = /[\\\\\\\"\\x00-\\x1f\\x7f-\\x9f\\u00ad\\u0600-\\u0604\\u070f\\u17b4\\u17b5\\u200c-\\u200f\\u2028-\\u202f\\u2060-\\u206f\\ufeff\\ufff0-\\uffff]/g, gap, indent, meta = {\n                    '\\b': '\\\\b',\n                    '\\t': '\\\\t',\n                    '\\n': '\\\\n',\n                    '\\f': '\\\\f',\n                    '\\r': '\\\\r',\n                    '\"': '\\\\\"',\n                    '\\\\': '\\\\\\\\'\n                }, rep, toString = {}.toString;\n            if (typeof Date.prototype.toJSON !== FUNCTION) {\n                Date.prototype.toJSON = function () {\n                    var that = this;\n                    return isFinite(that.valueOf()) ? pad(that.getUTCFullYear(), 4) + '-' + pad(that.getUTCMonth() + 1) + '-' + pad(that.getUTCDate()) + 'T' + pad(that.getUTCHours()) + ':' + pad(that.getUTCMinutes()) + ':' + pad(that.getUTCSeconds()) + 'Z' : null;\n                };\n                String.prototype.toJSON = Number.prototype.toJSON = Boolean.prototype.toJSON = function () {\n                    return this.valueOf();\n                };\n            }\n            function quote(string) {\n                escapable.lastIndex = 0;\n                return escapable.test(string) ? '\"' + string.replace(escapable, function (a) {\n                    var c = meta[a];\n                    return typeof c === STRING ? c : '\\\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4);\n                }) + '\"' : '\"' + string + '\"';\n            }\n            function str(key, holder) {\n                var i, k, v, length, mind = gap, partial, value = holder[key], type;\n                if (value && typeof value === OBJECT && typeof value.toJSON === FUNCTION) {\n                    value = value.toJSON(key);\n                }\n                if (typeof rep === FUNCTION) {\n                    value = rep.call(holder, key, value);\n                }\n                type = typeof value;\n                if (type === STRING) {\n                    return quote(value);\n                } else if (type === NUMBER) {\n                    return isFinite(value) ? String(value) : NULL;\n                } else if (type === BOOLEAN || type === NULL) {\n                    return String(value);\n                } else if (type === OBJECT) {\n                    if (!value) {\n                        return NULL;\n                    }\n                    gap += indent;\n                    partial = [];\n                    if (toString.apply(value) === '[object Array]') {\n                        length = value.length;\n                        for (i = 0; i < length; i++) {\n                            partial[i] = str(i, value) || NULL;\n                        }\n                        v = partial.length === 0 ? '[]' : gap ? '[\\n' + gap + partial.join(',\\n' + gap) + '\\n' + mind + ']' : '[' + partial.join(',') + ']';\n                        gap = mind;\n                        return v;\n                    }\n                    if (rep && typeof rep === OBJECT) {\n                        length = rep.length;\n                        for (i = 0; i < length; i++) {\n                            if (typeof rep[i] === STRING) {\n                                k = rep[i];\n                                v = str(k, value);\n                                if (v) {\n                                    partial.push(quote(k) + (gap ? ': ' : ':') + v);\n                                }\n                            }\n                        }\n                    } else {\n                        for (k in value) {\n                            if (Object.hasOwnProperty.call(value, k)) {\n                                v = str(k, value);\n                                if (v) {\n                                    partial.push(quote(k) + (gap ? ': ' : ':') + v);\n                                }\n                            }\n                        }\n                    }\n                    v = partial.length === 0 ? '{}' : gap ? '{\\n' + gap + partial.join(',\\n' + gap) + '\\n' + mind + '}' : '{' + partial.join(',') + '}';\n                    gap = mind;\n                    return v;\n                }\n            }\n            if (typeof JSON.stringify !== FUNCTION) {\n                JSON.stringify = function (value, replacer, space) {\n                    var i;\n                    gap = '';\n                    indent = '';\n                    if (typeof space === NUMBER) {\n                        for (i = 0; i < space; i += 1) {\n                            indent += ' ';\n                        }\n                    } else if (typeof space === STRING) {\n                        indent = space;\n                    }\n                    rep = replacer;\n                    if (replacer && typeof replacer !== FUNCTION && (typeof replacer !== OBJECT || typeof replacer.length !== NUMBER)) {\n                        throw new Error('JSON.stringify');\n                    }\n                    return str('', { '': value });\n                };\n            }\n        }());\n        (function () {\n            var dateFormatRegExp = /dddd|ddd|dd|d|MMMM|MMM|MM|M|yyyy|yy|HH|H|hh|h|mm|m|fff|ff|f|tt|ss|s|zzz|zz|z|\"[^\"]*\"|'[^']*'/g, standardFormatRegExp = /^(n|c|p|e)(\\d*)$/i, literalRegExp = /(\\\\.)|(['][^']*[']?)|([\"][^\"]*[\"]?)/g, commaRegExp = /\\,/g, EMPTY = '', POINT = '.', COMMA = ',', SHARP = '#', ZERO = '0', PLACEHOLDER = '??', EN = 'en-US', objectToString = {}.toString;\n            kendo.cultures['en-US'] = {\n                name: EN,\n                numberFormat: {\n                    pattern: ['-n'],\n                    decimals: 2,\n                    ',': ',',\n                    '.': '.',\n                    groupSize: [3],\n                    percent: {\n                        pattern: [\n                            '-n %',\n                            'n %'\n                        ],\n                        decimals: 2,\n                        ',': ',',\n                        '.': '.',\n                        groupSize: [3],\n                        symbol: '%'\n                    },\n                    currency: {\n                        name: 'US Dollar',\n                        abbr: 'USD',\n                        pattern: [\n                            '($n)',\n                            '$n'\n                        ],\n                        decimals: 2,\n                        ',': ',',\n                        '.': '.',\n                        groupSize: [3],\n                        symbol: '$'\n                    }\n                },\n                calendars: {\n                    standard: {\n                        days: {\n                            names: [\n                                'Sunday',\n                                'Monday',\n                                'Tuesday',\n                                'Wednesday',\n                                'Thursday',\n                                'Friday',\n                                'Saturday'\n                            ],\n                            namesAbbr: [\n                                'Sun',\n                                'Mon',\n                                'Tue',\n                                'Wed',\n                                'Thu',\n                                'Fri',\n                                'Sat'\n                            ],\n                            namesShort: [\n                                'Su',\n                                'Mo',\n                                'Tu',\n                                'We',\n                                'Th',\n                                'Fr',\n                                'Sa'\n                            ]\n                        },\n                        months: {\n                            names: [\n                                'January',\n                                'February',\n                                'March',\n                                'April',\n                                'May',\n                                'June',\n                                'July',\n                                'August',\n                                'September',\n                                'October',\n                                'November',\n                                'December'\n                            ],\n                            namesAbbr: [\n                                'Jan',\n                                'Feb',\n                                'Mar',\n                                'Apr',\n                                'May',\n                                'Jun',\n                                'Jul',\n                                'Aug',\n                                'Sep',\n                                'Oct',\n                                'Nov',\n                                'Dec'\n                            ]\n                        },\n                        AM: [\n                            'AM',\n                            'am',\n                            'AM'\n                        ],\n                        PM: [\n                            'PM',\n                            'pm',\n                            'PM'\n                        ],\n                        patterns: {\n                            d: 'M/d/yyyy',\n                            D: 'dddd, MMMM dd, yyyy',\n                            F: 'dddd, MMMM dd, yyyy h:mm:ss tt',\n                            g: 'M/d/yyyy h:mm tt',\n                            G: 'M/d/yyyy h:mm:ss tt',\n                            m: 'MMMM dd',\n                            M: 'MMMM dd',\n                            s: 'yyyy\\'-\\'MM\\'-\\'ddTHH\\':\\'mm\\':\\'ss',\n                            t: 'h:mm tt',\n                            T: 'h:mm:ss tt',\n                            u: 'yyyy\\'-\\'MM\\'-\\'dd HH\\':\\'mm\\':\\'ss\\'Z\\'',\n                            y: 'MMMM, yyyy',\n                            Y: 'MMMM, yyyy'\n                        },\n                        '/': '/',\n                        ':': ':',\n                        firstDay: 0,\n                        twoDigitYearMax: 2029\n                    }\n                }\n            };\n            function findCulture(culture) {\n                if (culture) {\n                    if (culture.numberFormat) {\n                        return culture;\n                    }\n                    if (typeof culture === STRING) {\n                        var cultures = kendo.cultures;\n                        return cultures[culture] || cultures[culture.split('-')[0]] || null;\n                    }\n                    return null;\n                }\n                return null;\n            }\n            function getCulture(culture) {\n                if (culture) {\n                    culture = findCulture(culture);\n                }\n                return culture || kendo.cultures.current;\n            }\n            kendo.culture = function (cultureName) {\n                var cultures = kendo.cultures, culture;\n                if (cultureName !== undefined) {\n                    culture = findCulture(cultureName) || cultures[EN];\n                    culture.calendar = culture.calendars.standard;\n                    cultures.current = culture;\n                } else {\n                    return cultures.current;\n                }\n            };\n            kendo.findCulture = findCulture;\n            kendo.getCulture = getCulture;\n            kendo.culture(EN);\n            function formatDate(date, format, culture) {\n                culture = getCulture(culture);\n                var calendar = culture.calendars.standard, days = calendar.days, months = calendar.months;\n                format = calendar.patterns[format] || format;\n                return format.replace(dateFormatRegExp, function (match) {\n                    var minutes;\n                    var result;\n                    var sign;\n                    if (match === 'd') {\n                        result = date.getDate();\n                    } else if (match === 'dd') {\n                        result = pad(date.getDate());\n                    } else if (match === 'ddd') {\n                        result = days.namesAbbr[date.getDay()];\n                    } else if (match === 'dddd') {\n                        result = days.names[date.getDay()];\n                    } else if (match === 'M') {\n                        result = date.getMonth() + 1;\n                    } else if (match === 'MM') {\n                        result = pad(date.getMonth() + 1);\n                    } else if (match === 'MMM') {\n                        result = months.namesAbbr[date.getMonth()];\n                    } else if (match === 'MMMM') {\n                        result = months.names[date.getMonth()];\n                    } else if (match === 'yy') {\n                        result = pad(date.getFullYear() % 100);\n                    } else if (match === 'yyyy') {\n                        result = pad(date.getFullYear(), 4);\n                    } else if (match === 'h') {\n                        result = date.getHours() % 12 || 12;\n                    } else if (match === 'hh') {\n                        result = pad(date.getHours() % 12 || 12);\n                    } else if (match === 'H') {\n                        result = date.getHours();\n                    } else if (match === 'HH') {\n                        result = pad(date.getHours());\n                    } else if (match === 'm') {\n                        result = date.getMinutes();\n                    } else if (match === 'mm') {\n                        result = pad(date.getMinutes());\n                    } else if (match === 's') {\n                        result = date.getSeconds();\n                    } else if (match === 'ss') {\n                        result = pad(date.getSeconds());\n                    } else if (match === 'f') {\n                        result = math.floor(date.getMilliseconds() / 100);\n                    } else if (match === 'ff') {\n                        result = date.getMilliseconds();\n                        if (result > 99) {\n                            result = math.floor(result / 10);\n                        }\n                        result = pad(result);\n                    } else if (match === 'fff') {\n                        result = pad(date.getMilliseconds(), 3);\n                    } else if (match === 'tt') {\n                        result = date.getHours() < 12 ? calendar.AM[0] : calendar.PM[0];\n                    } else if (match === 'zzz') {\n                        minutes = date.getTimezoneOffset();\n                        sign = minutes < 0;\n                        result = math.abs(minutes / 60).toString().split('.')[0];\n                        minutes = math.abs(minutes) - result * 60;\n                        result = (sign ? '+' : '-') + pad(result);\n                        result += ':' + pad(minutes);\n                    } else if (match === 'zz' || match === 'z') {\n                        result = date.getTimezoneOffset() / 60;\n                        sign = result < 0;\n                        result = math.abs(result).toString().split('.')[0];\n                        result = (sign ? '+' : '-') + (match === 'zz' ? pad(result) : result);\n                    }\n                    return result !== undefined ? result : match.slice(1, match.length - 1);\n                });\n            }\n            function formatNumber(number, format, culture) {\n                culture = getCulture(culture);\n                var numberFormat = culture.numberFormat, decimal = numberFormat[POINT], precision = numberFormat.decimals, pattern = numberFormat.pattern[0], literals = [], symbol, isCurrency, isPercent, customPrecision, formatAndPrecision, negative = number < 0, integer, fraction, integerLength, fractionLength, replacement = EMPTY, value = EMPTY, idx, length, ch, hasGroup, hasNegativeFormat, decimalIndex, sharpIndex, zeroIndex, hasZero, hasSharp, percentIndex, currencyIndex, startZeroIndex, start = -1, end;\n                if (number === undefined) {\n                    return EMPTY;\n                }\n                if (!isFinite(number)) {\n                    return number;\n                }\n                if (!format) {\n                    return culture.name.length ? number.toLocaleString() : number.toString();\n                }\n                formatAndPrecision = standardFormatRegExp.exec(format);\n                if (formatAndPrecision) {\n                    format = formatAndPrecision[1].toLowerCase();\n                    isCurrency = format === 'c';\n                    isPercent = format === 'p';\n                    if (isCurrency || isPercent) {\n                        numberFormat = isCurrency ? numberFormat.currency : numberFormat.percent;\n                        decimal = numberFormat[POINT];\n                        precision = numberFormat.decimals;\n                        symbol = numberFormat.symbol;\n                        pattern = numberFormat.pattern[negative ? 0 : 1];\n                    }\n                    customPrecision = formatAndPrecision[2];\n                    if (customPrecision) {\n                        precision = +customPrecision;\n                    }\n                    if (format === 'e') {\n                        return customPrecision ? number.toExponential(precision) : number.toExponential();\n                    }\n                    if (isPercent) {\n                        number *= 100;\n                    }\n                    number = round(number, precision);\n                    negative = number < 0;\n                    number = number.split(POINT);\n                    integer = number[0];\n                    fraction = number[1];\n                    if (negative) {\n                        integer = integer.substring(1);\n                    }\n                    value = groupInteger(integer, 0, integer.length, numberFormat);\n                    if (fraction) {\n                        value += decimal + fraction;\n                    }\n                    if (format === 'n' && !negative) {\n                        return value;\n                    }\n                    number = EMPTY;\n                    for (idx = 0, length = pattern.length; idx < length; idx++) {\n                        ch = pattern.charAt(idx);\n                        if (ch === 'n') {\n                            number += value;\n                        } else if (ch === '$' || ch === '%') {\n                            number += symbol;\n                        } else {\n                            number += ch;\n                        }\n                    }\n                    return number;\n                }\n                if (negative) {\n                    number = -number;\n                }\n                if (format.indexOf('\\'') > -1 || format.indexOf('\"') > -1 || format.indexOf('\\\\') > -1) {\n                    format = format.replace(literalRegExp, function (match) {\n                        var quoteChar = match.charAt(0).replace('\\\\', ''), literal = match.slice(1).replace(quoteChar, '');\n                        literals.push(literal);\n                        return PLACEHOLDER;\n                    });\n                }\n                format = format.split(';');\n                if (negative && format[1]) {\n                    format = format[1];\n                    hasNegativeFormat = true;\n                } else if (number === 0) {\n                    format = format[2] || format[0];\n                    if (format.indexOf(SHARP) == -1 && format.indexOf(ZERO) == -1) {\n                        return format;\n                    }\n                } else {\n                    format = format[0];\n                }\n                percentIndex = format.indexOf('%');\n                currencyIndex = format.indexOf('$');\n                isPercent = percentIndex != -1;\n                isCurrency = currencyIndex != -1;\n                if (isPercent) {\n                    number *= 100;\n                }\n                if (isCurrency && format[currencyIndex - 1] === '\\\\') {\n                    format = format.split('\\\\').join('');\n                    isCurrency = false;\n                }\n                if (isCurrency || isPercent) {\n                    numberFormat = isCurrency ? numberFormat.currency : numberFormat.percent;\n                    decimal = numberFormat[POINT];\n                    precision = numberFormat.decimals;\n                    symbol = numberFormat.symbol;\n                }\n                hasGroup = format.indexOf(COMMA) > -1;\n                if (hasGroup) {\n                    format = format.replace(commaRegExp, EMPTY);\n                }\n                decimalIndex = format.indexOf(POINT);\n                length = format.length;\n                if (decimalIndex != -1) {\n                    fraction = number.toString().split('e');\n                    if (fraction[1]) {\n                        fraction = round(number, Math.abs(fraction[1]));\n                    } else {\n                        fraction = fraction[0];\n                    }\n                    fraction = fraction.split(POINT)[1] || EMPTY;\n                    zeroIndex = format.lastIndexOf(ZERO) - decimalIndex;\n                    sharpIndex = format.lastIndexOf(SHARP) - decimalIndex;\n                    hasZero = zeroIndex > -1;\n                    hasSharp = sharpIndex > -1;\n                    idx = fraction.length;\n                    if (!hasZero && !hasSharp) {\n                        format = format.substring(0, decimalIndex) + format.substring(decimalIndex + 1);\n                        length = format.length;\n                        decimalIndex = -1;\n                        idx = 0;\n                    }\n                    if (hasZero && zeroIndex > sharpIndex) {\n                        idx = zeroIndex;\n                    } else if (sharpIndex > zeroIndex) {\n                        if (hasSharp && idx > sharpIndex) {\n                            idx = sharpIndex;\n                        } else if (hasZero && idx < zeroIndex) {\n                            idx = zeroIndex;\n                        }\n                    }\n                    if (idx > -1) {\n                        number = round(number, idx);\n                    }\n                } else {\n                    number = round(number);\n                }\n                sharpIndex = format.indexOf(SHARP);\n                startZeroIndex = zeroIndex = format.indexOf(ZERO);\n                if (sharpIndex == -1 && zeroIndex != -1) {\n                    start = zeroIndex;\n                } else if (sharpIndex != -1 && zeroIndex == -1) {\n                    start = sharpIndex;\n                } else {\n                    start = sharpIndex > zeroIndex ? zeroIndex : sharpIndex;\n                }\n                sharpIndex = format.lastIndexOf(SHARP);\n                zeroIndex = format.lastIndexOf(ZERO);\n                if (sharpIndex == -1 && zeroIndex != -1) {\n                    end = zeroIndex;\n                } else if (sharpIndex != -1 && zeroIndex == -1) {\n                    end = sharpIndex;\n                } else {\n                    end = sharpIndex > zeroIndex ? sharpIndex : zeroIndex;\n                }\n                if (start == length) {\n                    end = start;\n                }\n                if (start != -1) {\n                    value = number.toString().split(POINT);\n                    integer = value[0];\n                    fraction = value[1] || EMPTY;\n                    integerLength = integer.length;\n                    fractionLength = fraction.length;\n                    if (negative && number * -1 >= 0) {\n                        negative = false;\n                    }\n                    number = format.substring(0, start);\n                    if (negative && !hasNegativeFormat) {\n                        number += '-';\n                    }\n                    for (idx = start; idx < length; idx++) {\n                        ch = format.charAt(idx);\n                        if (decimalIndex == -1) {\n                            if (end - idx < integerLength) {\n                                number += integer;\n                                break;\n                            }\n                        } else {\n                            if (zeroIndex != -1 && zeroIndex < idx) {\n                                replacement = EMPTY;\n                            }\n                            if (decimalIndex - idx <= integerLength && decimalIndex - idx > -1) {\n                                number += integer;\n                                idx = decimalIndex;\n                            }\n                            if (decimalIndex === idx) {\n                                number += (fraction ? decimal : EMPTY) + fraction;\n                                idx += end - decimalIndex + 1;\n                                continue;\n                            }\n                        }\n                        if (ch === ZERO) {\n                            number += ch;\n                            replacement = ch;\n                        } else if (ch === SHARP) {\n                            number += replacement;\n                        }\n                    }\n                    if (hasGroup) {\n                        number = groupInteger(number, start + (negative && !hasNegativeFormat ? 1 : 0), Math.max(end, integerLength + start), numberFormat);\n                    }\n                    if (end >= start) {\n                        number += format.substring(end + 1);\n                    }\n                    if (isCurrency || isPercent) {\n                        value = EMPTY;\n                        for (idx = 0, length = number.length; idx < length; idx++) {\n                            ch = number.charAt(idx);\n                            value += ch === '$' || ch === '%' ? symbol : ch;\n                        }\n                        number = value;\n                    }\n                    length = literals.length;\n                    if (length) {\n                        for (idx = 0; idx < length; idx++) {\n                            number = number.replace(PLACEHOLDER, literals[idx]);\n                        }\n                    }\n                }\n                return number;\n            }\n            var groupInteger = function (number, start, end, numberFormat) {\n                var decimalIndex = number.indexOf(numberFormat[POINT]);\n                var groupSizes = numberFormat.groupSize.slice();\n                var groupSize = groupSizes.shift();\n                var integer, integerLength;\n                var idx, parts, value;\n                var newGroupSize;\n                end = decimalIndex !== -1 ? decimalIndex : end + 1;\n                integer = number.substring(start, end);\n                integerLength = integer.length;\n                if (integerLength >= groupSize) {\n                    idx = integerLength;\n                    parts = [];\n                    while (idx > -1) {\n                        value = integer.substring(idx - groupSize, idx);\n                        if (value) {\n                            parts.push(value);\n                        }\n                        idx -= groupSize;\n                        newGroupSize = groupSizes.shift();\n                        groupSize = newGroupSize !== undefined ? newGroupSize : groupSize;\n                        if (groupSize === 0) {\n                            parts.push(integer.substring(0, idx));\n                            break;\n                        }\n                    }\n                    integer = parts.reverse().join(numberFormat[COMMA]);\n                    number = number.substring(0, start) + integer + number.substring(end);\n                }\n                return number;\n            };\n            var round = function (value, precision) {\n                precision = precision || 0;\n                value = value.toString().split('e');\n                value = Math.round(+(value[0] + 'e' + (value[1] ? +value[1] + precision : precision)));\n                value = value.toString().split('e');\n                value = +(value[0] + 'e' + (value[1] ? +value[1] - precision : -precision));\n                return value.toFixed(Math.min(precision, 20));\n            };\n            var toString = function (value, fmt, culture) {\n                if (fmt) {\n                    if (objectToString.call(value) === '[object Date]') {\n                        return formatDate(value, fmt, culture);\n                    } else if (typeof value === NUMBER) {\n                        return formatNumber(value, fmt, culture);\n                    }\n                }\n                return value !== undefined ? value : '';\n            };\n            kendo.format = function (fmt) {\n                var values = arguments;\n                return fmt.replace(formatRegExp, function (match, index, placeholderFormat) {\n                    var value = values[parseInt(index, 10) + 1];\n                    return toString(value, placeholderFormat ? placeholderFormat.substring(1) : '');\n                });\n            };\n            kendo._extractFormat = function (format) {\n                if (format.slice(0, 3) === '{0:') {\n                    format = format.slice(3, format.length - 1);\n                }\n                return format;\n            };\n            kendo._activeElement = function () {\n                try {\n                    return document.activeElement;\n                } catch (e) {\n                    return document.documentElement.activeElement;\n                }\n            };\n            kendo._round = round;\n            kendo._outerWidth = function (element, includeMargin) {\n                return $(element).outerWidth(includeMargin || false) || 0;\n            };\n            kendo._outerHeight = function (element, includeMargin) {\n                return $(element).outerHeight(includeMargin || false) || 0;\n            };\n            kendo.toString = toString;\n        }());\n        (function () {\n            var nonBreakingSpaceRegExp = /\\u00A0/g, exponentRegExp = /[eE][\\-+]?[0-9]+/, shortTimeZoneRegExp = /[+|\\-]\\d{1,2}/, longTimeZoneRegExp = /[+|\\-]\\d{1,2}:?\\d{2}/, dateRegExp = /^\\/Date\\((.*?)\\)\\/$/, offsetRegExp = /[+-]\\d*/, FORMATS_SEQUENCE = [\n                    [],\n                    [\n                        'G',\n                        'g',\n                        'F'\n                    ],\n                    [\n                        'D',\n                        'd',\n                        'y',\n                        'm',\n                        'T',\n                        't'\n                    ]\n                ], STANDARD_FORMATS = [\n                    [\n                        'yyyy-MM-ddTHH:mm:ss.fffffffzzz',\n                        'yyyy-MM-ddTHH:mm:ss.fffffff',\n                        'yyyy-MM-ddTHH:mm:ss.fffzzz',\n                        'yyyy-MM-ddTHH:mm:ss.fff',\n                        'ddd MMM dd yyyy HH:mm:ss',\n                        'yyyy-MM-ddTHH:mm:sszzz',\n                        'yyyy-MM-ddTHH:mmzzz',\n                        'yyyy-MM-ddTHH:mmzz',\n                        'yyyy-MM-ddTHH:mm:ss',\n                        'yyyy-MM-dd HH:mm:ss',\n                        'yyyy/MM/dd HH:mm:ss'\n                    ],\n                    [\n                        'yyyy-MM-ddTHH:mm',\n                        'yyyy-MM-dd HH:mm',\n                        'yyyy/MM/dd HH:mm'\n                    ],\n                    [\n                        'yyyy/MM/dd',\n                        'yyyy-MM-dd',\n                        'HH:mm:ss',\n                        'HH:mm'\n                    ]\n                ], numberRegExp = {\n                    2: /^\\d{1,2}/,\n                    3: /^\\d{1,3}/,\n                    4: /^\\d{4}/\n                }, objectToString = {}.toString;\n            function outOfRange(value, start, end) {\n                return !(value >= start && value <= end);\n            }\n            function designatorPredicate(designator) {\n                return designator.charAt(0);\n            }\n            function mapDesignators(designators) {\n                return $.map(designators, designatorPredicate);\n            }\n            function adjustDST(date, hours) {\n                if (!hours && date.getHours() === 23) {\n                    date.setHours(date.getHours() + 2);\n                }\n            }\n            function lowerArray(data) {\n                var idx = 0, length = data.length, array = [];\n                for (; idx < length; idx++) {\n                    array[idx] = (data[idx] + '').toLowerCase();\n                }\n                return array;\n            }\n            function lowerLocalInfo(localInfo) {\n                var newLocalInfo = {}, property;\n                for (property in localInfo) {\n                    newLocalInfo[property] = lowerArray(localInfo[property]);\n                }\n                return newLocalInfo;\n            }\n            function parseExact(value, format, culture) {\n                if (!value) {\n                    return null;\n                }\n                var lookAhead = function (match) {\n                        var i = 0;\n                        while (format[idx] === match) {\n                            i++;\n                            idx++;\n                        }\n                        if (i > 0) {\n                            idx -= 1;\n                        }\n                        return i;\n                    }, getNumber = function (size) {\n                        var rg = numberRegExp[size] || new RegExp('^\\\\d{1,' + size + '}'), match = value.substr(valueIdx, size).match(rg);\n                        if (match) {\n                            match = match[0];\n                            valueIdx += match.length;\n                            return parseInt(match, 10);\n                        }\n                        return null;\n                    }, getIndexByName = function (names, lower) {\n                        var i = 0, length = names.length, name, nameLength, matchLength = 0, matchIdx = 0, subValue;\n                        for (; i < length; i++) {\n                            name = names[i];\n                            nameLength = name.length;\n                            subValue = value.substr(valueIdx, nameLength);\n                            if (lower) {\n                                subValue = subValue.toLowerCase();\n                            }\n                            if (subValue == name && nameLength > matchLength) {\n                                matchLength = nameLength;\n                                matchIdx = i;\n                            }\n                        }\n                        if (matchLength) {\n                            valueIdx += matchLength;\n                            return matchIdx + 1;\n                        }\n                        return null;\n                    }, checkLiteral = function () {\n                        var result = false;\n                        if (value.charAt(valueIdx) === format[idx]) {\n                            valueIdx++;\n                            result = true;\n                        }\n                        return result;\n                    }, calendar = culture.calendars.standard, year = null, month = null, day = null, hours = null, minutes = null, seconds = null, milliseconds = null, idx = 0, valueIdx = 0, literal = false, date = new Date(), twoDigitYearMax = calendar.twoDigitYearMax || 2029, defaultYear = date.getFullYear(), ch, count, length, pattern, pmHour, UTC, matches, amDesignators, pmDesignators, hoursOffset, minutesOffset, hasTime, match;\n                if (!format) {\n                    format = 'd';\n                }\n                pattern = calendar.patterns[format];\n                if (pattern) {\n                    format = pattern;\n                }\n                format = format.split('');\n                length = format.length;\n                for (; idx < length; idx++) {\n                    ch = format[idx];\n                    if (literal) {\n                        if (ch === '\\'') {\n                            literal = false;\n                        } else {\n                            checkLiteral();\n                        }\n                    } else {\n                        if (ch === 'd') {\n                            count = lookAhead('d');\n                            if (!calendar._lowerDays) {\n                                calendar._lowerDays = lowerLocalInfo(calendar.days);\n                            }\n                            if (day !== null && count > 2) {\n                                continue;\n                            }\n                            day = count < 3 ? getNumber(2) : getIndexByName(calendar._lowerDays[count == 3 ? 'namesAbbr' : 'names'], true);\n                            if (day === null || outOfRange(day, 1, 31)) {\n                                return null;\n                            }\n                        } else if (ch === 'M') {\n                            count = lookAhead('M');\n                            if (!calendar._lowerMonths) {\n                                calendar._lowerMonths = lowerLocalInfo(calendar.months);\n                            }\n                            month = count < 3 ? getNumber(2) : getIndexByName(calendar._lowerMonths[count == 3 ? 'namesAbbr' : 'names'], true);\n                            if (month === null || outOfRange(month, 1, 12)) {\n                                return null;\n                            }\n                            month -= 1;\n                        } else if (ch === 'y') {\n                            count = lookAhead('y');\n                            year = getNumber(count);\n                            if (year === null) {\n                                return null;\n                            }\n                            if (count == 2) {\n                                if (typeof twoDigitYearMax === 'string') {\n                                    twoDigitYearMax = defaultYear + parseInt(twoDigitYearMax, 10);\n                                }\n                                year = defaultYear - defaultYear % 100 + year;\n                                if (year > twoDigitYearMax) {\n                                    year -= 100;\n                                }\n                            }\n                        } else if (ch === 'h') {\n                            lookAhead('h');\n                            hours = getNumber(2);\n                            if (hours == 12) {\n                                hours = 0;\n                            }\n                            if (hours === null || outOfRange(hours, 0, 11)) {\n                                return null;\n                            }\n                        } else if (ch === 'H') {\n                            lookAhead('H');\n                            hours = getNumber(2);\n                            if (hours === null || outOfRange(hours, 0, 23)) {\n                                return null;\n                            }\n                        } else if (ch === 'm') {\n                            lookAhead('m');\n                            minutes = getNumber(2);\n                            if (minutes === null || outOfRange(minutes, 0, 59)) {\n                                return null;\n                            }\n                        } else if (ch === 's') {\n                            lookAhead('s');\n                            seconds = getNumber(2);\n                            if (seconds === null || outOfRange(seconds, 0, 59)) {\n                                return null;\n                            }\n                        } else if (ch === 'f') {\n                            count = lookAhead('f');\n                            match = value.substr(valueIdx, count).match(numberRegExp[3]);\n                            milliseconds = getNumber(count);\n                            if (milliseconds !== null) {\n                                milliseconds = parseFloat('0.' + match[0], 10);\n                                milliseconds = kendo._round(milliseconds, 3);\n                                milliseconds *= 1000;\n                            }\n                            if (milliseconds === null || outOfRange(milliseconds, 0, 999)) {\n                                return null;\n                            }\n                        } else if (ch === 't') {\n                            count = lookAhead('t');\n                            amDesignators = calendar.AM;\n                            pmDesignators = calendar.PM;\n                            if (count === 1) {\n                                amDesignators = mapDesignators(amDesignators);\n                                pmDesignators = mapDesignators(pmDesignators);\n                            }\n                            pmHour = getIndexByName(pmDesignators);\n                            if (!pmHour && !getIndexByName(amDesignators)) {\n                                return null;\n                            }\n                        } else if (ch === 'z') {\n                            UTC = true;\n                            count = lookAhead('z');\n                            if (value.substr(valueIdx, 1) === 'Z') {\n                                checkLiteral();\n                                continue;\n                            }\n                            matches = value.substr(valueIdx, 6).match(count > 2 ? longTimeZoneRegExp : shortTimeZoneRegExp);\n                            if (!matches) {\n                                return null;\n                            }\n                            matches = matches[0].split(':');\n                            hoursOffset = matches[0];\n                            minutesOffset = matches[1];\n                            if (!minutesOffset && hoursOffset.length > 3) {\n                                valueIdx = hoursOffset.length - 2;\n                                minutesOffset = hoursOffset.substring(valueIdx);\n                                hoursOffset = hoursOffset.substring(0, valueIdx);\n                            }\n                            hoursOffset = parseInt(hoursOffset, 10);\n                            if (outOfRange(hoursOffset, -12, 13)) {\n                                return null;\n                            }\n                            if (count > 2) {\n                                minutesOffset = parseInt(minutesOffset, 10);\n                                if (isNaN(minutesOffset) || outOfRange(minutesOffset, 0, 59)) {\n                                    return null;\n                                }\n                            }\n                        } else if (ch === '\\'') {\n                            literal = true;\n                            checkLiteral();\n                        } else if (!checkLiteral()) {\n                            return null;\n                        }\n                    }\n                }\n                hasTime = hours !== null || minutes !== null || seconds || null;\n                if (year === null && month === null && day === null && hasTime) {\n                    year = defaultYear;\n                    month = date.getMonth();\n                    day = date.getDate();\n                } else {\n                    if (year === null) {\n                        year = defaultYear;\n                    }\n                    if (day === null) {\n                        day = 1;\n                    }\n                }\n                if (pmHour && hours < 12) {\n                    hours += 12;\n                }\n                if (UTC) {\n                    if (hoursOffset) {\n                        hours += -hoursOffset;\n                    }\n                    if (minutesOffset) {\n                        minutes += -minutesOffset;\n                    }\n                    value = new Date(Date.UTC(year, month, day, hours, minutes, seconds, milliseconds));\n                } else {\n                    value = new Date(year, month, day, hours, minutes, seconds, milliseconds);\n                    adjustDST(value, hours);\n                }\n                if (year < 100) {\n                    value.setFullYear(year);\n                }\n                if (value.getDate() !== day && UTC === undefined) {\n                    return null;\n                }\n                return value;\n            }\n            function parseMicrosoftFormatOffset(offset) {\n                var sign = offset.substr(0, 1) === '-' ? -1 : 1;\n                offset = offset.substring(1);\n                offset = parseInt(offset.substr(0, 2), 10) * 60 + parseInt(offset.substring(2), 10);\n                return sign * offset;\n            }\n            function getDefaultFormats(culture) {\n                var length = math.max(FORMATS_SEQUENCE.length, STANDARD_FORMATS.length);\n                var patterns = culture.calendar.patterns;\n                var cultureFormats, formatIdx, idx;\n                var formats = [];\n                for (idx = 0; idx < length; idx++) {\n                    cultureFormats = FORMATS_SEQUENCE[idx];\n                    for (formatIdx = 0; formatIdx < cultureFormats.length; formatIdx++) {\n                        formats.push(patterns[cultureFormats[formatIdx]]);\n                    }\n                    formats = formats.concat(STANDARD_FORMATS[idx]);\n                }\n                return formats;\n            }\n            kendo.parseDate = function (value, formats, culture) {\n                if (objectToString.call(value) === '[object Date]') {\n                    return value;\n                }\n                var idx = 0;\n                var date = null;\n                var length;\n                var tzoffset;\n                if (value && value.indexOf('/D') === 0) {\n                    date = dateRegExp.exec(value);\n                    if (date) {\n                        date = date[1];\n                        tzoffset = offsetRegExp.exec(date.substring(1));\n                        date = new Date(parseInt(date, 10));\n                        if (tzoffset) {\n                            tzoffset = parseMicrosoftFormatOffset(tzoffset[0]);\n                            date = kendo.timezone.apply(date, 0);\n                            date = kendo.timezone.convert(date, 0, -1 * tzoffset);\n                        }\n                        return date;\n                    }\n                }\n                culture = kendo.getCulture(culture);\n                if (!formats) {\n                    formats = getDefaultFormats(culture);\n                }\n                formats = isArray(formats) ? formats : [formats];\n                length = formats.length;\n                for (; idx < length; idx++) {\n                    date = parseExact(value, formats[idx], culture);\n                    if (date) {\n                        return date;\n                    }\n                }\n                return date;\n            };\n            kendo.parseInt = function (value, culture) {\n                var result = kendo.parseFloat(value, culture);\n                if (result) {\n                    result = result | 0;\n                }\n                return result;\n            };\n            kendo.parseFloat = function (value, culture, format) {\n                if (!value && value !== 0) {\n                    return null;\n                }\n                if (typeof value === NUMBER) {\n                    return value;\n                }\n                value = value.toString();\n                culture = kendo.getCulture(culture);\n                var number = culture.numberFormat, percent = number.percent, currency = number.currency, symbol = currency.symbol, percentSymbol = percent.symbol, negative = value.indexOf('-'), parts, isPercent;\n                if (exponentRegExp.test(value)) {\n                    value = parseFloat(value.replace(number['.'], '.'));\n                    if (isNaN(value)) {\n                        value = null;\n                    }\n                    return value;\n                }\n                if (negative > 0) {\n                    return null;\n                } else {\n                    negative = negative > -1;\n                }\n                if (value.indexOf(symbol) > -1 || format && format.toLowerCase().indexOf('c') > -1) {\n                    number = currency;\n                    parts = number.pattern[0].replace('$', symbol).split('n');\n                    if (value.indexOf(parts[0]) > -1 && value.indexOf(parts[1]) > -1) {\n                        value = value.replace(parts[0], '').replace(parts[1], '');\n                        negative = true;\n                    }\n                } else if (value.indexOf(percentSymbol) > -1) {\n                    isPercent = true;\n                    number = percent;\n                    symbol = percentSymbol;\n                }\n                value = value.replace('-', '').replace(symbol, '').replace(nonBreakingSpaceRegExp, ' ').split(number[','].replace(nonBreakingSpaceRegExp, ' ')).join('').replace(number['.'], '.');\n                value = parseFloat(value);\n                if (isNaN(value)) {\n                    value = null;\n                } else if (negative) {\n                    value *= -1;\n                }\n                if (value && isPercent) {\n                    value /= 100;\n                }\n                return value;\n            };\n        }());\n        function getShadows(element) {\n            var shadow = element.css(kendo.support.transitions.css + 'box-shadow') || element.css('box-shadow'), radius = shadow ? shadow.match(boxShadowRegExp) || [\n                    0,\n                    0,\n                    0,\n                    0,\n                    0\n                ] : [\n                    0,\n                    0,\n                    0,\n                    0,\n                    0\n                ], blur = math.max(+radius[3], +(radius[4] || 0));\n            return {\n                left: -radius[1] + blur,\n                right: +radius[1] + blur,\n                bottom: +radius[2] + blur\n            };\n        }\n        function wrap(element, autosize) {\n            var browser = support.browser, percentage, outerWidth = kendo._outerWidth, outerHeight = kendo._outerHeight;\n            if (!element.parent().hasClass('k-animation-container')) {\n                var width = element[0].style.width, height = element[0].style.height, percentWidth = percentRegExp.test(width), percentHeight = percentRegExp.test(height);\n                percentage = percentWidth || percentHeight;\n                if (!percentWidth && (!autosize || autosize && width)) {\n                    width = autosize ? outerWidth(element) + 1 : outerWidth(element);\n                }\n                if (!percentHeight && (!autosize || autosize && height)) {\n                    height = outerHeight(element);\n                }\n                element.wrap($('<div/>').addClass('k-animation-container').css({\n                    width: width,\n                    height: height\n                }));\n                if (percentage) {\n                    element.css({\n                        width: '100%',\n                        height: '100%',\n                        boxSizing: 'border-box',\n                        mozBoxSizing: 'border-box',\n                        webkitBoxSizing: 'border-box'\n                    });\n                }\n            } else {\n                var wrapper = element.parent('.k-animation-container'), wrapperStyle = wrapper[0].style;\n                if (wrapper.is(':hidden')) {\n                    wrapper.show();\n                }\n                percentage = percentRegExp.test(wrapperStyle.width) || percentRegExp.test(wrapperStyle.height);\n                if (!percentage) {\n                    wrapper.css({\n                        width: autosize ? outerWidth(element) + 1 : outerWidth(element),\n                        height: outerHeight(element),\n                        boxSizing: 'content-box',\n                        mozBoxSizing: 'content-box',\n                        webkitBoxSizing: 'content-box'\n                    });\n                }\n            }\n            if (browser.msie && math.floor(browser.version) <= 7) {\n                element.css({ zoom: 1 });\n                element.children('.k-menu').width(element.width());\n            }\n            return element.parent();\n        }\n        function deepExtend(destination) {\n            var i = 1, length = arguments.length;\n            for (i = 1; i < length; i++) {\n                deepExtendOne(destination, arguments[i]);\n            }\n            return destination;\n        }\n        function deepExtendOne(destination, source) {\n            var ObservableArray = kendo.data.ObservableArray, LazyObservableArray = kendo.data.LazyObservableArray, DataSource = kendo.data.DataSource, HierarchicalDataSource = kendo.data.HierarchicalDataSource, property, propValue, propType, propInit, destProp;\n            for (property in source) {\n                propValue = source[property];\n                propType = typeof propValue;\n                if (propType === OBJECT && propValue !== null) {\n                    propInit = propValue.constructor;\n                } else {\n                    propInit = null;\n                }\n                if (propInit && propInit !== Array && propInit !== ObservableArray && propInit !== LazyObservableArray && propInit !== DataSource && propInit !== HierarchicalDataSource && propInit !== RegExp) {\n                    if (propValue instanceof Date) {\n                        destination[property] = new Date(propValue.getTime());\n                    } else if (isFunction(propValue.clone)) {\n                        destination[property] = propValue.clone();\n                    } else {\n                        destProp = destination[property];\n                        if (typeof destProp === OBJECT) {\n                            destination[property] = destProp || {};\n                        } else {\n                            destination[property] = {};\n                        }\n                        deepExtendOne(destination[property], propValue);\n                    }\n                } else if (propType !== UNDEFINED) {\n                    destination[property] = propValue;\n                }\n            }\n            return destination;\n        }\n        function testRx(agent, rxs, dflt) {\n            for (var rx in rxs) {\n                if (rxs.hasOwnProperty(rx) && rxs[rx].test(agent)) {\n                    return rx;\n                }\n            }\n            return dflt !== undefined ? dflt : agent;\n        }\n        function toHyphens(str) {\n            return str.replace(/([a-z][A-Z])/g, function (g) {\n                return g.charAt(0) + '-' + g.charAt(1).toLowerCase();\n            });\n        }\n        function toCamelCase(str) {\n            return str.replace(/\\-(\\w)/g, function (strMatch, g1) {\n                return g1.toUpperCase();\n            });\n        }\n        function getComputedStyles(element, properties) {\n            var styles = {}, computedStyle;\n            if (document.defaultView && document.defaultView.getComputedStyle) {\n                computedStyle = document.defaultView.getComputedStyle(element, '');\n                if (properties) {\n                    $.each(properties, function (idx, value) {\n                        styles[value] = computedStyle.getPropertyValue(value);\n                    });\n                }\n            } else {\n                computedStyle = element.currentStyle;\n                if (properties) {\n                    $.each(properties, function (idx, value) {\n                        styles[value] = computedStyle[toCamelCase(value)];\n                    });\n                }\n            }\n            if (!kendo.size(styles)) {\n                styles = computedStyle;\n            }\n            return styles;\n        }\n        function isScrollable(element) {\n            if (element && element.className && typeof element.className === 'string' && element.className.indexOf('k-auto-scrollable') > -1) {\n                return true;\n            }\n            var overflow = getComputedStyles(element, ['overflow']).overflow;\n            return overflow == 'auto' || overflow == 'scroll';\n        }\n        function scrollLeft(element, value) {\n            var webkit = support.browser.webkit;\n            var mozila = support.browser.mozilla;\n            var el = element instanceof $ ? element[0] : element;\n            var isRtl;\n            if (!element) {\n                return;\n            }\n            isRtl = support.isRtl(element);\n            if (value !== undefined) {\n                if (isRtl && webkit) {\n                    el.scrollLeft = el.scrollWidth - el.clientWidth - value;\n                } else if (isRtl && mozila) {\n                    el.scrollLeft = -value;\n                } else {\n                    el.scrollLeft = value;\n                }\n            } else {\n                if (isRtl && webkit) {\n                    return el.scrollWidth - el.clientWidth - el.scrollLeft;\n                } else {\n                    return Math.abs(el.scrollLeft);\n                }\n            }\n        }\n        (function () {\n            support._scrollbar = undefined;\n            support.scrollbar = function (refresh) {\n                if (!isNaN(support._scrollbar) && !refresh) {\n                    return support._scrollbar;\n                } else {\n                    var div = document.createElement('div'), result;\n                    div.style.cssText = 'overflow:scroll;overflow-x:hidden;zoom:1;clear:both;display:block';\n                    div.innerHTML = '&nbsp;';\n                    document.body.appendChild(div);\n                    support._scrollbar = result = div.offsetWidth - div.scrollWidth;\n                    document.body.removeChild(div);\n                    return result;\n                }\n            };\n            support.isRtl = function (element) {\n                return $(element).closest('.k-rtl').length > 0;\n            };\n            var table = document.createElement('table');\n            try {\n                table.innerHTML = '<tr><td></td></tr>';\n                support.tbodyInnerHtml = true;\n            } catch (e) {\n                support.tbodyInnerHtml = false;\n            }\n            support.touch = 'ontouchstart' in window;\n            var docStyle = document.documentElement.style;\n            var transitions = support.transitions = false, transforms = support.transforms = false, elementProto = 'HTMLElement' in window ? HTMLElement.prototype : [];\n            support.hasHW3D = 'WebKitCSSMatrix' in window && 'm11' in new window.WebKitCSSMatrix() || 'MozPerspective' in docStyle || 'msPerspective' in docStyle;\n            support.cssFlexbox = 'flexWrap' in docStyle || 'WebkitFlexWrap' in docStyle || 'msFlexWrap' in docStyle;\n            each([\n                'Moz',\n                'webkit',\n                'O',\n                'ms'\n            ], function () {\n                var prefix = this.toString(), hasTransitions = typeof table.style[prefix + 'Transition'] === STRING;\n                if (hasTransitions || typeof table.style[prefix + 'Transform'] === STRING) {\n                    var lowPrefix = prefix.toLowerCase();\n                    transforms = {\n                        css: lowPrefix != 'ms' ? '-' + lowPrefix + '-' : '',\n                        prefix: prefix,\n                        event: lowPrefix === 'o' || lowPrefix === 'webkit' ? lowPrefix : ''\n                    };\n                    if (hasTransitions) {\n                        transitions = transforms;\n                        transitions.event = transitions.event ? transitions.event + 'TransitionEnd' : 'transitionend';\n                    }\n                    return false;\n                }\n            });\n            table = null;\n            support.transforms = transforms;\n            support.transitions = transitions;\n            support.devicePixelRatio = window.devicePixelRatio === undefined ? 1 : window.devicePixelRatio;\n            try {\n                support.screenWidth = window.outerWidth || window.screen ? window.screen.availWidth : window.innerWidth;\n                support.screenHeight = window.outerHeight || window.screen ? window.screen.availHeight : window.innerHeight;\n            } catch (e) {\n                support.screenWidth = window.screen.availWidth;\n                support.screenHeight = window.screen.availHeight;\n            }\n            support.detectOS = function (ua) {\n                var os = false, minorVersion, match = [], notAndroidPhone = !/mobile safari/i.test(ua), agentRxs = {\n                        wp: /(Windows Phone(?: OS)?)\\s(\\d+)\\.(\\d+(\\.\\d+)?)/,\n                        fire: /(Silk)\\/(\\d+)\\.(\\d+(\\.\\d+)?)/,\n                        android: /(Android|Android.*(?:Opera|Firefox).*?\\/)\\s*(\\d+)\\.(\\d+(\\.\\d+)?)/,\n                        iphone: /(iPhone|iPod).*OS\\s+(\\d+)[\\._]([\\d\\._]+)/,\n                        ipad: /(iPad).*OS\\s+(\\d+)[\\._]([\\d_]+)/,\n                        meego: /(MeeGo).+NokiaBrowser\\/(\\d+)\\.([\\d\\._]+)/,\n                        webos: /(webOS)\\/(\\d+)\\.(\\d+(\\.\\d+)?)/,\n                        blackberry: /(BlackBerry|BB10).*?Version\\/(\\d+)\\.(\\d+(\\.\\d+)?)/,\n                        playbook: /(PlayBook).*?Tablet\\s*OS\\s*(\\d+)\\.(\\d+(\\.\\d+)?)/,\n                        windows: /(MSIE)\\s+(\\d+)\\.(\\d+(\\.\\d+)?)/,\n                        tizen: /(tizen).*?Version\\/(\\d+)\\.(\\d+(\\.\\d+)?)/i,\n                        sailfish: /(sailfish).*rv:(\\d+)\\.(\\d+(\\.\\d+)?).*firefox/i,\n                        ffos: /(Mobile).*rv:(\\d+)\\.(\\d+(\\.\\d+)?).*Firefox/\n                    }, osRxs = {\n                        ios: /^i(phone|pad|pod)$/i,\n                        android: /^android|fire$/i,\n                        blackberry: /^blackberry|playbook/i,\n                        windows: /windows/,\n                        wp: /wp/,\n                        flat: /sailfish|ffos|tizen/i,\n                        meego: /meego/\n                    }, formFactorRxs = { tablet: /playbook|ipad|fire/i }, browserRxs = {\n                        omini: /Opera\\sMini/i,\n                        omobile: /Opera\\sMobi/i,\n                        firefox: /Firefox|Fennec/i,\n                        mobilesafari: /version\\/.*safari/i,\n                        ie: /MSIE|Windows\\sPhone/i,\n                        chrome: /chrome|crios/i,\n                        webkit: /webkit/i\n                    };\n                for (var agent in agentRxs) {\n                    if (agentRxs.hasOwnProperty(agent)) {\n                        match = ua.match(agentRxs[agent]);\n                        if (match) {\n                            if (agent == 'windows' && 'plugins' in navigator) {\n                                return false;\n                            }\n                            os = {};\n                            os.device = agent;\n                            os.tablet = testRx(agent, formFactorRxs, false);\n                            os.browser = testRx(ua, browserRxs, 'default');\n                            os.name = testRx(agent, osRxs);\n                            os[os.name] = true;\n                            os.majorVersion = match[2];\n                            os.minorVersion = match[3].replace('_', '.');\n                            minorVersion = os.minorVersion.replace('.', '').substr(0, 2);\n                            os.flatVersion = os.majorVersion + minorVersion + new Array(3 - (minorVersion.length < 3 ? minorVersion.length : 2)).join('0');\n                            os.cordova = typeof window.PhoneGap !== UNDEFINED || typeof window.cordova !== UNDEFINED;\n                            os.appMode = window.navigator.standalone || /file|local|wmapp/.test(window.location.protocol) || os.cordova;\n                            if (os.android && (support.devicePixelRatio < 1.5 && os.flatVersion < 400 || notAndroidPhone) && (support.screenWidth > 800 || support.screenHeight > 800)) {\n                                os.tablet = agent;\n                            }\n                            break;\n                        }\n                    }\n                }\n                return os;\n            };\n            var mobileOS = support.mobileOS = support.detectOS(navigator.userAgent);\n            support.wpDevicePixelRatio = mobileOS.wp ? screen.width / 320 : 0;\n            support.hasNativeScrolling = false;\n            if (mobileOS.ios || mobileOS.android && mobileOS.majorVersion > 2 || mobileOS.wp) {\n                support.hasNativeScrolling = mobileOS;\n            }\n            support.delayedClick = function () {\n                if (support.touch) {\n                    if (mobileOS.ios) {\n                        return true;\n                    }\n                    if (mobileOS.android) {\n                        if (!support.browser.chrome) {\n                            return true;\n                        }\n                        if (support.browser.version < 32) {\n                            return false;\n                        }\n                        return !($('meta[name=viewport]').attr('content') || '').match(/user-scalable=no/i);\n                    }\n                }\n                return false;\n            };\n            support.mouseAndTouchPresent = support.touch && !(support.mobileOS.ios || support.mobileOS.android);\n            support.detectBrowser = function (ua) {\n                var browser = false, match = [], browserRxs = {\n                        edge: /(edge)[ \\/]([\\w.]+)/i,\n                        webkit: /(chrome)[ \\/]([\\w.]+)/i,\n                        safari: /(webkit)[ \\/]([\\w.]+)/i,\n                        opera: /(opera)(?:.*version|)[ \\/]([\\w.]+)/i,\n                        msie: /(msie\\s|trident.*? rv:)([\\w.]+)/i,\n                        mozilla: /(mozilla)(?:.*? rv:([\\w.]+)|)/i\n                    };\n                for (var agent in browserRxs) {\n                    if (browserRxs.hasOwnProperty(agent)) {\n                        match = ua.match(browserRxs[agent]);\n                        if (match) {\n                            browser = {};\n                            browser[agent] = true;\n                            browser[match[1].toLowerCase().split(' ')[0].split('/')[0]] = true;\n                            browser.version = parseInt(document.documentMode || match[2], 10);\n                            break;\n                        }\n                    }\n                }\n                return browser;\n            };\n            support.browser = support.detectBrowser(navigator.userAgent);\n            support.detectClipboardAccess = function () {\n                var commands = {\n                    copy: document.queryCommandSupported ? document.queryCommandSupported('copy') : false,\n                    cut: document.queryCommandSupported ? document.queryCommandSupported('cut') : false,\n                    paste: document.queryCommandSupported ? document.queryCommandSupported('paste') : false\n                };\n                if (support.browser.chrome) {\n                    commands.paste = false;\n                    if (support.browser.version >= 43) {\n                        commands.copy = true;\n                        commands.cut = true;\n                    }\n                }\n                return commands;\n            };\n            support.clipboard = support.detectClipboardAccess();\n            support.zoomLevel = function () {\n                try {\n                    var browser = support.browser;\n                    var ie11WidthCorrection = 0;\n                    var docEl = document.documentElement;\n                    if (browser.msie && browser.version == 11 && docEl.scrollHeight > docEl.clientHeight && !support.touch) {\n                        ie11WidthCorrection = support.scrollbar();\n                    }\n                    return support.touch ? docEl.clientWidth / window.innerWidth : browser.msie && browser.version >= 10 ? ((top || window).document.documentElement.offsetWidth + ie11WidthCorrection) / (top || window).innerWidth : 1;\n                } catch (e) {\n                    return 1;\n                }\n            };\n            support.cssBorderSpacing = typeof docStyle.borderSpacing != 'undefined' && !(support.browser.msie && support.browser.version < 8);\n            (function (browser) {\n                var cssClass = '', docElement = $(document.documentElement), majorVersion = parseInt(browser.version, 10);\n                if (browser.msie) {\n                    cssClass = 'ie';\n                } else if (browser.mozilla) {\n                    cssClass = 'ff';\n                } else if (browser.safari) {\n                    cssClass = 'safari';\n                } else if (browser.webkit) {\n                    cssClass = 'webkit';\n                } else if (browser.opera) {\n                    cssClass = 'opera';\n                } else if (browser.edge) {\n                    cssClass = 'edge';\n                }\n                if (cssClass) {\n                    cssClass = 'k-' + cssClass + ' k-' + cssClass + majorVersion;\n                }\n                if (support.mobileOS) {\n                    cssClass += ' k-mobile';\n                }\n                if (!support.cssFlexbox) {\n                    cssClass += ' k-no-flexbox';\n                }\n                docElement.addClass(cssClass);\n            }(support.browser));\n            support.eventCapture = document.documentElement.addEventListener;\n            var input = document.createElement('input');\n            support.placeholder = 'placeholder' in input;\n            support.propertyChangeEvent = 'onpropertychange' in input;\n            support.input = function () {\n                var types = [\n                    'number',\n                    'date',\n                    'time',\n                    'month',\n                    'week',\n                    'datetime',\n                    'datetime-local'\n                ];\n                var length = types.length;\n                var value = 'test';\n                var result = {};\n                var idx = 0;\n                var type;\n                for (; idx < length; idx++) {\n                    type = types[idx];\n                    input.setAttribute('type', type);\n                    input.value = value;\n                    result[type.replace('-', '')] = input.type !== 'text' && input.value !== value;\n                }\n                return result;\n            }();\n            input.style.cssText = 'float:left;';\n            support.cssFloat = !!input.style.cssFloat;\n            input = null;\n            support.stableSort = function () {\n                var threshold = 513;\n                var sorted = [{\n                        index: 0,\n                        field: 'b'\n                    }];\n                for (var i = 1; i < threshold; i++) {\n                    sorted.push({\n                        index: i,\n                        field: 'a'\n                    });\n                }\n                sorted.sort(function (a, b) {\n                    return a.field > b.field ? 1 : a.field < b.field ? -1 : 0;\n                });\n                return sorted[0].index === 1;\n            }();\n            support.matchesSelector = elementProto.webkitMatchesSelector || elementProto.mozMatchesSelector || elementProto.msMatchesSelector || elementProto.oMatchesSelector || elementProto.matchesSelector || elementProto.matches || function (selector) {\n                var nodeList = document.querySelectorAll ? (this.parentNode || document).querySelectorAll(selector) || [] : $(selector), i = nodeList.length;\n                while (i--) {\n                    if (nodeList[i] == this) {\n                        return true;\n                    }\n                }\n                return false;\n            };\n            support.pushState = window.history && window.history.pushState;\n            var documentMode = document.documentMode;\n            support.hashChange = 'onhashchange' in window && !(support.browser.msie && (!documentMode || documentMode <= 8));\n            support.customElements = 'registerElement' in window.document;\n            var chrome = support.browser.chrome;\n            support.msPointers = !chrome && window.MSPointerEvent;\n            support.pointers = !chrome && window.PointerEvent;\n            support.kineticScrollNeeded = mobileOS && (support.touch || support.msPointers || support.pointers);\n        }());\n        function size(obj) {\n            var result = 0, key;\n            for (key in obj) {\n                if (obj.hasOwnProperty(key) && key != 'toJSON') {\n                    result++;\n                }\n            }\n            return result;\n        }\n        function getOffset(element, type, positioned) {\n            if (!type) {\n                type = 'offset';\n            }\n            var offset = element[type]();\n            var result = {\n                top: offset.top,\n                right: offset.right,\n                bottom: offset.bottom,\n                left: offset.left\n            };\n            if (support.browser.msie && (support.pointers || support.msPointers) && !positioned) {\n                var sign = support.isRtl(element) ? 1 : -1;\n                result.top -= window.pageYOffset - document.documentElement.scrollTop;\n                result.left -= window.pageXOffset + sign * document.documentElement.scrollLeft;\n            }\n            return result;\n        }\n        var directions = {\n            left: { reverse: 'right' },\n            right: { reverse: 'left' },\n            down: { reverse: 'up' },\n            up: { reverse: 'down' },\n            top: { reverse: 'bottom' },\n            bottom: { reverse: 'top' },\n            'in': { reverse: 'out' },\n            out: { reverse: 'in' }\n        };\n        function parseEffects(input) {\n            var effects = {};\n            each(typeof input === 'string' ? input.split(' ') : input, function (idx) {\n                effects[idx] = this;\n            });\n            return effects;\n        }\n        function fx(element) {\n            return new kendo.effects.Element(element);\n        }\n        var effects = {};\n        $.extend(effects, {\n            enabled: true,\n            Element: function (element) {\n                this.element = $(element);\n            },\n            promise: function (element, options) {\n                if (!element.is(':visible')) {\n                    element.css({ display: element.data('olddisplay') || 'block' }).css('display');\n                }\n                if (options.hide) {\n                    element.data('olddisplay', element.css('display')).hide();\n                }\n                if (options.init) {\n                    options.init();\n                }\n                if (options.completeCallback) {\n                    options.completeCallback(element);\n                }\n                element.dequeue();\n            },\n            disable: function () {\n                this.enabled = false;\n                this.promise = this.promiseShim;\n            },\n            enable: function () {\n                this.enabled = true;\n                this.promise = this.animatedPromise;\n            }\n        });\n        effects.promiseShim = effects.promise;\n        function prepareAnimationOptions(options, duration, reverse, complete) {\n            if (typeof options === STRING) {\n                if (isFunction(duration)) {\n                    complete = duration;\n                    duration = 400;\n                    reverse = false;\n                }\n                if (isFunction(reverse)) {\n                    complete = reverse;\n                    reverse = false;\n                }\n                if (typeof duration === BOOLEAN) {\n                    reverse = duration;\n                    duration = 400;\n                }\n                options = {\n                    effects: options,\n                    duration: duration,\n                    reverse: reverse,\n                    complete: complete\n                };\n            }\n            return extend({\n                effects: {},\n                duration: 400,\n                reverse: false,\n                init: noop,\n                teardown: noop,\n                hide: false\n            }, options, {\n                completeCallback: options.complete,\n                complete: noop\n            });\n        }\n        function animate(element, options, duration, reverse, complete) {\n            var idx = 0, length = element.length, instance;\n            for (; idx < length; idx++) {\n                instance = $(element[idx]);\n                instance.queue(function () {\n                    effects.promise(instance, prepareAnimationOptions(options, duration, reverse, complete));\n                });\n            }\n            return element;\n        }\n        function toggleClass(element, classes, options, add) {\n            if (classes) {\n                classes = classes.split(' ');\n                each(classes, function (idx, value) {\n                    element.toggleClass(value, add);\n                });\n            }\n            return element;\n        }\n        if (!('kendoAnimate' in $.fn)) {\n            extend($.fn, {\n                kendoStop: function (clearQueue, gotoEnd) {\n                    return this.stop(clearQueue, gotoEnd);\n                },\n                kendoAnimate: function (options, duration, reverse, complete) {\n                    return animate(this, options, duration, reverse, complete);\n                },\n                kendoAddClass: function (classes, options) {\n                    return kendo.toggleClass(this, classes, options, true);\n                },\n                kendoRemoveClass: function (classes, options) {\n                    return kendo.toggleClass(this, classes, options, false);\n                },\n                kendoToggleClass: function (classes, options, toggle) {\n                    return kendo.toggleClass(this, classes, options, toggle);\n                }\n            });\n        }\n        var ampRegExp = /&/g, ltRegExp = /</g, quoteRegExp = /\"/g, aposRegExp = /'/g, gtRegExp = />/g;\n        function htmlEncode(value) {\n            return ('' + value).replace(ampRegExp, '&amp;').replace(ltRegExp, '&lt;').replace(gtRegExp, '&gt;').replace(quoteRegExp, '&quot;').replace(aposRegExp, '&#39;');\n        }\n        var eventTarget = function (e) {\n            return e.target;\n        };\n        if (support.touch) {\n            eventTarget = function (e) {\n                var touches = 'originalEvent' in e ? e.originalEvent.changedTouches : 'changedTouches' in e ? e.changedTouches : null;\n                return touches ? document.elementFromPoint(touches[0].clientX, touches[0].clientY) : e.target;\n            };\n            each([\n                'swipe',\n                'swipeLeft',\n                'swipeRight',\n                'swipeUp',\n                'swipeDown',\n                'doubleTap',\n                'tap'\n            ], function (m, value) {\n                $.fn[value] = function (callback) {\n                    return this.bind(value, callback);\n                };\n            });\n        }\n        if (support.touch) {\n            if (!support.mobileOS) {\n                support.mousedown = 'mousedown touchstart';\n                support.mouseup = 'mouseup touchend';\n                support.mousemove = 'mousemove touchmove';\n                support.mousecancel = 'mouseleave touchcancel';\n                support.click = 'click';\n                support.resize = 'resize';\n            } else {\n                support.mousedown = 'touchstart';\n                support.mouseup = 'touchend';\n                support.mousemove = 'touchmove';\n                support.mousecancel = 'touchcancel';\n                support.click = 'touchend';\n                support.resize = 'orientationchange';\n            }\n        } else if (support.pointers) {\n            support.mousemove = 'pointermove';\n            support.mousedown = 'pointerdown';\n            support.mouseup = 'pointerup';\n            support.mousecancel = 'pointercancel';\n            support.click = 'pointerup';\n            support.resize = 'orientationchange resize';\n        } else if (support.msPointers) {\n            support.mousemove = 'MSPointerMove';\n            support.mousedown = 'MSPointerDown';\n            support.mouseup = 'MSPointerUp';\n            support.mousecancel = 'MSPointerCancel';\n            support.click = 'MSPointerUp';\n            support.resize = 'orientationchange resize';\n        } else {\n            support.mousemove = 'mousemove';\n            support.mousedown = 'mousedown';\n            support.mouseup = 'mouseup';\n            support.mousecancel = 'mouseleave';\n            support.click = 'click';\n            support.resize = 'resize';\n        }\n        var wrapExpression = function (members, paramName) {\n                var result = paramName || 'd', index, idx, length, member, count = 1;\n                for (idx = 0, length = members.length; idx < length; idx++) {\n                    member = members[idx];\n                    if (member !== '') {\n                        index = member.indexOf('[');\n                        if (index !== 0) {\n                            if (index == -1) {\n                                member = '.' + member;\n                            } else {\n                                count++;\n                                member = '.' + member.substring(0, index) + ' || {})' + member.substring(index);\n                            }\n                        }\n                        count++;\n                        result += member + (idx < length - 1 ? ' || {})' : ')');\n                    }\n                }\n                return new Array(count).join('(') + result;\n            }, localUrlRe = /^([a-z]+:)?\\/\\//i;\n        extend(kendo, {\n            widgets: [],\n            _widgetRegisteredCallbacks: [],\n            ui: kendo.ui || {},\n            fx: kendo.fx || fx,\n            effects: kendo.effects || effects,\n            mobile: kendo.mobile || {},\n            data: kendo.data || {},\n            dataviz: kendo.dataviz || {},\n            drawing: kendo.drawing || {},\n            spreadsheet: { messages: {} },\n            keys: {\n                INSERT: 45,\n                DELETE: 46,\n                BACKSPACE: 8,\n                TAB: 9,\n                ENTER: 13,\n                ESC: 27,\n                LEFT: 37,\n                UP: 38,\n                RIGHT: 39,\n                DOWN: 40,\n                END: 35,\n                HOME: 36,\n                SPACEBAR: 32,\n                PAGEUP: 33,\n                PAGEDOWN: 34,\n                F2: 113,\n                F10: 121,\n                F12: 123,\n                NUMPAD_PLUS: 107,\n                NUMPAD_MINUS: 109,\n                NUMPAD_DOT: 110\n            },\n            support: kendo.support || support,\n            animate: kendo.animate || animate,\n            ns: '',\n            attr: function (value) {\n                return 'data-' + kendo.ns + value;\n            },\n            getShadows: getShadows,\n            wrap: wrap,\n            deepExtend: deepExtend,\n            getComputedStyles: getComputedStyles,\n            webComponents: kendo.webComponents || [],\n            isScrollable: isScrollable,\n            scrollLeft: scrollLeft,\n            size: size,\n            toCamelCase: toCamelCase,\n            toHyphens: toHyphens,\n            getOffset: kendo.getOffset || getOffset,\n            parseEffects: kendo.parseEffects || parseEffects,\n            toggleClass: kendo.toggleClass || toggleClass,\n            directions: kendo.directions || directions,\n            Observable: Observable,\n            Class: Class,\n            Template: Template,\n            template: proxy(Template.compile, Template),\n            render: proxy(Template.render, Template),\n            stringify: proxy(JSON.stringify, JSON),\n            eventTarget: eventTarget,\n            htmlEncode: htmlEncode,\n            isLocalUrl: function (url) {\n                return url && !localUrlRe.test(url);\n            },\n            expr: function (expression, safe, paramName) {\n                expression = expression || '';\n                if (typeof safe == STRING) {\n                    paramName = safe;\n                    safe = false;\n                }\n                paramName = paramName || 'd';\n                if (expression && expression.charAt(0) !== '[') {\n                    expression = '.' + expression;\n                }\n                if (safe) {\n                    expression = expression.replace(/\"([^.]*)\\.([^\"]*)\"/g, '\"$1_$DOT$_$2\"');\n                    expression = expression.replace(/'([^.]*)\\.([^']*)'/g, '\\'$1_$DOT$_$2\\'');\n                    expression = wrapExpression(expression.split('.'), paramName);\n                    expression = expression.replace(/_\\$DOT\\$_/g, '.');\n                } else {\n                    expression = paramName + expression;\n                }\n                return expression;\n            },\n            getter: function (expression, safe) {\n                var key = expression + safe;\n                return getterCache[key] = getterCache[key] || new Function('d', 'return ' + kendo.expr(expression, safe));\n            },\n            setter: function (expression) {\n                return setterCache[expression] = setterCache[expression] || new Function('d,value', kendo.expr(expression) + '=value');\n            },\n            accessor: function (expression) {\n                return {\n                    get: kendo.getter(expression),\n                    set: kendo.setter(expression)\n                };\n            },\n            guid: function () {\n                var id = '', i, random;\n                for (i = 0; i < 32; i++) {\n                    random = math.random() * 16 | 0;\n                    if (i == 8 || i == 12 || i == 16 || i == 20) {\n                        id += '-';\n                    }\n                    id += (i == 12 ? 4 : i == 16 ? random & 3 | 8 : random).toString(16);\n                }\n                return id;\n            },\n            roleSelector: function (role) {\n                return role.replace(/(\\S+)/g, '[' + kendo.attr('role') + '=$1],').slice(0, -1);\n            },\n            directiveSelector: function (directives) {\n                var selectors = directives.split(' ');\n                if (selectors) {\n                    for (var i = 0; i < selectors.length; i++) {\n                        if (selectors[i] != 'view') {\n                            selectors[i] = selectors[i].replace(/(\\w*)(view|bar|strip|over)$/, '$1-$2');\n                        }\n                    }\n                }\n                return selectors.join(' ').replace(/(\\S+)/g, 'kendo-mobile-$1,').slice(0, -1);\n            },\n            triggeredByInput: function (e) {\n                return /^(label|input|textarea|select)$/i.test(e.target.tagName);\n            },\n            onWidgetRegistered: function (callback) {\n                for (var i = 0, len = kendo.widgets.length; i < len; i++) {\n                    callback(kendo.widgets[i]);\n                }\n                kendo._widgetRegisteredCallbacks.push(callback);\n            },\n            logToConsole: function (message, type) {\n                var console = window.console;\n                if (!kendo.suppressLog && typeof console != 'undefined' && console.log) {\n                    console[type || 'log'](message);\n                }\n            }\n        });\n        var Widget = Observable.extend({\n            init: function (element, options) {\n                var that = this;\n                that.element = kendo.jQuery(element).handler(that);\n                that.angular('init', options);\n                Observable.fn.init.call(that);\n                var dataSource = options ? options.dataSource : null;\n                if (dataSource) {\n                    options = extend({}, options, { dataSource: {} });\n                }\n                options = that.options = extend(true, {}, that.options, options);\n                if (dataSource) {\n                    options.dataSource = dataSource;\n                }\n                if (!that.element.attr(kendo.attr('role'))) {\n                    that.element.attr(kendo.attr('role'), (options.name || '').toLowerCase());\n                }\n                that.element.data('kendo' + options.prefix + options.name, that);\n                that.bind(that.events, options);\n            },\n            events: [],\n            options: { prefix: '' },\n            _hasBindingTarget: function () {\n                return !!this.element[0].kendoBindingTarget;\n            },\n            _tabindex: function (target) {\n                target = target || this.wrapper;\n                var element = this.element, TABINDEX = 'tabindex', tabindex = target.attr(TABINDEX) || element.attr(TABINDEX);\n                element.removeAttr(TABINDEX);\n                target.attr(TABINDEX, !isNaN(tabindex) ? tabindex : 0);\n            },\n            setOptions: function (options) {\n                this._setEvents(options);\n                $.extend(this.options, options);\n            },\n            _setEvents: function (options) {\n                var that = this, idx = 0, length = that.events.length, e;\n                for (; idx < length; idx++) {\n                    e = that.events[idx];\n                    if (that.options[e] && options[e]) {\n                        that.unbind(e, that.options[e]);\n                    }\n                }\n                that.bind(that.events, options);\n            },\n            resize: function (force) {\n                var size = this.getSize(), currentSize = this._size;\n                if (force || (size.width > 0 || size.height > 0) && (!currentSize || size.width !== currentSize.width || size.height !== currentSize.height)) {\n                    this._size = size;\n                    this._resize(size, force);\n                    this.trigger('resize', size);\n                }\n            },\n            getSize: function () {\n                return kendo.dimensions(this.element);\n            },\n            size: function (size) {\n                if (!size) {\n                    return this.getSize();\n                } else {\n                    this.setSize(size);\n                }\n            },\n            setSize: $.noop,\n            _resize: $.noop,\n            destroy: function () {\n                var that = this;\n                that.element.removeData('kendo' + that.options.prefix + that.options.name);\n                that.element.removeData('handler');\n                that.unbind();\n            },\n            _destroy: function () {\n                this.destroy();\n            },\n            angular: function () {\n            },\n            _muteAngularRebind: function (callback) {\n                this._muteRebind = true;\n                callback.call(this);\n                this._muteRebind = false;\n            }\n        });\n        var DataBoundWidget = Widget.extend({\n            dataItems: function () {\n                return this.dataSource.flatView();\n            },\n            _angularItems: function (cmd) {\n                var that = this;\n                that.angular(cmd, function () {\n                    return {\n                        elements: that.items(),\n                        data: $.map(that.dataItems(), function (dataItem) {\n                            return { dataItem: dataItem };\n                        })\n                    };\n                });\n            }\n        });\n        kendo.dimensions = function (element, dimensions) {\n            var domElement = element[0];\n            if (dimensions) {\n                element.css(dimensions);\n            }\n            return {\n                width: domElement.offsetWidth,\n                height: domElement.offsetHeight\n            };\n        };\n        kendo.notify = noop;\n        var templateRegExp = /template$/i, jsonRegExp = /^\\s*(?:\\{(?:.|\\r\\n|\\n)*\\}|\\[(?:.|\\r\\n|\\n)*\\])\\s*$/, jsonFormatRegExp = /^\\{(\\d+)(:[^\\}]+)?\\}|^\\[[A-Za-z_]+\\]$/, dashRegExp = /([A-Z])/g;\n        function parseOption(element, option) {\n            var value;\n            if (option.indexOf('data') === 0) {\n                option = option.substring(4);\n                option = option.charAt(0).toLowerCase() + option.substring(1);\n            }\n            option = option.replace(dashRegExp, '-$1');\n            value = element.getAttribute('data-' + kendo.ns + option);\n            if (value === null) {\n                value = undefined;\n            } else if (value === 'null') {\n                value = null;\n            } else if (value === 'true') {\n                value = true;\n            } else if (value === 'false') {\n                value = false;\n            } else if (numberRegExp.test(value)) {\n                value = parseFloat(value);\n            } else if (jsonRegExp.test(value) && !jsonFormatRegExp.test(value)) {\n                value = new Function('return (' + value + ')')();\n            }\n            return value;\n        }\n        function parseOptions(element, options) {\n            var result = {}, option, value;\n            for (option in options) {\n                value = parseOption(element, option);\n                if (value !== undefined) {\n                    if (templateRegExp.test(option)) {\n                        if (typeof value === 'string') {\n                            value = kendo.template($('#' + value).html());\n                        } else {\n                            value = element.getAttribute(option);\n                        }\n                    }\n                    result[option] = value;\n                }\n            }\n            return result;\n        }\n        kendo.initWidget = function (element, options, roles) {\n            var result, option, widget, idx, length, role, value, dataSource, fullPath, widgetKeyRegExp;\n            if (!roles) {\n                roles = kendo.ui.roles;\n            } else if (roles.roles) {\n                roles = roles.roles;\n            }\n            element = element.nodeType ? element : element[0];\n            role = element.getAttribute('data-' + kendo.ns + 'role');\n            if (!role) {\n                return;\n            }\n            fullPath = role.indexOf('.') === -1;\n            if (fullPath) {\n                widget = roles[role];\n            } else {\n                widget = kendo.getter(role)(window);\n            }\n            var data = $(element).data(), widgetKey = widget ? 'kendo' + widget.fn.options.prefix + widget.fn.options.name : '';\n            if (fullPath) {\n                widgetKeyRegExp = new RegExp('^kendo.*' + role + '$', 'i');\n            } else {\n                widgetKeyRegExp = new RegExp('^' + widgetKey + '$', 'i');\n            }\n            for (var key in data) {\n                if (key.match(widgetKeyRegExp)) {\n                    if (key === widgetKey) {\n                        result = data[key];\n                    } else {\n                        return data[key];\n                    }\n                }\n            }\n            if (!widget) {\n                return;\n            }\n            dataSource = parseOption(element, 'dataSource');\n            options = $.extend({}, parseOptions(element, widget.fn.options), options);\n            if (dataSource) {\n                if (typeof dataSource === STRING) {\n                    options.dataSource = kendo.getter(dataSource)(window);\n                } else {\n                    options.dataSource = dataSource;\n                }\n            }\n            for (idx = 0, length = widget.fn.events.length; idx < length; idx++) {\n                option = widget.fn.events[idx];\n                value = parseOption(element, option);\n                if (value !== undefined) {\n                    options[option] = kendo.getter(value)(window);\n                }\n            }\n            if (!result) {\n                result = new widget(element, options);\n            } else if (!$.isEmptyObject(options)) {\n                result.setOptions(options);\n            }\n            return result;\n        };\n        kendo.rolesFromNamespaces = function (namespaces) {\n            var roles = [], idx, length;\n            if (!namespaces[0]) {\n                namespaces = [\n                    kendo.ui,\n                    kendo.dataviz.ui\n                ];\n            }\n            for (idx = 0, length = namespaces.length; idx < length; idx++) {\n                roles[idx] = namespaces[idx].roles;\n            }\n            return extend.apply(null, [{}].concat(roles.reverse()));\n        };\n        kendo.init = function (element) {\n            var roles = kendo.rolesFromNamespaces(slice.call(arguments, 1));\n            $(element).find('[data-' + kendo.ns + 'role]').addBack().each(function () {\n                kendo.initWidget(this, {}, roles);\n            });\n        };\n        kendo.destroy = function (element) {\n            $(element).find('[data-' + kendo.ns + 'role]').addBack().each(function () {\n                var data = $(this).data();\n                for (var key in data) {\n                    if (key.indexOf('kendo') === 0 && typeof data[key].destroy === FUNCTION) {\n                        data[key].destroy();\n                    }\n                }\n            });\n        };\n        function containmentComparer(a, b) {\n            return $.contains(a, b) ? -1 : 1;\n        }\n        function resizableWidget() {\n            var widget = $(this);\n            return $.inArray(widget.attr('data-' + kendo.ns + 'role'), [\n                'slider',\n                'rangeslider'\n            ]) > -1 || widget.is(':visible');\n        }\n        kendo.resize = function (element, force) {\n            var widgets = $(element).find('[data-' + kendo.ns + 'role]').addBack().filter(resizableWidget);\n            if (!widgets.length) {\n                return;\n            }\n            var widgetsArray = $.makeArray(widgets);\n            widgetsArray.sort(containmentComparer);\n            $.each(widgetsArray, function () {\n                var widget = kendo.widgetInstance($(this));\n                if (widget) {\n                    widget.resize(force);\n                }\n            });\n        };\n        kendo.parseOptions = parseOptions;\n        extend(kendo.ui, {\n            Widget: Widget,\n            DataBoundWidget: DataBoundWidget,\n            roles: {},\n            progress: function (container, toggle) {\n                var mask = container.find('.k-loading-mask'), support = kendo.support, browser = support.browser, isRtl, leftRight, webkitCorrection, containerScrollLeft;\n                if (toggle) {\n                    if (!mask.length) {\n                        isRtl = support.isRtl(container);\n                        leftRight = isRtl ? 'right' : 'left';\n                        containerScrollLeft = container.scrollLeft();\n                        webkitCorrection = browser.webkit ? !isRtl ? 0 : container[0].scrollWidth - container.width() - 2 * containerScrollLeft : 0;\n                        mask = $('<div class=\\'k-loading-mask\\'><span class=\\'k-loading-text\\'>' + kendo.ui.progress.messages.loading + '</span><div class=\\'k-loading-image\\'/><div class=\\'k-loading-color\\'/></div>').width('100%').height('100%').css('top', container.scrollTop()).css(leftRight, Math.abs(containerScrollLeft) + webkitCorrection).prependTo(container);\n                    }\n                } else if (mask) {\n                    mask.remove();\n                }\n            },\n            plugin: function (widget, register, prefix) {\n                var name = widget.fn.options.name, getter;\n                register = register || kendo.ui;\n                prefix = prefix || '';\n                register[name] = widget;\n                register.roles[name.toLowerCase()] = widget;\n                getter = 'getKendo' + prefix + name;\n                name = 'kendo' + prefix + name;\n                var widgetEntry = {\n                    name: name,\n                    widget: widget,\n                    prefix: prefix || ''\n                };\n                kendo.widgets.push(widgetEntry);\n                for (var i = 0, len = kendo._widgetRegisteredCallbacks.length; i < len; i++) {\n                    kendo._widgetRegisteredCallbacks[i](widgetEntry);\n                }\n                $.fn[name] = function (options) {\n                    var value = this, args;\n                    if (typeof options === STRING) {\n                        args = slice.call(arguments, 1);\n                        this.each(function () {\n                            var widget = $.data(this, name), method, result;\n                            if (!widget) {\n                                throw new Error(kendo.format('Cannot call method \\'{0}\\' of {1} before it is initialized', options, name));\n                            }\n                            method = widget[options];\n                            if (typeof method !== FUNCTION) {\n                                throw new Error(kendo.format('Cannot find method \\'{0}\\' of {1}', options, name));\n                            }\n                            result = method.apply(widget, args);\n                            if (result !== undefined) {\n                                value = result;\n                                return false;\n                            }\n                        });\n                    } else {\n                        this.each(function () {\n                            return new widget(this, options);\n                        });\n                    }\n                    return value;\n                };\n                $.fn[name].widget = widget;\n                $.fn[getter] = function () {\n                    return this.data(name);\n                };\n            }\n        });\n        kendo.ui.progress.messages = { loading: 'Loading...' };\n        var ContainerNullObject = {\n            bind: function () {\n                return this;\n            },\n            nullObject: true,\n            options: {}\n        };\n        var MobileWidget = Widget.extend({\n            init: function (element, options) {\n                Widget.fn.init.call(this, element, options);\n                this.element.autoApplyNS();\n                this.wrapper = this.element;\n                this.element.addClass('km-widget');\n            },\n            destroy: function () {\n                Widget.fn.destroy.call(this);\n                this.element.kendoDestroy();\n            },\n            options: { prefix: 'Mobile' },\n            events: [],\n            view: function () {\n                var viewElement = this.element.closest(kendo.roleSelector('view splitview modalview drawer'));\n                return kendo.widgetInstance(viewElement, kendo.mobile.ui) || ContainerNullObject;\n            },\n            viewHasNativeScrolling: function () {\n                var view = this.view();\n                return view && view.options.useNativeScrolling;\n            },\n            container: function () {\n                var element = this.element.closest(kendo.roleSelector('view layout modalview drawer splitview'));\n                return kendo.widgetInstance(element.eq(0), kendo.mobile.ui) || ContainerNullObject;\n            }\n        });\n        extend(kendo.mobile, {\n            init: function (element) {\n                kendo.init(element, kendo.mobile.ui, kendo.ui, kendo.dataviz.ui);\n            },\n            appLevelNativeScrolling: function () {\n                return kendo.mobile.application && kendo.mobile.application.options && kendo.mobile.application.options.useNativeScrolling;\n            },\n            roles: {},\n            ui: {\n                Widget: MobileWidget,\n                DataBoundWidget: DataBoundWidget.extend(MobileWidget.prototype),\n                roles: {},\n                plugin: function (widget) {\n                    kendo.ui.plugin(widget, kendo.mobile.ui, 'Mobile');\n                }\n            }\n        });\n        deepExtend(kendo.dataviz, {\n            init: function (element) {\n                kendo.init(element, kendo.dataviz.ui);\n            },\n            ui: {\n                roles: {},\n                themes: {},\n                views: [],\n                plugin: function (widget) {\n                    kendo.ui.plugin(widget, kendo.dataviz.ui);\n                }\n            },\n            roles: {}\n        });\n        kendo.touchScroller = function (elements, options) {\n            if (!options) {\n                options = {};\n            }\n            options.useNative = true;\n            return $(elements).map(function (idx, element) {\n                element = $(element);\n                if (support.kineticScrollNeeded && kendo.mobile.ui.Scroller && !element.data('kendoMobileScroller')) {\n                    element.kendoMobileScroller(options);\n                    return element.data('kendoMobileScroller');\n                } else {\n                    return false;\n                }\n            })[0];\n        };\n        kendo.preventDefault = function (e) {\n            e.preventDefault();\n        };\n        kendo.widgetInstance = function (element, suites) {\n            var role = element.data(kendo.ns + 'role'), widgets = [], i, length;\n            if (role) {\n                if (role === 'content') {\n                    role = 'scroller';\n                }\n                if (suites) {\n                    if (suites[0]) {\n                        for (i = 0, length = suites.length; i < length; i++) {\n                            widgets.push(suites[i].roles[role]);\n                        }\n                    } else {\n                        widgets.push(suites.roles[role]);\n                    }\n                } else {\n                    widgets = [\n                        kendo.ui.roles[role],\n                        kendo.dataviz.ui.roles[role],\n                        kendo.mobile.ui.roles[role]\n                    ];\n                }\n                if (role.indexOf('.') >= 0) {\n                    widgets = [kendo.getter(role)(window)];\n                }\n                for (i = 0, length = widgets.length; i < length; i++) {\n                    var widget = widgets[i];\n                    if (widget) {\n                        var instance = element.data('kendo' + widget.fn.options.prefix + widget.fn.options.name);\n                        if (instance) {\n                            return instance;\n                        }\n                    }\n                }\n            }\n        };\n        kendo.onResize = function (callback) {\n            var handler = callback;\n            if (support.mobileOS.android) {\n                handler = function () {\n                    setTimeout(callback, 600);\n                };\n            }\n            $(window).on(support.resize, handler);\n            return handler;\n        };\n        kendo.unbindResize = function (callback) {\n            $(window).off(support.resize, callback);\n        };\n        kendo.attrValue = function (element, key) {\n            return element.data(kendo.ns + key);\n        };\n        kendo.days = {\n            Sunday: 0,\n            Monday: 1,\n            Tuesday: 2,\n            Wednesday: 3,\n            Thursday: 4,\n            Friday: 5,\n            Saturday: 6\n        };\n        function focusable(element, isTabIndexNotNaN) {\n            var nodeName = element.nodeName.toLowerCase();\n            return (/input|select|textarea|button|object/.test(nodeName) ? !element.disabled : 'a' === nodeName ? element.href || isTabIndexNotNaN : isTabIndexNotNaN) && visible(element);\n        }\n        function visible(element) {\n            return $.expr.filters.visible(element) && !$(element).parents().addBack().filter(function () {\n                return $.css(this, 'visibility') === 'hidden';\n            }).length;\n        }\n        $.extend($.expr[':'], {\n            kendoFocusable: function (element) {\n                var idx = $.attr(element, 'tabindex');\n                return focusable(element, !isNaN(idx) && idx > -1);\n            }\n        });\n        var MOUSE_EVENTS = [\n            'mousedown',\n            'mousemove',\n            'mouseenter',\n            'mouseleave',\n            'mouseover',\n            'mouseout',\n            'mouseup',\n            'click'\n        ];\n        var EXCLUDE_BUST_CLICK_SELECTOR = 'label, input, [data-rel=external]';\n        var MouseEventNormalizer = {\n            setupMouseMute: function () {\n                var idx = 0, length = MOUSE_EVENTS.length, element = document.documentElement;\n                if (MouseEventNormalizer.mouseTrap || !support.eventCapture) {\n                    return;\n                }\n                MouseEventNormalizer.mouseTrap = true;\n                MouseEventNormalizer.bustClick = false;\n                MouseEventNormalizer.captureMouse = false;\n                var handler = function (e) {\n                    if (MouseEventNormalizer.captureMouse) {\n                        if (e.type === 'click') {\n                            if (MouseEventNormalizer.bustClick && !$(e.target).is(EXCLUDE_BUST_CLICK_SELECTOR)) {\n                                e.preventDefault();\n                                e.stopPropagation();\n                            }\n                        } else {\n                            e.stopPropagation();\n                        }\n                    }\n                };\n                for (; idx < length; idx++) {\n                    element.addEventListener(MOUSE_EVENTS[idx], handler, true);\n                }\n            },\n            muteMouse: function (e) {\n                MouseEventNormalizer.captureMouse = true;\n                if (e.data.bustClick) {\n                    MouseEventNormalizer.bustClick = true;\n                }\n                clearTimeout(MouseEventNormalizer.mouseTrapTimeoutID);\n            },\n            unMuteMouse: function () {\n                clearTimeout(MouseEventNormalizer.mouseTrapTimeoutID);\n                MouseEventNormalizer.mouseTrapTimeoutID = setTimeout(function () {\n                    MouseEventNormalizer.captureMouse = false;\n                    MouseEventNormalizer.bustClick = false;\n                }, 400);\n            }\n        };\n        var eventMap = {\n            down: 'touchstart mousedown',\n            move: 'mousemove touchmove',\n            up: 'mouseup touchend touchcancel',\n            cancel: 'mouseleave touchcancel'\n        };\n        if (support.touch && (support.mobileOS.ios || support.mobileOS.android)) {\n            eventMap = {\n                down: 'touchstart',\n                move: 'touchmove',\n                up: 'touchend touchcancel',\n                cancel: 'touchcancel'\n            };\n        } else if (support.pointers) {\n            eventMap = {\n                down: 'pointerdown',\n                move: 'pointermove',\n                up: 'pointerup',\n                cancel: 'pointercancel pointerleave'\n            };\n        } else if (support.msPointers) {\n            eventMap = {\n                down: 'MSPointerDown',\n                move: 'MSPointerMove',\n                up: 'MSPointerUp',\n                cancel: 'MSPointerCancel MSPointerLeave'\n            };\n        }\n        if (support.msPointers && !('onmspointerenter' in window)) {\n            $.each({\n                MSPointerEnter: 'MSPointerOver',\n                MSPointerLeave: 'MSPointerOut'\n            }, function (orig, fix) {\n                $.event.special[orig] = {\n                    delegateType: fix,\n                    bindType: fix,\n                    handle: function (event) {\n                        var ret, target = this, related = event.relatedTarget, handleObj = event.handleObj;\n                        if (!related || related !== target && !$.contains(target, related)) {\n                            event.type = handleObj.origType;\n                            ret = handleObj.handler.apply(this, arguments);\n                            event.type = fix;\n                        }\n                        return ret;\n                    }\n                };\n            });\n        }\n        var getEventMap = function (e) {\n                return eventMap[e] || e;\n            }, eventRegEx = /([^ ]+)/g;\n        kendo.applyEventMap = function (events, ns) {\n            events = events.replace(eventRegEx, getEventMap);\n            if (ns) {\n                events = events.replace(eventRegEx, '$1.' + ns);\n            }\n            return events;\n        };\n        var on = $.fn.on;\n        function kendoJQuery(selector, context) {\n            return new kendoJQuery.fn.init(selector, context);\n        }\n        extend(true, kendoJQuery, $);\n        kendoJQuery.fn = kendoJQuery.prototype = new $();\n        kendoJQuery.fn.constructor = kendoJQuery;\n        kendoJQuery.fn.init = function (selector, context) {\n            if (context && context instanceof $ && !(context instanceof kendoJQuery)) {\n                context = kendoJQuery(context);\n            }\n            return $.fn.init.call(this, selector, context, rootjQuery);\n        };\n        kendoJQuery.fn.init.prototype = kendoJQuery.fn;\n        var rootjQuery = kendoJQuery(document);\n        extend(kendoJQuery.fn, {\n            handler: function (handler) {\n                this.data('handler', handler);\n                return this;\n            },\n            autoApplyNS: function (ns) {\n                this.data('kendoNS', ns || kendo.guid());\n                return this;\n            },\n            on: function () {\n                var that = this, ns = that.data('kendoNS');\n                if (arguments.length === 1) {\n                    return on.call(that, arguments[0]);\n                }\n                var context = that, args = slice.call(arguments);\n                if (typeof args[args.length - 1] === UNDEFINED) {\n                    args.pop();\n                }\n                var callback = args[args.length - 1], events = kendo.applyEventMap(args[0], ns);\n                if (support.mouseAndTouchPresent && events.search(/mouse|click/) > -1 && this[0] !== document.documentElement) {\n                    MouseEventNormalizer.setupMouseMute();\n                    var selector = args.length === 2 ? null : args[1], bustClick = events.indexOf('click') > -1 && events.indexOf('touchend') > -1;\n                    on.call(this, {\n                        touchstart: MouseEventNormalizer.muteMouse,\n                        touchend: MouseEventNormalizer.unMuteMouse\n                    }, selector, { bustClick: bustClick });\n                }\n                if (typeof callback === STRING) {\n                    context = that.data('handler');\n                    callback = context[callback];\n                    args[args.length - 1] = function (e) {\n                        callback.call(context, e);\n                    };\n                }\n                args[0] = events;\n                on.apply(that, args);\n                return that;\n            },\n            kendoDestroy: function (ns) {\n                ns = ns || this.data('kendoNS');\n                if (ns) {\n                    this.off('.' + ns);\n                }\n                return this;\n            }\n        });\n        kendo.jQuery = kendoJQuery;\n        kendo.eventMap = eventMap;\n        kendo.timezone = function () {\n            var months = {\n                Jan: 0,\n                Feb: 1,\n                Mar: 2,\n                Apr: 3,\n                May: 4,\n                Jun: 5,\n                Jul: 6,\n                Aug: 7,\n                Sep: 8,\n                Oct: 9,\n                Nov: 10,\n                Dec: 11\n            };\n            var days = {\n                Sun: 0,\n                Mon: 1,\n                Tue: 2,\n                Wed: 3,\n                Thu: 4,\n                Fri: 5,\n                Sat: 6\n            };\n            function ruleToDate(year, rule) {\n                var date;\n                var targetDay;\n                var ourDay;\n                var month = rule[3];\n                var on = rule[4];\n                var time = rule[5];\n                var cache = rule[8];\n                if (!cache) {\n                    rule[8] = cache = {};\n                }\n                if (cache[year]) {\n                    return cache[year];\n                }\n                if (!isNaN(on)) {\n                    date = new Date(Date.UTC(year, months[month], on, time[0], time[1], time[2], 0));\n                } else if (on.indexOf('last') === 0) {\n                    date = new Date(Date.UTC(year, months[month] + 1, 1, time[0] - 24, time[1], time[2], 0));\n                    targetDay = days[on.substr(4, 3)];\n                    ourDay = date.getUTCDay();\n                    date.setUTCDate(date.getUTCDate() + targetDay - ourDay - (targetDay > ourDay ? 7 : 0));\n                } else if (on.indexOf('>=') >= 0) {\n                    date = new Date(Date.UTC(year, months[month], on.substr(5), time[0], time[1], time[2], 0));\n                    targetDay = days[on.substr(0, 3)];\n                    ourDay = date.getUTCDay();\n                    date.setUTCDate(date.getUTCDate() + targetDay - ourDay + (targetDay < ourDay ? 7 : 0));\n                }\n                return cache[year] = date;\n            }\n            function findRule(utcTime, rules, zone) {\n                rules = rules[zone];\n                if (!rules) {\n                    var time = zone.split(':');\n                    var offset = 0;\n                    if (time.length > 1) {\n                        offset = time[0] * 60 + Number(time[1]);\n                    }\n                    return [\n                        -1000000,\n                        'max',\n                        '-',\n                        'Jan',\n                        1,\n                        [\n                            0,\n                            0,\n                            0\n                        ],\n                        offset,\n                        '-'\n                    ];\n                }\n                var year = new Date(utcTime).getUTCFullYear();\n                rules = jQuery.grep(rules, function (rule) {\n                    var from = rule[0];\n                    var to = rule[1];\n                    return from <= year && (to >= year || from == year && to == 'only' || to == 'max');\n                });\n                rules.push(utcTime);\n                rules.sort(function (a, b) {\n                    if (typeof a != 'number') {\n                        a = Number(ruleToDate(year, a));\n                    }\n                    if (typeof b != 'number') {\n                        b = Number(ruleToDate(year, b));\n                    }\n                    return a - b;\n                });\n                var rule = rules[jQuery.inArray(utcTime, rules) - 1] || rules[rules.length - 1];\n                return isNaN(rule) ? rule : null;\n            }\n            function findZone(utcTime, zones, timezone) {\n                var zoneRules = zones[timezone];\n                if (typeof zoneRules === 'string') {\n                    zoneRules = zones[zoneRules];\n                }\n                if (!zoneRules) {\n                    throw new Error('Timezone \"' + timezone + '\" is either incorrect, or kendo.timezones.min.js is not included.');\n                }\n                for (var idx = zoneRules.length - 1; idx >= 0; idx--) {\n                    var until = zoneRules[idx][3];\n                    if (until && utcTime > until) {\n                        break;\n                    }\n                }\n                var zone = zoneRules[idx + 1];\n                if (!zone) {\n                    throw new Error('Timezone \"' + timezone + '\" not found on ' + utcTime + '.');\n                }\n                return zone;\n            }\n            function zoneAndRule(utcTime, zones, rules, timezone) {\n                if (typeof utcTime != NUMBER) {\n                    utcTime = Date.UTC(utcTime.getFullYear(), utcTime.getMonth(), utcTime.getDate(), utcTime.getHours(), utcTime.getMinutes(), utcTime.getSeconds(), utcTime.getMilliseconds());\n                }\n                var zone = findZone(utcTime, zones, timezone);\n                return {\n                    zone: zone,\n                    rule: findRule(utcTime, rules, zone[1])\n                };\n            }\n            function offset(utcTime, timezone) {\n                if (timezone == 'Etc/UTC' || timezone == 'Etc/GMT') {\n                    return 0;\n                }\n                var info = zoneAndRule(utcTime, this.zones, this.rules, timezone);\n                var zone = info.zone;\n                var rule = info.rule;\n                return kendo.parseFloat(rule ? zone[0] - rule[6] : zone[0]);\n            }\n            function abbr(utcTime, timezone) {\n                var info = zoneAndRule(utcTime, this.zones, this.rules, timezone);\n                var zone = info.zone;\n                var rule = info.rule;\n                var base = zone[2];\n                if (base.indexOf('/') >= 0) {\n                    return base.split('/')[rule && +rule[6] ? 1 : 0];\n                } else if (base.indexOf('%s') >= 0) {\n                    return base.replace('%s', !rule || rule[7] == '-' ? '' : rule[7]);\n                }\n                return base;\n            }\n            function convert(date, fromOffset, toOffset) {\n                if (typeof fromOffset == STRING) {\n                    fromOffset = this.offset(date, fromOffset);\n                }\n                if (typeof toOffset == STRING) {\n                    toOffset = this.offset(date, toOffset);\n                }\n                var fromLocalOffset = date.getTimezoneOffset();\n                date = new Date(date.getTime() + (fromOffset - toOffset) * 60000);\n                var toLocalOffset = date.getTimezoneOffset();\n                return new Date(date.getTime() + (toLocalOffset - fromLocalOffset) * 60000);\n            }\n            function apply(date, timezone) {\n                return this.convert(date, date.getTimezoneOffset(), timezone);\n            }\n            function remove(date, timezone) {\n                return this.convert(date, timezone, date.getTimezoneOffset());\n            }\n            function toLocalDate(time) {\n                return this.apply(new Date(time), 'Etc/UTC');\n            }\n            return {\n                zones: {},\n                rules: {},\n                offset: offset,\n                convert: convert,\n                apply: apply,\n                remove: remove,\n                abbr: abbr,\n                toLocalDate: toLocalDate\n            };\n        }();\n        kendo.date = function () {\n            var MS_PER_MINUTE = 60000, MS_PER_DAY = 86400000;\n            function adjustDST(date, hours) {\n                if (hours === 0 && date.getHours() === 23) {\n                    date.setHours(date.getHours() + 2);\n                    return true;\n                }\n                return false;\n            }\n            function setDayOfWeek(date, day, dir) {\n                var hours = date.getHours();\n                dir = dir || 1;\n                day = (day - date.getDay() + 7 * dir) % 7;\n                date.setDate(date.getDate() + day);\n                adjustDST(date, hours);\n            }\n            function dayOfWeek(date, day, dir) {\n                date = new Date(date);\n                setDayOfWeek(date, day, dir);\n                return date;\n            }\n            function firstDayOfMonth(date) {\n                return new Date(date.getFullYear(), date.getMonth(), 1);\n            }\n            function lastDayOfMonth(date) {\n                var last = new Date(date.getFullYear(), date.getMonth() + 1, 0), first = firstDayOfMonth(date), timeOffset = Math.abs(last.getTimezoneOffset() - first.getTimezoneOffset());\n                if (timeOffset) {\n                    last.setHours(first.getHours() + timeOffset / 60);\n                }\n                return last;\n            }\n            function moveDateToWeekStart(date, weekStartDay) {\n                if (weekStartDay !== 1) {\n                    return addDays(dayOfWeek(date, weekStartDay, -1), 4);\n                }\n                return addDays(date, 4 - (date.getDay() || 7));\n            }\n            function calcWeekInYear(date, weekStartDay) {\n                var firstWeekInYear = new Date(date.getFullYear(), 0, 1, -6);\n                var newDate = moveDateToWeekStart(date, weekStartDay);\n                var diffInMS = newDate.getTime() - firstWeekInYear.getTime();\n                var days = Math.floor(diffInMS / MS_PER_DAY);\n                return 1 + Math.floor(days / 7);\n            }\n            function weekInYear(date, weekStartDay) {\n                var prevWeekDate = addDays(date, -7);\n                var nextWeekDate = addDays(date, 7);\n                var weekNumber = calcWeekInYear(date, weekStartDay);\n                if (weekNumber === 0) {\n                    return calcWeekInYear(prevWeekDate, weekStartDay) + 1;\n                }\n                if (weekNumber === 53 && calcWeekInYear(nextWeekDate, weekStartDay) > 1) {\n                    return 1;\n                }\n                return weekNumber;\n            }\n            function getDate(date) {\n                date = new Date(date.getFullYear(), date.getMonth(), date.getDate(), 0, 0, 0);\n                adjustDST(date, 0);\n                return date;\n            }\n            function toUtcTime(date) {\n                return Date.UTC(date.getFullYear(), date.getMonth(), date.getDate(), date.getHours(), date.getMinutes(), date.getSeconds(), date.getMilliseconds());\n            }\n            function getMilliseconds(date) {\n                return date.getTime() - getDate(date);\n            }\n            function isInTimeRange(value, min, max) {\n                var msMin = getMilliseconds(min), msMax = getMilliseconds(max), msValue;\n                if (!value || msMin == msMax) {\n                    return true;\n                }\n                if (min >= max) {\n                    max += MS_PER_DAY;\n                }\n                msValue = getMilliseconds(value);\n                if (msMin > msValue) {\n                    msValue += MS_PER_DAY;\n                }\n                if (msMax < msMin) {\n                    msMax += MS_PER_DAY;\n                }\n                return msValue >= msMin && msValue <= msMax;\n            }\n            function isInDateRange(value, min, max) {\n                var msMin = min.getTime(), msMax = max.getTime(), msValue;\n                if (msMin >= msMax) {\n                    msMax += MS_PER_DAY;\n                }\n                msValue = value.getTime();\n                return msValue >= msMin && msValue <= msMax;\n            }\n            function addDays(date, offset) {\n                var hours = date.getHours();\n                date = new Date(date);\n                setTime(date, offset * MS_PER_DAY);\n                adjustDST(date, hours);\n                return date;\n            }\n            function setTime(date, milliseconds, ignoreDST) {\n                var offset = date.getTimezoneOffset();\n                var difference;\n                date.setTime(date.getTime() + milliseconds);\n                if (!ignoreDST) {\n                    difference = date.getTimezoneOffset() - offset;\n                    date.setTime(date.getTime() + difference * MS_PER_MINUTE);\n                }\n            }\n            function setHours(date, time) {\n                date = new Date(kendo.date.getDate(date).getTime() + kendo.date.getMilliseconds(time));\n                adjustDST(date, time.getHours());\n                return date;\n            }\n            function today() {\n                return getDate(new Date());\n            }\n            function isToday(date) {\n                return getDate(date).getTime() == today().getTime();\n            }\n            function toInvariantTime(date) {\n                var staticDate = new Date(1980, 1, 1, 0, 0, 0);\n                if (date) {\n                    staticDate.setHours(date.getHours(), date.getMinutes(), date.getSeconds(), date.getMilliseconds());\n                }\n                return staticDate;\n            }\n            return {\n                adjustDST: adjustDST,\n                dayOfWeek: dayOfWeek,\n                setDayOfWeek: setDayOfWeek,\n                getDate: getDate,\n                isInDateRange: isInDateRange,\n                isInTimeRange: isInTimeRange,\n                isToday: isToday,\n                nextDay: function (date) {\n                    return addDays(date, 1);\n                },\n                previousDay: function (date) {\n                    return addDays(date, -1);\n                },\n                toUtcTime: toUtcTime,\n                MS_PER_DAY: MS_PER_DAY,\n                MS_PER_HOUR: 60 * MS_PER_MINUTE,\n                MS_PER_MINUTE: MS_PER_MINUTE,\n                setTime: setTime,\n                setHours: setHours,\n                addDays: addDays,\n                today: today,\n                toInvariantTime: toInvariantTime,\n                firstDayOfMonth: firstDayOfMonth,\n                lastDayOfMonth: lastDayOfMonth,\n                weekInYear: weekInYear,\n                getMilliseconds: getMilliseconds\n            };\n        }();\n        kendo.stripWhitespace = function (element) {\n            if (document.createNodeIterator) {\n                var iterator = document.createNodeIterator(element, NodeFilter.SHOW_TEXT, function (node) {\n                    return node.parentNode == element ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_REJECT;\n                }, false);\n                while (iterator.nextNode()) {\n                    if (iterator.referenceNode && !iterator.referenceNode.textContent.trim()) {\n                        iterator.referenceNode.parentNode.removeChild(iterator.referenceNode);\n                    }\n                }\n            } else {\n                for (var i = 0; i < element.childNodes.length; i++) {\n                    var child = element.childNodes[i];\n                    if (child.nodeType == 3 && !/\\S/.test(child.nodeValue)) {\n                        element.removeChild(child);\n                        i--;\n                    }\n                    if (child.nodeType == 1) {\n                        kendo.stripWhitespace(child);\n                    }\n                }\n            }\n        };\n        var animationFrame = window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame || function (callback) {\n            setTimeout(callback, 1000 / 60);\n        };\n        kendo.animationFrame = function (callback) {\n            animationFrame.call(window, callback);\n        };\n        var animationQueue = [];\n        kendo.queueAnimation = function (callback) {\n            animationQueue[animationQueue.length] = callback;\n            if (animationQueue.length === 1) {\n                kendo.runNextAnimation();\n            }\n        };\n        kendo.runNextAnimation = function () {\n            kendo.animationFrame(function () {\n                if (animationQueue[0]) {\n                    animationQueue.shift()();\n                    if (animationQueue[0]) {\n                        kendo.runNextAnimation();\n                    }\n                }\n            });\n        };\n        kendo.parseQueryStringParams = function (url) {\n            var queryString = url.split('?')[1] || '', params = {}, paramParts = queryString.split(/&|=/), length = paramParts.length, idx = 0;\n            for (; idx < length; idx += 2) {\n                if (paramParts[idx] !== '') {\n                    params[decodeURIComponent(paramParts[idx])] = decodeURIComponent(paramParts[idx + 1]);\n                }\n            }\n            return params;\n        };\n        kendo.elementUnderCursor = function (e) {\n            if (typeof e.x.client != 'undefined') {\n                return document.elementFromPoint(e.x.client, e.y.client);\n            }\n        };\n        kendo.wheelDeltaY = function (jQueryEvent) {\n            var e = jQueryEvent.originalEvent, deltaY = e.wheelDeltaY, delta;\n            if (e.wheelDelta) {\n                if (deltaY === undefined || deltaY) {\n                    delta = e.wheelDelta;\n                }\n            } else if (e.detail && e.axis === e.VERTICAL_AXIS) {\n                delta = -e.detail * 10;\n            }\n            return delta;\n        };\n        kendo.throttle = function (fn, delay) {\n            var timeout;\n            var lastExecTime = 0;\n            if (!delay || delay <= 0) {\n                return fn;\n            }\n            var throttled = function () {\n                var that = this;\n                var elapsed = +new Date() - lastExecTime;\n                var args = arguments;\n                function exec() {\n                    fn.apply(that, args);\n                    lastExecTime = +new Date();\n                }\n                if (!lastExecTime) {\n                    return exec();\n                }\n                if (timeout) {\n                    clearTimeout(timeout);\n                }\n                if (elapsed > delay) {\n                    exec();\n                } else {\n                    timeout = setTimeout(exec, delay - elapsed);\n                }\n            };\n            throttled.cancel = function () {\n                clearTimeout(timeout);\n            };\n            return throttled;\n        };\n        kendo.caret = function (element, start, end) {\n            var rangeElement;\n            var isPosition = start !== undefined;\n            if (end === undefined) {\n                end = start;\n            }\n            if (element[0]) {\n                element = element[0];\n            }\n            if (isPosition && element.disabled) {\n                return;\n            }\n            try {\n                if (element.selectionStart !== undefined) {\n                    if (isPosition) {\n                        element.focus();\n                        var mobile = support.mobileOS;\n                        if (mobile.wp || mobile.android) {\n                            setTimeout(function () {\n                                element.setSelectionRange(start, end);\n                            }, 0);\n                        } else {\n                            element.setSelectionRange(start, end);\n                        }\n                    } else {\n                        start = [\n                            element.selectionStart,\n                            element.selectionEnd\n                        ];\n                    }\n                } else if (document.selection) {\n                    if ($(element).is(':visible')) {\n                        element.focus();\n                    }\n                    rangeElement = element.createTextRange();\n                    if (isPosition) {\n                        rangeElement.collapse(true);\n                        rangeElement.moveStart('character', start);\n                        rangeElement.moveEnd('character', end - start);\n                        rangeElement.select();\n                    } else {\n                        var rangeDuplicated = rangeElement.duplicate(), selectionStart, selectionEnd;\n                        rangeElement.moveToBookmark(document.selection.createRange().getBookmark());\n                        rangeDuplicated.setEndPoint('EndToStart', rangeElement);\n                        selectionStart = rangeDuplicated.text.length;\n                        selectionEnd = selectionStart + rangeElement.text.length;\n                        start = [\n                            selectionStart,\n                            selectionEnd\n                        ];\n                    }\n                }\n            } catch (e) {\n                start = [];\n            }\n            return start;\n        };\n        kendo.compileMobileDirective = function (element, scope) {\n            var angular = window.angular;\n            element.attr('data-' + kendo.ns + 'role', element[0].tagName.toLowerCase().replace('kendo-mobile-', '').replace('-', ''));\n            angular.element(element).injector().invoke([\n                '$compile',\n                function ($compile) {\n                    $compile(element)(scope);\n                    if (!/^\\$(digest|apply)$/.test(scope.$$phase)) {\n                        scope.$digest();\n                    }\n                }\n            ]);\n            return kendo.widgetInstance(element, kendo.mobile.ui);\n        };\n        kendo.antiForgeryTokens = function () {\n            var tokens = {}, csrf_token = $('meta[name=csrf-token],meta[name=_csrf]').attr('content'), csrf_param = $('meta[name=csrf-param],meta[name=_csrf_header]').attr('content');\n            $('input[name^=\\'__RequestVerificationToken\\']').each(function () {\n                tokens[this.name] = this.value;\n            });\n            if (csrf_param !== undefined && csrf_token !== undefined) {\n                tokens[csrf_param] = csrf_token;\n            }\n            return tokens;\n        };\n        kendo.cycleForm = function (form) {\n            var firstElement = form.find('input, .k-widget').first();\n            var lastElement = form.find('button, .k-button').last();\n            function focus(el) {\n                var widget = kendo.widgetInstance(el);\n                if (widget && widget.focus) {\n                    widget.focus();\n                } else {\n                    el.focus();\n                }\n            }\n            lastElement.on('keydown', function (e) {\n                if (e.keyCode == kendo.keys.TAB && !e.shiftKey) {\n                    e.preventDefault();\n                    focus(firstElement);\n                }\n            });\n            firstElement.on('keydown', function (e) {\n                if (e.keyCode == kendo.keys.TAB && e.shiftKey) {\n                    e.preventDefault();\n                    focus(lastElement);\n                }\n            });\n        };\n        (function () {\n            function postToProxy(dataURI, fileName, proxyURL, proxyTarget) {\n                var form = $('<form>').attr({\n                    action: proxyURL,\n                    method: 'POST',\n                    target: proxyTarget\n                });\n                var data = kendo.antiForgeryTokens();\n                data.fileName = fileName;\n                var parts = dataURI.split(';base64,');\n                data.contentType = parts[0].replace('data:', '');\n                data.base64 = parts[1];\n                for (var name in data) {\n                    if (data.hasOwnProperty(name)) {\n                        $('<input>').attr({\n                            value: data[name],\n                            name: name,\n                            type: 'hidden'\n                        }).appendTo(form);\n                    }\n                }\n                form.appendTo('body').submit().remove();\n            }\n            var fileSaver = document.createElement('a');\n            var downloadAttribute = 'download' in fileSaver && !kendo.support.browser.edge;\n            function saveAsBlob(dataURI, fileName) {\n                var blob = dataURI;\n                if (typeof dataURI == 'string') {\n                    var parts = dataURI.split(';base64,');\n                    var contentType = parts[0];\n                    var base64 = atob(parts[1]);\n                    var array = new Uint8Array(base64.length);\n                    for (var idx = 0; idx < base64.length; idx++) {\n                        array[idx] = base64.charCodeAt(idx);\n                    }\n                    blob = new Blob([array.buffer], { type: contentType });\n                }\n                navigator.msSaveBlob(blob, fileName);\n            }\n            function saveAsDataURI(dataURI, fileName) {\n                if (window.Blob && dataURI instanceof Blob) {\n                    dataURI = URL.createObjectURL(dataURI);\n                }\n                fileSaver.download = fileName;\n                fileSaver.href = dataURI;\n                var e = document.createEvent('MouseEvents');\n                e.initMouseEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);\n                fileSaver.dispatchEvent(e);\n                setTimeout(function () {\n                    URL.revokeObjectURL(dataURI);\n                });\n            }\n            kendo.saveAs = function (options) {\n                var save = postToProxy;\n                if (!options.forceProxy) {\n                    if (downloadAttribute) {\n                        save = saveAsDataURI;\n                    } else if (navigator.msSaveBlob) {\n                        save = saveAsBlob;\n                    }\n                }\n                save(options.dataURI, options.fileName, options.proxyURL, options.proxyTarget);\n            };\n        }());\n        kendo.proxyModelSetters = function proxyModelSetters(data) {\n            var observable = {};\n            Object.keys(data || {}).forEach(function (property) {\n                Object.defineProperty(observable, property, {\n                    get: function () {\n                        return data[property];\n                    },\n                    set: function (value) {\n                        data[property] = value;\n                        data.dirty = true;\n                    }\n                });\n            });\n            return observable;\n        };\n    }(jQuery, window));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.router', ['kendo.core'], f);\n}(function () {\n    var __meta__ = {\n        id: 'router',\n        name: 'Router',\n        category: 'framework',\n        description: 'The Router class is responsible for tracking the application state and navigating between the application states.',\n        depends: ['core'],\n        hidden: false\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, CHANGE = 'change', BACK = 'back', SAME = 'same', support = kendo.support, location = window.location, history = window.history, CHECK_URL_INTERVAL = 50, BROKEN_BACK_NAV = kendo.support.browser.msie, hashStrip = /^#*/, document = window.document;\n        function absoluteURL(path, pathPrefix) {\n            if (!pathPrefix) {\n                return path;\n            }\n            if (path + '/' === pathPrefix) {\n                path = pathPrefix;\n            }\n            var regEx = new RegExp('^' + pathPrefix, 'i');\n            if (!regEx.test(path)) {\n                path = pathPrefix + '/' + path;\n            }\n            return location.protocol + '//' + (location.host + '/' + path).replace(/\\/\\/+/g, '/');\n        }\n        function hashDelimiter(bang) {\n            return bang ? '#!' : '#';\n        }\n        function locationHash(hashDelimiter) {\n            var href = location.href;\n            if (hashDelimiter === '#!' && href.indexOf('#') > -1 && href.indexOf('#!') < 0) {\n                return null;\n            }\n            return href.split(hashDelimiter)[1] || '';\n        }\n        function stripRoot(root, url) {\n            if (url.indexOf(root) === 0) {\n                return url.substr(root.length).replace(/\\/\\//g, '/');\n            } else {\n                return url;\n            }\n        }\n        var HistoryAdapter = kendo.Class.extend({\n            back: function () {\n                if (BROKEN_BACK_NAV) {\n                    setTimeout(function () {\n                        history.back();\n                    });\n                } else {\n                    history.back();\n                }\n            },\n            forward: function () {\n                if (BROKEN_BACK_NAV) {\n                    setTimeout(function () {\n                        history.forward();\n                    });\n                } else {\n                    history.forward();\n                }\n            },\n            length: function () {\n                return history.length;\n            },\n            replaceLocation: function (url) {\n                location.replace(url);\n            }\n        });\n        var PushStateAdapter = HistoryAdapter.extend({\n            init: function (root) {\n                this.root = root;\n            },\n            navigate: function (to) {\n                history.pushState({}, document.title, absoluteURL(to, this.root));\n            },\n            replace: function (to) {\n                history.replaceState({}, document.title, absoluteURL(to, this.root));\n            },\n            normalize: function (url) {\n                return stripRoot(this.root, url);\n            },\n            current: function () {\n                var current = location.pathname;\n                if (location.search) {\n                    current += location.search;\n                }\n                return stripRoot(this.root, current);\n            },\n            change: function (callback) {\n                $(window).bind('popstate.kendo', callback);\n            },\n            stop: function () {\n                $(window).unbind('popstate.kendo');\n            },\n            normalizeCurrent: function (options) {\n                var fixedUrl, root = options.root, pathname = location.pathname, hash = locationHash(hashDelimiter(options.hashBang));\n                if (root === pathname + '/') {\n                    fixedUrl = root;\n                }\n                if (root === pathname && hash) {\n                    fixedUrl = absoluteURL(hash.replace(hashStrip, ''), root);\n                }\n                if (fixedUrl) {\n                    history.pushState({}, document.title, fixedUrl);\n                }\n            }\n        });\n        function fixHash(url) {\n            return url.replace(/^(#)?/, '#');\n        }\n        function fixBang(url) {\n            return url.replace(/^(#(!)?)?/, '#!');\n        }\n        var HashAdapter = HistoryAdapter.extend({\n            init: function (bang) {\n                this._id = kendo.guid();\n                this.prefix = hashDelimiter(bang);\n                this.fix = bang ? fixBang : fixHash;\n            },\n            navigate: function (to) {\n                location.hash = this.fix(to);\n            },\n            replace: function (to) {\n                this.replaceLocation(this.fix(to));\n            },\n            normalize: function (url) {\n                if (url.indexOf(this.prefix) < 0) {\n                    return url;\n                } else {\n                    return url.split(this.prefix)[1];\n                }\n            },\n            change: function (callback) {\n                if (support.hashChange) {\n                    $(window).on('hashchange.' + this._id, callback);\n                } else {\n                    this._interval = setInterval(callback, CHECK_URL_INTERVAL);\n                }\n            },\n            stop: function () {\n                $(window).off('hashchange.' + this._id);\n                clearInterval(this._interval);\n            },\n            current: function () {\n                return locationHash(this.prefix);\n            },\n            normalizeCurrent: function (options) {\n                var pathname = location.pathname, root = options.root;\n                if (options.pushState && root !== pathname) {\n                    this.replaceLocation(root + this.prefix + stripRoot(root, pathname));\n                    return true;\n                }\n                return false;\n            }\n        });\n        var History = kendo.Observable.extend({\n            start: function (options) {\n                options = options || {};\n                this.bind([\n                    CHANGE,\n                    BACK,\n                    SAME\n                ], options);\n                if (this._started) {\n                    return;\n                }\n                this._started = true;\n                options.root = options.root || '/';\n                var adapter = this.createAdapter(options), current;\n                if (adapter.normalizeCurrent(options)) {\n                    return;\n                }\n                current = adapter.current();\n                $.extend(this, {\n                    adapter: adapter,\n                    root: options.root,\n                    historyLength: adapter.length(),\n                    current: current,\n                    locations: [current]\n                });\n                adapter.change($.proxy(this, '_checkUrl'));\n            },\n            createAdapter: function (options) {\n                return support.pushState && options.pushState ? new PushStateAdapter(options.root) : new HashAdapter(options.hashBang);\n            },\n            stop: function () {\n                if (!this._started) {\n                    return;\n                }\n                this.adapter.stop();\n                this.unbind(CHANGE);\n                this._started = false;\n            },\n            change: function (callback) {\n                this.bind(CHANGE, callback);\n            },\n            replace: function (to, silent) {\n                this._navigate(to, silent, function (adapter) {\n                    adapter.replace(to);\n                    this.locations[this.locations.length - 1] = this.current;\n                });\n            },\n            navigate: function (to, silent) {\n                if (to === '#:back') {\n                    this.backCalled = true;\n                    this.adapter.back();\n                    return;\n                }\n                this._navigate(to, silent, function (adapter) {\n                    adapter.navigate(to);\n                    this.locations.push(this.current);\n                });\n            },\n            _navigate: function (to, silent, callback) {\n                var adapter = this.adapter;\n                to = adapter.normalize(to);\n                if (this.current === to || this.current === decodeURIComponent(to)) {\n                    this.trigger(SAME);\n                    return;\n                }\n                if (!silent) {\n                    if (this.trigger(CHANGE, {\n                            url: to,\n                            decode: false\n                        })) {\n                        return;\n                    }\n                }\n                this.current = to;\n                callback.call(this, adapter);\n                this.historyLength = adapter.length();\n            },\n            _checkUrl: function () {\n                var adapter = this.adapter, current = adapter.current(), newLength = adapter.length(), navigatingInExisting = this.historyLength === newLength, back = current === this.locations[this.locations.length - 2] && navigatingInExisting, backCalled = this.backCalled, prev = this.current;\n                if (current === null || this.current === current || this.current === decodeURIComponent(current)) {\n                    return true;\n                }\n                this.historyLength = newLength;\n                this.backCalled = false;\n                this.current = current;\n                if (back && this.trigger('back', {\n                        url: prev,\n                        to: current\n                    })) {\n                    adapter.forward();\n                    this.current = prev;\n                    return;\n                }\n                if (this.trigger(CHANGE, {\n                        url: current,\n                        backButtonPressed: !backCalled\n                    })) {\n                    if (back) {\n                        adapter.forward();\n                    } else {\n                        adapter.back();\n                        this.historyLength--;\n                    }\n                    this.current = prev;\n                    return;\n                }\n                if (back) {\n                    this.locations.pop();\n                } else {\n                    this.locations.push(current);\n                }\n            }\n        });\n        kendo.History = History;\n        kendo.History.HistoryAdapter = HistoryAdapter;\n        kendo.History.HashAdapter = HashAdapter;\n        kendo.History.PushStateAdapter = PushStateAdapter;\n        kendo.absoluteURL = absoluteURL;\n        kendo.history = new History();\n    }(window.kendo.jQuery));\n    (function () {\n        var kendo = window.kendo, history = kendo.history, Observable = kendo.Observable, INIT = 'init', ROUTE_MISSING = 'routeMissing', CHANGE = 'change', BACK = 'back', SAME = 'same', optionalParam = /\\((.*?)\\)/g, namedParam = /(\\(\\?)?:\\w+/g, splatParam = /\\*\\w+/g, escapeRegExp = /[\\-{}\\[\\]+?.,\\\\\\^$|#\\s]/g;\n        function namedParamReplace(match, optional) {\n            return optional ? match : '([^/]+)';\n        }\n        function routeToRegExp(route, ignoreCase) {\n            return new RegExp('^' + route.replace(escapeRegExp, '\\\\$&').replace(optionalParam, '(?:$1)?').replace(namedParam, namedParamReplace).replace(splatParam, '(.*?)') + '$', ignoreCase ? 'i' : '');\n        }\n        function stripUrl(url) {\n            return url.replace(/(\\?.*)|(#.*)/g, '');\n        }\n        var Route = kendo.Class.extend({\n            init: function (route, callback, ignoreCase) {\n                if (!(route instanceof RegExp)) {\n                    route = routeToRegExp(route, ignoreCase);\n                }\n                this.route = route;\n                this._callback = callback;\n            },\n            callback: function (url, back, decode) {\n                var params, idx = 0, length, queryStringParams = kendo.parseQueryStringParams(url);\n                queryStringParams._back = back;\n                url = stripUrl(url);\n                params = this.route.exec(url).slice(1);\n                length = params.length;\n                if (decode) {\n                    for (; idx < length; idx++) {\n                        if (typeof params[idx] !== 'undefined') {\n                            params[idx] = decodeURIComponent(params[idx]);\n                        }\n                    }\n                }\n                params.push(queryStringParams);\n                this._callback.apply(null, params);\n            },\n            worksWith: function (url, back, decode) {\n                if (this.route.test(stripUrl(url))) {\n                    this.callback(url, back, decode);\n                    return true;\n                } else {\n                    return false;\n                }\n            }\n        });\n        var Router = Observable.extend({\n            init: function (options) {\n                if (!options) {\n                    options = {};\n                }\n                Observable.fn.init.call(this);\n                this.routes = [];\n                this.pushState = options.pushState;\n                this.hashBang = options.hashBang;\n                this.root = options.root;\n                this.ignoreCase = options.ignoreCase !== false;\n                this.bind([\n                    INIT,\n                    ROUTE_MISSING,\n                    CHANGE,\n                    SAME\n                ], options);\n            },\n            destroy: function () {\n                history.unbind(CHANGE, this._urlChangedProxy);\n                history.unbind(SAME, this._sameProxy);\n                history.unbind(BACK, this._backProxy);\n                this.unbind();\n            },\n            start: function () {\n                var that = this, sameProxy = function () {\n                        that._same();\n                    }, backProxy = function (e) {\n                        that._back(e);\n                    }, urlChangedProxy = function (e) {\n                        that._urlChanged(e);\n                    };\n                history.start({\n                    same: sameProxy,\n                    change: urlChangedProxy,\n                    back: backProxy,\n                    pushState: that.pushState,\n                    hashBang: that.hashBang,\n                    root: that.root\n                });\n                var initEventObject = {\n                    url: history.current || '/',\n                    preventDefault: $.noop\n                };\n                if (!that.trigger(INIT, initEventObject)) {\n                    that._urlChanged(initEventObject);\n                }\n                this._urlChangedProxy = urlChangedProxy;\n                this._backProxy = backProxy;\n            },\n            route: function (route, callback) {\n                this.routes.push(new Route(route, callback, this.ignoreCase));\n            },\n            navigate: function (url, silent) {\n                kendo.history.navigate(url, silent);\n            },\n            replace: function (url, silent) {\n                kendo.history.replace(url, silent);\n            },\n            _back: function (e) {\n                if (this.trigger(BACK, {\n                        url: e.url,\n                        to: e.to\n                    })) {\n                    e.preventDefault();\n                }\n            },\n            _same: function () {\n                this.trigger(SAME);\n            },\n            _urlChanged: function (e) {\n                var url = e.url;\n                var decode = typeof e.decode === 'undefined';\n                var back = e.backButtonPressed;\n                if (!url) {\n                    url = '/';\n                }\n                if (this.trigger(CHANGE, {\n                        url: e.url,\n                        params: kendo.parseQueryStringParams(e.url),\n                        backButtonPressed: back\n                    })) {\n                    e.preventDefault();\n                    return;\n                }\n                var idx = 0, routes = this.routes, route, length = routes.length;\n                for (; idx < length; idx++) {\n                    route = routes[idx];\n                    if (route.worksWith(url, back, decode)) {\n                        return;\n                    }\n                }\n                if (this.trigger(ROUTE_MISSING, {\n                        url: url,\n                        params: kendo.parseQueryStringParams(url),\n                        backButtonPressed: back\n                    })) {\n                    e.preventDefault();\n                }\n            }\n        });\n        kendo.Router = Router;\n    }());\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.data.odata', ['kendo.core'], f);\n}(function () {\n    var __meta__ = {\n        id: 'data.odata',\n        name: 'OData',\n        category: 'framework',\n        depends: ['core'],\n        hidden: true\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, extend = $.extend, odataFilters = {\n                eq: 'eq',\n                neq: 'ne',\n                gt: 'gt',\n                gte: 'ge',\n                lt: 'lt',\n                lte: 'le',\n                contains: 'substringof',\n                doesnotcontain: 'substringof',\n                endswith: 'endswith',\n                startswith: 'startswith',\n                isnull: 'eq',\n                isnotnull: 'ne',\n                isempty: 'eq',\n                isnotempty: 'ne'\n            }, odataFiltersVersionFour = extend({}, odataFilters, { contains: 'contains' }), mappers = {\n                pageSize: $.noop,\n                page: $.noop,\n                filter: function (params, filter, useVersionFour) {\n                    if (filter) {\n                        filter = toOdataFilter(filter, useVersionFour);\n                        if (filter) {\n                            params.$filter = filter;\n                        }\n                    }\n                },\n                sort: function (params, orderby) {\n                    var expr = $.map(orderby, function (value) {\n                        var order = value.field.replace(/\\./g, '/');\n                        if (value.dir === 'desc') {\n                            order += ' desc';\n                        }\n                        return order;\n                    }).join(',');\n                    if (expr) {\n                        params.$orderby = expr;\n                    }\n                },\n                skip: function (params, skip) {\n                    if (skip) {\n                        params.$skip = skip;\n                    }\n                },\n                take: function (params, take) {\n                    if (take) {\n                        params.$top = take;\n                    }\n                }\n            }, defaultDataType = { read: { dataType: 'jsonp' } };\n        function toOdataFilter(filter, useOdataFour) {\n            var result = [], logic = filter.logic || 'and', idx, length, field, type, format, operator, value, ignoreCase, filters = filter.filters;\n            for (idx = 0, length = filters.length; idx < length; idx++) {\n                filter = filters[idx];\n                field = filter.field;\n                value = filter.value;\n                operator = filter.operator;\n                if (filter.filters) {\n                    filter = toOdataFilter(filter, useOdataFour);\n                } else {\n                    ignoreCase = filter.ignoreCase;\n                    field = field.replace(/\\./g, '/');\n                    filter = odataFilters[operator];\n                    if (useOdataFour) {\n                        filter = odataFiltersVersionFour[operator];\n                    }\n                    if (operator === 'isnull' || operator === 'isnotnull') {\n                        filter = kendo.format('{0} {1} null', field, filter);\n                    } else if (operator === 'isempty' || operator === 'isnotempty') {\n                        filter = kendo.format('{0} {1} \\'\\'', field, filter);\n                    } else if (filter && value !== undefined) {\n                        type = $.type(value);\n                        if (type === 'string') {\n                            format = '\\'{1}\\'';\n                            value = value.replace(/'/g, '\\'\\'');\n                            if (ignoreCase === true) {\n                                field = 'tolower(' + field + ')';\n                            }\n                        } else if (type === 'date') {\n                            if (useOdataFour) {\n                                format = '{1:yyyy-MM-ddTHH:mm:ss+00:00}';\n                                value = kendo.timezone.apply(value, 'Etc/UTC');\n                            } else {\n                                format = 'datetime\\'{1:yyyy-MM-ddTHH:mm:ss}\\'';\n                            }\n                        } else {\n                            format = '{1}';\n                        }\n                        if (filter.length > 3) {\n                            if (filter !== 'substringof') {\n                                format = '{0}({2},' + format + ')';\n                            } else {\n                                format = '{0}(' + format + ',{2})';\n                                if (operator === 'doesnotcontain') {\n                                    if (useOdataFour) {\n                                        format = '{0}({2},\\'{1}\\') eq -1';\n                                        filter = 'indexof';\n                                    } else {\n                                        format += ' eq false';\n                                    }\n                                }\n                            }\n                        } else {\n                            format = '{2} {0} ' + format;\n                        }\n                        filter = kendo.format(format, filter, value, field);\n                    }\n                }\n                result.push(filter);\n            }\n            filter = result.join(' ' + logic + ' ');\n            if (result.length > 1) {\n                filter = '(' + filter + ')';\n            }\n            return filter;\n        }\n        function stripMetadata(obj) {\n            for (var name in obj) {\n                if (name.indexOf('@odata') === 0) {\n                    delete obj[name];\n                }\n            }\n        }\n        extend(true, kendo.data, {\n            schemas: {\n                odata: {\n                    type: 'json',\n                    data: function (data) {\n                        return data.d.results || [data.d];\n                    },\n                    total: 'd.__count'\n                }\n            },\n            transports: {\n                odata: {\n                    read: {\n                        cache: true,\n                        dataType: 'jsonp',\n                        jsonp: '$callback'\n                    },\n                    update: {\n                        cache: true,\n                        dataType: 'json',\n                        contentType: 'application/json',\n                        type: 'PUT'\n                    },\n                    create: {\n                        cache: true,\n                        dataType: 'json',\n                        contentType: 'application/json',\n                        type: 'POST'\n                    },\n                    destroy: {\n                        cache: true,\n                        dataType: 'json',\n                        type: 'DELETE'\n                    },\n                    parameterMap: function (options, type, useVersionFour) {\n                        var params, value, option, dataType;\n                        options = options || {};\n                        type = type || 'read';\n                        dataType = (this.options || defaultDataType)[type];\n                        dataType = dataType ? dataType.dataType : 'json';\n                        if (type === 'read') {\n                            params = { $inlinecount: 'allpages' };\n                            if (dataType != 'json') {\n                                params.$format = 'json';\n                            }\n                            for (option in options) {\n                                if (mappers[option]) {\n                                    mappers[option](params, options[option], useVersionFour);\n                                } else {\n                                    params[option] = options[option];\n                                }\n                            }\n                        } else {\n                            if (dataType !== 'json') {\n                                throw new Error('Only json dataType can be used for ' + type + ' operation.');\n                            }\n                            if (type !== 'destroy') {\n                                for (option in options) {\n                                    value = options[option];\n                                    if (typeof value === 'number') {\n                                        options[option] = value + '';\n                                    }\n                                }\n                                params = kendo.stringify(options);\n                            }\n                        }\n                        return params;\n                    }\n                }\n            }\n        });\n        extend(true, kendo.data, {\n            schemas: {\n                'odata-v4': {\n                    type: 'json',\n                    data: function (data) {\n                        data = $.extend({}, data);\n                        stripMetadata(data);\n                        if (data.value) {\n                            return data.value;\n                        }\n                        return [data];\n                    },\n                    total: function (data) {\n                        return data['@odata.count'];\n                    }\n                }\n            },\n            transports: {\n                'odata-v4': {\n                    read: {\n                        cache: true,\n                        dataType: 'json'\n                    },\n                    update: {\n                        cache: true,\n                        dataType: 'json',\n                        contentType: 'application/json;IEEE754Compatible=true',\n                        type: 'PUT'\n                    },\n                    create: {\n                        cache: true,\n                        dataType: 'json',\n                        contentType: 'application/json;IEEE754Compatible=true',\n                        type: 'POST'\n                    },\n                    destroy: {\n                        cache: true,\n                        dataType: 'json',\n                        type: 'DELETE'\n                    },\n                    parameterMap: function (options, type) {\n                        var result = kendo.data.transports.odata.parameterMap(options, type, true);\n                        if (type == 'read') {\n                            result.$count = true;\n                            delete result.$inlinecount;\n                        }\n                        return result;\n                    }\n                }\n            }\n        });\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.data.xml', ['kendo.core'], f);\n}(function () {\n    var __meta__ = {\n        id: 'data.xml',\n        name: 'XML',\n        category: 'framework',\n        depends: ['core'],\n        hidden: true\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, isArray = $.isArray, isPlainObject = $.isPlainObject, map = $.map, each = $.each, extend = $.extend, getter = kendo.getter, Class = kendo.Class;\n        var XmlDataReader = Class.extend({\n            init: function (options) {\n                var that = this, total = options.total, model = options.model, parse = options.parse, errors = options.errors, serialize = options.serialize, data = options.data;\n                if (model) {\n                    if (isPlainObject(model)) {\n                        var base = options.modelBase || kendo.data.Model;\n                        if (model.fields) {\n                            each(model.fields, function (field, value) {\n                                if (isPlainObject(value) && value.field) {\n                                    if (!$.isFunction(value.field)) {\n                                        value = extend(value, { field: that.getter(value.field) });\n                                    }\n                                } else {\n                                    value = { field: that.getter(value) };\n                                }\n                                model.fields[field] = value;\n                            });\n                        }\n                        var id = model.id;\n                        if (id) {\n                            var idField = {};\n                            idField[that.xpathToMember(id, true)] = { field: that.getter(id) };\n                            model.fields = extend(idField, model.fields);\n                            model.id = that.xpathToMember(id);\n                        }\n                        model = base.define(model);\n                    }\n                    that.model = model;\n                }\n                if (total) {\n                    if (typeof total == 'string') {\n                        total = that.getter(total);\n                        that.total = function (data) {\n                            return parseInt(total(data), 10);\n                        };\n                    } else if (typeof total == 'function') {\n                        that.total = total;\n                    }\n                }\n                if (errors) {\n                    if (typeof errors == 'string') {\n                        errors = that.getter(errors);\n                        that.errors = function (data) {\n                            return errors(data) || null;\n                        };\n                    } else if (typeof errors == 'function') {\n                        that.errors = errors;\n                    }\n                }\n                if (data) {\n                    if (typeof data == 'string') {\n                        data = that.xpathToMember(data);\n                        that.data = function (value) {\n                            var result = that.evaluate(value, data), modelInstance;\n                            result = isArray(result) ? result : [result];\n                            if (that.model && model.fields) {\n                                modelInstance = new that.model();\n                                return map(result, function (value) {\n                                    if (value) {\n                                        var record = {}, field;\n                                        for (field in model.fields) {\n                                            record[field] = modelInstance._parse(field, model.fields[field].field(value));\n                                        }\n                                        return record;\n                                    }\n                                });\n                            }\n                            return result;\n                        };\n                    } else if (typeof data == 'function') {\n                        that.data = data;\n                    }\n                }\n                if (typeof parse == 'function') {\n                    var xmlParse = that.parse;\n                    that.parse = function (data) {\n                        var xml = parse.call(that, data);\n                        return xmlParse.call(that, xml);\n                    };\n                }\n                if (typeof serialize == 'function') {\n                    that.serialize = serialize;\n                }\n            },\n            total: function (result) {\n                return this.data(result).length;\n            },\n            errors: function (data) {\n                return data ? data.errors : null;\n            },\n            serialize: function (data) {\n                return data;\n            },\n            parseDOM: function (element) {\n                var result = {}, parsedNode, node, nodeType, nodeName, member, attribute, attributes = element.attributes, attributeCount = attributes.length, idx;\n                for (idx = 0; idx < attributeCount; idx++) {\n                    attribute = attributes[idx];\n                    result['@' + attribute.nodeName] = attribute.nodeValue;\n                }\n                for (node = element.firstChild; node; node = node.nextSibling) {\n                    nodeType = node.nodeType;\n                    if (nodeType === 3 || nodeType === 4) {\n                        result['#text'] = node.nodeValue;\n                    } else if (nodeType === 1) {\n                        parsedNode = this.parseDOM(node);\n                        nodeName = node.nodeName;\n                        member = result[nodeName];\n                        if (isArray(member)) {\n                            member.push(parsedNode);\n                        } else if (member !== undefined) {\n                            member = [\n                                member,\n                                parsedNode\n                            ];\n                        } else {\n                            member = parsedNode;\n                        }\n                        result[nodeName] = member;\n                    }\n                }\n                return result;\n            },\n            evaluate: function (value, expression) {\n                var members = expression.split('.'), member, result, length, intermediateResult, idx;\n                while (member = members.shift()) {\n                    value = value[member];\n                    if (isArray(value)) {\n                        result = [];\n                        expression = members.join('.');\n                        for (idx = 0, length = value.length; idx < length; idx++) {\n                            intermediateResult = this.evaluate(value[idx], expression);\n                            intermediateResult = isArray(intermediateResult) ? intermediateResult : [intermediateResult];\n                            result.push.apply(result, intermediateResult);\n                        }\n                        return result;\n                    }\n                }\n                return value;\n            },\n            parse: function (xml) {\n                var documentElement, tree, result = {};\n                documentElement = xml.documentElement || $.parseXML(xml).documentElement;\n                tree = this.parseDOM(documentElement);\n                result[documentElement.nodeName] = tree;\n                return result;\n            },\n            xpathToMember: function (member, raw) {\n                if (!member) {\n                    return '';\n                }\n                member = member.replace(/^\\//, '').replace(/\\//g, '.');\n                if (member.indexOf('@') >= 0) {\n                    return member.replace(/\\.?(@.*)/, raw ? '$1' : '[\"$1\"]');\n                }\n                if (member.indexOf('text()') >= 0) {\n                    return member.replace(/(\\.?text\\(\\))/, raw ? '#text' : '[\"#text\"]');\n                }\n                return member;\n            },\n            getter: function (member) {\n                return getter(this.xpathToMember(member), true);\n            }\n        });\n        $.extend(true, kendo.data, {\n            XmlDataReader: XmlDataReader,\n            readers: { xml: XmlDataReader }\n        });\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.data', [\n        'kendo.core',\n        'kendo.data.odata',\n        'kendo.data.xml'\n    ], f);\n}(function () {\n    var __meta__ = {\n        id: 'data',\n        name: 'Data source',\n        category: 'framework',\n        description: 'Powerful component for using local and remote data.Fully supports CRUD, Sorting, Paging, Filtering, Grouping, and Aggregates.',\n        depends: ['core'],\n        features: [\n            {\n                id: 'data-odata',\n                name: 'OData',\n                description: 'Support for accessing Open Data Protocol (OData) services.',\n                depends: ['data.odata']\n            },\n            {\n                id: 'data-signalr',\n                name: 'SignalR',\n                description: 'Support for binding to SignalR hubs.',\n                depends: ['data.signalr']\n            },\n            {\n                id: 'data-XML',\n                name: 'XML',\n                description: 'Support for binding to XML.',\n                depends: ['data.xml']\n            }\n        ]\n    };\n    (function ($, undefined) {\n        var extend = $.extend, proxy = $.proxy, isPlainObject = $.isPlainObject, isEmptyObject = $.isEmptyObject, isArray = $.isArray, grep = $.grep, ajax = $.ajax, map, each = $.each, noop = $.noop, kendo = window.kendo, isFunction = kendo.isFunction, Observable = kendo.Observable, Class = kendo.Class, STRING = 'string', FUNCTION = 'function', CREATE = 'create', READ = 'read', UPDATE = 'update', DESTROY = 'destroy', CHANGE = 'change', SYNC = 'sync', GET = 'get', ERROR = 'error', REQUESTSTART = 'requestStart', PROGRESS = 'progress', REQUESTEND = 'requestEnd', crud = [\n                CREATE,\n                READ,\n                UPDATE,\n                DESTROY\n            ], identity = function (o) {\n                return o;\n            }, getter = kendo.getter, stringify = kendo.stringify, math = Math, push = [].push, join = [].join, pop = [].pop, splice = [].splice, shift = [].shift, slice = [].slice, unshift = [].unshift, toString = {}.toString, stableSort = kendo.support.stableSort, dateRegExp = /^\\/Date\\((.*?)\\)\\/$/;\n        var ObservableArray = Observable.extend({\n            init: function (array, type) {\n                var that = this;\n                that.type = type || ObservableObject;\n                Observable.fn.init.call(that);\n                that.length = array.length;\n                that.wrapAll(array, that);\n            },\n            at: function (index) {\n                return this[index];\n            },\n            toJSON: function () {\n                var idx, length = this.length, value, json = new Array(length);\n                for (idx = 0; idx < length; idx++) {\n                    value = this[idx];\n                    if (value instanceof ObservableObject) {\n                        value = value.toJSON();\n                    }\n                    json[idx] = value;\n                }\n                return json;\n            },\n            parent: noop,\n            wrapAll: function (source, target) {\n                var that = this, idx, length, parent = function () {\n                        return that;\n                    };\n                target = target || [];\n                for (idx = 0, length = source.length; idx < length; idx++) {\n                    target[idx] = that.wrap(source[idx], parent);\n                }\n                return target;\n            },\n            wrap: function (object, parent) {\n                var that = this, observable;\n                if (object !== null && toString.call(object) === '[object Object]') {\n                    observable = object instanceof that.type || object instanceof Model;\n                    if (!observable) {\n                        object = object instanceof ObservableObject ? object.toJSON() : object;\n                        object = new that.type(object);\n                    }\n                    object.parent = parent;\n                    object.bind(CHANGE, function (e) {\n                        that.trigger(CHANGE, {\n                            field: e.field,\n                            node: e.node,\n                            index: e.index,\n                            items: e.items || [this],\n                            action: e.node ? e.action || 'itemloaded' : 'itemchange'\n                        });\n                    });\n                }\n                return object;\n            },\n            push: function () {\n                var index = this.length, items = this.wrapAll(arguments), result;\n                result = push.apply(this, items);\n                this.trigger(CHANGE, {\n                    action: 'add',\n                    index: index,\n                    items: items\n                });\n                return result;\n            },\n            slice: slice,\n            sort: [].sort,\n            join: join,\n            pop: function () {\n                var length = this.length, result = pop.apply(this);\n                if (length) {\n                    this.trigger(CHANGE, {\n                        action: 'remove',\n                        index: length - 1,\n                        items: [result]\n                    });\n                }\n                return result;\n            },\n            splice: function (index, howMany, item) {\n                var items = this.wrapAll(slice.call(arguments, 2)), result, i, len;\n                result = splice.apply(this, [\n                    index,\n                    howMany\n                ].concat(items));\n                if (result.length) {\n                    this.trigger(CHANGE, {\n                        action: 'remove',\n                        index: index,\n                        items: result\n                    });\n                    for (i = 0, len = result.length; i < len; i++) {\n                        if (result[i] && result[i].children) {\n                            result[i].unbind(CHANGE);\n                        }\n                    }\n                }\n                if (item) {\n                    this.trigger(CHANGE, {\n                        action: 'add',\n                        index: index,\n                        items: items\n                    });\n                }\n                return result;\n            },\n            shift: function () {\n                var length = this.length, result = shift.apply(this);\n                if (length) {\n                    this.trigger(CHANGE, {\n                        action: 'remove',\n                        index: 0,\n                        items: [result]\n                    });\n                }\n                return result;\n            },\n            unshift: function () {\n                var items = this.wrapAll(arguments), result;\n                result = unshift.apply(this, items);\n                this.trigger(CHANGE, {\n                    action: 'add',\n                    index: 0,\n                    items: items\n                });\n                return result;\n            },\n            indexOf: function (item) {\n                var that = this, idx, length;\n                for (idx = 0, length = that.length; idx < length; idx++) {\n                    if (that[idx] === item) {\n                        return idx;\n                    }\n                }\n                return -1;\n            },\n            forEach: function (callback) {\n                var idx = 0, length = this.length;\n                for (; idx < length; idx++) {\n                    callback(this[idx], idx, this);\n                }\n            },\n            map: function (callback) {\n                var idx = 0, result = [], length = this.length;\n                for (; idx < length; idx++) {\n                    result[idx] = callback(this[idx], idx, this);\n                }\n                return result;\n            },\n            reduce: function (callback) {\n                var idx = 0, result, length = this.length;\n                if (arguments.length == 2) {\n                    result = arguments[1];\n                } else if (idx < length) {\n                    result = this[idx++];\n                }\n                for (; idx < length; idx++) {\n                    result = callback(result, this[idx], idx, this);\n                }\n                return result;\n            },\n            reduceRight: function (callback) {\n                var idx = this.length - 1, result;\n                if (arguments.length == 2) {\n                    result = arguments[1];\n                } else if (idx > 0) {\n                    result = this[idx--];\n                }\n                for (; idx >= 0; idx--) {\n                    result = callback(result, this[idx], idx, this);\n                }\n                return result;\n            },\n            filter: function (callback) {\n                var idx = 0, result = [], item, length = this.length;\n                for (; idx < length; idx++) {\n                    item = this[idx];\n                    if (callback(item, idx, this)) {\n                        result[result.length] = item;\n                    }\n                }\n                return result;\n            },\n            find: function (callback) {\n                var idx = 0, item, length = this.length;\n                for (; idx < length; idx++) {\n                    item = this[idx];\n                    if (callback(item, idx, this)) {\n                        return item;\n                    }\n                }\n            },\n            every: function (callback) {\n                var idx = 0, item, length = this.length;\n                for (; idx < length; idx++) {\n                    item = this[idx];\n                    if (!callback(item, idx, this)) {\n                        return false;\n                    }\n                }\n                return true;\n            },\n            some: function (callback) {\n                var idx = 0, item, length = this.length;\n                for (; idx < length; idx++) {\n                    item = this[idx];\n                    if (callback(item, idx, this)) {\n                        return true;\n                    }\n                }\n                return false;\n            },\n            remove: function (item) {\n                var idx = this.indexOf(item);\n                if (idx !== -1) {\n                    this.splice(idx, 1);\n                }\n            },\n            empty: function () {\n                this.splice(0, this.length);\n            }\n        });\n        if (typeof Symbol !== 'undefined' && Symbol.iterator && !ObservableArray.prototype[Symbol.iterator]) {\n            ObservableArray.prototype[Symbol.iterator] = [][Symbol.iterator];\n        }\n        var LazyObservableArray = ObservableArray.extend({\n            init: function (data, type) {\n                Observable.fn.init.call(this);\n                this.type = type || ObservableObject;\n                for (var idx = 0; idx < data.length; idx++) {\n                    this[idx] = data[idx];\n                }\n                this.length = idx;\n                this._parent = proxy(function () {\n                    return this;\n                }, this);\n            },\n            at: function (index) {\n                var item = this[index];\n                if (!(item instanceof this.type)) {\n                    item = this[index] = this.wrap(item, this._parent);\n                } else {\n                    item.parent = this._parent;\n                }\n                return item;\n            }\n        });\n        function eventHandler(context, type, field, prefix) {\n            return function (e) {\n                var event = {}, key;\n                for (key in e) {\n                    event[key] = e[key];\n                }\n                if (prefix) {\n                    event.field = field + '.' + e.field;\n                } else {\n                    event.field = field;\n                }\n                if (type == CHANGE && context._notifyChange) {\n                    context._notifyChange(event);\n                }\n                context.trigger(type, event);\n            };\n        }\n        var ObservableObject = Observable.extend({\n            init: function (value) {\n                var that = this, member, field, parent = function () {\n                        return that;\n                    };\n                Observable.fn.init.call(this);\n                this._handlers = {};\n                for (field in value) {\n                    member = value[field];\n                    if (typeof member === 'object' && member && !member.getTime && field.charAt(0) != '_') {\n                        member = that.wrap(member, field, parent);\n                    }\n                    that[field] = member;\n                }\n                that.uid = kendo.guid();\n            },\n            shouldSerialize: function (field) {\n                return this.hasOwnProperty(field) && field !== '_handlers' && field !== '_events' && typeof this[field] !== FUNCTION && field !== 'uid';\n            },\n            forEach: function (f) {\n                for (var i in this) {\n                    if (this.shouldSerialize(i)) {\n                        f(this[i], i);\n                    }\n                }\n            },\n            toJSON: function () {\n                var result = {}, value, field;\n                for (field in this) {\n                    if (this.shouldSerialize(field)) {\n                        value = this[field];\n                        if (value instanceof ObservableObject || value instanceof ObservableArray) {\n                            value = value.toJSON();\n                        }\n                        result[field] = value;\n                    }\n                }\n                return result;\n            },\n            get: function (field) {\n                var that = this, result;\n                that.trigger(GET, { field: field });\n                if (field === 'this') {\n                    result = that;\n                } else {\n                    result = kendo.getter(field, true)(that);\n                }\n                return result;\n            },\n            _set: function (field, value) {\n                var that = this;\n                var composite = field.indexOf('.') >= 0;\n                if (composite) {\n                    var paths = field.split('.'), path = '';\n                    while (paths.length > 1) {\n                        path += paths.shift();\n                        var obj = kendo.getter(path, true)(that);\n                        if (obj instanceof ObservableObject) {\n                            obj.set(paths.join('.'), value);\n                            return composite;\n                        }\n                        path += '.';\n                    }\n                }\n                kendo.setter(field)(that, value);\n                return composite;\n            },\n            set: function (field, value) {\n                var that = this, isSetPrevented = false, composite = field.indexOf('.') >= 0, current = kendo.getter(field, true)(that);\n                if (current !== value) {\n                    if (current instanceof Observable && this._handlers[field]) {\n                        if (this._handlers[field].get) {\n                            current.unbind(GET, this._handlers[field].get);\n                        }\n                        current.unbind(CHANGE, this._handlers[field].change);\n                    }\n                    isSetPrevented = that.trigger('set', {\n                        field: field,\n                        value: value\n                    });\n                    if (!isSetPrevented) {\n                        if (!composite) {\n                            value = that.wrap(value, field, function () {\n                                return that;\n                            });\n                        }\n                        if (!that._set(field, value) || field.indexOf('(') >= 0 || field.indexOf('[') >= 0) {\n                            that.trigger(CHANGE, { field: field });\n                        }\n                    }\n                }\n                return isSetPrevented;\n            },\n            parent: noop,\n            wrap: function (object, field, parent) {\n                var that = this;\n                var get;\n                var change;\n                var type = toString.call(object);\n                if (object != null && (type === '[object Object]' || type === '[object Array]')) {\n                    var isObservableArray = object instanceof ObservableArray;\n                    var isDataSource = object instanceof DataSource;\n                    if (type === '[object Object]' && !isDataSource && !isObservableArray) {\n                        if (!(object instanceof ObservableObject)) {\n                            object = new ObservableObject(object);\n                        }\n                        get = eventHandler(that, GET, field, true);\n                        object.bind(GET, get);\n                        change = eventHandler(that, CHANGE, field, true);\n                        object.bind(CHANGE, change);\n                        that._handlers[field] = {\n                            get: get,\n                            change: change\n                        };\n                    } else if (type === '[object Array]' || isObservableArray || isDataSource) {\n                        if (!isObservableArray && !isDataSource) {\n                            object = new ObservableArray(object);\n                        }\n                        change = eventHandler(that, CHANGE, field, false);\n                        object.bind(CHANGE, change);\n                        that._handlers[field] = { change: change };\n                    }\n                    object.parent = parent;\n                }\n                return object;\n            }\n        });\n        function equal(x, y) {\n            if (x === y) {\n                return true;\n            }\n            var xtype = $.type(x), ytype = $.type(y), field;\n            if (xtype !== ytype) {\n                return false;\n            }\n            if (xtype === 'date') {\n                return x.getTime() === y.getTime();\n            }\n            if (xtype !== 'object' && xtype !== 'array') {\n                return false;\n            }\n            for (field in x) {\n                if (!equal(x[field], y[field])) {\n                    return false;\n                }\n            }\n            return true;\n        }\n        var parsers = {\n            'number': function (value) {\n                return kendo.parseFloat(value);\n            },\n            'date': function (value) {\n                return kendo.parseDate(value);\n            },\n            'boolean': function (value) {\n                if (typeof value === STRING) {\n                    return value.toLowerCase() === 'true';\n                }\n                return value != null ? !!value : value;\n            },\n            'string': function (value) {\n                return value != null ? value + '' : value;\n            },\n            'default': function (value) {\n                return value;\n            }\n        };\n        var defaultValues = {\n            'string': '',\n            'number': 0,\n            'date': new Date(),\n            'boolean': false,\n            'default': ''\n        };\n        function getFieldByName(obj, name) {\n            var field, fieldName;\n            for (fieldName in obj) {\n                field = obj[fieldName];\n                if (isPlainObject(field) && field.field && field.field === name) {\n                    return field;\n                } else if (field === name) {\n                    return field;\n                }\n            }\n            return null;\n        }\n        var Model = ObservableObject.extend({\n            init: function (data) {\n                var that = this;\n                if (!data || $.isEmptyObject(data)) {\n                    data = $.extend({}, that.defaults, data);\n                    if (that._initializers) {\n                        for (var idx = 0; idx < that._initializers.length; idx++) {\n                            var name = that._initializers[idx];\n                            data[name] = that.defaults[name]();\n                        }\n                    }\n                }\n                ObservableObject.fn.init.call(that, data);\n                that.dirty = false;\n                if (that.idField) {\n                    that.id = that.get(that.idField);\n                    if (that.id === undefined) {\n                        that.id = that._defaultId;\n                    }\n                }\n            },\n            shouldSerialize: function (field) {\n                return ObservableObject.fn.shouldSerialize.call(this, field) && field !== 'uid' && !(this.idField !== 'id' && field === 'id') && field !== 'dirty' && field !== '_accessors';\n            },\n            _parse: function (field, value) {\n                var that = this, fieldName = field, fields = that.fields || {}, parse;\n                field = fields[field];\n                if (!field) {\n                    field = getFieldByName(fields, fieldName);\n                }\n                if (field) {\n                    parse = field.parse;\n                    if (!parse && field.type) {\n                        parse = parsers[field.type.toLowerCase()];\n                    }\n                }\n                return parse ? parse(value) : value;\n            },\n            _notifyChange: function (e) {\n                var action = e.action;\n                if (action == 'add' || action == 'remove') {\n                    this.dirty = true;\n                }\n            },\n            editable: function (field) {\n                field = (this.fields || {})[field];\n                return field ? field.editable !== false : true;\n            },\n            set: function (field, value, initiator) {\n                var that = this;\n                var dirty = that.dirty;\n                if (that.editable(field)) {\n                    value = that._parse(field, value);\n                    if (!equal(value, that.get(field))) {\n                        that.dirty = true;\n                        if (ObservableObject.fn.set.call(that, field, value, initiator) && !dirty) {\n                            that.dirty = dirty;\n                        }\n                    }\n                }\n            },\n            accept: function (data) {\n                var that = this, parent = function () {\n                        return that;\n                    }, field;\n                for (field in data) {\n                    var value = data[field];\n                    if (field.charAt(0) != '_') {\n                        value = that.wrap(data[field], field, parent);\n                    }\n                    that._set(field, value);\n                }\n                if (that.idField) {\n                    that.id = that.get(that.idField);\n                }\n                that.dirty = false;\n            },\n            isNew: function () {\n                return this.id === this._defaultId;\n            }\n        });\n        Model.define = function (base, options) {\n            if (options === undefined) {\n                options = base;\n                base = Model;\n            }\n            var model, proto = extend({ defaults: {} }, options), name, field, type, value, idx, length, fields = {}, originalName, id = proto.id, functionFields = [];\n            if (id) {\n                proto.idField = id;\n            }\n            if (proto.id) {\n                delete proto.id;\n            }\n            if (id) {\n                proto.defaults[id] = proto._defaultId = '';\n            }\n            if (toString.call(proto.fields) === '[object Array]') {\n                for (idx = 0, length = proto.fields.length; idx < length; idx++) {\n                    field = proto.fields[idx];\n                    if (typeof field === STRING) {\n                        fields[field] = {};\n                    } else if (field.field) {\n                        fields[field.field] = field;\n                    }\n                }\n                proto.fields = fields;\n            }\n            for (name in proto.fields) {\n                field = proto.fields[name];\n                type = field.type || 'default';\n                value = null;\n                originalName = name;\n                name = typeof field.field === STRING ? field.field : name;\n                if (!field.nullable) {\n                    value = proto.defaults[originalName !== name ? originalName : name] = field.defaultValue !== undefined ? field.defaultValue : defaultValues[type.toLowerCase()];\n                    if (typeof value === 'function') {\n                        functionFields.push(name);\n                    }\n                }\n                if (options.id === name) {\n                    proto._defaultId = value;\n                }\n                proto.defaults[originalName !== name ? originalName : name] = value;\n                field.parse = field.parse || parsers[type];\n            }\n            if (functionFields.length > 0) {\n                proto._initializers = functionFields;\n            }\n            model = base.extend(proto);\n            model.define = function (options) {\n                return Model.define(model, options);\n            };\n            if (proto.fields) {\n                model.fields = proto.fields;\n                model.idField = proto.idField;\n            }\n            return model;\n        };\n        var Comparer = {\n            selector: function (field) {\n                return isFunction(field) ? field : getter(field);\n            },\n            compare: function (field) {\n                var selector = this.selector(field);\n                return function (a, b) {\n                    a = selector(a);\n                    b = selector(b);\n                    if (a == null && b == null) {\n                        return 0;\n                    }\n                    if (a == null) {\n                        return -1;\n                    }\n                    if (b == null) {\n                        return 1;\n                    }\n                    if (a.localeCompare) {\n                        return a.localeCompare(b);\n                    }\n                    return a > b ? 1 : a < b ? -1 : 0;\n                };\n            },\n            create: function (sort) {\n                var compare = sort.compare || this.compare(sort.field);\n                if (sort.dir == 'desc') {\n                    return function (a, b) {\n                        return compare(b, a, true);\n                    };\n                }\n                return compare;\n            },\n            combine: function (comparers) {\n                return function (a, b) {\n                    var result = comparers[0](a, b), idx, length;\n                    for (idx = 1, length = comparers.length; idx < length; idx++) {\n                        result = result || comparers[idx](a, b);\n                    }\n                    return result;\n                };\n            }\n        };\n        var StableComparer = extend({}, Comparer, {\n            asc: function (field) {\n                var selector = this.selector(field);\n                return function (a, b) {\n                    var valueA = selector(a);\n                    var valueB = selector(b);\n                    if (valueA && valueA.getTime && valueB && valueB.getTime) {\n                        valueA = valueA.getTime();\n                        valueB = valueB.getTime();\n                    }\n                    if (valueA === valueB) {\n                        return a.__position - b.__position;\n                    }\n                    if (valueA == null) {\n                        return -1;\n                    }\n                    if (valueB == null) {\n                        return 1;\n                    }\n                    if (valueA.localeCompare) {\n                        return valueA.localeCompare(valueB);\n                    }\n                    return valueA > valueB ? 1 : -1;\n                };\n            },\n            desc: function (field) {\n                var selector = this.selector(field);\n                return function (a, b) {\n                    var valueA = selector(a);\n                    var valueB = selector(b);\n                    if (valueA && valueA.getTime && valueB && valueB.getTime) {\n                        valueA = valueA.getTime();\n                        valueB = valueB.getTime();\n                    }\n                    if (valueA === valueB) {\n                        return a.__position - b.__position;\n                    }\n                    if (valueA == null) {\n                        return 1;\n                    }\n                    if (valueB == null) {\n                        return -1;\n                    }\n                    if (valueB.localeCompare) {\n                        return valueB.localeCompare(valueA);\n                    }\n                    return valueA < valueB ? 1 : -1;\n                };\n            },\n            create: function (sort) {\n                return this[sort.dir](sort.field);\n            }\n        });\n        map = function (array, callback) {\n            var idx, length = array.length, result = new Array(length);\n            for (idx = 0; idx < length; idx++) {\n                result[idx] = callback(array[idx], idx, array);\n            }\n            return result;\n        };\n        var operators = function () {\n            function quote(str) {\n                if (typeof str == 'string') {\n                    str = str.replace(/[\\r\\n]+/g, '');\n                }\n                return JSON.stringify(str);\n            }\n            function textOp(impl) {\n                return function (a, b, ignore) {\n                    b += '';\n                    if (ignore) {\n                        a = '(' + a + ' || \\'\\').toLowerCase()';\n                        b = b.toLowerCase();\n                    }\n                    return impl(a, quote(b), ignore);\n                };\n            }\n            function operator(op, a, b, ignore) {\n                if (b != null) {\n                    if (typeof b === STRING) {\n                        var date = dateRegExp.exec(b);\n                        if (date) {\n                            b = new Date(+date[1]);\n                        } else if (ignore) {\n                            b = quote(b.toLowerCase());\n                            a = '((' + a + ' || \\'\\')+\\'\\').toLowerCase()';\n                        } else {\n                            b = quote(b);\n                        }\n                    }\n                    if (b.getTime) {\n                        a = '(' + a + '&&' + a + '.getTime?' + a + '.getTime():' + a + ')';\n                        b = b.getTime();\n                    }\n                }\n                return a + ' ' + op + ' ' + b;\n            }\n            function getMatchRegexp(pattern) {\n                for (var rx = '/^', esc = false, i = 0; i < pattern.length; ++i) {\n                    var ch = pattern.charAt(i);\n                    if (esc) {\n                        rx += '\\\\' + ch;\n                    } else if (ch == '~') {\n                        esc = true;\n                        continue;\n                    } else if (ch == '*') {\n                        rx += '.*';\n                    } else if (ch == '?') {\n                        rx += '.';\n                    } else if ('.+^$()[]{}|\\\\/\\n\\r\\u2028\\u2029\\xA0'.indexOf(ch) >= 0) {\n                        rx += '\\\\' + ch;\n                    } else {\n                        rx += ch;\n                    }\n                    esc = false;\n                }\n                return rx + '$/';\n            }\n            return {\n                quote: function (value) {\n                    if (value && value.getTime) {\n                        return 'new Date(' + value.getTime() + ')';\n                    }\n                    return quote(value);\n                },\n                eq: function (a, b, ignore) {\n                    return operator('==', a, b, ignore);\n                },\n                neq: function (a, b, ignore) {\n                    return operator('!=', a, b, ignore);\n                },\n                gt: function (a, b, ignore) {\n                    return operator('>', a, b, ignore);\n                },\n                gte: function (a, b, ignore) {\n                    return operator('>=', a, b, ignore);\n                },\n                lt: function (a, b, ignore) {\n                    return operator('<', a, b, ignore);\n                },\n                lte: function (a, b, ignore) {\n                    return operator('<=', a, b, ignore);\n                },\n                startswith: textOp(function (a, b) {\n                    return a + '.lastIndexOf(' + b + ', 0) == 0';\n                }),\n                doesnotstartwith: textOp(function (a, b) {\n                    return a + '.lastIndexOf(' + b + ', 0) == -1';\n                }),\n                endswith: textOp(function (a, b) {\n                    var n = b ? b.length - 2 : 0;\n                    return a + '.indexOf(' + b + ', ' + a + '.length - ' + n + ') >= 0';\n                }),\n                doesnotendwith: textOp(function (a, b) {\n                    var n = b ? b.length - 2 : 0;\n                    return a + '.indexOf(' + b + ', ' + a + '.length - ' + n + ') < 0';\n                }),\n                contains: textOp(function (a, b) {\n                    return a + '.indexOf(' + b + ') >= 0';\n                }),\n                doesnotcontain: textOp(function (a, b) {\n                    return a + '.indexOf(' + b + ') == -1';\n                }),\n                matches: textOp(function (a, b) {\n                    b = b.substring(1, b.length - 1);\n                    return getMatchRegexp(b) + '.test(' + a + ')';\n                }),\n                doesnotmatch: textOp(function (a, b) {\n                    b = b.substring(1, b.length - 1);\n                    return '!' + getMatchRegexp(b) + '.test(' + a + ')';\n                }),\n                isempty: function (a) {\n                    return a + ' === \\'\\'';\n                },\n                isnotempty: function (a) {\n                    return a + ' !== \\'\\'';\n                },\n                isnull: function (a) {\n                    return '(' + a + ' == null)';\n                },\n                isnotnull: function (a) {\n                    return '(' + a + ' != null)';\n                }\n            };\n        }();\n        function Query(data) {\n            this.data = data || [];\n        }\n        Query.filterExpr = function (expression) {\n            var expressions = [], logic = {\n                    and: ' && ',\n                    or: ' || '\n                }, idx, length, filter, expr, fieldFunctions = [], operatorFunctions = [], field, operator, filters = expression.filters;\n            for (idx = 0, length = filters.length; idx < length; idx++) {\n                filter = filters[idx];\n                field = filter.field;\n                operator = filter.operator;\n                if (filter.filters) {\n                    expr = Query.filterExpr(filter);\n                    filter = expr.expression.replace(/__o\\[(\\d+)\\]/g, function (match, index) {\n                        index = +index;\n                        return '__o[' + (operatorFunctions.length + index) + ']';\n                    }).replace(/__f\\[(\\d+)\\]/g, function (match, index) {\n                        index = +index;\n                        return '__f[' + (fieldFunctions.length + index) + ']';\n                    });\n                    operatorFunctions.push.apply(operatorFunctions, expr.operators);\n                    fieldFunctions.push.apply(fieldFunctions, expr.fields);\n                } else {\n                    if (typeof field === FUNCTION) {\n                        expr = '__f[' + fieldFunctions.length + '](d)';\n                        fieldFunctions.push(field);\n                    } else {\n                        expr = kendo.expr(field);\n                    }\n                    if (typeof operator === FUNCTION) {\n                        filter = '__o[' + operatorFunctions.length + '](' + expr + ', ' + operators.quote(filter.value) + ')';\n                        operatorFunctions.push(operator);\n                    } else {\n                        filter = operators[(operator || 'eq').toLowerCase()](expr, filter.value, filter.ignoreCase !== undefined ? filter.ignoreCase : true);\n                    }\n                }\n                expressions.push(filter);\n            }\n            return {\n                expression: '(' + expressions.join(logic[expression.logic]) + ')',\n                fields: fieldFunctions,\n                operators: operatorFunctions\n            };\n        };\n        function normalizeSort(field, dir) {\n            if (field) {\n                var descriptor = typeof field === STRING ? {\n                        field: field,\n                        dir: dir\n                    } : field, descriptors = isArray(descriptor) ? descriptor : descriptor !== undefined ? [descriptor] : [];\n                return grep(descriptors, function (d) {\n                    return !!d.dir;\n                });\n            }\n        }\n        var operatorMap = {\n            '==': 'eq',\n            equals: 'eq',\n            isequalto: 'eq',\n            equalto: 'eq',\n            equal: 'eq',\n            '!=': 'neq',\n            ne: 'neq',\n            notequals: 'neq',\n            isnotequalto: 'neq',\n            notequalto: 'neq',\n            notequal: 'neq',\n            '<': 'lt',\n            islessthan: 'lt',\n            lessthan: 'lt',\n            less: 'lt',\n            '<=': 'lte',\n            le: 'lte',\n            islessthanorequalto: 'lte',\n            lessthanequal: 'lte',\n            '>': 'gt',\n            isgreaterthan: 'gt',\n            greaterthan: 'gt',\n            greater: 'gt',\n            '>=': 'gte',\n            isgreaterthanorequalto: 'gte',\n            greaterthanequal: 'gte',\n            ge: 'gte',\n            notsubstringof: 'doesnotcontain',\n            isnull: 'isnull',\n            isempty: 'isempty',\n            isnotempty: 'isnotempty'\n        };\n        function normalizeOperator(expression) {\n            var idx, length, filter, operator, filters = expression.filters;\n            if (filters) {\n                for (idx = 0, length = filters.length; idx < length; idx++) {\n                    filter = filters[idx];\n                    operator = filter.operator;\n                    if (operator && typeof operator === STRING) {\n                        filter.operator = operatorMap[operator.toLowerCase()] || operator;\n                    }\n                    normalizeOperator(filter);\n                }\n            }\n        }\n        function normalizeFilter(expression) {\n            if (expression && !isEmptyObject(expression)) {\n                if (isArray(expression) || !expression.filters) {\n                    expression = {\n                        logic: 'and',\n                        filters: isArray(expression) ? expression : [expression]\n                    };\n                }\n                normalizeOperator(expression);\n                return expression;\n            }\n        }\n        Query.normalizeFilter = normalizeFilter;\n        function compareDescriptor(f1, f2) {\n            if (f1.logic || f2.logic) {\n                return false;\n            }\n            return f1.field === f2.field && f1.value === f2.value && f1.operator === f2.operator;\n        }\n        function normalizeDescriptor(filter) {\n            filter = filter || {};\n            if (isEmptyObject(filter)) {\n                return {\n                    logic: 'and',\n                    filters: []\n                };\n            }\n            return normalizeFilter(filter);\n        }\n        function fieldComparer(a, b) {\n            if (b.logic || a.field > b.field) {\n                return 1;\n            } else if (a.field < b.field) {\n                return -1;\n            } else {\n                return 0;\n            }\n        }\n        function compareFilters(expr1, expr2) {\n            expr1 = normalizeDescriptor(expr1);\n            expr2 = normalizeDescriptor(expr2);\n            if (expr1.logic !== expr2.logic) {\n                return false;\n            }\n            var f1, f2;\n            var filters1 = (expr1.filters || []).slice();\n            var filters2 = (expr2.filters || []).slice();\n            if (filters1.length !== filters2.length) {\n                return false;\n            }\n            filters1 = filters1.sort(fieldComparer);\n            filters2 = filters2.sort(fieldComparer);\n            for (var idx = 0; idx < filters1.length; idx++) {\n                f1 = filters1[idx];\n                f2 = filters2[idx];\n                if (f1.logic && f2.logic) {\n                    if (!compareFilters(f1, f2)) {\n                        return false;\n                    }\n                } else if (!compareDescriptor(f1, f2)) {\n                    return false;\n                }\n            }\n            return true;\n        }\n        Query.compareFilters = compareFilters;\n        function normalizeAggregate(expressions) {\n            return isArray(expressions) ? expressions : [expressions];\n        }\n        function normalizeGroup(field, dir) {\n            var descriptor = typeof field === STRING ? {\n                    field: field,\n                    dir: dir\n                } : field, descriptors = isArray(descriptor) ? descriptor : descriptor !== undefined ? [descriptor] : [];\n            return map(descriptors, function (d) {\n                return {\n                    field: d.field,\n                    dir: d.dir || 'asc',\n                    aggregates: d.aggregates\n                };\n            });\n        }\n        Query.prototype = {\n            toArray: function () {\n                return this.data;\n            },\n            range: function (index, count) {\n                return new Query(this.data.slice(index, index + count));\n            },\n            skip: function (count) {\n                return new Query(this.data.slice(count));\n            },\n            take: function (count) {\n                return new Query(this.data.slice(0, count));\n            },\n            select: function (selector) {\n                return new Query(map(this.data, selector));\n            },\n            order: function (selector, dir) {\n                var sort = { dir: dir };\n                if (selector) {\n                    if (selector.compare) {\n                        sort.compare = selector.compare;\n                    } else {\n                        sort.field = selector;\n                    }\n                }\n                return new Query(this.data.slice(0).sort(Comparer.create(sort)));\n            },\n            orderBy: function (selector) {\n                return this.order(selector, 'asc');\n            },\n            orderByDescending: function (selector) {\n                return this.order(selector, 'desc');\n            },\n            sort: function (field, dir, comparer) {\n                var idx, length, descriptors = normalizeSort(field, dir), comparers = [];\n                comparer = comparer || Comparer;\n                if (descriptors.length) {\n                    for (idx = 0, length = descriptors.length; idx < length; idx++) {\n                        comparers.push(comparer.create(descriptors[idx]));\n                    }\n                    return this.orderBy({ compare: comparer.combine(comparers) });\n                }\n                return this;\n            },\n            filter: function (expressions) {\n                var idx, current, length, compiled, predicate, data = this.data, fields, operators, result = [], filter;\n                expressions = normalizeFilter(expressions);\n                if (!expressions || expressions.filters.length === 0) {\n                    return this;\n                }\n                compiled = Query.filterExpr(expressions);\n                fields = compiled.fields;\n                operators = compiled.operators;\n                predicate = filter = new Function('d, __f, __o', 'return ' + compiled.expression);\n                if (fields.length || operators.length) {\n                    filter = function (d) {\n                        return predicate(d, fields, operators);\n                    };\n                }\n                for (idx = 0, length = data.length; idx < length; idx++) {\n                    current = data[idx];\n                    if (filter(current)) {\n                        result.push(current);\n                    }\n                }\n                return new Query(result);\n            },\n            group: function (descriptors, allData) {\n                descriptors = normalizeGroup(descriptors || []);\n                allData = allData || this.data;\n                var that = this, result = new Query(that.data), descriptor;\n                if (descriptors.length > 0) {\n                    descriptor = descriptors[0];\n                    result = result.groupBy(descriptor).select(function (group) {\n                        var data = new Query(allData).filter([{\n                                field: group.field,\n                                operator: 'eq',\n                                value: group.value,\n                                ignoreCase: false\n                            }]);\n                        return {\n                            field: group.field,\n                            value: group.value,\n                            items: descriptors.length > 1 ? new Query(group.items).group(descriptors.slice(1), data.toArray()).toArray() : group.items,\n                            hasSubgroups: descriptors.length > 1,\n                            aggregates: data.aggregate(descriptor.aggregates)\n                        };\n                    });\n                }\n                return result;\n            },\n            groupBy: function (descriptor) {\n                if (isEmptyObject(descriptor) || !this.data.length) {\n                    return new Query([]);\n                }\n                var field = descriptor.field, sorted = this._sortForGrouping(field, descriptor.dir || 'asc'), accessor = kendo.accessor(field), item, groupValue = accessor.get(sorted[0], field), group = {\n                        field: field,\n                        value: groupValue,\n                        items: []\n                    }, currentValue, idx, len, result = [group];\n                for (idx = 0, len = sorted.length; idx < len; idx++) {\n                    item = sorted[idx];\n                    currentValue = accessor.get(item, field);\n                    if (!groupValueComparer(groupValue, currentValue)) {\n                        groupValue = currentValue;\n                        group = {\n                            field: field,\n                            value: groupValue,\n                            items: []\n                        };\n                        result.push(group);\n                    }\n                    group.items.push(item);\n                }\n                return new Query(result);\n            },\n            _sortForGrouping: function (field, dir) {\n                var idx, length, data = this.data;\n                if (!stableSort) {\n                    for (idx = 0, length = data.length; idx < length; idx++) {\n                        data[idx].__position = idx;\n                    }\n                    data = new Query(data).sort(field, dir, StableComparer).toArray();\n                    for (idx = 0, length = data.length; idx < length; idx++) {\n                        delete data[idx].__position;\n                    }\n                    return data;\n                }\n                return this.sort(field, dir).toArray();\n            },\n            aggregate: function (aggregates) {\n                var idx, len, result = {}, state = {};\n                if (aggregates && aggregates.length) {\n                    for (idx = 0, len = this.data.length; idx < len; idx++) {\n                        calculateAggregate(result, aggregates, this.data[idx], idx, len, state);\n                    }\n                }\n                return result;\n            }\n        };\n        function groupValueComparer(a, b) {\n            if (a && a.getTime && b && b.getTime) {\n                return a.getTime() === b.getTime();\n            }\n            return a === b;\n        }\n        function calculateAggregate(accumulator, aggregates, item, index, length, state) {\n            aggregates = aggregates || [];\n            var idx, aggr, functionName, len = aggregates.length;\n            for (idx = 0; idx < len; idx++) {\n                aggr = aggregates[idx];\n                functionName = aggr.aggregate;\n                var field = aggr.field;\n                accumulator[field] = accumulator[field] || {};\n                state[field] = state[field] || {};\n                state[field][functionName] = state[field][functionName] || {};\n                accumulator[field][functionName] = functions[functionName.toLowerCase()](accumulator[field][functionName], item, kendo.accessor(field), index, length, state[field][functionName]);\n            }\n        }\n        var functions = {\n            sum: function (accumulator, item, accessor) {\n                var value = accessor.get(item);\n                if (!isNumber(accumulator)) {\n                    accumulator = value;\n                } else if (isNumber(value)) {\n                    accumulator += value;\n                }\n                return accumulator;\n            },\n            count: function (accumulator) {\n                return (accumulator || 0) + 1;\n            },\n            average: function (accumulator, item, accessor, index, length, state) {\n                var value = accessor.get(item);\n                if (state.count === undefined) {\n                    state.count = 0;\n                }\n                if (!isNumber(accumulator)) {\n                    accumulator = value;\n                } else if (isNumber(value)) {\n                    accumulator += value;\n                }\n                if (isNumber(value)) {\n                    state.count++;\n                }\n                if (index == length - 1 && isNumber(accumulator)) {\n                    accumulator = accumulator / state.count;\n                }\n                return accumulator;\n            },\n            max: function (accumulator, item, accessor) {\n                var value = accessor.get(item);\n                if (!isNumber(accumulator) && !isDate(accumulator)) {\n                    accumulator = value;\n                }\n                if (accumulator < value && (isNumber(value) || isDate(value))) {\n                    accumulator = value;\n                }\n                return accumulator;\n            },\n            min: function (accumulator, item, accessor) {\n                var value = accessor.get(item);\n                if (!isNumber(accumulator) && !isDate(accumulator)) {\n                    accumulator = value;\n                }\n                if (accumulator > value && (isNumber(value) || isDate(value))) {\n                    accumulator = value;\n                }\n                return accumulator;\n            }\n        };\n        function isNumber(val) {\n            return typeof val === 'number' && !isNaN(val);\n        }\n        function isDate(val) {\n            return val && val.getTime;\n        }\n        function toJSON(array) {\n            var idx, length = array.length, result = new Array(length);\n            for (idx = 0; idx < length; idx++) {\n                result[idx] = array[idx].toJSON();\n            }\n            return result;\n        }\n        Query.process = function (data, options) {\n            options = options || {};\n            var query = new Query(data), group = options.group, sort = normalizeGroup(group || []).concat(normalizeSort(options.sort || [])), total, filterCallback = options.filterCallback, filter = options.filter, skip = options.skip, take = options.take;\n            if (filter) {\n                query = query.filter(filter);\n                if (filterCallback) {\n                    query = filterCallback(query);\n                }\n                total = query.toArray().length;\n            }\n            if (sort) {\n                query = query.sort(sort);\n                if (group) {\n                    data = query.toArray();\n                }\n            }\n            if (skip !== undefined && take !== undefined) {\n                query = query.range(skip, take);\n            }\n            if (group) {\n                query = query.group(group, data);\n            }\n            return {\n                total: total,\n                data: query.toArray()\n            };\n        };\n        var LocalTransport = Class.extend({\n            init: function (options) {\n                this.data = options.data;\n            },\n            read: function (options) {\n                options.success(this.data);\n            },\n            update: function (options) {\n                options.success(options.data);\n            },\n            create: function (options) {\n                options.success(options.data);\n            },\n            destroy: function (options) {\n                options.success(options.data);\n            }\n        });\n        var RemoteTransport = Class.extend({\n            init: function (options) {\n                var that = this, parameterMap;\n                options = that.options = extend({}, that.options, options);\n                each(crud, function (index, type) {\n                    if (typeof options[type] === STRING) {\n                        options[type] = { url: options[type] };\n                    }\n                });\n                that.cache = options.cache ? Cache.create(options.cache) : {\n                    find: noop,\n                    add: noop\n                };\n                parameterMap = options.parameterMap;\n                if (isFunction(options.push)) {\n                    that.push = options.push;\n                }\n                if (!that.push) {\n                    that.push = identity;\n                }\n                that.parameterMap = isFunction(parameterMap) ? parameterMap : function (options) {\n                    var result = {};\n                    each(options, function (option, value) {\n                        if (option in parameterMap) {\n                            option = parameterMap[option];\n                            if (isPlainObject(option)) {\n                                value = option.value(value);\n                                option = option.key;\n                            }\n                        }\n                        result[option] = value;\n                    });\n                    return result;\n                };\n            },\n            options: { parameterMap: identity },\n            create: function (options) {\n                return ajax(this.setup(options, CREATE));\n            },\n            read: function (options) {\n                var that = this, success, error, result, cache = that.cache;\n                options = that.setup(options, READ);\n                success = options.success || noop;\n                error = options.error || noop;\n                result = cache.find(options.data);\n                if (result !== undefined) {\n                    success(result);\n                } else {\n                    options.success = function (result) {\n                        cache.add(options.data, result);\n                        success(result);\n                    };\n                    $.ajax(options);\n                }\n            },\n            update: function (options) {\n                return ajax(this.setup(options, UPDATE));\n            },\n            destroy: function (options) {\n                return ajax(this.setup(options, DESTROY));\n            },\n            setup: function (options, type) {\n                options = options || {};\n                var that = this, parameters, operation = that.options[type], data = isFunction(operation.data) ? operation.data(options.data) : operation.data;\n                options = extend(true, {}, operation, options);\n                parameters = extend(true, {}, data, options.data);\n                options.data = that.parameterMap(parameters, type);\n                if (isFunction(options.url)) {\n                    options.url = options.url(parameters);\n                }\n                return options;\n            }\n        });\n        var Cache = Class.extend({\n            init: function () {\n                this._store = {};\n            },\n            add: function (key, data) {\n                if (key !== undefined) {\n                    this._store[stringify(key)] = data;\n                }\n            },\n            find: function (key) {\n                return this._store[stringify(key)];\n            },\n            clear: function () {\n                this._store = {};\n            },\n            remove: function (key) {\n                delete this._store[stringify(key)];\n            }\n        });\n        Cache.create = function (options) {\n            var store = {\n                'inmemory': function () {\n                    return new Cache();\n                }\n            };\n            if (isPlainObject(options) && isFunction(options.find)) {\n                return options;\n            }\n            if (options === true) {\n                return new Cache();\n            }\n            return store[options]();\n        };\n        function serializeRecords(data, getters, modelInstance, originalFieldNames, fieldNames) {\n            var record, getter, originalName, idx, setters = {}, length;\n            for (idx = 0, length = data.length; idx < length; idx++) {\n                record = data[idx];\n                for (getter in getters) {\n                    originalName = fieldNames[getter];\n                    if (originalName && originalName !== getter) {\n                        if (!setters[originalName]) {\n                            setters[originalName] = kendo.setter(originalName);\n                        }\n                        setters[originalName](record, getters[getter](record));\n                        delete record[getter];\n                    }\n                }\n            }\n        }\n        function convertRecords(data, getters, modelInstance, originalFieldNames, fieldNames) {\n            var record, getter, originalName, idx, length;\n            for (idx = 0, length = data.length; idx < length; idx++) {\n                record = data[idx];\n                for (getter in getters) {\n                    record[getter] = modelInstance._parse(getter, getters[getter](record));\n                    originalName = fieldNames[getter];\n                    if (originalName && originalName !== getter) {\n                        delete record[originalName];\n                    }\n                }\n            }\n        }\n        function convertGroup(data, getters, modelInstance, originalFieldNames, fieldNames) {\n            var record, idx, fieldName, length;\n            for (idx = 0, length = data.length; idx < length; idx++) {\n                record = data[idx];\n                fieldName = originalFieldNames[record.field];\n                if (fieldName && fieldName != record.field) {\n                    record.field = fieldName;\n                }\n                record.value = modelInstance._parse(record.field, record.value);\n                if (record.hasSubgroups) {\n                    convertGroup(record.items, getters, modelInstance, originalFieldNames, fieldNames);\n                } else {\n                    convertRecords(record.items, getters, modelInstance, originalFieldNames, fieldNames);\n                }\n            }\n        }\n        function wrapDataAccess(originalFunction, model, converter, getters, originalFieldNames, fieldNames) {\n            return function (data) {\n                data = originalFunction(data);\n                if (data && !isEmptyObject(getters)) {\n                    if (toString.call(data) !== '[object Array]' && !(data instanceof ObservableArray)) {\n                        data = [data];\n                    }\n                    converter(data, getters, new model(), originalFieldNames, fieldNames);\n                }\n                return data || [];\n            };\n        }\n        var DataReader = Class.extend({\n            init: function (schema) {\n                var that = this, member, get, model, base;\n                schema = schema || {};\n                for (member in schema) {\n                    get = schema[member];\n                    that[member] = typeof get === STRING ? getter(get) : get;\n                }\n                base = schema.modelBase || Model;\n                if (isPlainObject(that.model)) {\n                    that.model = model = base.define(that.model);\n                }\n                var dataFunction = proxy(that.data, that);\n                that._dataAccessFunction = dataFunction;\n                if (that.model) {\n                    var groupsFunction = proxy(that.groups, that), serializeFunction = proxy(that.serialize, that), originalFieldNames = {}, getters = {}, serializeGetters = {}, fieldNames = {}, shouldSerialize = false, fieldName;\n                    model = that.model;\n                    if (model.fields) {\n                        each(model.fields, function (field, value) {\n                            var fromName;\n                            fieldName = field;\n                            if (isPlainObject(value) && value.field) {\n                                fieldName = value.field;\n                            } else if (typeof value === STRING) {\n                                fieldName = value;\n                            }\n                            if (isPlainObject(value) && value.from) {\n                                fromName = value.from;\n                            }\n                            shouldSerialize = shouldSerialize || fromName && fromName !== field || fieldName !== field;\n                            getters[field] = getter(fromName || fieldName);\n                            serializeGetters[field] = getter(field);\n                            originalFieldNames[fromName || fieldName] = field;\n                            fieldNames[field] = fromName || fieldName;\n                        });\n                        if (!schema.serialize && shouldSerialize) {\n                            that.serialize = wrapDataAccess(serializeFunction, model, serializeRecords, serializeGetters, originalFieldNames, fieldNames);\n                        }\n                    }\n                    that._dataAccessFunction = dataFunction;\n                    that.data = wrapDataAccess(dataFunction, model, convertRecords, getters, originalFieldNames, fieldNames);\n                    that.groups = wrapDataAccess(groupsFunction, model, convertGroup, getters, originalFieldNames, fieldNames);\n                }\n            },\n            errors: function (data) {\n                return data ? data.errors : null;\n            },\n            parse: identity,\n            data: identity,\n            total: function (data) {\n                return data.length;\n            },\n            groups: identity,\n            aggregates: function () {\n                return {};\n            },\n            serialize: function (data) {\n                return data;\n            }\n        });\n        function mergeGroups(target, dest, skip, take) {\n            var group, idx = 0, items;\n            while (dest.length && take) {\n                group = dest[idx];\n                items = group.items;\n                var length = items.length;\n                if (target && target.field === group.field && target.value === group.value) {\n                    if (target.hasSubgroups && target.items.length) {\n                        mergeGroups(target.items[target.items.length - 1], group.items, skip, take);\n                    } else {\n                        items = items.slice(skip, skip + take);\n                        target.items = target.items.concat(items);\n                    }\n                    dest.splice(idx--, 1);\n                } else if (group.hasSubgroups && items.length) {\n                    mergeGroups(group, items, skip, take);\n                    if (!group.items.length) {\n                        dest.splice(idx--, 1);\n                    }\n                } else {\n                    items = items.slice(skip, skip + take);\n                    group.items = items;\n                    if (!group.items.length) {\n                        dest.splice(idx--, 1);\n                    }\n                }\n                if (items.length === 0) {\n                    skip -= length;\n                } else {\n                    skip = 0;\n                    take -= items.length;\n                }\n                if (++idx >= dest.length) {\n                    break;\n                }\n            }\n            if (idx < dest.length) {\n                dest.splice(idx, dest.length - idx);\n            }\n        }\n        function flattenGroups(data) {\n            var idx, result = [], length, items, itemIndex;\n            for (idx = 0, length = data.length; idx < length; idx++) {\n                var group = data.at(idx);\n                if (group.hasSubgroups) {\n                    result = result.concat(flattenGroups(group.items));\n                } else {\n                    items = group.items;\n                    for (itemIndex = 0; itemIndex < items.length; itemIndex++) {\n                        result.push(items.at(itemIndex));\n                    }\n                }\n            }\n            return result;\n        }\n        function wrapGroupItems(data, model) {\n            var idx, length, group;\n            if (model) {\n                for (idx = 0, length = data.length; idx < length; idx++) {\n                    group = data.at(idx);\n                    if (group.hasSubgroups) {\n                        wrapGroupItems(group.items, model);\n                    } else {\n                        group.items = new LazyObservableArray(group.items, model);\n                    }\n                }\n            }\n        }\n        function eachGroupItems(data, func) {\n            for (var idx = 0, length = data.length; idx < length; idx++) {\n                if (data[idx].hasSubgroups) {\n                    if (eachGroupItems(data[idx].items, func)) {\n                        return true;\n                    }\n                } else if (func(data[idx].items, data[idx])) {\n                    return true;\n                }\n            }\n        }\n        function replaceInRanges(ranges, data, item, observable) {\n            for (var idx = 0; idx < ranges.length; idx++) {\n                if (ranges[idx].data === data) {\n                    break;\n                }\n                if (replaceInRange(ranges[idx].data, item, observable)) {\n                    break;\n                }\n            }\n        }\n        function replaceInRange(items, item, observable) {\n            for (var idx = 0, length = items.length; idx < length; idx++) {\n                if (items[idx] && items[idx].hasSubgroups) {\n                    return replaceInRange(items[idx].items, item, observable);\n                } else if (items[idx] === item || items[idx] === observable) {\n                    items[idx] = observable;\n                    return true;\n                }\n            }\n        }\n        function replaceWithObservable(view, data, ranges, type, serverGrouping) {\n            for (var viewIndex = 0, length = view.length; viewIndex < length; viewIndex++) {\n                var item = view[viewIndex];\n                if (!item || item instanceof type) {\n                    continue;\n                }\n                if (item.hasSubgroups !== undefined && !serverGrouping) {\n                    replaceWithObservable(item.items, data, ranges, type, serverGrouping);\n                } else {\n                    for (var idx = 0; idx < data.length; idx++) {\n                        if (data[idx] === item) {\n                            view[viewIndex] = data.at(idx);\n                            replaceInRanges(ranges, data, item, view[viewIndex]);\n                            break;\n                        }\n                    }\n                }\n            }\n        }\n        function removeModel(data, model) {\n            var idx, length;\n            for (idx = 0, length = data.length; idx < length; idx++) {\n                var dataItem = data.at(idx);\n                if (dataItem.uid == model.uid) {\n                    data.splice(idx, 1);\n                    return dataItem;\n                }\n            }\n        }\n        function indexOfPristineModel(data, model) {\n            if (model) {\n                return indexOf(data, function (item) {\n                    return item.uid && item.uid == model.uid || item[model.idField] === model.id && model.id !== model._defaultId;\n                });\n            }\n            return -1;\n        }\n        function indexOfModel(data, model) {\n            if (model) {\n                return indexOf(data, function (item) {\n                    return item.uid == model.uid;\n                });\n            }\n            return -1;\n        }\n        function indexOf(data, comparer) {\n            var idx, length;\n            for (idx = 0, length = data.length; idx < length; idx++) {\n                if (comparer(data[idx])) {\n                    return idx;\n                }\n            }\n            return -1;\n        }\n        function fieldNameFromModel(fields, name) {\n            if (fields && !isEmptyObject(fields)) {\n                var descriptor = fields[name];\n                var fieldName;\n                if (isPlainObject(descriptor)) {\n                    fieldName = descriptor.from || descriptor.field || name;\n                } else {\n                    fieldName = fields[name] || name;\n                }\n                if (isFunction(fieldName)) {\n                    return name;\n                }\n                return fieldName;\n            }\n            return name;\n        }\n        function convertFilterDescriptorsField(descriptor, model) {\n            var idx, length, target = {};\n            for (var field in descriptor) {\n                if (field !== 'filters') {\n                    target[field] = descriptor[field];\n                }\n            }\n            if (descriptor.filters) {\n                target.filters = [];\n                for (idx = 0, length = descriptor.filters.length; idx < length; idx++) {\n                    target.filters[idx] = convertFilterDescriptorsField(descriptor.filters[idx], model);\n                }\n            } else {\n                target.field = fieldNameFromModel(model.fields, target.field);\n            }\n            return target;\n        }\n        function convertDescriptorsField(descriptors, model) {\n            var idx, length, result = [], target, descriptor;\n            for (idx = 0, length = descriptors.length; idx < length; idx++) {\n                target = {};\n                descriptor = descriptors[idx];\n                for (var field in descriptor) {\n                    target[field] = descriptor[field];\n                }\n                target.field = fieldNameFromModel(model.fields, target.field);\n                if (target.aggregates && isArray(target.aggregates)) {\n                    target.aggregates = convertDescriptorsField(target.aggregates, model);\n                }\n                result.push(target);\n            }\n            return result;\n        }\n        var DataSource = Observable.extend({\n            init: function (options) {\n                var that = this, model, data;\n                if (options) {\n                    data = options.data;\n                }\n                options = that.options = extend({}, that.options, options);\n                that._map = {};\n                that._prefetch = {};\n                that._data = [];\n                that._pristineData = [];\n                that._ranges = [];\n                that._view = [];\n                that._pristineTotal = 0;\n                that._destroyed = [];\n                that._pageSize = options.pageSize;\n                that._page = options.page || (options.pageSize ? 1 : undefined);\n                that._sort = normalizeSort(options.sort);\n                that._filter = normalizeFilter(options.filter);\n                that._group = normalizeGroup(options.group);\n                that._aggregate = options.aggregate;\n                that._total = options.total;\n                that._shouldDetachObservableParents = true;\n                Observable.fn.init.call(that);\n                that.transport = Transport.create(options, data, that);\n                if (isFunction(that.transport.push)) {\n                    that.transport.push({\n                        pushCreate: proxy(that._pushCreate, that),\n                        pushUpdate: proxy(that._pushUpdate, that),\n                        pushDestroy: proxy(that._pushDestroy, that)\n                    });\n                }\n                if (options.offlineStorage != null) {\n                    if (typeof options.offlineStorage == 'string') {\n                        var key = options.offlineStorage;\n                        that._storage = {\n                            getItem: function () {\n                                return JSON.parse(localStorage.getItem(key));\n                            },\n                            setItem: function (item) {\n                                localStorage.setItem(key, stringify(that.reader.serialize(item)));\n                            }\n                        };\n                    } else {\n                        that._storage = options.offlineStorage;\n                    }\n                }\n                that.reader = new kendo.data.readers[options.schema.type || 'json'](options.schema);\n                model = that.reader.model || {};\n                that._detachObservableParents();\n                that._data = that._observe(that._data);\n                that._online = true;\n                that.bind([\n                    'push',\n                    ERROR,\n                    CHANGE,\n                    REQUESTSTART,\n                    SYNC,\n                    REQUESTEND,\n                    PROGRESS\n                ], options);\n            },\n            options: {\n                data: null,\n                schema: { modelBase: Model },\n                offlineStorage: null,\n                serverSorting: false,\n                serverPaging: false,\n                serverFiltering: false,\n                serverGrouping: false,\n                serverAggregates: false,\n                batch: false\n            },\n            clone: function () {\n                return this;\n            },\n            online: function (value) {\n                if (value !== undefined) {\n                    if (this._online != value) {\n                        this._online = value;\n                        if (value) {\n                            return this.sync();\n                        }\n                    }\n                    return $.Deferred().resolve().promise();\n                } else {\n                    return this._online;\n                }\n            },\n            offlineData: function (state) {\n                if (this.options.offlineStorage == null) {\n                    return null;\n                }\n                if (state !== undefined) {\n                    return this._storage.setItem(state);\n                }\n                return this._storage.getItem() || [];\n            },\n            _isServerGrouped: function () {\n                var group = this.group() || [];\n                return this.options.serverGrouping && group.length;\n            },\n            _pushCreate: function (result) {\n                this._push(result, 'pushCreate');\n            },\n            _pushUpdate: function (result) {\n                this._push(result, 'pushUpdate');\n            },\n            _pushDestroy: function (result) {\n                this._push(result, 'pushDestroy');\n            },\n            _push: function (result, operation) {\n                var data = this._readData(result);\n                if (!data) {\n                    data = result;\n                }\n                this[operation](data);\n            },\n            _flatData: function (data, skip) {\n                if (data) {\n                    if (this._isServerGrouped()) {\n                        return flattenGroups(data);\n                    }\n                    if (!skip) {\n                        for (var idx = 0; idx < data.length; idx++) {\n                            data.at(idx);\n                        }\n                    }\n                }\n                return data;\n            },\n            parent: noop,\n            get: function (id) {\n                var idx, length, data = this._flatData(this._data);\n                for (idx = 0, length = data.length; idx < length; idx++) {\n                    if (data[idx].id == id) {\n                        return data[idx];\n                    }\n                }\n            },\n            getByUid: function (id) {\n                var idx, length, data = this._flatData(this._data);\n                if (!data) {\n                    return;\n                }\n                for (idx = 0, length = data.length; idx < length; idx++) {\n                    if (data[idx].uid == id) {\n                        return data[idx];\n                    }\n                }\n            },\n            indexOf: function (model) {\n                return indexOfModel(this._data, model);\n            },\n            at: function (index) {\n                return this._data.at(index);\n            },\n            data: function (value) {\n                var that = this;\n                if (value !== undefined) {\n                    that._detachObservableParents();\n                    that._data = this._observe(value);\n                    that._pristineData = value.slice(0);\n                    that._storeData();\n                    that._ranges = [];\n                    that.trigger('reset');\n                    that._addRange(that._data);\n                    that._total = that._data.length;\n                    that._pristineTotal = that._total;\n                    that._process(that._data);\n                } else {\n                    if (that._data) {\n                        for (var idx = 0; idx < that._data.length; idx++) {\n                            that._data.at(idx);\n                        }\n                    }\n                    return that._data;\n                }\n            },\n            view: function (value) {\n                if (value === undefined) {\n                    return this._view;\n                } else {\n                    this._view = this._observeView(value);\n                }\n            },\n            _observeView: function (data) {\n                var that = this;\n                replaceWithObservable(data, that._data, that._ranges, that.reader.model || ObservableObject, that._isServerGrouped());\n                var view = new LazyObservableArray(data, that.reader.model);\n                view.parent = function () {\n                    return that.parent();\n                };\n                return view;\n            },\n            flatView: function () {\n                var groups = this.group() || [];\n                if (groups.length) {\n                    return flattenGroups(this._view);\n                } else {\n                    return this._view;\n                }\n            },\n            add: function (model) {\n                return this.insert(this._data.length, model);\n            },\n            _createNewModel: function (model) {\n                if (this.reader.model) {\n                    return new this.reader.model(model);\n                }\n                if (model instanceof ObservableObject) {\n                    return model;\n                }\n                return new ObservableObject(model);\n            },\n            insert: function (index, model) {\n                if (!model) {\n                    model = index;\n                    index = 0;\n                }\n                if (!(model instanceof Model)) {\n                    model = this._createNewModel(model);\n                }\n                if (this._isServerGrouped()) {\n                    this._data.splice(index, 0, this._wrapInEmptyGroup(model));\n                } else {\n                    this._data.splice(index, 0, model);\n                }\n                return model;\n            },\n            pushInsert: function (index, items) {\n                if (!items) {\n                    items = index;\n                    index = 0;\n                }\n                if (!isArray(items)) {\n                    items = [items];\n                }\n                var pushed = [];\n                var autoSync = this.options.autoSync;\n                this.options.autoSync = false;\n                try {\n                    for (var idx = 0; idx < items.length; idx++) {\n                        var item = items[idx];\n                        var result = this.insert(index, item);\n                        pushed.push(result);\n                        var pristine = result.toJSON();\n                        if (this._isServerGrouped()) {\n                            pristine = this._wrapInEmptyGroup(pristine);\n                        }\n                        this._pristineData.push(pristine);\n                        index++;\n                    }\n                } finally {\n                    this.options.autoSync = autoSync;\n                }\n                if (pushed.length) {\n                    this.trigger('push', {\n                        type: 'create',\n                        items: pushed\n                    });\n                }\n            },\n            pushCreate: function (items) {\n                this.pushInsert(this._data.length, items);\n            },\n            pushUpdate: function (items) {\n                if (!isArray(items)) {\n                    items = [items];\n                }\n                var pushed = [];\n                for (var idx = 0; idx < items.length; idx++) {\n                    var item = items[idx];\n                    var model = this._createNewModel(item);\n                    var target = this.get(model.id);\n                    if (target) {\n                        pushed.push(target);\n                        target.accept(item);\n                        target.trigger(CHANGE);\n                        this._updatePristineForModel(target, item);\n                    } else {\n                        this.pushCreate(item);\n                    }\n                }\n                if (pushed.length) {\n                    this.trigger('push', {\n                        type: 'update',\n                        items: pushed\n                    });\n                }\n            },\n            pushDestroy: function (items) {\n                var pushed = this._removeItems(items);\n                if (pushed.length) {\n                    this.trigger('push', {\n                        type: 'destroy',\n                        items: pushed\n                    });\n                }\n            },\n            _removeItems: function (items) {\n                if (!isArray(items)) {\n                    items = [items];\n                }\n                var destroyed = [];\n                var autoSync = this.options.autoSync;\n                this.options.autoSync = false;\n                try {\n                    for (var idx = 0; idx < items.length; idx++) {\n                        var item = items[idx];\n                        var model = this._createNewModel(item);\n                        var found = false;\n                        this._eachItem(this._data, function (items) {\n                            for (var idx = 0; idx < items.length; idx++) {\n                                var item = items.at(idx);\n                                if (item.id === model.id) {\n                                    destroyed.push(item);\n                                    items.splice(idx, 1);\n                                    found = true;\n                                    break;\n                                }\n                            }\n                        });\n                        if (found) {\n                            this._removePristineForModel(model);\n                            this._destroyed.pop();\n                        }\n                    }\n                } finally {\n                    this.options.autoSync = autoSync;\n                }\n                return destroyed;\n            },\n            remove: function (model) {\n                var result, that = this, hasGroups = that._isServerGrouped();\n                this._eachItem(that._data, function (items) {\n                    result = removeModel(items, model);\n                    if (result && hasGroups) {\n                        if (!result.isNew || !result.isNew()) {\n                            that._destroyed.push(result);\n                        }\n                        return true;\n                    }\n                });\n                this._removeModelFromRanges(model);\n                this._updateRangesLength();\n                return model;\n            },\n            destroyed: function () {\n                return this._destroyed;\n            },\n            created: function () {\n                var idx, length, result = [], data = this._flatData(this._data);\n                for (idx = 0, length = data.length; idx < length; idx++) {\n                    if (data[idx].isNew && data[idx].isNew()) {\n                        result.push(data[idx]);\n                    }\n                }\n                return result;\n            },\n            updated: function () {\n                var idx, length, result = [], data = this._flatData(this._data);\n                for (idx = 0, length = data.length; idx < length; idx++) {\n                    if (data[idx].isNew && !data[idx].isNew() && data[idx].dirty) {\n                        result.push(data[idx]);\n                    }\n                }\n                return result;\n            },\n            sync: function () {\n                var that = this, created = [], updated = [], destroyed = that._destroyed;\n                var promise = $.Deferred().resolve().promise();\n                if (that.online()) {\n                    if (!that.reader.model) {\n                        return promise;\n                    }\n                    created = that.created();\n                    updated = that.updated();\n                    var promises = [];\n                    if (that.options.batch && that.transport.submit) {\n                        promises = that._sendSubmit(created, updated, destroyed);\n                    } else {\n                        promises.push.apply(promises, that._send('create', created));\n                        promises.push.apply(promises, that._send('update', updated));\n                        promises.push.apply(promises, that._send('destroy', destroyed));\n                    }\n                    promise = $.when.apply(null, promises).then(function () {\n                        var idx, length;\n                        for (idx = 0, length = arguments.length; idx < length; idx++) {\n                            if (arguments[idx]) {\n                                that._accept(arguments[idx]);\n                            }\n                        }\n                        that._storeData(true);\n                        that._change({ action: 'sync' });\n                        that.trigger(SYNC);\n                    });\n                } else {\n                    that._storeData(true);\n                    that._change({ action: 'sync' });\n                }\n                return promise;\n            },\n            cancelChanges: function (model) {\n                var that = this;\n                if (model instanceof kendo.data.Model) {\n                    that._cancelModel(model);\n                } else {\n                    that._destroyed = [];\n                    that._detachObservableParents();\n                    that._data = that._observe(that._pristineData);\n                    if (that.options.serverPaging) {\n                        that._total = that._pristineTotal;\n                    }\n                    that._ranges = [];\n                    that._addRange(that._data);\n                    that._change();\n                    that._markOfflineUpdatesAsDirty();\n                }\n            },\n            _markOfflineUpdatesAsDirty: function () {\n                var that = this;\n                if (that.options.offlineStorage != null) {\n                    that._eachItem(that._data, function (items) {\n                        for (var idx = 0; idx < items.length; idx++) {\n                            var item = items.at(idx);\n                            if (item.__state__ == 'update' || item.__state__ == 'create') {\n                                item.dirty = true;\n                            }\n                        }\n                    });\n                }\n            },\n            hasChanges: function () {\n                var idx, length, data = this._flatData(this._data);\n                if (this._destroyed.length) {\n                    return true;\n                }\n                for (idx = 0, length = data.length; idx < length; idx++) {\n                    if (data[idx].isNew && data[idx].isNew() || data[idx].dirty) {\n                        return true;\n                    }\n                }\n                return false;\n            },\n            _accept: function (result) {\n                var that = this, models = result.models, response = result.response, idx = 0, serverGroup = that._isServerGrouped(), pristine = that._pristineData, type = result.type, length;\n                that.trigger(REQUESTEND, {\n                    response: response,\n                    type: type\n                });\n                if (response && !isEmptyObject(response)) {\n                    response = that.reader.parse(response);\n                    if (that._handleCustomErrors(response)) {\n                        return;\n                    }\n                    response = that.reader.data(response);\n                    if (!isArray(response)) {\n                        response = [response];\n                    }\n                } else {\n                    response = $.map(models, function (model) {\n                        return model.toJSON();\n                    });\n                }\n                if (type === 'destroy') {\n                    that._destroyed = [];\n                }\n                for (idx = 0, length = models.length; idx < length; idx++) {\n                    if (type !== 'destroy') {\n                        models[idx].accept(response[idx]);\n                        if (type === 'create') {\n                            pristine.push(serverGroup ? that._wrapInEmptyGroup(models[idx]) : response[idx]);\n                        } else if (type === 'update') {\n                            that._updatePristineForModel(models[idx], response[idx]);\n                        }\n                    } else {\n                        that._removePristineForModel(models[idx]);\n                    }\n                }\n            },\n            _updatePristineForModel: function (model, values) {\n                this._executeOnPristineForModel(model, function (index, items) {\n                    kendo.deepExtend(items[index], values);\n                });\n            },\n            _executeOnPristineForModel: function (model, callback) {\n                this._eachPristineItem(function (items) {\n                    var index = indexOfPristineModel(items, model);\n                    if (index > -1) {\n                        callback(index, items);\n                        return true;\n                    }\n                });\n            },\n            _removePristineForModel: function (model) {\n                this._executeOnPristineForModel(model, function (index, items) {\n                    items.splice(index, 1);\n                });\n            },\n            _readData: function (data) {\n                var read = !this._isServerGrouped() ? this.reader.data : this.reader.groups;\n                return read.call(this.reader, data);\n            },\n            _eachPristineItem: function (callback) {\n                this._eachItem(this._pristineData, callback);\n            },\n            _eachItem: function (data, callback) {\n                if (data && data.length) {\n                    if (this._isServerGrouped()) {\n                        eachGroupItems(data, callback);\n                    } else {\n                        callback(data);\n                    }\n                }\n            },\n            _pristineForModel: function (model) {\n                var pristine, idx, callback = function (items) {\n                        idx = indexOfPristineModel(items, model);\n                        if (idx > -1) {\n                            pristine = items[idx];\n                            return true;\n                        }\n                    };\n                this._eachPristineItem(callback);\n                return pristine;\n            },\n            _cancelModel: function (model) {\n                var pristine = this._pristineForModel(model);\n                this._eachItem(this._data, function (items) {\n                    var idx = indexOfModel(items, model);\n                    if (idx >= 0) {\n                        if (pristine && (!model.isNew() || pristine.__state__)) {\n                            items[idx].accept(pristine);\n                            if (pristine.__state__ == 'update') {\n                                items[idx].dirty = true;\n                            }\n                        } else {\n                            items.splice(idx, 1);\n                        }\n                    }\n                });\n            },\n            _submit: function (promises, data) {\n                var that = this;\n                that.trigger(REQUESTSTART, { type: 'submit' });\n                that.trigger(PROGRESS);\n                that.transport.submit(extend({\n                    success: function (response, type) {\n                        var promise = $.grep(promises, function (x) {\n                            return x.type == type;\n                        })[0];\n                        if (promise) {\n                            promise.resolve({\n                                response: response,\n                                models: promise.models,\n                                type: type\n                            });\n                        }\n                    },\n                    error: function (response, status, error) {\n                        for (var idx = 0; idx < promises.length; idx++) {\n                            promises[idx].reject(response);\n                        }\n                        that.error(response, status, error);\n                    }\n                }, data));\n            },\n            _sendSubmit: function (created, updated, destroyed) {\n                var that = this, promises = [];\n                if (that.options.batch) {\n                    if (created.length) {\n                        promises.push($.Deferred(function (deferred) {\n                            deferred.type = 'create';\n                            deferred.models = created;\n                        }));\n                    }\n                    if (updated.length) {\n                        promises.push($.Deferred(function (deferred) {\n                            deferred.type = 'update';\n                            deferred.models = updated;\n                        }));\n                    }\n                    if (destroyed.length) {\n                        promises.push($.Deferred(function (deferred) {\n                            deferred.type = 'destroy';\n                            deferred.models = destroyed;\n                        }));\n                    }\n                    that._submit(promises, {\n                        data: {\n                            created: that.reader.serialize(toJSON(created)),\n                            updated: that.reader.serialize(toJSON(updated)),\n                            destroyed: that.reader.serialize(toJSON(destroyed))\n                        }\n                    });\n                }\n                return promises;\n            },\n            _promise: function (data, models, type) {\n                var that = this;\n                return $.Deferred(function (deferred) {\n                    that.trigger(REQUESTSTART, { type: type });\n                    that.trigger(PROGRESS);\n                    that.transport[type].call(that.transport, extend({\n                        success: function (response) {\n                            deferred.resolve({\n                                response: response,\n                                models: models,\n                                type: type\n                            });\n                        },\n                        error: function (response, status, error) {\n                            deferred.reject(response);\n                            that.error(response, status, error);\n                        }\n                    }, data));\n                }).promise();\n            },\n            _send: function (method, data) {\n                var that = this, idx, length, promises = [], converted = that.reader.serialize(toJSON(data));\n                if (that.options.batch) {\n                    if (data.length) {\n                        promises.push(that._promise({ data: { models: converted } }, data, method));\n                    }\n                } else {\n                    for (idx = 0, length = data.length; idx < length; idx++) {\n                        promises.push(that._promise({ data: converted[idx] }, [data[idx]], method));\n                    }\n                }\n                return promises;\n            },\n            read: function (data) {\n                var that = this, params = that._params(data);\n                var deferred = $.Deferred();\n                that._queueRequest(params, function () {\n                    var isPrevented = that.trigger(REQUESTSTART, { type: 'read' });\n                    if (!isPrevented) {\n                        that.trigger(PROGRESS);\n                        that._ranges = [];\n                        that.trigger('reset');\n                        if (that.online()) {\n                            that.transport.read({\n                                data: params,\n                                success: function (data) {\n                                    that._ranges = [];\n                                    that.success(data, params);\n                                    deferred.resolve();\n                                },\n                                error: function () {\n                                    var args = slice.call(arguments);\n                                    that.error.apply(that, args);\n                                    deferred.reject.apply(deferred, args);\n                                }\n                            });\n                        } else if (that.options.offlineStorage != null) {\n                            that.success(that.offlineData(), params);\n                            deferred.resolve();\n                        }\n                    } else {\n                        that._dequeueRequest();\n                        deferred.resolve(isPrevented);\n                    }\n                });\n                return deferred.promise();\n            },\n            _readAggregates: function (data) {\n                return this.reader.aggregates(data);\n            },\n            success: function (data) {\n                var that = this, options = that.options;\n                that.trigger(REQUESTEND, {\n                    response: data,\n                    type: 'read'\n                });\n                if (that.online()) {\n                    data = that.reader.parse(data);\n                    if (that._handleCustomErrors(data)) {\n                        that._dequeueRequest();\n                        return;\n                    }\n                    that._total = that.reader.total(data);\n                    if (that._aggregate && options.serverAggregates) {\n                        that._aggregateResult = that._readAggregates(data);\n                    }\n                    data = that._readData(data);\n                    that._destroyed = [];\n                } else {\n                    data = that._readData(data);\n                    var items = [];\n                    var itemIds = {};\n                    var model = that.reader.model;\n                    var idField = model ? model.idField : 'id';\n                    var idx;\n                    for (idx = 0; idx < this._destroyed.length; idx++) {\n                        var id = this._destroyed[idx][idField];\n                        itemIds[id] = id;\n                    }\n                    for (idx = 0; idx < data.length; idx++) {\n                        var item = data[idx];\n                        var state = item.__state__;\n                        if (state == 'destroy') {\n                            if (!itemIds[item[idField]]) {\n                                this._destroyed.push(this._createNewModel(item));\n                            }\n                        } else {\n                            items.push(item);\n                        }\n                    }\n                    data = items;\n                    that._total = data.length;\n                }\n                that._pristineTotal = that._total;\n                that._pristineData = data.slice(0);\n                that._detachObservableParents();\n                that._data = that._observe(data);\n                that._markOfflineUpdatesAsDirty();\n                that._storeData();\n                that._addRange(that._data);\n                that._process(that._data);\n                that._dequeueRequest();\n            },\n            _detachObservableParents: function () {\n                if (this._data && this._shouldDetachObservableParents) {\n                    for (var idx = 0; idx < this._data.length; idx++) {\n                        if (this._data[idx].parent) {\n                            this._data[idx].parent = noop;\n                        }\n                    }\n                }\n            },\n            _storeData: function (updatePristine) {\n                var serverGrouping = this._isServerGrouped();\n                var model = this.reader.model;\n                function items(data) {\n                    var state = [];\n                    for (var idx = 0; idx < data.length; idx++) {\n                        var dataItem = data.at(idx);\n                        var item = dataItem.toJSON();\n                        if (serverGrouping && dataItem.items) {\n                            item.items = items(dataItem.items);\n                        } else {\n                            item.uid = dataItem.uid;\n                            if (model) {\n                                if (dataItem.isNew()) {\n                                    item.__state__ = 'create';\n                                } else if (dataItem.dirty) {\n                                    item.__state__ = 'update';\n                                }\n                            }\n                        }\n                        state.push(item);\n                    }\n                    return state;\n                }\n                if (this.options.offlineStorage != null) {\n                    var state = items(this._data);\n                    var destroyed = [];\n                    for (var idx = 0; idx < this._destroyed.length; idx++) {\n                        var item = this._destroyed[idx].toJSON();\n                        item.__state__ = 'destroy';\n                        destroyed.push(item);\n                    }\n                    this.offlineData(state.concat(destroyed));\n                    if (updatePristine) {\n                        this._pristineData = this._readData(state);\n                    }\n                }\n            },\n            _addRange: function (data) {\n                var that = this, start = that._skip || 0, end = start + that._flatData(data, true).length;\n                that._ranges.push({\n                    start: start,\n                    end: end,\n                    data: data,\n                    timestamp: new Date().getTime()\n                });\n                that._ranges.sort(function (x, y) {\n                    return x.start - y.start;\n                });\n            },\n            error: function (xhr, status, errorThrown) {\n                this._dequeueRequest();\n                this.trigger(REQUESTEND, {});\n                this.trigger(ERROR, {\n                    xhr: xhr,\n                    status: status,\n                    errorThrown: errorThrown\n                });\n            },\n            _params: function (data) {\n                var that = this, options = extend({\n                        take: that.take(),\n                        skip: that.skip(),\n                        page: that.page(),\n                        pageSize: that.pageSize(),\n                        sort: that._sort,\n                        filter: that._filter,\n                        group: that._group,\n                        aggregate: that._aggregate\n                    }, data);\n                if (!that.options.serverPaging) {\n                    delete options.take;\n                    delete options.skip;\n                    delete options.page;\n                    delete options.pageSize;\n                }\n                if (!that.options.serverGrouping) {\n                    delete options.group;\n                } else if (that.reader.model && options.group) {\n                    options.group = convertDescriptorsField(options.group, that.reader.model);\n                }\n                if (!that.options.serverFiltering) {\n                    delete options.filter;\n                } else if (that.reader.model && options.filter) {\n                    options.filter = convertFilterDescriptorsField(options.filter, that.reader.model);\n                }\n                if (!that.options.serverSorting) {\n                    delete options.sort;\n                } else if (that.reader.model && options.sort) {\n                    options.sort = convertDescriptorsField(options.sort, that.reader.model);\n                }\n                if (!that.options.serverAggregates) {\n                    delete options.aggregate;\n                } else if (that.reader.model && options.aggregate) {\n                    options.aggregate = convertDescriptorsField(options.aggregate, that.reader.model);\n                }\n                return options;\n            },\n            _queueRequest: function (options, callback) {\n                var that = this;\n                if (!that._requestInProgress) {\n                    that._requestInProgress = true;\n                    that._pending = undefined;\n                    callback();\n                } else {\n                    that._pending = {\n                        callback: proxy(callback, that),\n                        options: options\n                    };\n                }\n            },\n            _dequeueRequest: function () {\n                var that = this;\n                that._requestInProgress = false;\n                if (that._pending) {\n                    that._queueRequest(that._pending.options, that._pending.callback);\n                }\n            },\n            _handleCustomErrors: function (response) {\n                if (this.reader.errors) {\n                    var errors = this.reader.errors(response);\n                    if (errors) {\n                        this.trigger(ERROR, {\n                            xhr: null,\n                            status: 'customerror',\n                            errorThrown: 'custom error',\n                            errors: errors\n                        });\n                        return true;\n                    }\n                }\n                return false;\n            },\n            _shouldWrap: function (data) {\n                var model = this.reader.model;\n                if (model && data.length) {\n                    return !(data[0] instanceof model);\n                }\n                return false;\n            },\n            _observe: function (data) {\n                var that = this, model = that.reader.model;\n                that._shouldDetachObservableParents = true;\n                if (data instanceof ObservableArray) {\n                    that._shouldDetachObservableParents = false;\n                    if (that._shouldWrap(data)) {\n                        data.type = that.reader.model;\n                        data.wrapAll(data, data);\n                    }\n                } else {\n                    var arrayType = that.pageSize() && !that.options.serverPaging ? LazyObservableArray : ObservableArray;\n                    data = new arrayType(data, that.reader.model);\n                    data.parent = function () {\n                        return that.parent();\n                    };\n                }\n                if (that._isServerGrouped()) {\n                    wrapGroupItems(data, model);\n                }\n                if (that._changeHandler && that._data && that._data instanceof ObservableArray) {\n                    that._data.unbind(CHANGE, that._changeHandler);\n                } else {\n                    that._changeHandler = proxy(that._change, that);\n                }\n                return data.bind(CHANGE, that._changeHandler);\n            },\n            _updateTotalForAction: function (action, items) {\n                var that = this;\n                var total = parseInt(that._total, 10);\n                if (!isNumber(that._total)) {\n                    total = parseInt(that._pristineTotal, 10);\n                }\n                if (action === 'add') {\n                    total += items.length;\n                } else if (action === 'remove') {\n                    total -= items.length;\n                } else if (action !== 'itemchange' && action !== 'sync' && !that.options.serverPaging) {\n                    total = that._pristineTotal;\n                } else if (action === 'sync') {\n                    total = that._pristineTotal = parseInt(that._total, 10);\n                }\n                that._total = total;\n            },\n            _change: function (e) {\n                var that = this, idx, length, action = e ? e.action : '';\n                if (action === 'remove') {\n                    for (idx = 0, length = e.items.length; idx < length; idx++) {\n                        if (!e.items[idx].isNew || !e.items[idx].isNew()) {\n                            that._destroyed.push(e.items[idx]);\n                        }\n                    }\n                }\n                if (that.options.autoSync && (action === 'add' || action === 'remove' || action === 'itemchange')) {\n                    var handler = function (args) {\n                        if (args.action === 'sync') {\n                            that.unbind('change', handler);\n                            that._updateTotalForAction(action, e.items);\n                        }\n                    };\n                    that.first('change', handler);\n                    that.sync();\n                } else {\n                    that._updateTotalForAction(action, e ? e.items : []);\n                    that._process(that._data, e);\n                }\n            },\n            _calculateAggregates: function (data, options) {\n                options = options || {};\n                var query = new Query(data), aggregates = options.aggregate, filter = options.filter;\n                if (filter) {\n                    query = query.filter(filter);\n                }\n                return query.aggregate(aggregates);\n            },\n            _process: function (data, e) {\n                var that = this, options = {}, result;\n                if (that.options.serverPaging !== true) {\n                    options.skip = that._skip;\n                    options.take = that._take || that._pageSize;\n                    if (options.skip === undefined && that._page !== undefined && that._pageSize !== undefined) {\n                        options.skip = (that._page - 1) * that._pageSize;\n                    }\n                }\n                if (that.options.serverSorting !== true) {\n                    options.sort = that._sort;\n                }\n                if (that.options.serverFiltering !== true) {\n                    options.filter = that._filter;\n                }\n                if (that.options.serverGrouping !== true) {\n                    options.group = that._group;\n                }\n                if (that.options.serverAggregates !== true) {\n                    options.aggregate = that._aggregate;\n                    that._aggregateResult = that._calculateAggregates(data, options);\n                }\n                result = that._queryProcess(data, options);\n                that.view(result.data);\n                if (result.total !== undefined && !that.options.serverFiltering) {\n                    that._total = result.total;\n                }\n                e = e || {};\n                e.items = e.items || that._view;\n                that.trigger(CHANGE, e);\n            },\n            _queryProcess: function (data, options) {\n                return Query.process(data, options);\n            },\n            _mergeState: function (options) {\n                var that = this;\n                if (options !== undefined) {\n                    that._pageSize = options.pageSize;\n                    that._page = options.page;\n                    that._sort = options.sort;\n                    that._filter = options.filter;\n                    that._group = options.group;\n                    that._aggregate = options.aggregate;\n                    that._skip = that._currentRangeStart = options.skip;\n                    that._take = options.take;\n                    if (that._skip === undefined) {\n                        that._skip = that._currentRangeStart = that.skip();\n                        options.skip = that.skip();\n                    }\n                    if (that._take === undefined && that._pageSize !== undefined) {\n                        that._take = that._pageSize;\n                        options.take = that._take;\n                    }\n                    if (options.sort) {\n                        that._sort = options.sort = normalizeSort(options.sort);\n                    }\n                    if (options.filter) {\n                        that._filter = options.filter = normalizeFilter(options.filter);\n                    }\n                    if (options.group) {\n                        that._group = options.group = normalizeGroup(options.group);\n                    }\n                    if (options.aggregate) {\n                        that._aggregate = options.aggregate = normalizeAggregate(options.aggregate);\n                    }\n                }\n                return options;\n            },\n            query: function (options) {\n                var result;\n                var remote = this.options.serverSorting || this.options.serverPaging || this.options.serverFiltering || this.options.serverGrouping || this.options.serverAggregates;\n                if (remote || (this._data === undefined || this._data.length === 0) && !this._destroyed.length) {\n                    return this.read(this._mergeState(options));\n                }\n                var isPrevented = this.trigger(REQUESTSTART, { type: 'read' });\n                if (!isPrevented) {\n                    this.trigger(PROGRESS);\n                    result = this._queryProcess(this._data, this._mergeState(options));\n                    if (!this.options.serverFiltering) {\n                        if (result.total !== undefined) {\n                            this._total = result.total;\n                        } else {\n                            this._total = this._data.length;\n                        }\n                    }\n                    this._aggregateResult = this._calculateAggregates(this._data, options);\n                    this.view(result.data);\n                    this.trigger(REQUESTEND, { type: 'read' });\n                    this.trigger(CHANGE, { items: result.data });\n                }\n                return $.Deferred().resolve(isPrevented).promise();\n            },\n            fetch: function (callback) {\n                var that = this;\n                var fn = function (isPrevented) {\n                    if (isPrevented !== true && isFunction(callback)) {\n                        callback.call(that);\n                    }\n                };\n                return this._query().then(fn);\n            },\n            _query: function (options) {\n                var that = this;\n                return that.query(extend({}, {\n                    page: that.page(),\n                    pageSize: that.pageSize(),\n                    sort: that.sort(),\n                    filter: that.filter(),\n                    group: that.group(),\n                    aggregate: that.aggregate()\n                }, options));\n            },\n            next: function (options) {\n                var that = this, page = that.page(), total = that.total();\n                options = options || {};\n                if (!page || total && page + 1 > that.totalPages()) {\n                    return;\n                }\n                that._skip = that._currentRangeStart = page * that.take();\n                page += 1;\n                options.page = page;\n                that._query(options);\n                return page;\n            },\n            prev: function (options) {\n                var that = this, page = that.page();\n                options = options || {};\n                if (!page || page === 1) {\n                    return;\n                }\n                that._skip = that._currentRangeStart = that._skip - that.take();\n                page -= 1;\n                options.page = page;\n                that._query(options);\n                return page;\n            },\n            page: function (val) {\n                var that = this, skip;\n                if (val !== undefined) {\n                    val = math.max(math.min(math.max(val, 1), that.totalPages()), 1);\n                    that._query({ page: val });\n                    return;\n                }\n                skip = that.skip();\n                return skip !== undefined ? math.round((skip || 0) / (that.take() || 1)) + 1 : undefined;\n            },\n            pageSize: function (val) {\n                var that = this;\n                if (val !== undefined) {\n                    that._query({\n                        pageSize: val,\n                        page: 1\n                    });\n                    return;\n                }\n                return that.take();\n            },\n            sort: function (val) {\n                var that = this;\n                if (val !== undefined) {\n                    that._query({ sort: val });\n                    return;\n                }\n                return that._sort;\n            },\n            filter: function (val) {\n                var that = this;\n                if (val === undefined) {\n                    return that._filter;\n                }\n                that.trigger('reset');\n                that._query({\n                    filter: val,\n                    page: 1\n                });\n            },\n            group: function (val) {\n                var that = this;\n                if (val !== undefined) {\n                    that._query({ group: val });\n                    return;\n                }\n                return that._group;\n            },\n            total: function () {\n                return parseInt(this._total || 0, 10);\n            },\n            aggregate: function (val) {\n                var that = this;\n                if (val !== undefined) {\n                    that._query({ aggregate: val });\n                    return;\n                }\n                return that._aggregate;\n            },\n            aggregates: function () {\n                var result = this._aggregateResult;\n                if (isEmptyObject(result)) {\n                    result = this._emptyAggregates(this.aggregate());\n                }\n                return result;\n            },\n            _emptyAggregates: function (aggregates) {\n                var result = {};\n                if (!isEmptyObject(aggregates)) {\n                    var aggregate = {};\n                    if (!isArray(aggregates)) {\n                        aggregates = [aggregates];\n                    }\n                    for (var idx = 0; idx < aggregates.length; idx++) {\n                        aggregate[aggregates[idx].aggregate] = 0;\n                        result[aggregates[idx].field] = aggregate;\n                    }\n                }\n                return result;\n            },\n            _wrapInEmptyGroup: function (model) {\n                var groups = this.group(), parent, group, idx, length;\n                for (idx = groups.length - 1, length = 0; idx >= length; idx--) {\n                    group = groups[idx];\n                    parent = {\n                        value: model.get(group.field),\n                        field: group.field,\n                        items: parent ? [parent] : [model],\n                        hasSubgroups: !!parent,\n                        aggregates: this._emptyAggregates(group.aggregates)\n                    };\n                }\n                return parent;\n            },\n            totalPages: function () {\n                var that = this, pageSize = that.pageSize() || that.total();\n                return math.ceil((that.total() || 0) / pageSize);\n            },\n            inRange: function (skip, take) {\n                var that = this, end = math.min(skip + take, that.total());\n                if (!that.options.serverPaging && that._data.length > 0) {\n                    return true;\n                }\n                return that._findRange(skip, end).length > 0;\n            },\n            lastRange: function () {\n                var ranges = this._ranges;\n                return ranges[ranges.length - 1] || {\n                    start: 0,\n                    end: 0,\n                    data: []\n                };\n            },\n            firstItemUid: function () {\n                var ranges = this._ranges;\n                return ranges.length && ranges[0].data.length && ranges[0].data[0].uid;\n            },\n            enableRequestsInProgress: function () {\n                this._skipRequestsInProgress = false;\n            },\n            _timeStamp: function () {\n                return new Date().getTime();\n            },\n            range: function (skip, take) {\n                this._currentRequestTimeStamp = this._timeStamp();\n                this._skipRequestsInProgress = true;\n                skip = math.min(skip || 0, this.total());\n                var that = this, pageSkip = math.max(math.floor(skip / take), 0) * take, size = math.min(pageSkip + take, that.total()), data;\n                data = that._findRange(skip, math.min(skip + take, that.total()));\n                if (data.length) {\n                    that._pending = undefined;\n                    that._skip = skip > that.skip() ? math.min(size, (that.totalPages() - 1) * that.take()) : pageSkip;\n                    that._currentRangeStart = skip;\n                    that._take = take;\n                    var paging = that.options.serverPaging;\n                    var sorting = that.options.serverSorting;\n                    var filtering = that.options.serverFiltering;\n                    var aggregates = that.options.serverAggregates;\n                    try {\n                        that.options.serverPaging = true;\n                        if (!that._isServerGrouped() && !(that.group() && that.group().length)) {\n                            that.options.serverSorting = true;\n                        }\n                        that.options.serverFiltering = true;\n                        that.options.serverPaging = true;\n                        that.options.serverAggregates = true;\n                        if (paging) {\n                            that._detachObservableParents();\n                            that._data = data = that._observe(data);\n                        }\n                        that._process(data);\n                    } finally {\n                        that.options.serverPaging = paging;\n                        that.options.serverSorting = sorting;\n                        that.options.serverFiltering = filtering;\n                        that.options.serverAggregates = aggregates;\n                    }\n                    return;\n                }\n                if (take !== undefined) {\n                    if (!that._rangeExists(pageSkip, size)) {\n                        that.prefetch(pageSkip, take, function () {\n                            if (skip > pageSkip && size < that.total() && !that._rangeExists(size, math.min(size + take, that.total()))) {\n                                that.prefetch(size, take, function () {\n                                    that.range(skip, take);\n                                });\n                            } else {\n                                that.range(skip, take);\n                            }\n                        });\n                    } else if (pageSkip < skip) {\n                        that.prefetch(size, take, function () {\n                            that.range(skip, take);\n                        });\n                    }\n                }\n            },\n            _findRange: function (start, end) {\n                var that = this, ranges = that._ranges, range, data = [], skipIdx, takeIdx, startIndex, endIndex, rangeData, rangeEnd, processed, options = that.options, remote = options.serverSorting || options.serverPaging || options.serverFiltering || options.serverGrouping || options.serverAggregates, flatData, count, length;\n                for (skipIdx = 0, length = ranges.length; skipIdx < length; skipIdx++) {\n                    range = ranges[skipIdx];\n                    if (start >= range.start && start <= range.end) {\n                        count = 0;\n                        for (takeIdx = skipIdx; takeIdx < length; takeIdx++) {\n                            range = ranges[takeIdx];\n                            flatData = that._flatData(range.data, true);\n                            if (flatData.length && start + count >= range.start) {\n                                rangeData = range.data;\n                                rangeEnd = range.end;\n                                if (!remote) {\n                                    var sort = normalizeGroup(that.group() || []).concat(normalizeSort(that.sort() || []));\n                                    processed = that._queryProcess(range.data, {\n                                        sort: sort,\n                                        filter: that.filter()\n                                    });\n                                    flatData = rangeData = processed.data;\n                                    if (processed.total !== undefined) {\n                                        rangeEnd = processed.total;\n                                    }\n                                }\n                                startIndex = 0;\n                                if (start + count > range.start) {\n                                    startIndex = start + count - range.start;\n                                }\n                                endIndex = flatData.length;\n                                if (rangeEnd > end) {\n                                    endIndex = endIndex - (rangeEnd - end);\n                                }\n                                count += endIndex - startIndex;\n                                data = that._mergeGroups(data, rangeData, startIndex, endIndex);\n                                if (end <= range.end && count == end - start) {\n                                    return data;\n                                }\n                            }\n                        }\n                        break;\n                    }\n                }\n                return [];\n            },\n            _mergeGroups: function (data, range, skip, take) {\n                if (this._isServerGrouped()) {\n                    var temp = range.toJSON(), prevGroup;\n                    if (data.length) {\n                        prevGroup = data[data.length - 1];\n                    }\n                    mergeGroups(prevGroup, temp, skip, take);\n                    return data.concat(temp);\n                }\n                return data.concat(range.slice(skip, take));\n            },\n            skip: function () {\n                var that = this;\n                if (that._skip === undefined) {\n                    return that._page !== undefined ? (that._page - 1) * (that.take() || 1) : undefined;\n                }\n                return that._skip;\n            },\n            currentRangeStart: function () {\n                return this._currentRangeStart || 0;\n            },\n            take: function () {\n                return this._take || this._pageSize;\n            },\n            _prefetchSuccessHandler: function (skip, size, callback, force) {\n                var that = this;\n                var timestamp = that._timeStamp();\n                return function (data) {\n                    var found = false, range = {\n                            start: skip,\n                            end: size,\n                            data: [],\n                            timestamp: that._timeStamp()\n                        }, idx, length, temp;\n                    that._dequeueRequest();\n                    that.trigger(REQUESTEND, {\n                        response: data,\n                        type: 'read'\n                    });\n                    data = that.reader.parse(data);\n                    temp = that._readData(data);\n                    if (temp.length) {\n                        for (idx = 0, length = that._ranges.length; idx < length; idx++) {\n                            if (that._ranges[idx].start === skip) {\n                                found = true;\n                                range = that._ranges[idx];\n                                break;\n                            }\n                        }\n                        if (!found) {\n                            that._ranges.push(range);\n                        }\n                    }\n                    range.data = that._observe(temp);\n                    range.end = range.start + that._flatData(range.data, true).length;\n                    that._ranges.sort(function (x, y) {\n                        return x.start - y.start;\n                    });\n                    that._total = that.reader.total(data);\n                    if (force || (timestamp >= that._currentRequestTimeStamp || !that._skipRequestsInProgress)) {\n                        if (callback && temp.length) {\n                            callback();\n                        } else {\n                            that.trigger(CHANGE, {});\n                        }\n                    }\n                };\n            },\n            prefetch: function (skip, take, callback) {\n                var that = this, size = math.min(skip + take, that.total()), options = {\n                        take: take,\n                        skip: skip,\n                        page: skip / take + 1,\n                        pageSize: take,\n                        sort: that._sort,\n                        filter: that._filter,\n                        group: that._group,\n                        aggregate: that._aggregate\n                    };\n                if (!that._rangeExists(skip, size)) {\n                    clearTimeout(that._timeout);\n                    that._timeout = setTimeout(function () {\n                        that._queueRequest(options, function () {\n                            if (!that.trigger(REQUESTSTART, { type: 'read' })) {\n                                that.transport.read({\n                                    data: that._params(options),\n                                    success: that._prefetchSuccessHandler(skip, size, callback),\n                                    error: function () {\n                                        var args = slice.call(arguments);\n                                        that.error.apply(that, args);\n                                    }\n                                });\n                            } else {\n                                that._dequeueRequest();\n                            }\n                        });\n                    }, 100);\n                } else if (callback) {\n                    callback();\n                }\n            },\n            _multiplePrefetch: function (skip, take, callback) {\n                var that = this, size = math.min(skip + take, that.total()), options = {\n                        take: take,\n                        skip: skip,\n                        page: skip / take + 1,\n                        pageSize: take,\n                        sort: that._sort,\n                        filter: that._filter,\n                        group: that._group,\n                        aggregate: that._aggregate\n                    };\n                if (!that._rangeExists(skip, size)) {\n                    if (!that.trigger(REQUESTSTART, { type: 'read' })) {\n                        that.transport.read({\n                            data: that._params(options),\n                            success: that._prefetchSuccessHandler(skip, size, callback, true)\n                        });\n                    }\n                } else if (callback) {\n                    callback();\n                }\n            },\n            _rangeExists: function (start, end) {\n                var that = this, ranges = that._ranges, idx, length;\n                for (idx = 0, length = ranges.length; idx < length; idx++) {\n                    if (ranges[idx].start <= start && ranges[idx].end >= end) {\n                        return true;\n                    }\n                }\n                return false;\n            },\n            _removeModelFromRanges: function (model) {\n                var result, found, range;\n                for (var idx = 0, length = this._ranges.length; idx < length; idx++) {\n                    range = this._ranges[idx];\n                    this._eachItem(range.data, function (items) {\n                        result = removeModel(items, model);\n                        if (result) {\n                            found = true;\n                        }\n                    });\n                    if (found) {\n                        break;\n                    }\n                }\n            },\n            _updateRangesLength: function () {\n                var startOffset = 0, range, rangeLength;\n                for (var idx = 0, length = this._ranges.length; idx < length; idx++) {\n                    range = this._ranges[idx];\n                    range.start = range.start - startOffset;\n                    rangeLength = this._flatData(range.data, true).length;\n                    startOffset = range.end - rangeLength;\n                    range.end = range.start + rangeLength;\n                }\n            }\n        });\n        var Transport = {};\n        Transport.create = function (options, data, dataSource) {\n            var transport, transportOptions = options.transport ? $.extend({}, options.transport) : null;\n            if (transportOptions) {\n                transportOptions.read = typeof transportOptions.read === STRING ? { url: transportOptions.read } : transportOptions.read;\n                if (options.type === 'jsdo') {\n                    transportOptions.dataSource = dataSource;\n                }\n                if (options.type) {\n                    kendo.data.transports = kendo.data.transports || {};\n                    kendo.data.schemas = kendo.data.schemas || {};\n                    if (!kendo.data.transports[options.type]) {\n                        kendo.logToConsole('Unknown DataSource transport type \\'' + options.type + '\\'.\\nVerify that registration scripts for this type are included after Kendo UI on the page.', 'warn');\n                    } else if (!isPlainObject(kendo.data.transports[options.type])) {\n                        transport = new kendo.data.transports[options.type](extend(transportOptions, { data: data }));\n                    } else {\n                        transportOptions = extend(true, {}, kendo.data.transports[options.type], transportOptions);\n                    }\n                    options.schema = extend(true, {}, kendo.data.schemas[options.type], options.schema);\n                }\n                if (!transport) {\n                    transport = isFunction(transportOptions.read) ? transportOptions : new RemoteTransport(transportOptions);\n                }\n            } else {\n                transport = new LocalTransport({ data: options.data || [] });\n            }\n            return transport;\n        };\n        DataSource.create = function (options) {\n            if (isArray(options) || options instanceof ObservableArray) {\n                options = { data: options };\n            }\n            var dataSource = options || {}, data = dataSource.data, fields = dataSource.fields, table = dataSource.table, select = dataSource.select, idx, length, model = {}, field;\n            if (!data && fields && !dataSource.transport) {\n                if (table) {\n                    data = inferTable(table, fields);\n                } else if (select) {\n                    data = inferSelect(select, fields);\n                    if (dataSource.group === undefined && data[0] && data[0].optgroup !== undefined) {\n                        dataSource.group = 'optgroup';\n                    }\n                }\n            }\n            if (kendo.data.Model && fields && (!dataSource.schema || !dataSource.schema.model)) {\n                for (idx = 0, length = fields.length; idx < length; idx++) {\n                    field = fields[idx];\n                    if (field.type) {\n                        model[field.field] = field;\n                    }\n                }\n                if (!isEmptyObject(model)) {\n                    dataSource.schema = extend(true, dataSource.schema, { model: { fields: model } });\n                }\n            }\n            dataSource.data = data;\n            select = null;\n            dataSource.select = null;\n            table = null;\n            dataSource.table = null;\n            return dataSource instanceof DataSource ? dataSource : new DataSource(dataSource);\n        };\n        function inferSelect(select, fields) {\n            select = $(select)[0];\n            var options = select.options;\n            var firstField = fields[0];\n            var secondField = fields[1];\n            var data = [];\n            var idx, length;\n            var optgroup;\n            var option;\n            var record;\n            var value;\n            for (idx = 0, length = options.length; idx < length; idx++) {\n                record = {};\n                option = options[idx];\n                optgroup = option.parentNode;\n                if (optgroup === select) {\n                    optgroup = null;\n                }\n                if (option.disabled || optgroup && optgroup.disabled) {\n                    continue;\n                }\n                if (optgroup) {\n                    record.optgroup = optgroup.label;\n                }\n                record[firstField.field] = option.text;\n                value = option.attributes.value;\n                if (value && value.specified) {\n                    value = option.value;\n                } else {\n                    value = option.text;\n                }\n                record[secondField.field] = value;\n                data.push(record);\n            }\n            return data;\n        }\n        function inferTable(table, fields) {\n            var tbody = $(table)[0].tBodies[0], rows = tbody ? tbody.rows : [], idx, length, fieldIndex, fieldCount = fields.length, data = [], cells, record, cell, empty;\n            for (idx = 0, length = rows.length; idx < length; idx++) {\n                record = {};\n                empty = true;\n                cells = rows[idx].cells;\n                for (fieldIndex = 0; fieldIndex < fieldCount; fieldIndex++) {\n                    cell = cells[fieldIndex];\n                    if (cell.nodeName.toLowerCase() !== 'th') {\n                        empty = false;\n                        record[fields[fieldIndex].field] = cell.innerHTML;\n                    }\n                }\n                if (!empty) {\n                    data.push(record);\n                }\n            }\n            return data;\n        }\n        var Node = Model.define({\n            idField: 'id',\n            init: function (value) {\n                var that = this, hasChildren = that.hasChildren || value && value.hasChildren, childrenField = 'items', childrenOptions = {};\n                kendo.data.Model.fn.init.call(that, value);\n                if (typeof that.children === STRING) {\n                    childrenField = that.children;\n                }\n                childrenOptions = {\n                    schema: {\n                        data: childrenField,\n                        model: {\n                            hasChildren: hasChildren,\n                            id: that.idField,\n                            fields: that.fields\n                        }\n                    }\n                };\n                if (typeof that.children !== STRING) {\n                    extend(childrenOptions, that.children);\n                }\n                childrenOptions.data = value;\n                if (!hasChildren) {\n                    hasChildren = childrenOptions.schema.data;\n                }\n                if (typeof hasChildren === STRING) {\n                    hasChildren = kendo.getter(hasChildren);\n                }\n                if (isFunction(hasChildren)) {\n                    var hasChildrenObject = hasChildren.call(that, that);\n                    if (hasChildrenObject && hasChildrenObject.length === 0) {\n                        that.hasChildren = false;\n                    } else {\n                        that.hasChildren = !!hasChildrenObject;\n                    }\n                }\n                that._childrenOptions = childrenOptions;\n                if (that.hasChildren) {\n                    that._initChildren();\n                }\n                that._loaded = !!(value && value._loaded);\n            },\n            _initChildren: function () {\n                var that = this;\n                var children, transport, parameterMap;\n                if (!(that.children instanceof HierarchicalDataSource)) {\n                    children = that.children = new HierarchicalDataSource(that._childrenOptions);\n                    transport = children.transport;\n                    parameterMap = transport.parameterMap;\n                    transport.parameterMap = function (data, type) {\n                        data[that.idField || 'id'] = that.id;\n                        if (parameterMap) {\n                            data = parameterMap(data, type);\n                        }\n                        return data;\n                    };\n                    children.parent = function () {\n                        return that;\n                    };\n                    children.bind(CHANGE, function (e) {\n                        e.node = e.node || that;\n                        that.trigger(CHANGE, e);\n                    });\n                    children.bind(ERROR, function (e) {\n                        var collection = that.parent();\n                        if (collection) {\n                            e.node = e.node || that;\n                            collection.trigger(ERROR, e);\n                        }\n                    });\n                    that._updateChildrenField();\n                }\n            },\n            append: function (model) {\n                this._initChildren();\n                this.loaded(true);\n                this.children.add(model);\n            },\n            hasChildren: false,\n            level: function () {\n                var parentNode = this.parentNode(), level = 0;\n                while (parentNode && parentNode.parentNode) {\n                    level++;\n                    parentNode = parentNode.parentNode ? parentNode.parentNode() : null;\n                }\n                return level;\n            },\n            _updateChildrenField: function () {\n                var fieldName = this._childrenOptions.schema.data;\n                this[fieldName || 'items'] = this.children.data();\n            },\n            _childrenLoaded: function () {\n                this._loaded = true;\n                this._updateChildrenField();\n            },\n            load: function () {\n                var options = {};\n                var method = '_query';\n                var children, promise;\n                if (this.hasChildren) {\n                    this._initChildren();\n                    children = this.children;\n                    options[this.idField || 'id'] = this.id;\n                    if (!this._loaded) {\n                        children._data = undefined;\n                        method = 'read';\n                    }\n                    children.one(CHANGE, proxy(this._childrenLoaded, this));\n                    if (this._matchFilter) {\n                        options.filter = {\n                            field: '_matchFilter',\n                            operator: 'eq',\n                            value: true\n                        };\n                    }\n                    promise = children[method](options);\n                } else {\n                    this.loaded(true);\n                }\n                return promise || $.Deferred().resolve().promise();\n            },\n            parentNode: function () {\n                var array = this.parent();\n                return array.parent();\n            },\n            loaded: function (value) {\n                if (value !== undefined) {\n                    this._loaded = value;\n                } else {\n                    return this._loaded;\n                }\n            },\n            shouldSerialize: function (field) {\n                return Model.fn.shouldSerialize.call(this, field) && field !== 'children' && field !== '_loaded' && field !== 'hasChildren' && field !== '_childrenOptions';\n            }\n        });\n        function dataMethod(name) {\n            return function () {\n                var data = this._data, result = DataSource.fn[name].apply(this, slice.call(arguments));\n                if (this._data != data) {\n                    this._attachBubbleHandlers();\n                }\n                return result;\n            };\n        }\n        var HierarchicalDataSource = DataSource.extend({\n            init: function (options) {\n                var node = Node.define({ children: options });\n                if (options.filter && !options.serverFiltering) {\n                    this._hierarchicalFilter = options.filter;\n                    options.filter = null;\n                }\n                DataSource.fn.init.call(this, extend(true, {}, {\n                    schema: {\n                        modelBase: node,\n                        model: node\n                    }\n                }, options));\n                this._attachBubbleHandlers();\n            },\n            _attachBubbleHandlers: function () {\n                var that = this;\n                that._data.bind(ERROR, function (e) {\n                    that.trigger(ERROR, e);\n                });\n            },\n            read: function (data) {\n                var result = DataSource.fn.read.call(this, data);\n                if (this._hierarchicalFilter) {\n                    this.filter(this._hierarchicalFilter);\n                }\n                return result;\n            },\n            remove: function (node) {\n                var parentNode = node.parentNode(), dataSource = this, result;\n                if (parentNode && parentNode._initChildren) {\n                    dataSource = parentNode.children;\n                }\n                result = DataSource.fn.remove.call(dataSource, node);\n                if (parentNode && !dataSource.data().length) {\n                    parentNode.hasChildren = false;\n                }\n                return result;\n            },\n            success: dataMethod('success'),\n            data: dataMethod('data'),\n            insert: function (index, model) {\n                var parentNode = this.parent();\n                if (parentNode && parentNode._initChildren) {\n                    parentNode.hasChildren = true;\n                    parentNode._initChildren();\n                }\n                return DataSource.fn.insert.call(this, index, model);\n            },\n            filter: function (val) {\n                if (val === undefined) {\n                    return this._filter;\n                }\n                if (!this.options.serverFiltering) {\n                    this._markHierarchicalQuery(val);\n                    val = {\n                        logic: 'or',\n                        filters: [\n                            val,\n                            {\n                                field: '_matchFilter',\n                                operator: 'equals',\n                                value: true\n                            }\n                        ]\n                    };\n                }\n                this.trigger('reset');\n                this._query({\n                    filter: val,\n                    page: 1\n                });\n            },\n            _markHierarchicalQuery: function (expressions) {\n                var compiled;\n                var predicate;\n                var fields;\n                var operators;\n                var filter;\n                expressions = normalizeFilter(expressions);\n                if (!expressions || expressions.filters.length === 0) {\n                    return this;\n                }\n                compiled = Query.filterExpr(expressions);\n                fields = compiled.fields;\n                operators = compiled.operators;\n                predicate = filter = new Function('d, __f, __o', 'return ' + compiled.expression);\n                if (fields.length || operators.length) {\n                    filter = function (d) {\n                        return predicate(d, fields, operators);\n                    };\n                }\n                this._updateHierarchicalFilter(filter);\n            },\n            _updateHierarchicalFilter: function (filter) {\n                var current;\n                var data = this._data;\n                var result = false;\n                for (var idx = 0; idx < data.length; idx++) {\n                    current = data[idx];\n                    if (current.hasChildren) {\n                        current._matchFilter = current.children._updateHierarchicalFilter(filter);\n                        if (!current._matchFilter) {\n                            current._matchFilter = filter(current);\n                        }\n                    } else {\n                        current._matchFilter = filter(current);\n                    }\n                    if (current._matchFilter) {\n                        result = true;\n                    }\n                }\n                return result;\n            },\n            _find: function (method, value) {\n                var idx, length, node, children;\n                var data = this._data;\n                if (!data) {\n                    return;\n                }\n                node = DataSource.fn[method].call(this, value);\n                if (node) {\n                    return node;\n                }\n                data = this._flatData(this._data);\n                for (idx = 0, length = data.length; idx < length; idx++) {\n                    children = data[idx].children;\n                    if (!(children instanceof HierarchicalDataSource)) {\n                        continue;\n                    }\n                    node = children[method](value);\n                    if (node) {\n                        return node;\n                    }\n                }\n            },\n            get: function (id) {\n                return this._find('get', id);\n            },\n            getByUid: function (uid) {\n                return this._find('getByUid', uid);\n            }\n        });\n        function inferList(list, fields) {\n            var items = $(list).children(), idx, length, data = [], record, textField = fields[0].field, urlField = fields[1] && fields[1].field, spriteCssClassField = fields[2] && fields[2].field, imageUrlField = fields[3] && fields[3].field, item, id, textChild, className, children;\n            function elements(collection, tagName) {\n                return collection.filter(tagName).add(collection.find(tagName));\n            }\n            for (idx = 0, length = items.length; idx < length; idx++) {\n                record = { _loaded: true };\n                item = items.eq(idx);\n                textChild = item[0].firstChild;\n                children = item.children();\n                list = children.filter('ul');\n                children = children.filter(':not(ul)');\n                id = item.attr('data-id');\n                if (id) {\n                    record.id = id;\n                }\n                if (textChild) {\n                    record[textField] = textChild.nodeType == 3 ? textChild.nodeValue : children.text();\n                }\n                if (urlField) {\n                    record[urlField] = elements(children, 'a').attr('href');\n                }\n                if (imageUrlField) {\n                    record[imageUrlField] = elements(children, 'img').attr('src');\n                }\n                if (spriteCssClassField) {\n                    className = elements(children, '.k-sprite').prop('className');\n                    record[spriteCssClassField] = className && $.trim(className.replace('k-sprite', ''));\n                }\n                if (list.length) {\n                    record.items = inferList(list.eq(0), fields);\n                }\n                if (item.attr('data-hasChildren') == 'true') {\n                    record.hasChildren = true;\n                }\n                data.push(record);\n            }\n            return data;\n        }\n        HierarchicalDataSource.create = function (options) {\n            options = options && options.push ? { data: options } : options;\n            var dataSource = options || {}, data = dataSource.data, fields = dataSource.fields, list = dataSource.list;\n            if (data && data._dataSource) {\n                return data._dataSource;\n            }\n            if (!data && fields && !dataSource.transport) {\n                if (list) {\n                    data = inferList(list, fields);\n                }\n            }\n            dataSource.data = data;\n            return dataSource instanceof HierarchicalDataSource ? dataSource : new HierarchicalDataSource(dataSource);\n        };\n        var Buffer = kendo.Observable.extend({\n            init: function (dataSource, viewSize, disablePrefetch) {\n                kendo.Observable.fn.init.call(this);\n                this._prefetching = false;\n                this.dataSource = dataSource;\n                this.prefetch = !disablePrefetch;\n                var buffer = this;\n                dataSource.bind('change', function () {\n                    buffer._change();\n                });\n                dataSource.bind('reset', function () {\n                    buffer._reset();\n                });\n                this._syncWithDataSource();\n                this.setViewSize(viewSize);\n            },\n            setViewSize: function (viewSize) {\n                this.viewSize = viewSize;\n                this._recalculate();\n            },\n            at: function (index) {\n                var pageSize = this.pageSize, itemPresent = true;\n                if (index >= this.total()) {\n                    this.trigger('endreached', { index: index });\n                    return null;\n                }\n                if (!this.useRanges) {\n                    return this.dataSource.view()[index];\n                }\n                if (this.useRanges) {\n                    if (index < this.dataOffset || index >= this.skip + pageSize) {\n                        itemPresent = this.range(Math.floor(index / pageSize) * pageSize);\n                    }\n                    if (index === this.prefetchThreshold) {\n                        this._prefetch();\n                    }\n                    if (index === this.midPageThreshold) {\n                        this.range(this.nextMidRange, true);\n                    } else if (index === this.nextPageThreshold) {\n                        this.range(this.nextFullRange);\n                    } else if (index === this.pullBackThreshold) {\n                        if (this.offset === this.skip) {\n                            this.range(this.previousMidRange);\n                        } else {\n                            this.range(this.previousFullRange);\n                        }\n                    }\n                    if (itemPresent) {\n                        return this.dataSource.at(index - this.dataOffset);\n                    } else {\n                        this.trigger('endreached', { index: index });\n                        return null;\n                    }\n                }\n            },\n            indexOf: function (item) {\n                return this.dataSource.data().indexOf(item) + this.dataOffset;\n            },\n            total: function () {\n                return parseInt(this.dataSource.total(), 10);\n            },\n            next: function () {\n                var buffer = this, pageSize = buffer.pageSize, offset = buffer.skip - buffer.viewSize + pageSize, pageSkip = math.max(math.floor(offset / pageSize), 0) * pageSize;\n                this.offset = offset;\n                this.dataSource.prefetch(pageSkip, pageSize, function () {\n                    buffer._goToRange(offset, true);\n                });\n            },\n            range: function (offset, nextRange) {\n                if (this.offset === offset) {\n                    return true;\n                }\n                var buffer = this, pageSize = this.pageSize, pageSkip = math.max(math.floor(offset / pageSize), 0) * pageSize, dataSource = this.dataSource;\n                if (nextRange) {\n                    pageSkip += pageSize;\n                }\n                if (dataSource.inRange(offset, pageSize)) {\n                    this.offset = offset;\n                    this._recalculate();\n                    this._goToRange(offset);\n                    return true;\n                } else if (this.prefetch) {\n                    dataSource.prefetch(pageSkip, pageSize, function () {\n                        buffer.offset = offset;\n                        buffer._recalculate();\n                        buffer._goToRange(offset, true);\n                    });\n                    return false;\n                }\n                return true;\n            },\n            syncDataSource: function () {\n                var offset = this.offset;\n                this.offset = null;\n                this.range(offset);\n            },\n            destroy: function () {\n                this.unbind();\n            },\n            _prefetch: function () {\n                var buffer = this, pageSize = this.pageSize, prefetchOffset = this.skip + pageSize, dataSource = this.dataSource;\n                if (!dataSource.inRange(prefetchOffset, pageSize) && !this._prefetching && this.prefetch) {\n                    this._prefetching = true;\n                    this.trigger('prefetching', {\n                        skip: prefetchOffset,\n                        take: pageSize\n                    });\n                    dataSource.prefetch(prefetchOffset, pageSize, function () {\n                        buffer._prefetching = false;\n                        buffer.trigger('prefetched', {\n                            skip: prefetchOffset,\n                            take: pageSize\n                        });\n                    });\n                }\n            },\n            _goToRange: function (offset, expanding) {\n                if (this.offset !== offset) {\n                    return;\n                }\n                this.dataOffset = offset;\n                this._expanding = expanding;\n                this.dataSource.range(offset, this.pageSize);\n                this.dataSource.enableRequestsInProgress();\n            },\n            _reset: function () {\n                this._syncPending = true;\n            },\n            _change: function () {\n                var dataSource = this.dataSource;\n                this.length = this.useRanges ? dataSource.lastRange().end : dataSource.view().length;\n                if (this._syncPending) {\n                    this._syncWithDataSource();\n                    this._recalculate();\n                    this._syncPending = false;\n                    this.trigger('reset', { offset: this.offset });\n                }\n                this.trigger('resize');\n                if (this._expanding) {\n                    this.trigger('expand');\n                }\n                delete this._expanding;\n            },\n            _syncWithDataSource: function () {\n                var dataSource = this.dataSource;\n                this._firstItemUid = dataSource.firstItemUid();\n                this.dataOffset = this.offset = dataSource.skip() || 0;\n                this.pageSize = dataSource.pageSize();\n                this.useRanges = dataSource.options.serverPaging;\n            },\n            _recalculate: function () {\n                var pageSize = this.pageSize, offset = this.offset, viewSize = this.viewSize, skip = Math.ceil(offset / pageSize) * pageSize;\n                this.skip = skip;\n                this.midPageThreshold = skip + pageSize - 1;\n                this.nextPageThreshold = skip + viewSize - 1;\n                this.prefetchThreshold = skip + Math.floor(pageSize / 3 * 2);\n                this.pullBackThreshold = this.offset - 1;\n                this.nextMidRange = skip + pageSize - viewSize;\n                this.nextFullRange = skip;\n                this.previousMidRange = offset - viewSize;\n                this.previousFullRange = skip - pageSize;\n            }\n        });\n        var BatchBuffer = kendo.Observable.extend({\n            init: function (dataSource, batchSize) {\n                var batchBuffer = this;\n                kendo.Observable.fn.init.call(batchBuffer);\n                this.dataSource = dataSource;\n                this.batchSize = batchSize;\n                this._total = 0;\n                this.buffer = new Buffer(dataSource, batchSize * 3);\n                this.buffer.bind({\n                    'endreached': function (e) {\n                        batchBuffer.trigger('endreached', { index: e.index });\n                    },\n                    'prefetching': function (e) {\n                        batchBuffer.trigger('prefetching', {\n                            skip: e.skip,\n                            take: e.take\n                        });\n                    },\n                    'prefetched': function (e) {\n                        batchBuffer.trigger('prefetched', {\n                            skip: e.skip,\n                            take: e.take\n                        });\n                    },\n                    'reset': function () {\n                        batchBuffer._total = 0;\n                        batchBuffer.trigger('reset');\n                    },\n                    'resize': function () {\n                        batchBuffer._total = Math.ceil(this.length / batchBuffer.batchSize);\n                        batchBuffer.trigger('resize', {\n                            total: batchBuffer.total(),\n                            offset: this.offset\n                        });\n                    }\n                });\n            },\n            syncDataSource: function () {\n                this.buffer.syncDataSource();\n            },\n            at: function (index) {\n                var buffer = this.buffer, skip = index * this.batchSize, take = this.batchSize, view = [], item;\n                if (buffer.offset > skip) {\n                    buffer.at(buffer.offset - 1);\n                }\n                for (var i = 0; i < take; i++) {\n                    item = buffer.at(skip + i);\n                    if (item === null) {\n                        break;\n                    }\n                    view.push(item);\n                }\n                return view;\n            },\n            total: function () {\n                return this._total;\n            },\n            destroy: function () {\n                this.buffer.destroy();\n                this.unbind();\n            }\n        });\n        extend(true, kendo.data, {\n            readers: { json: DataReader },\n            Query: Query,\n            DataSource: DataSource,\n            HierarchicalDataSource: HierarchicalDataSource,\n            Node: Node,\n            ObservableObject: ObservableObject,\n            ObservableArray: ObservableArray,\n            LazyObservableArray: LazyObservableArray,\n            LocalTransport: LocalTransport,\n            RemoteTransport: RemoteTransport,\n            Cache: Cache,\n            DataReader: DataReader,\n            Model: Model,\n            Buffer: Buffer,\n            BatchBuffer: BatchBuffer\n        });\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.binder', [\n        'kendo.core',\n        'kendo.data'\n    ], f);\n}(function () {\n    var __meta__ = {\n        id: 'binder',\n        name: 'MVVM',\n        category: 'framework',\n        description: 'Model View ViewModel (MVVM) is a design pattern which helps developers separate the Model (the data) from the View (the UI).',\n        depends: [\n            'core',\n            'data'\n        ]\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, Observable = kendo.Observable, ObservableObject = kendo.data.ObservableObject, ObservableArray = kendo.data.ObservableArray, toString = {}.toString, binders = {}, Class = kendo.Class, proxy = $.proxy, VALUE = 'value', SOURCE = 'source', EVENTS = 'events', CHECKED = 'checked', CSS = 'css', deleteExpando = true, FUNCTION = 'function', CHANGE = 'change';\n        (function () {\n            var a = document.createElement('a');\n            try {\n                delete a.test;\n            } catch (e) {\n                deleteExpando = false;\n            }\n        }());\n        var Binding = Observable.extend({\n            init: function (parents, path) {\n                var that = this;\n                Observable.fn.init.call(that);\n                that.source = parents[0];\n                that.parents = parents;\n                that.path = path;\n                that.dependencies = {};\n                that.dependencies[path] = true;\n                that.observable = that.source instanceof Observable;\n                that._access = function (e) {\n                    that.dependencies[e.field] = true;\n                };\n                if (that.observable) {\n                    that._change = function (e) {\n                        that.change(e);\n                    };\n                    that.source.bind(CHANGE, that._change);\n                }\n            },\n            _parents: function () {\n                var parents = this.parents;\n                var value = this.get();\n                if (value && typeof value.parent == 'function') {\n                    var parent = value.parent();\n                    if ($.inArray(parent, parents) < 0) {\n                        parents = [parent].concat(parents);\n                    }\n                }\n                return parents;\n            },\n            change: function (e) {\n                var dependency, ch, field = e.field, that = this;\n                if (that.path === 'this') {\n                    that.trigger(CHANGE, e);\n                } else {\n                    for (dependency in that.dependencies) {\n                        if (dependency.indexOf(field) === 0) {\n                            ch = dependency.charAt(field.length);\n                            if (!ch || ch === '.' || ch === '[') {\n                                that.trigger(CHANGE, e);\n                                break;\n                            }\n                        }\n                    }\n                }\n            },\n            start: function (source) {\n                source.bind('get', this._access);\n            },\n            stop: function (source) {\n                source.unbind('get', this._access);\n            },\n            get: function () {\n                var that = this, source = that.source, index = 0, path = that.path, result = source;\n                if (!that.observable) {\n                    return result;\n                }\n                that.start(that.source);\n                result = source.get(path);\n                while (result === undefined && source) {\n                    source = that.parents[++index];\n                    if (source instanceof ObservableObject) {\n                        result = source.get(path);\n                    }\n                }\n                if (result === undefined) {\n                    source = that.source;\n                    while (result === undefined && source) {\n                        source = source.parent();\n                        if (source instanceof ObservableObject) {\n                            result = source.get(path);\n                        }\n                    }\n                }\n                if (typeof result === 'function') {\n                    index = path.lastIndexOf('.');\n                    if (index > 0) {\n                        source = source.get(path.substring(0, index));\n                    }\n                    that.start(source);\n                    if (source !== that.source) {\n                        result = result.call(source, that.source);\n                    } else {\n                        result = result.call(source);\n                    }\n                    that.stop(source);\n                }\n                if (source && source !== that.source) {\n                    that.currentSource = source;\n                    source.unbind(CHANGE, that._change).bind(CHANGE, that._change);\n                }\n                that.stop(that.source);\n                return result;\n            },\n            set: function (value) {\n                var source = this.currentSource || this.source;\n                var field = kendo.getter(this.path)(source);\n                if (typeof field === 'function') {\n                    if (source !== this.source) {\n                        field.call(source, this.source, value);\n                    } else {\n                        field.call(source, value);\n                    }\n                } else {\n                    source.set(this.path, value);\n                }\n            },\n            destroy: function () {\n                if (this.observable) {\n                    this.source.unbind(CHANGE, this._change);\n                    if (this.currentSource) {\n                        this.currentSource.unbind(CHANGE, this._change);\n                    }\n                }\n                this.unbind();\n            }\n        });\n        var EventBinding = Binding.extend({\n            get: function () {\n                var source = this.source, path = this.path, index = 0, handler;\n                handler = source.get(path);\n                while (!handler && source) {\n                    source = this.parents[++index];\n                    if (source instanceof ObservableObject) {\n                        handler = source.get(path);\n                    }\n                }\n                return proxy(handler, source);\n            }\n        });\n        var TemplateBinding = Binding.extend({\n            init: function (source, path, template) {\n                var that = this;\n                Binding.fn.init.call(that, source, path);\n                that.template = template;\n            },\n            render: function (value) {\n                var html;\n                this.start(this.source);\n                html = kendo.render(this.template, value);\n                this.stop(this.source);\n                return html;\n            }\n        });\n        var Binder = Class.extend({\n            init: function (element, bindings, options) {\n                this.element = element;\n                this.bindings = bindings;\n                this.options = options;\n            },\n            bind: function (binding, attribute) {\n                var that = this;\n                binding = attribute ? binding[attribute] : binding;\n                binding.bind(CHANGE, function (e) {\n                    that.refresh(attribute || e);\n                });\n                that.refresh(attribute);\n            },\n            destroy: function () {\n            }\n        });\n        var TypedBinder = Binder.extend({\n            dataType: function () {\n                var dataType = this.element.getAttribute('data-type') || this.element.type || 'text';\n                return dataType.toLowerCase();\n            },\n            parsedValue: function () {\n                return this._parseValue(this.element.value, this.dataType());\n            },\n            _parseValue: function (value, dataType) {\n                if (dataType == 'date') {\n                    value = kendo.parseDate(value, 'yyyy-MM-dd');\n                } else if (dataType == 'datetime-local') {\n                    value = kendo.parseDate(value, [\n                        'yyyy-MM-ddTHH:mm:ss',\n                        'yyyy-MM-ddTHH:mm'\n                    ]);\n                } else if (dataType == 'number') {\n                    value = kendo.parseFloat(value);\n                } else if (dataType == 'boolean') {\n                    value = value.toLowerCase();\n                    if (kendo.parseFloat(value) !== null) {\n                        value = Boolean(kendo.parseFloat(value));\n                    } else {\n                        value = value.toLowerCase() === 'true';\n                    }\n                }\n                return value;\n            }\n        });\n        binders.attr = Binder.extend({\n            refresh: function (key) {\n                this.element.setAttribute(key, this.bindings.attr[key].get());\n            }\n        });\n        binders.css = Binder.extend({\n            init: function (element, bindings, options) {\n                Binder.fn.init.call(this, element, bindings, options);\n                this.classes = {};\n            },\n            refresh: function (className) {\n                var element = $(this.element), binding = this.bindings.css[className], hasClass = this.classes[className] = binding.get();\n                if (hasClass) {\n                    element.addClass(className);\n                } else {\n                    element.removeClass(className);\n                }\n            }\n        });\n        binders.style = Binder.extend({\n            refresh: function (key) {\n                this.element.style[key] = this.bindings.style[key].get() || '';\n            }\n        });\n        binders.enabled = Binder.extend({\n            refresh: function () {\n                if (this.bindings.enabled.get()) {\n                    this.element.removeAttribute('disabled');\n                } else {\n                    this.element.setAttribute('disabled', 'disabled');\n                }\n            }\n        });\n        binders.readonly = Binder.extend({\n            refresh: function () {\n                if (this.bindings.readonly.get()) {\n                    this.element.setAttribute('readonly', 'readonly');\n                } else {\n                    this.element.removeAttribute('readonly');\n                }\n            }\n        });\n        binders.disabled = Binder.extend({\n            refresh: function () {\n                if (this.bindings.disabled.get()) {\n                    this.element.setAttribute('disabled', 'disabled');\n                } else {\n                    this.element.removeAttribute('disabled');\n                }\n            }\n        });\n        binders.events = Binder.extend({\n            init: function (element, bindings, options) {\n                Binder.fn.init.call(this, element, bindings, options);\n                this.handlers = {};\n            },\n            refresh: function (key) {\n                var element = $(this.element), binding = this.bindings.events[key], handler = this.handlers[key];\n                if (handler) {\n                    element.off(key, handler);\n                }\n                handler = this.handlers[key] = binding.get();\n                element.on(key, binding.source, handler);\n            },\n            destroy: function () {\n                var element = $(this.element), handler;\n                for (handler in this.handlers) {\n                    element.off(handler, this.handlers[handler]);\n                }\n            }\n        });\n        binders.text = Binder.extend({\n            refresh: function () {\n                var text = this.bindings.text.get();\n                var dataFormat = this.element.getAttribute('data-format') || '';\n                if (text == null) {\n                    text = '';\n                }\n                $(this.element).text(kendo.toString(text, dataFormat));\n            }\n        });\n        binders.visible = Binder.extend({\n            refresh: function () {\n                if (this.bindings.visible.get()) {\n                    this.element.style.display = '';\n                } else {\n                    this.element.style.display = 'none';\n                }\n            }\n        });\n        binders.invisible = Binder.extend({\n            refresh: function () {\n                if (!this.bindings.invisible.get()) {\n                    this.element.style.display = '';\n                } else {\n                    this.element.style.display = 'none';\n                }\n            }\n        });\n        binders.html = Binder.extend({\n            refresh: function () {\n                this.element.innerHTML = this.bindings.html.get();\n            }\n        });\n        binders.value = TypedBinder.extend({\n            init: function (element, bindings, options) {\n                TypedBinder.fn.init.call(this, element, bindings, options);\n                this._change = proxy(this.change, this);\n                this.eventName = options.valueUpdate || CHANGE;\n                $(this.element).on(this.eventName, this._change);\n                this._initChange = false;\n            },\n            change: function () {\n                this._initChange = this.eventName != CHANGE;\n                this.bindings[VALUE].set(this.parsedValue());\n                this._initChange = false;\n            },\n            refresh: function () {\n                if (!this._initChange) {\n                    var value = this.bindings[VALUE].get();\n                    if (value == null) {\n                        value = '';\n                    }\n                    var type = this.dataType();\n                    if (type == 'date') {\n                        value = kendo.toString(value, 'yyyy-MM-dd');\n                    } else if (type == 'datetime-local') {\n                        value = kendo.toString(value, 'yyyy-MM-ddTHH:mm:ss');\n                    }\n                    this.element.value = value;\n                }\n                this._initChange = false;\n            },\n            destroy: function () {\n                $(this.element).off(this.eventName, this._change);\n            }\n        });\n        binders.source = Binder.extend({\n            init: function (element, bindings, options) {\n                Binder.fn.init.call(this, element, bindings, options);\n                var source = this.bindings.source.get();\n                if (source instanceof kendo.data.DataSource && options.autoBind !== false) {\n                    source.fetch();\n                }\n            },\n            refresh: function (e) {\n                var that = this, source = that.bindings.source.get();\n                if (source instanceof ObservableArray || source instanceof kendo.data.DataSource) {\n                    e = e || {};\n                    if (e.action == 'add') {\n                        that.add(e.index, e.items);\n                    } else if (e.action == 'remove') {\n                        that.remove(e.index, e.items);\n                    } else if (e.action != 'itemchange') {\n                        that.render();\n                    }\n                } else {\n                    that.render();\n                }\n            },\n            container: function () {\n                var element = this.element;\n                if (element.nodeName.toLowerCase() == 'table') {\n                    if (!element.tBodies[0]) {\n                        element.appendChild(document.createElement('tbody'));\n                    }\n                    element = element.tBodies[0];\n                }\n                return element;\n            },\n            template: function () {\n                var options = this.options, template = options.template, nodeName = this.container().nodeName.toLowerCase();\n                if (!template) {\n                    if (nodeName == 'select') {\n                        if (options.valueField || options.textField) {\n                            template = kendo.format('<option value=\"#:{0}#\">#:{1}#</option>', options.valueField || options.textField, options.textField || options.valueField);\n                        } else {\n                            template = '<option>#:data#</option>';\n                        }\n                    } else if (nodeName == 'tbody') {\n                        template = '<tr><td>#:data#</td></tr>';\n                    } else if (nodeName == 'ul' || nodeName == 'ol') {\n                        template = '<li>#:data#</li>';\n                    } else {\n                        template = '#:data#';\n                    }\n                    template = kendo.template(template);\n                }\n                return template;\n            },\n            add: function (index, items) {\n                var element = this.container(), parents, idx, length, child, clone = element.cloneNode(false), reference = element.children[index];\n                $(clone).html(kendo.render(this.template(), items));\n                if (clone.children.length) {\n                    parents = this.bindings.source._parents();\n                    for (idx = 0, length = items.length; idx < length; idx++) {\n                        child = clone.children[0];\n                        element.insertBefore(child, reference || null);\n                        bindElement(child, items[idx], this.options.roles, [items[idx]].concat(parents));\n                    }\n                }\n            },\n            remove: function (index, items) {\n                var idx, element = this.container();\n                for (idx = 0; idx < items.length; idx++) {\n                    var child = element.children[index];\n                    unbindElementTree(child, true);\n                    if (child.parentNode == element) {\n                        element.removeChild(child);\n                    }\n                }\n            },\n            render: function () {\n                var source = this.bindings.source.get(), parents, idx, length, element = this.container(), template = this.template();\n                if (source == null) {\n                    return;\n                }\n                if (source instanceof kendo.data.DataSource) {\n                    source = source.view();\n                }\n                if (!(source instanceof ObservableArray) && toString.call(source) !== '[object Array]') {\n                    source = [source];\n                }\n                if (this.bindings.template) {\n                    unbindElementChildren(element, true);\n                    $(element).html(this.bindings.template.render(source));\n                    if (element.children.length) {\n                        parents = this.bindings.source._parents();\n                        for (idx = 0, length = source.length; idx < length; idx++) {\n                            bindElement(element.children[idx], source[idx], this.options.roles, [source[idx]].concat(parents));\n                        }\n                    }\n                } else {\n                    $(element).html(kendo.render(template, source));\n                }\n            }\n        });\n        binders.input = {\n            checked: TypedBinder.extend({\n                init: function (element, bindings, options) {\n                    TypedBinder.fn.init.call(this, element, bindings, options);\n                    this._change = proxy(this.change, this);\n                    $(this.element).change(this._change);\n                },\n                change: function () {\n                    var element = this.element;\n                    var value = this.value();\n                    if (element.type == 'radio') {\n                        value = this.parsedValue();\n                        this.bindings[CHECKED].set(value);\n                    } else if (element.type == 'checkbox') {\n                        var source = this.bindings[CHECKED].get();\n                        var index;\n                        if (source instanceof ObservableArray) {\n                            value = this.parsedValue();\n                            if (value instanceof Date) {\n                                for (var i = 0; i < source.length; i++) {\n                                    if (source[i] instanceof Date && +source[i] === +value) {\n                                        index = i;\n                                        break;\n                                    }\n                                }\n                            } else {\n                                index = source.indexOf(value);\n                            }\n                            if (index > -1) {\n                                source.splice(index, 1);\n                            } else {\n                                source.push(value);\n                            }\n                        } else {\n                            this.bindings[CHECKED].set(value);\n                        }\n                    }\n                },\n                refresh: function () {\n                    var value = this.bindings[CHECKED].get(), source = value, type = this.dataType(), element = this.element;\n                    if (element.type == 'checkbox') {\n                        if (source instanceof ObservableArray) {\n                            var index = -1;\n                            value = this.parsedValue();\n                            if (value instanceof Date) {\n                                for (var i = 0; i < source.length; i++) {\n                                    if (source[i] instanceof Date && +source[i] === +value) {\n                                        index = i;\n                                        break;\n                                    }\n                                }\n                            } else {\n                                index = source.indexOf(value);\n                            }\n                            element.checked = index >= 0;\n                        } else {\n                            element.checked = source;\n                        }\n                    } else if (element.type == 'radio' && value != null) {\n                        if (type == 'date') {\n                            value = kendo.toString(value, 'yyyy-MM-dd');\n                        } else if (type == 'datetime-local') {\n                            value = kendo.toString(value, 'yyyy-MM-ddTHH:mm:ss');\n                        }\n                        if (element.value === value.toString()) {\n                            element.checked = true;\n                        } else {\n                            element.checked = false;\n                        }\n                    }\n                },\n                value: function () {\n                    var element = this.element, value = element.value;\n                    if (element.type == 'checkbox') {\n                        value = element.checked;\n                    }\n                    return value;\n                },\n                destroy: function () {\n                    $(this.element).off(CHANGE, this._change);\n                }\n            })\n        };\n        binders.select = {\n            source: binders.source.extend({\n                refresh: function (e) {\n                    var that = this, source = that.bindings.source.get();\n                    if (source instanceof ObservableArray || source instanceof kendo.data.DataSource) {\n                        e = e || {};\n                        if (e.action == 'add') {\n                            that.add(e.index, e.items);\n                        } else if (e.action == 'remove') {\n                            that.remove(e.index, e.items);\n                        } else if (e.action == 'itemchange' || e.action === undefined) {\n                            that.render();\n                            if (that.bindings.value) {\n                                if (that.bindings.value) {\n                                    var val = retrievePrimitiveValues(that.bindings.value.get(), $(that.element).data('valueField'));\n                                    if (val === null) {\n                                        that.element.selectedIndex = -1;\n                                    } else {\n                                        that.element.value = val;\n                                    }\n                                }\n                            }\n                        }\n                    } else {\n                        that.render();\n                    }\n                }\n            }),\n            value: TypedBinder.extend({\n                init: function (target, bindings, options) {\n                    TypedBinder.fn.init.call(this, target, bindings, options);\n                    this._change = proxy(this.change, this);\n                    $(this.element).change(this._change);\n                },\n                parsedValue: function () {\n                    var dataType = this.dataType();\n                    var values = [];\n                    var value, option, idx, length;\n                    for (idx = 0, length = this.element.options.length; idx < length; idx++) {\n                        option = this.element.options[idx];\n                        if (option.selected) {\n                            value = option.attributes.value;\n                            if (value && value.specified) {\n                                value = option.value;\n                            } else {\n                                value = option.text;\n                            }\n                            values.push(this._parseValue(value, dataType));\n                        }\n                    }\n                    return values;\n                },\n                change: function () {\n                    var values = [], element = this.element, source, field = this.options.valueField || this.options.textField, valuePrimitive = this.options.valuePrimitive, option, valueIndex, value, idx, length;\n                    for (idx = 0, length = element.options.length; idx < length; idx++) {\n                        option = element.options[idx];\n                        if (option.selected) {\n                            value = option.attributes.value;\n                            if (value && value.specified) {\n                                value = option.value;\n                            } else {\n                                value = option.text;\n                            }\n                            if (field) {\n                                values.push(value);\n                            } else {\n                                values.push(this._parseValue(value, this.dataType()));\n                            }\n                        }\n                    }\n                    if (field) {\n                        source = this.bindings.source.get();\n                        if (source instanceof kendo.data.DataSource) {\n                            source = source.view();\n                        }\n                        for (valueIndex = 0; valueIndex < values.length; valueIndex++) {\n                            for (idx = 0, length = source.length; idx < length; idx++) {\n                                var sourceValue = source[idx].get(field);\n                                var match = String(sourceValue) === values[valueIndex];\n                                if (match) {\n                                    values[valueIndex] = source[idx];\n                                    break;\n                                }\n                            }\n                        }\n                    }\n                    value = this.bindings[VALUE].get();\n                    if (value instanceof ObservableArray) {\n                        value.splice.apply(value, [\n                            0,\n                            value.length\n                        ].concat(values));\n                    } else if (!valuePrimitive && (value instanceof ObservableObject || value === null || value === undefined || !field)) {\n                        this.bindings[VALUE].set(values[0]);\n                    } else {\n                        this.bindings[VALUE].set(values[0].get(field));\n                    }\n                },\n                refresh: function () {\n                    var optionIndex, element = this.element, options = element.options, value = this.bindings[VALUE].get(), values = value, field = this.options.valueField || this.options.textField, found = false, type = this.dataType(), optionValue;\n                    if (!(values instanceof ObservableArray)) {\n                        values = new ObservableArray([value]);\n                    }\n                    element.selectedIndex = -1;\n                    for (var valueIndex = 0; valueIndex < values.length; valueIndex++) {\n                        value = values[valueIndex];\n                        if (field && value instanceof ObservableObject) {\n                            value = value.get(field);\n                        }\n                        if (type == 'date') {\n                            value = kendo.toString(values[valueIndex], 'yyyy-MM-dd');\n                        } else if (type == 'datetime-local') {\n                            value = kendo.toString(values[valueIndex], 'yyyy-MM-ddTHH:mm:ss');\n                        }\n                        for (optionIndex = 0; optionIndex < options.length; optionIndex++) {\n                            optionValue = options[optionIndex].value;\n                            if (optionValue === '' && value !== '') {\n                                optionValue = options[optionIndex].text;\n                            }\n                            if (value != null && optionValue == value.toString()) {\n                                options[optionIndex].selected = true;\n                                found = true;\n                            }\n                        }\n                    }\n                },\n                destroy: function () {\n                    $(this.element).off(CHANGE, this._change);\n                }\n            })\n        };\n        function dataSourceBinding(bindingName, fieldName, setter) {\n            return Binder.extend({\n                init: function (widget, bindings, options) {\n                    var that = this;\n                    Binder.fn.init.call(that, widget.element[0], bindings, options);\n                    that.widget = widget;\n                    that._dataBinding = proxy(that.dataBinding, that);\n                    that._dataBound = proxy(that.dataBound, that);\n                    that._itemChange = proxy(that.itemChange, that);\n                },\n                itemChange: function (e) {\n                    bindElement(e.item[0], e.data, this._ns(e.ns), [e.data].concat(this.bindings[bindingName]._parents()));\n                },\n                dataBinding: function (e) {\n                    var idx, length, widget = this.widget, items = e.removedItems || widget.items();\n                    for (idx = 0, length = items.length; idx < length; idx++) {\n                        unbindElementTree(items[idx], false);\n                    }\n                },\n                _ns: function (ns) {\n                    ns = ns || kendo.ui;\n                    var all = [\n                        kendo.ui,\n                        kendo.dataviz.ui,\n                        kendo.mobile.ui\n                    ];\n                    all.splice($.inArray(ns, all), 1);\n                    all.unshift(ns);\n                    return kendo.rolesFromNamespaces(all);\n                },\n                dataBound: function (e) {\n                    var idx, length, widget = this.widget, items = e.addedItems || widget.items(), dataSource = widget[fieldName], view, parents, hds = kendo.data.HierarchicalDataSource;\n                    if (hds && dataSource instanceof hds) {\n                        return;\n                    }\n                    if (items.length) {\n                        view = e.addedDataItems || dataSource.flatView();\n                        parents = this.bindings[bindingName]._parents();\n                        for (idx = 0, length = view.length; idx < length; idx++) {\n                            bindElement(items[idx], view[idx], this._ns(e.ns), [view[idx]].concat(parents));\n                        }\n                    }\n                },\n                refresh: function (e) {\n                    var that = this, source, widget = that.widget, select, multiselect;\n                    e = e || {};\n                    if (!e.action) {\n                        that.destroy();\n                        widget.bind('dataBinding', that._dataBinding);\n                        widget.bind('dataBound', that._dataBound);\n                        widget.bind('itemChange', that._itemChange);\n                        source = that.bindings[bindingName].get();\n                        if (widget[fieldName] instanceof kendo.data.DataSource && widget[fieldName] != source) {\n                            if (source instanceof kendo.data.DataSource) {\n                                widget[setter](source);\n                            } else if (source && source._dataSource) {\n                                widget[setter](source._dataSource);\n                            } else {\n                                widget[fieldName].data(source);\n                                select = kendo.ui.Select && widget instanceof kendo.ui.Select;\n                                multiselect = kendo.ui.MultiSelect && widget instanceof kendo.ui.MultiSelect;\n                                if (that.bindings.value && (select || multiselect)) {\n                                    widget.value(retrievePrimitiveValues(that.bindings.value.get(), widget.options.dataValueField));\n                                }\n                            }\n                        }\n                    }\n                },\n                destroy: function () {\n                    var widget = this.widget;\n                    widget.unbind('dataBinding', this._dataBinding);\n                    widget.unbind('dataBound', this._dataBound);\n                    widget.unbind('itemChange', this._itemChange);\n                }\n            });\n        }\n        binders.widget = {\n            events: Binder.extend({\n                init: function (widget, bindings, options) {\n                    Binder.fn.init.call(this, widget.element[0], bindings, options);\n                    this.widget = widget;\n                    this.handlers = {};\n                },\n                refresh: function (key) {\n                    var binding = this.bindings.events[key], handler = this.handlers[key];\n                    if (handler) {\n                        this.widget.unbind(key, handler);\n                    }\n                    handler = binding.get();\n                    this.handlers[key] = function (e) {\n                        e.data = binding.source;\n                        handler(e);\n                        if (e.data === binding.source) {\n                            delete e.data;\n                        }\n                    };\n                    this.widget.bind(key, this.handlers[key]);\n                },\n                destroy: function () {\n                    var handler;\n                    for (handler in this.handlers) {\n                        this.widget.unbind(handler, this.handlers[handler]);\n                    }\n                }\n            }),\n            checked: Binder.extend({\n                init: function (widget, bindings, options) {\n                    Binder.fn.init.call(this, widget.element[0], bindings, options);\n                    this.widget = widget;\n                    this._change = proxy(this.change, this);\n                    this.widget.bind(CHANGE, this._change);\n                },\n                change: function () {\n                    this.bindings[CHECKED].set(this.value());\n                },\n                refresh: function () {\n                    this.widget.check(this.bindings[CHECKED].get() === true);\n                },\n                value: function () {\n                    var element = this.element, value = element.value;\n                    if (value == 'on' || value == 'off') {\n                        value = element.checked;\n                    }\n                    return value;\n                },\n                destroy: function () {\n                    this.widget.unbind(CHANGE, this._change);\n                }\n            }),\n            visible: Binder.extend({\n                init: function (widget, bindings, options) {\n                    Binder.fn.init.call(this, widget.element[0], bindings, options);\n                    this.widget = widget;\n                },\n                refresh: function () {\n                    var visible = this.bindings.visible.get();\n                    this.widget.wrapper[0].style.display = visible ? '' : 'none';\n                }\n            }),\n            invisible: Binder.extend({\n                init: function (widget, bindings, options) {\n                    Binder.fn.init.call(this, widget.element[0], bindings, options);\n                    this.widget = widget;\n                },\n                refresh: function () {\n                    var invisible = this.bindings.invisible.get();\n                    this.widget.wrapper[0].style.display = invisible ? 'none' : '';\n                }\n            }),\n            enabled: Binder.extend({\n                init: function (widget, bindings, options) {\n                    Binder.fn.init.call(this, widget.element[0], bindings, options);\n                    this.widget = widget;\n                },\n                refresh: function () {\n                    if (this.widget.enable) {\n                        this.widget.enable(this.bindings.enabled.get());\n                    }\n                }\n            }),\n            disabled: Binder.extend({\n                init: function (widget, bindings, options) {\n                    Binder.fn.init.call(this, widget.element[0], bindings, options);\n                    this.widget = widget;\n                },\n                refresh: function () {\n                    if (this.widget.enable) {\n                        this.widget.enable(!this.bindings.disabled.get());\n                    }\n                }\n            }),\n            source: dataSourceBinding('source', 'dataSource', 'setDataSource'),\n            value: Binder.extend({\n                init: function (widget, bindings, options) {\n                    Binder.fn.init.call(this, widget.element[0], bindings, options);\n                    this.widget = widget;\n                    this._change = $.proxy(this.change, this);\n                    this.widget.first(CHANGE, this._change);\n                    var value = this.bindings.value.get();\n                    this._valueIsObservableObject = !options.valuePrimitive && (value == null || value instanceof ObservableObject);\n                    this._valueIsObservableArray = value instanceof ObservableArray;\n                    this._initChange = false;\n                },\n                _source: function () {\n                    var source;\n                    if (this.widget.dataItem) {\n                        source = this.widget.dataItem();\n                        if (source && source instanceof ObservableObject) {\n                            return [source];\n                        }\n                    }\n                    if (this.bindings.source) {\n                        source = this.bindings.source.get();\n                    }\n                    if (!source || source instanceof kendo.data.DataSource) {\n                        source = this.widget.dataSource.flatView();\n                    }\n                    return source;\n                },\n                change: function () {\n                    var value = this.widget.value(), field = this.options.dataValueField || this.options.dataTextField, isArray = toString.call(value) === '[object Array]', isObservableObject = this._valueIsObservableObject, valueIndex, valueLength, values = [], sourceItem, sourceValue, idx, length, source;\n                    this._initChange = true;\n                    if (field) {\n                        if (value === '' && (isObservableObject || this.options.valuePrimitive)) {\n                            value = null;\n                        } else {\n                            source = this._source();\n                            if (isArray) {\n                                valueLength = value.length;\n                                values = value.slice(0);\n                            }\n                            for (idx = 0, length = source.length; idx < length; idx++) {\n                                sourceItem = source[idx];\n                                sourceValue = sourceItem.get(field);\n                                if (isArray) {\n                                    for (valueIndex = 0; valueIndex < valueLength; valueIndex++) {\n                                        if (sourceValue == values[valueIndex]) {\n                                            values[valueIndex] = sourceItem;\n                                            break;\n                                        }\n                                    }\n                                } else if (sourceValue == value) {\n                                    value = isObservableObject ? sourceItem : sourceValue;\n                                    break;\n                                }\n                            }\n                            if (values[0]) {\n                                if (this._valueIsObservableArray) {\n                                    value = values;\n                                } else if (isObservableObject || !field) {\n                                    value = values[0];\n                                } else {\n                                    value = values[0].get(field);\n                                }\n                            }\n                        }\n                    }\n                    this.bindings.value.set(value);\n                    this._initChange = false;\n                },\n                refresh: function () {\n                    if (!this._initChange) {\n                        var widget = this.widget;\n                        var options = widget.options;\n                        var textField = options.dataTextField;\n                        var valueField = options.dataValueField || textField;\n                        var value = this.bindings.value.get();\n                        var text = options.text || '';\n                        var idx = 0, length;\n                        var values = [];\n                        if (value === undefined) {\n                            value = null;\n                        }\n                        if (valueField) {\n                            if (value instanceof ObservableArray) {\n                                for (length = value.length; idx < length; idx++) {\n                                    values[idx] = value[idx].get(valueField);\n                                }\n                                value = values;\n                            } else if (value instanceof ObservableObject) {\n                                text = value.get(textField);\n                                value = value.get(valueField);\n                            }\n                        }\n                        if (options.autoBind === false && !options.cascadeFrom && widget.listView && !widget.listView.bound()) {\n                            if (textField === valueField && !text) {\n                                text = value;\n                            }\n                            if (!text && (value || value === 0) && options.valuePrimitive) {\n                                widget.value(value);\n                            } else {\n                                widget._preselect(value, text);\n                            }\n                        } else {\n                            widget.value(value);\n                        }\n                    }\n                    this._initChange = false;\n                },\n                destroy: function () {\n                    this.widget.unbind(CHANGE, this._change);\n                }\n            }),\n            gantt: { dependencies: dataSourceBinding('dependencies', 'dependencies', 'setDependenciesDataSource') },\n            multiselect: {\n                value: Binder.extend({\n                    init: function (widget, bindings, options) {\n                        Binder.fn.init.call(this, widget.element[0], bindings, options);\n                        this.widget = widget;\n                        this._change = $.proxy(this.change, this);\n                        this.widget.first(CHANGE, this._change);\n                        this._initChange = false;\n                    },\n                    change: function () {\n                        var that = this, oldValues = that.bindings[VALUE].get(), valuePrimitive = that.options.valuePrimitive, newValues = valuePrimitive ? that.widget.value() : that.widget.dataItems();\n                        var field = this.options.dataValueField || this.options.dataTextField;\n                        newValues = newValues.slice(0);\n                        that._initChange = true;\n                        if (oldValues instanceof ObservableArray) {\n                            var remove = [];\n                            var newLength = newValues.length;\n                            var i = 0, j = 0;\n                            var old = oldValues[i];\n                            var same = false;\n                            var removeIndex;\n                            var newValue;\n                            var found;\n                            while (old !== undefined) {\n                                found = false;\n                                for (j = 0; j < newLength; j++) {\n                                    if (valuePrimitive) {\n                                        same = newValues[j] == old;\n                                    } else {\n                                        newValue = newValues[j];\n                                        newValue = newValue.get ? newValue.get(field) : newValue;\n                                        same = newValue == (old.get ? old.get(field) : old);\n                                    }\n                                    if (same) {\n                                        newValues.splice(j, 1);\n                                        newLength -= 1;\n                                        found = true;\n                                        break;\n                                    }\n                                }\n                                if (!found) {\n                                    remove.push(old);\n                                    arraySplice(oldValues, i, 1);\n                                    removeIndex = i;\n                                } else {\n                                    i += 1;\n                                }\n                                old = oldValues[i];\n                            }\n                            arraySplice(oldValues, oldValues.length, 0, newValues);\n                            if (remove.length) {\n                                oldValues.trigger('change', {\n                                    action: 'remove',\n                                    items: remove,\n                                    index: removeIndex\n                                });\n                            }\n                            if (newValues.length) {\n                                oldValues.trigger('change', {\n                                    action: 'add',\n                                    items: newValues,\n                                    index: oldValues.length - 1\n                                });\n                            }\n                        } else {\n                            that.bindings[VALUE].set(newValues);\n                        }\n                        that._initChange = false;\n                    },\n                    refresh: function () {\n                        if (!this._initChange) {\n                            var options = this.options, widget = this.widget, field = options.dataValueField || options.dataTextField, value = this.bindings.value.get(), data = value, idx = 0, length, values = [], selectedValue;\n                            if (value === undefined) {\n                                value = null;\n                            }\n                            if (field) {\n                                if (value instanceof ObservableArray) {\n                                    for (length = value.length; idx < length; idx++) {\n                                        selectedValue = value[idx];\n                                        values[idx] = selectedValue.get ? selectedValue.get(field) : selectedValue;\n                                    }\n                                    value = values;\n                                } else if (value instanceof ObservableObject) {\n                                    value = value.get(field);\n                                }\n                            }\n                            if (options.autoBind === false && options.valuePrimitive !== true && !widget._isBound()) {\n                                widget._preselect(data, value);\n                            } else {\n                                widget.value(value);\n                            }\n                        }\n                    },\n                    destroy: function () {\n                        this.widget.unbind(CHANGE, this._change);\n                    }\n                })\n            },\n            scheduler: {\n                source: dataSourceBinding('source', 'dataSource', 'setDataSource').extend({\n                    dataBound: function (e) {\n                        var idx;\n                        var length;\n                        var widget = this.widget;\n                        var elements = e.addedItems || widget.items();\n                        var data, parents;\n                        if (elements.length) {\n                            data = e.addedDataItems || widget.dataItems();\n                            parents = this.bindings.source._parents();\n                            for (idx = 0, length = data.length; idx < length; idx++) {\n                                bindElement(elements[idx], data[idx], this._ns(e.ns), [data[idx]].concat(parents));\n                            }\n                        }\n                    }\n                })\n            }\n        };\n        var arraySplice = function (arr, idx, remove, add) {\n            add = add || [];\n            remove = remove || 0;\n            var addLength = add.length;\n            var oldLength = arr.length;\n            var shifted = [].slice.call(arr, idx + remove);\n            var shiftedLength = shifted.length;\n            var index;\n            if (addLength) {\n                addLength = idx + addLength;\n                index = 0;\n                for (; idx < addLength; idx++) {\n                    arr[idx] = add[index];\n                    index++;\n                }\n                arr.length = addLength;\n            } else if (remove) {\n                arr.length = idx;\n                remove += idx;\n                while (idx < remove) {\n                    delete arr[--remove];\n                }\n            }\n            if (shiftedLength) {\n                shiftedLength = idx + shiftedLength;\n                index = 0;\n                for (; idx < shiftedLength; idx++) {\n                    arr[idx] = shifted[index];\n                    index++;\n                }\n                arr.length = shiftedLength;\n            }\n            idx = arr.length;\n            while (idx < oldLength) {\n                delete arr[idx];\n                idx++;\n            }\n        };\n        var BindingTarget = Class.extend({\n            init: function (target, options) {\n                this.target = target;\n                this.options = options;\n                this.toDestroy = [];\n            },\n            bind: function (bindings) {\n                var key, hasValue, hasSource, hasEvents, hasChecked, hasCss, widgetBinding = this instanceof WidgetBindingTarget, specificBinders = this.binders();\n                for (key in bindings) {\n                    if (key == VALUE) {\n                        hasValue = true;\n                    } else if (key == SOURCE) {\n                        hasSource = true;\n                    } else if (key == EVENTS && !widgetBinding) {\n                        hasEvents = true;\n                    } else if (key == CHECKED) {\n                        hasChecked = true;\n                    } else if (key == CSS) {\n                        hasCss = true;\n                    } else {\n                        this.applyBinding(key, bindings, specificBinders);\n                    }\n                }\n                if (hasSource) {\n                    this.applyBinding(SOURCE, bindings, specificBinders);\n                }\n                if (hasValue) {\n                    this.applyBinding(VALUE, bindings, specificBinders);\n                }\n                if (hasChecked) {\n                    this.applyBinding(CHECKED, bindings, specificBinders);\n                }\n                if (hasEvents && !widgetBinding) {\n                    this.applyBinding(EVENTS, bindings, specificBinders);\n                }\n                if (hasCss && !widgetBinding) {\n                    this.applyBinding(CSS, bindings, specificBinders);\n                }\n            },\n            binders: function () {\n                return binders[this.target.nodeName.toLowerCase()] || {};\n            },\n            applyBinding: function (name, bindings, specificBinders) {\n                var binder = specificBinders[name] || binders[name], toDestroy = this.toDestroy, attribute, binding = bindings[name];\n                if (binder) {\n                    binder = new binder(this.target, bindings, this.options);\n                    toDestroy.push(binder);\n                    if (binding instanceof Binding) {\n                        binder.bind(binding);\n                        toDestroy.push(binding);\n                    } else {\n                        for (attribute in binding) {\n                            binder.bind(binding, attribute);\n                            toDestroy.push(binding[attribute]);\n                        }\n                    }\n                } else if (name !== 'template') {\n                    throw new Error('The ' + name + ' binding is not supported by the ' + this.target.nodeName.toLowerCase() + ' element');\n                }\n            },\n            destroy: function () {\n                var idx, length, toDestroy = this.toDestroy;\n                for (idx = 0, length = toDestroy.length; idx < length; idx++) {\n                    toDestroy[idx].destroy();\n                }\n            }\n        });\n        var WidgetBindingTarget = BindingTarget.extend({\n            binders: function () {\n                return binders.widget[this.target.options.name.toLowerCase()] || {};\n            },\n            applyBinding: function (name, bindings, specificBinders) {\n                var binder = specificBinders[name] || binders.widget[name], toDestroy = this.toDestroy, attribute, binding = bindings[name];\n                if (binder) {\n                    binder = new binder(this.target, bindings, this.target.options);\n                    toDestroy.push(binder);\n                    if (binding instanceof Binding) {\n                        binder.bind(binding);\n                        toDestroy.push(binding);\n                    } else {\n                        for (attribute in binding) {\n                            binder.bind(binding, attribute);\n                            toDestroy.push(binding[attribute]);\n                        }\n                    }\n                } else {\n                    throw new Error('The ' + name + ' binding is not supported by the ' + this.target.options.name + ' widget');\n                }\n            }\n        });\n        function bindingTargetForRole(element, roles) {\n            var widget = kendo.initWidget(element, {}, roles);\n            if (widget) {\n                return new WidgetBindingTarget(widget);\n            }\n        }\n        var keyValueRegExp = /[A-Za-z0-9_\\-]+:(\\{([^}]*)\\}|[^,}]+)/g, whiteSpaceRegExp = /\\s/g;\n        function parseBindings(bind) {\n            var result = {}, idx, length, token, colonIndex, key, value, tokens;\n            tokens = bind.match(keyValueRegExp);\n            for (idx = 0, length = tokens.length; idx < length; idx++) {\n                token = tokens[idx];\n                colonIndex = token.indexOf(':');\n                key = token.substring(0, colonIndex);\n                value = token.substring(colonIndex + 1);\n                if (value.charAt(0) == '{') {\n                    value = parseBindings(value);\n                }\n                result[key] = value;\n            }\n            return result;\n        }\n        function createBindings(bindings, source, type) {\n            var binding, result = {};\n            for (binding in bindings) {\n                result[binding] = new type(source, bindings[binding]);\n            }\n            return result;\n        }\n        function bindElement(element, source, roles, parents) {\n            var role = element.getAttribute('data-' + kendo.ns + 'role'), idx, bind = element.getAttribute('data-' + kendo.ns + 'bind'), childrenCopy = [], deep = true, bindings, options = {}, target;\n            parents = parents || [source];\n            if (role || bind) {\n                unbindElement(element, false);\n            }\n            if (role) {\n                target = bindingTargetForRole(element, roles);\n            }\n            if (bind) {\n                bind = parseBindings(bind.replace(whiteSpaceRegExp, ''));\n                if (!target) {\n                    options = kendo.parseOptions(element, {\n                        textField: '',\n                        valueField: '',\n                        template: '',\n                        valueUpdate: CHANGE,\n                        valuePrimitive: false,\n                        autoBind: true\n                    });\n                    options.roles = roles;\n                    target = new BindingTarget(element, options);\n                }\n                target.source = source;\n                bindings = createBindings(bind, parents, Binding);\n                if (options.template) {\n                    bindings.template = new TemplateBinding(parents, '', options.template);\n                }\n                if (bindings.click) {\n                    bind.events = bind.events || {};\n                    bind.events.click = bind.click;\n                    bindings.click.destroy();\n                    delete bindings.click;\n                }\n                if (bindings.source) {\n                    deep = false;\n                }\n                if (bind.attr) {\n                    bindings.attr = createBindings(bind.attr, parents, Binding);\n                }\n                if (bind.style) {\n                    bindings.style = createBindings(bind.style, parents, Binding);\n                }\n                if (bind.events) {\n                    bindings.events = createBindings(bind.events, parents, EventBinding);\n                }\n                if (bind.css) {\n                    bindings.css = createBindings(bind.css, parents, Binding);\n                }\n                target.bind(bindings);\n            }\n            if (target) {\n                element.kendoBindingTarget = target;\n            }\n            var children = element.children;\n            if (deep && children) {\n                for (idx = 0; idx < children.length; idx++) {\n                    childrenCopy[idx] = children[idx];\n                }\n                for (idx = 0; idx < childrenCopy.length; idx++) {\n                    bindElement(childrenCopy[idx], source, roles, parents);\n                }\n            }\n        }\n        function bind(dom, object) {\n            var idx, length, node, roles = kendo.rolesFromNamespaces([].slice.call(arguments, 2));\n            object = kendo.observable(object);\n            dom = $(dom);\n            for (idx = 0, length = dom.length; idx < length; idx++) {\n                node = dom[idx];\n                if (node.nodeType === 1) {\n                    bindElement(node, object, roles);\n                }\n            }\n        }\n        function unbindElement(element, destroyWidget) {\n            var bindingTarget = element.kendoBindingTarget;\n            if (bindingTarget) {\n                bindingTarget.destroy();\n                if (deleteExpando) {\n                    delete element.kendoBindingTarget;\n                } else if (element.removeAttribute) {\n                    element.removeAttribute('kendoBindingTarget');\n                } else {\n                    element.kendoBindingTarget = null;\n                }\n            }\n            if (destroyWidget) {\n                var widget = kendo.widgetInstance($(element));\n                if (widget && typeof widget.destroy === FUNCTION) {\n                    widget.destroy();\n                }\n            }\n        }\n        function unbindElementTree(element, destroyWidgets) {\n            unbindElement(element, destroyWidgets);\n            unbindElementChildren(element, destroyWidgets);\n        }\n        function unbindElementChildren(element, destroyWidgets) {\n            var children = element.children;\n            if (children) {\n                for (var idx = 0, length = children.length; idx < length; idx++) {\n                    unbindElementTree(children[idx], destroyWidgets);\n                }\n            }\n        }\n        function unbind(dom) {\n            var idx, length;\n            dom = $(dom);\n            for (idx = 0, length = dom.length; idx < length; idx++) {\n                unbindElementTree(dom[idx], false);\n            }\n        }\n        function notify(widget, namespace) {\n            var element = widget.element, bindingTarget = element[0].kendoBindingTarget;\n            if (bindingTarget) {\n                bind(element, bindingTarget.source, namespace);\n            }\n        }\n        function retrievePrimitiveValues(value, valueField) {\n            var values = [];\n            var idx = 0;\n            var length;\n            var item;\n            if (!valueField) {\n                return value;\n            }\n            if (value instanceof ObservableArray) {\n                for (length = value.length; idx < length; idx++) {\n                    item = value[idx];\n                    values[idx] = item.get ? item.get(valueField) : item[valueField];\n                }\n                value = values;\n            } else if (value instanceof ObservableObject) {\n                value = value.get(valueField);\n            }\n            return value;\n        }\n        kendo.unbind = unbind;\n        kendo.bind = bind;\n        kendo.data.binders = binders;\n        kendo.data.Binder = Binder;\n        kendo.notify = notify;\n        kendo.observable = function (object) {\n            if (!(object instanceof ObservableObject)) {\n                object = new ObservableObject(object);\n            }\n            return object;\n        };\n        kendo.observableHierarchy = function (array) {\n            var dataSource = kendo.data.HierarchicalDataSource.create(array);\n            function recursiveRead(data) {\n                var i, children;\n                for (i = 0; i < data.length; i++) {\n                    data[i]._initChildren();\n                    children = data[i].children;\n                    children.fetch();\n                    data[i].items = children.data();\n                    recursiveRead(data[i].items);\n                }\n            }\n            dataSource.fetch();\n            recursiveRead(dataSource.data());\n            dataSource._data._dataSource = dataSource;\n            return dataSource._data;\n        };\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.fx', ['kendo.core'], f);\n}(function () {\n    var __meta__ = {\n        id: 'fx',\n        name: 'Effects',\n        category: 'framework',\n        description: 'Required for animation effects in all Kendo UI widgets.',\n        depends: ['core']\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, fx = kendo.effects, each = $.each, extend = $.extend, proxy = $.proxy, support = kendo.support, browser = support.browser, transforms = support.transforms, transitions = support.transitions, scaleProperties = {\n                scale: 0,\n                scalex: 0,\n                scaley: 0,\n                scale3d: 0\n            }, translateProperties = {\n                translate: 0,\n                translatex: 0,\n                translatey: 0,\n                translate3d: 0\n            }, hasZoom = typeof document.documentElement.style.zoom !== 'undefined' && !transforms, matrix3dRegExp = /matrix3?d?\\s*\\(.*,\\s*([\\d\\.\\-]+)\\w*?,\\s*([\\d\\.\\-]+)\\w*?,\\s*([\\d\\.\\-]+)\\w*?,\\s*([\\d\\.\\-]+)\\w*?/i, cssParamsRegExp = /^(-?[\\d\\.\\-]+)?[\\w\\s]*,?\\s*(-?[\\d\\.\\-]+)?[\\w\\s]*/i, translateXRegExp = /translatex?$/i, oldEffectsRegExp = /(zoom|fade|expand)(\\w+)/, singleEffectRegExp = /(zoom|fade|expand)/, unitRegExp = /[xy]$/i, transformProps = [\n                'perspective',\n                'rotate',\n                'rotatex',\n                'rotatey',\n                'rotatez',\n                'rotate3d',\n                'scale',\n                'scalex',\n                'scaley',\n                'scalez',\n                'scale3d',\n                'skew',\n                'skewx',\n                'skewy',\n                'translate',\n                'translatex',\n                'translatey',\n                'translatez',\n                'translate3d',\n                'matrix',\n                'matrix3d'\n            ], transform2d = [\n                'rotate',\n                'scale',\n                'scalex',\n                'scaley',\n                'skew',\n                'skewx',\n                'skewy',\n                'translate',\n                'translatex',\n                'translatey',\n                'matrix'\n            ], transform2units = {\n                'rotate': 'deg',\n                scale: '',\n                skew: 'px',\n                translate: 'px'\n            }, cssPrefix = transforms.css, round = Math.round, BLANK = '', PX = 'px', NONE = 'none', AUTO = 'auto', WIDTH = 'width', HEIGHT = 'height', HIDDEN = 'hidden', ORIGIN = 'origin', ABORT_ID = 'abortId', OVERFLOW = 'overflow', TRANSLATE = 'translate', POSITION = 'position', COMPLETE_CALLBACK = 'completeCallback', TRANSITION = cssPrefix + 'transition', TRANSFORM = cssPrefix + 'transform', BACKFACE = cssPrefix + 'backface-visibility', PERSPECTIVE = cssPrefix + 'perspective', DEFAULT_PERSPECTIVE = '1500px', TRANSFORM_PERSPECTIVE = 'perspective(' + DEFAULT_PERSPECTIVE + ')', directions = {\n                left: {\n                    reverse: 'right',\n                    property: 'left',\n                    transition: 'translatex',\n                    vertical: false,\n                    modifier: -1\n                },\n                right: {\n                    reverse: 'left',\n                    property: 'left',\n                    transition: 'translatex',\n                    vertical: false,\n                    modifier: 1\n                },\n                down: {\n                    reverse: 'up',\n                    property: 'top',\n                    transition: 'translatey',\n                    vertical: true,\n                    modifier: 1\n                },\n                up: {\n                    reverse: 'down',\n                    property: 'top',\n                    transition: 'translatey',\n                    vertical: true,\n                    modifier: -1\n                },\n                top: { reverse: 'bottom' },\n                bottom: { reverse: 'top' },\n                'in': {\n                    reverse: 'out',\n                    modifier: -1\n                },\n                out: {\n                    reverse: 'in',\n                    modifier: 1\n                },\n                vertical: { reverse: 'vertical' },\n                horizontal: { reverse: 'horizontal' }\n            };\n        kendo.directions = directions;\n        extend($.fn, {\n            kendoStop: function (clearQueue, gotoEnd) {\n                if (transitions) {\n                    return fx.stopQueue(this, clearQueue || false, gotoEnd || false);\n                } else {\n                    return this.stop(clearQueue, gotoEnd);\n                }\n            }\n        });\n        if (transforms && !transitions) {\n            each(transform2d, function (idx, value) {\n                $.fn[value] = function (val) {\n                    if (typeof val == 'undefined') {\n                        return animationProperty(this, value);\n                    } else {\n                        var that = $(this)[0], transformValue = value + '(' + val + transform2units[value.replace(unitRegExp, '')] + ')';\n                        if (that.style.cssText.indexOf(TRANSFORM) == -1) {\n                            $(this).css(TRANSFORM, transformValue);\n                        } else {\n                            that.style.cssText = that.style.cssText.replace(new RegExp(value + '\\\\(.*?\\\\)', 'i'), transformValue);\n                        }\n                    }\n                    return this;\n                };\n                $.fx.step[value] = function (fx) {\n                    $(fx.elem)[value](fx.now);\n                };\n            });\n            var curProxy = $.fx.prototype.cur;\n            $.fx.prototype.cur = function () {\n                if (transform2d.indexOf(this.prop) != -1) {\n                    return parseFloat($(this.elem)[this.prop]());\n                }\n                return curProxy.apply(this, arguments);\n            };\n        }\n        kendo.toggleClass = function (element, classes, options, add) {\n            if (classes) {\n                classes = classes.split(' ');\n                if (transitions) {\n                    options = extend({\n                        exclusive: 'all',\n                        duration: 400,\n                        ease: 'ease-out'\n                    }, options);\n                    element.css(TRANSITION, options.exclusive + ' ' + options.duration + 'ms ' + options.ease);\n                    setTimeout(function () {\n                        element.css(TRANSITION, '').css(HEIGHT);\n                    }, options.duration);\n                }\n                each(classes, function (idx, value) {\n                    element.toggleClass(value, add);\n                });\n            }\n            return element;\n        };\n        kendo.parseEffects = function (input, mirror) {\n            var effects = {};\n            if (typeof input === 'string') {\n                each(input.split(' '), function (idx, value) {\n                    var redirectedEffect = !singleEffectRegExp.test(value), resolved = value.replace(oldEffectsRegExp, function (match, $1, $2) {\n                            return $1 + ':' + $2.toLowerCase();\n                        }), effect = resolved.split(':'), direction = effect[1], effectBody = {};\n                    if (effect.length > 1) {\n                        effectBody.direction = mirror && redirectedEffect ? directions[direction].reverse : direction;\n                    }\n                    effects[effect[0]] = effectBody;\n                });\n            } else {\n                each(input, function (idx) {\n                    var direction = this.direction;\n                    if (direction && mirror && !singleEffectRegExp.test(idx)) {\n                        this.direction = directions[direction].reverse;\n                    }\n                    effects[idx] = this;\n                });\n            }\n            return effects;\n        };\n        function parseInteger(value) {\n            return parseInt(value, 10);\n        }\n        function parseCSS(element, property) {\n            return parseInteger(element.css(property));\n        }\n        function keys(obj) {\n            var acc = [];\n            for (var propertyName in obj) {\n                acc.push(propertyName);\n            }\n            return acc;\n        }\n        function strip3DTransforms(properties) {\n            for (var key in properties) {\n                if (transformProps.indexOf(key) != -1 && transform2d.indexOf(key) == -1) {\n                    delete properties[key];\n                }\n            }\n            return properties;\n        }\n        function normalizeCSS(element, properties) {\n            var transformation = [], cssValues = {}, lowerKey, key, value, isTransformed;\n            for (key in properties) {\n                lowerKey = key.toLowerCase();\n                isTransformed = transforms && transformProps.indexOf(lowerKey) != -1;\n                if (!support.hasHW3D && isTransformed && transform2d.indexOf(lowerKey) == -1) {\n                    delete properties[key];\n                } else {\n                    value = properties[key];\n                    if (isTransformed) {\n                        transformation.push(key + '(' + value + ')');\n                    } else {\n                        cssValues[key] = value;\n                    }\n                }\n            }\n            if (transformation.length) {\n                cssValues[TRANSFORM] = transformation.join(' ');\n            }\n            return cssValues;\n        }\n        if (transitions) {\n            extend(fx, {\n                transition: function (element, properties, options) {\n                    var css, delay = 0, oldKeys = element.data('keys') || [], timeoutID;\n                    options = extend({\n                        duration: 200,\n                        ease: 'ease-out',\n                        complete: null,\n                        exclusive: 'all'\n                    }, options);\n                    var stopTransitionCalled = false;\n                    var stopTransition = function () {\n                        if (!stopTransitionCalled) {\n                            stopTransitionCalled = true;\n                            if (timeoutID) {\n                                clearTimeout(timeoutID);\n                                timeoutID = null;\n                            }\n                            element.removeData(ABORT_ID).dequeue().css(TRANSITION, '').css(TRANSITION);\n                            options.complete.call(element);\n                        }\n                    };\n                    options.duration = $.fx ? $.fx.speeds[options.duration] || options.duration : options.duration;\n                    css = normalizeCSS(element, properties);\n                    $.merge(oldKeys, keys(css));\n                    element.data('keys', $.unique(oldKeys)).height();\n                    element.css(TRANSITION, options.exclusive + ' ' + options.duration + 'ms ' + options.ease).css(TRANSITION);\n                    element.css(css).css(TRANSFORM);\n                    if (transitions.event) {\n                        element.one(transitions.event, stopTransition);\n                        if (options.duration !== 0) {\n                            delay = 500;\n                        }\n                    }\n                    timeoutID = setTimeout(stopTransition, options.duration + delay);\n                    element.data(ABORT_ID, timeoutID);\n                    element.data(COMPLETE_CALLBACK, stopTransition);\n                },\n                stopQueue: function (element, clearQueue, gotoEnd) {\n                    var cssValues, taskKeys = element.data('keys'), retainPosition = !gotoEnd && taskKeys, completeCallback = element.data(COMPLETE_CALLBACK);\n                    if (retainPosition) {\n                        cssValues = kendo.getComputedStyles(element[0], taskKeys);\n                    }\n                    if (completeCallback) {\n                        completeCallback();\n                    }\n                    if (retainPosition) {\n                        element.css(cssValues);\n                    }\n                    return element.removeData('keys').stop(clearQueue);\n                }\n            });\n        }\n        function animationProperty(element, property) {\n            if (transforms) {\n                var transform = element.css(TRANSFORM);\n                if (transform == NONE) {\n                    return property == 'scale' ? 1 : 0;\n                }\n                var match = transform.match(new RegExp(property + '\\\\s*\\\\(([\\\\d\\\\w\\\\.]+)')), computed = 0;\n                if (match) {\n                    computed = parseInteger(match[1]);\n                } else {\n                    match = transform.match(matrix3dRegExp) || [\n                        0,\n                        0,\n                        0,\n                        0,\n                        0\n                    ];\n                    property = property.toLowerCase();\n                    if (translateXRegExp.test(property)) {\n                        computed = parseFloat(match[3] / match[2]);\n                    } else if (property == 'translatey') {\n                        computed = parseFloat(match[4] / match[2]);\n                    } else if (property == 'scale') {\n                        computed = parseFloat(match[2]);\n                    } else if (property == 'rotate') {\n                        computed = parseFloat(Math.atan2(match[2], match[1]));\n                    }\n                }\n                return computed;\n            } else {\n                return parseFloat(element.css(property));\n            }\n        }\n        var EffectSet = kendo.Class.extend({\n            init: function (element, options) {\n                var that = this;\n                that.element = element;\n                that.effects = [];\n                that.options = options;\n                that.restore = [];\n            },\n            run: function (effects) {\n                var that = this, effect, idx, jdx, length = effects.length, element = that.element, options = that.options, deferred = $.Deferred(), start = {}, end = {}, target, children, childrenLength;\n                that.effects = effects;\n                deferred.then($.proxy(that, 'complete'));\n                element.data('animating', true);\n                for (idx = 0; idx < length; idx++) {\n                    effect = effects[idx];\n                    effect.setReverse(options.reverse);\n                    effect.setOptions(options);\n                    that.addRestoreProperties(effect.restore);\n                    effect.prepare(start, end);\n                    children = effect.children();\n                    for (jdx = 0, childrenLength = children.length; jdx < childrenLength; jdx++) {\n                        children[jdx].duration(options.duration).run();\n                    }\n                }\n                for (var effectName in options.effects) {\n                    extend(end, options.effects[effectName].properties);\n                }\n                if (!element.is(':visible')) {\n                    extend(start, { display: element.data('olddisplay') || 'block' });\n                }\n                if (transforms && !options.reset) {\n                    target = element.data('targetTransform');\n                    if (target) {\n                        start = extend(target, start);\n                    }\n                }\n                start = normalizeCSS(element, start);\n                if (transforms && !transitions) {\n                    start = strip3DTransforms(start);\n                }\n                element.css(start).css(TRANSFORM);\n                for (idx = 0; idx < length; idx++) {\n                    effects[idx].setup();\n                }\n                if (options.init) {\n                    options.init();\n                }\n                element.data('targetTransform', end);\n                fx.animate(element, end, extend({}, options, { complete: deferred.resolve }));\n                return deferred.promise();\n            },\n            stop: function () {\n                $(this.element).kendoStop(true, true);\n            },\n            addRestoreProperties: function (restore) {\n                var element = this.element, value, i = 0, length = restore.length;\n                for (; i < length; i++) {\n                    value = restore[i];\n                    this.restore.push(value);\n                    if (!element.data(value)) {\n                        element.data(value, element.css(value));\n                    }\n                }\n            },\n            restoreCallback: function () {\n                var element = this.element;\n                for (var i = 0, length = this.restore.length; i < length; i++) {\n                    var value = this.restore[i];\n                    element.css(value, element.data(value));\n                }\n            },\n            complete: function () {\n                var that = this, idx = 0, element = that.element, options = that.options, effects = that.effects, length = effects.length;\n                element.removeData('animating').dequeue();\n                if (options.hide) {\n                    element.data('olddisplay', element.css('display')).hide();\n                }\n                this.restoreCallback();\n                if (hasZoom && !transforms) {\n                    setTimeout($.proxy(this, 'restoreCallback'), 0);\n                }\n                for (; idx < length; idx++) {\n                    effects[idx].teardown();\n                }\n                if (options.completeCallback) {\n                    options.completeCallback(element);\n                }\n            }\n        });\n        fx.promise = function (element, options) {\n            var effects = [], effectClass, effectSet = new EffectSet(element, options), parsedEffects = kendo.parseEffects(options.effects), effect;\n            options.effects = parsedEffects;\n            for (var effectName in parsedEffects) {\n                effectClass = fx[capitalize(effectName)];\n                if (effectClass) {\n                    effect = new effectClass(element, parsedEffects[effectName].direction);\n                    effects.push(effect);\n                }\n            }\n            if (effects[0]) {\n                effectSet.run(effects);\n            } else {\n                if (!element.is(':visible')) {\n                    element.css({ display: element.data('olddisplay') || 'block' }).css('display');\n                }\n                if (options.init) {\n                    options.init();\n                }\n                element.dequeue();\n                effectSet.complete();\n            }\n        };\n        extend(fx, {\n            animate: function (elements, properties, options) {\n                var useTransition = options.transition !== false;\n                delete options.transition;\n                if (transitions && 'transition' in fx && useTransition) {\n                    fx.transition(elements, properties, options);\n                } else {\n                    if (transforms) {\n                        elements.animate(strip3DTransforms(properties), {\n                            queue: false,\n                            show: false,\n                            hide: false,\n                            duration: options.duration,\n                            complete: options.complete\n                        });\n                    } else {\n                        elements.each(function () {\n                            var element = $(this), multiple = {};\n                            each(transformProps, function (idx, value) {\n                                var params, currentValue = properties ? properties[value] + ' ' : null;\n                                if (currentValue) {\n                                    var single = properties;\n                                    if (value in scaleProperties && properties[value] !== undefined) {\n                                        params = currentValue.match(cssParamsRegExp);\n                                        if (transforms) {\n                                            extend(single, { scale: +params[0] });\n                                        }\n                                    } else {\n                                        if (value in translateProperties && properties[value] !== undefined) {\n                                            var position = element.css(POSITION), isFixed = position == 'absolute' || position == 'fixed';\n                                            if (!element.data(TRANSLATE)) {\n                                                if (isFixed) {\n                                                    element.data(TRANSLATE, {\n                                                        top: parseCSS(element, 'top') || 0,\n                                                        left: parseCSS(element, 'left') || 0,\n                                                        bottom: parseCSS(element, 'bottom'),\n                                                        right: parseCSS(element, 'right')\n                                                    });\n                                                } else {\n                                                    element.data(TRANSLATE, {\n                                                        top: parseCSS(element, 'marginTop') || 0,\n                                                        left: parseCSS(element, 'marginLeft') || 0\n                                                    });\n                                                }\n                                            }\n                                            var originalPosition = element.data(TRANSLATE);\n                                            params = currentValue.match(cssParamsRegExp);\n                                            if (params) {\n                                                var dX = value == TRANSLATE + 'y' ? +null : +params[1], dY = value == TRANSLATE + 'y' ? +params[1] : +params[2];\n                                                if (isFixed) {\n                                                    if (!isNaN(originalPosition.right)) {\n                                                        if (!isNaN(dX)) {\n                                                            extend(single, { right: originalPosition.right - dX });\n                                                        }\n                                                    } else {\n                                                        if (!isNaN(dX)) {\n                                                            extend(single, { left: originalPosition.left + dX });\n                                                        }\n                                                    }\n                                                    if (!isNaN(originalPosition.bottom)) {\n                                                        if (!isNaN(dY)) {\n                                                            extend(single, { bottom: originalPosition.bottom - dY });\n                                                        }\n                                                    } else {\n                                                        if (!isNaN(dY)) {\n                                                            extend(single, { top: originalPosition.top + dY });\n                                                        }\n                                                    }\n                                                } else {\n                                                    if (!isNaN(dX)) {\n                                                        extend(single, { marginLeft: originalPosition.left + dX });\n                                                    }\n                                                    if (!isNaN(dY)) {\n                                                        extend(single, { marginTop: originalPosition.top + dY });\n                                                    }\n                                                }\n                                            }\n                                        }\n                                    }\n                                    if (!transforms && value != 'scale' && value in single) {\n                                        delete single[value];\n                                    }\n                                    if (single) {\n                                        extend(multiple, single);\n                                    }\n                                }\n                            });\n                            if (browser.msie) {\n                                delete multiple.scale;\n                            }\n                            element.animate(multiple, {\n                                queue: false,\n                                show: false,\n                                hide: false,\n                                duration: options.duration,\n                                complete: options.complete\n                            });\n                        });\n                    }\n                }\n            }\n        });\n        fx.animatedPromise = fx.promise;\n        var Effect = kendo.Class.extend({\n            init: function (element, direction) {\n                var that = this;\n                that.element = element;\n                that._direction = direction;\n                that.options = {};\n                that._additionalEffects = [];\n                if (!that.restore) {\n                    that.restore = [];\n                }\n            },\n            reverse: function () {\n                this._reverse = true;\n                return this.run();\n            },\n            play: function () {\n                this._reverse = false;\n                return this.run();\n            },\n            add: function (additional) {\n                this._additionalEffects.push(additional);\n                return this;\n            },\n            direction: function (value) {\n                this._direction = value;\n                return this;\n            },\n            duration: function (duration) {\n                this._duration = duration;\n                return this;\n            },\n            compositeRun: function () {\n                var that = this, effectSet = new EffectSet(that.element, {\n                        reverse: that._reverse,\n                        duration: that._duration\n                    }), effects = that._additionalEffects.concat([that]);\n                return effectSet.run(effects);\n            },\n            run: function () {\n                if (this._additionalEffects && this._additionalEffects[0]) {\n                    return this.compositeRun();\n                }\n                var that = this, element = that.element, idx = 0, restore = that.restore, length = restore.length, value, deferred = $.Deferred(), start = {}, end = {}, target, children = that.children(), childrenLength = children.length;\n                deferred.then($.proxy(that, '_complete'));\n                element.data('animating', true);\n                for (idx = 0; idx < length; idx++) {\n                    value = restore[idx];\n                    if (!element.data(value)) {\n                        element.data(value, element.css(value));\n                    }\n                }\n                for (idx = 0; idx < childrenLength; idx++) {\n                    children[idx].duration(that._duration).run();\n                }\n                that.prepare(start, end);\n                if (!element.is(':visible')) {\n                    extend(start, { display: element.data('olddisplay') || 'block' });\n                }\n                if (transforms) {\n                    target = element.data('targetTransform');\n                    if (target) {\n                        start = extend(target, start);\n                    }\n                }\n                start = normalizeCSS(element, start);\n                if (transforms && !transitions) {\n                    start = strip3DTransforms(start);\n                }\n                element.css(start).css(TRANSFORM);\n                that.setup();\n                element.data('targetTransform', end);\n                fx.animate(element, end, {\n                    duration: that._duration,\n                    complete: deferred.resolve\n                });\n                return deferred.promise();\n            },\n            stop: function () {\n                var idx = 0, children = this.children(), childrenLength = children.length;\n                for (idx = 0; idx < childrenLength; idx++) {\n                    children[idx].stop();\n                }\n                $(this.element).kendoStop(true, true);\n                return this;\n            },\n            restoreCallback: function () {\n                var element = this.element;\n                for (var i = 0, length = this.restore.length; i < length; i++) {\n                    var value = this.restore[i];\n                    element.css(value, element.data(value));\n                }\n            },\n            _complete: function () {\n                var that = this, element = that.element;\n                element.removeData('animating').dequeue();\n                that.restoreCallback();\n                if (that.shouldHide()) {\n                    element.data('olddisplay', element.css('display')).hide();\n                }\n                if (hasZoom && !transforms) {\n                    setTimeout($.proxy(that, 'restoreCallback'), 0);\n                }\n                that.teardown();\n            },\n            setOptions: function (options) {\n                extend(true, this.options, options);\n            },\n            children: function () {\n                return [];\n            },\n            shouldHide: $.noop,\n            setup: $.noop,\n            prepare: $.noop,\n            teardown: $.noop,\n            directions: [],\n            setReverse: function (reverse) {\n                this._reverse = reverse;\n                return this;\n            }\n        });\n        function capitalize(word) {\n            return word.charAt(0).toUpperCase() + word.substring(1);\n        }\n        function createEffect(name, definition) {\n            var effectClass = Effect.extend(definition), directions = effectClass.prototype.directions;\n            fx[capitalize(name)] = effectClass;\n            fx.Element.prototype[name] = function (direction, opt1, opt2, opt3) {\n                return new effectClass(this.element, direction, opt1, opt2, opt3);\n            };\n            each(directions, function (idx, theDirection) {\n                fx.Element.prototype[name + capitalize(theDirection)] = function (opt1, opt2, opt3) {\n                    return new effectClass(this.element, theDirection, opt1, opt2, opt3);\n                };\n            });\n        }\n        var FOUR_DIRECTIONS = [\n                'left',\n                'right',\n                'up',\n                'down'\n            ], IN_OUT = [\n                'in',\n                'out'\n            ];\n        createEffect('slideIn', {\n            directions: FOUR_DIRECTIONS,\n            divisor: function (value) {\n                this.options.divisor = value;\n                return this;\n            },\n            prepare: function (start, end) {\n                var that = this, tmp, element = that.element, outerWidth = kendo._outerWidth, outerHeight = kendo._outerHeight, direction = directions[that._direction], offset = -direction.modifier * (direction.vertical ? outerHeight(element) : outerWidth(element)), startValue = offset / (that.options && that.options.divisor || 1) + PX, endValue = '0px';\n                if (that._reverse) {\n                    tmp = start;\n                    start = end;\n                    end = tmp;\n                }\n                if (transforms) {\n                    start[direction.transition] = startValue;\n                    end[direction.transition] = endValue;\n                } else {\n                    start[direction.property] = startValue;\n                    end[direction.property] = endValue;\n                }\n            }\n        });\n        createEffect('tile', {\n            directions: FOUR_DIRECTIONS,\n            init: function (element, direction, previous) {\n                Effect.prototype.init.call(this, element, direction);\n                this.options = { previous: previous };\n            },\n            previousDivisor: function (value) {\n                this.options.previousDivisor = value;\n                return this;\n            },\n            children: function () {\n                var that = this, reverse = that._reverse, previous = that.options.previous, divisor = that.options.previousDivisor || 1, dir = that._direction;\n                var children = [kendo.fx(that.element).slideIn(dir).setReverse(reverse)];\n                if (previous) {\n                    children.push(kendo.fx(previous).slideIn(directions[dir].reverse).divisor(divisor).setReverse(!reverse));\n                }\n                return children;\n            }\n        });\n        function createToggleEffect(name, property, defaultStart, defaultEnd) {\n            createEffect(name, {\n                directions: IN_OUT,\n                startValue: function (value) {\n                    this._startValue = value;\n                    return this;\n                },\n                endValue: function (value) {\n                    this._endValue = value;\n                    return this;\n                },\n                shouldHide: function () {\n                    return this._shouldHide;\n                },\n                prepare: function (start, end) {\n                    var that = this, startValue, endValue, out = this._direction === 'out', startDataValue = that.element.data(property), startDataValueIsSet = !(isNaN(startDataValue) || startDataValue == defaultStart);\n                    if (startDataValueIsSet) {\n                        startValue = startDataValue;\n                    } else if (typeof this._startValue !== 'undefined') {\n                        startValue = this._startValue;\n                    } else {\n                        startValue = out ? defaultStart : defaultEnd;\n                    }\n                    if (typeof this._endValue !== 'undefined') {\n                        endValue = this._endValue;\n                    } else {\n                        endValue = out ? defaultEnd : defaultStart;\n                    }\n                    if (this._reverse) {\n                        start[property] = endValue;\n                        end[property] = startValue;\n                    } else {\n                        start[property] = startValue;\n                        end[property] = endValue;\n                    }\n                    that._shouldHide = end[property] === defaultEnd;\n                }\n            });\n        }\n        createToggleEffect('fade', 'opacity', 1, 0);\n        createToggleEffect('zoom', 'scale', 1, 0.01);\n        createEffect('slideMargin', {\n            prepare: function (start, end) {\n                var that = this, element = that.element, options = that.options, origin = element.data(ORIGIN), offset = options.offset, margin, reverse = that._reverse;\n                if (!reverse && origin === null) {\n                    element.data(ORIGIN, parseFloat(element.css('margin-' + options.axis)));\n                }\n                margin = element.data(ORIGIN) || 0;\n                end['margin-' + options.axis] = !reverse ? margin + offset : margin;\n            }\n        });\n        createEffect('slideTo', {\n            prepare: function (start, end) {\n                var that = this, element = that.element, options = that.options, offset = options.offset.split(','), reverse = that._reverse;\n                if (transforms) {\n                    end.translatex = !reverse ? offset[0] : 0;\n                    end.translatey = !reverse ? offset[1] : 0;\n                } else {\n                    end.left = !reverse ? offset[0] : 0;\n                    end.top = !reverse ? offset[1] : 0;\n                }\n                element.css('left');\n            }\n        });\n        createEffect('expand', {\n            directions: [\n                'horizontal',\n                'vertical'\n            ],\n            restore: [OVERFLOW],\n            prepare: function (start, end) {\n                var that = this, element = that.element, options = that.options, reverse = that._reverse, property = that._direction === 'vertical' ? HEIGHT : WIDTH, setLength = element[0].style[property], oldLength = element.data(property), length = parseFloat(oldLength || setLength), realLength = round(element.css(property, AUTO)[property]());\n                start.overflow = HIDDEN;\n                length = options && options.reset ? realLength || length : length || realLength;\n                end[property] = (reverse ? 0 : length) + PX;\n                start[property] = (reverse ? length : 0) + PX;\n                if (oldLength === undefined) {\n                    element.data(property, setLength);\n                }\n            },\n            shouldHide: function () {\n                return this._reverse;\n            },\n            teardown: function () {\n                var that = this, element = that.element, property = that._direction === 'vertical' ? HEIGHT : WIDTH, length = element.data(property);\n                if (length == AUTO || length === BLANK) {\n                    setTimeout(function () {\n                        element.css(property, AUTO).css(property);\n                    }, 0);\n                }\n            }\n        });\n        var TRANSFER_START_STATE = {\n            position: 'absolute',\n            marginLeft: 0,\n            marginTop: 0,\n            scale: 1\n        };\n        createEffect('transfer', {\n            init: function (element, target) {\n                this.element = element;\n                this.options = { target: target };\n                this.restore = [];\n            },\n            setup: function () {\n                this.element.appendTo(document.body);\n            },\n            prepare: function (start, end) {\n                var that = this, element = that.element, outerBox = fx.box(element), innerBox = fx.box(that.options.target), currentScale = animationProperty(element, 'scale'), scale = fx.fillScale(innerBox, outerBox), transformOrigin = fx.transformOrigin(innerBox, outerBox);\n                extend(start, TRANSFER_START_STATE);\n                end.scale = 1;\n                element.css(TRANSFORM, 'scale(1)').css(TRANSFORM);\n                element.css(TRANSFORM, 'scale(' + currentScale + ')');\n                start.top = outerBox.top;\n                start.left = outerBox.left;\n                start.transformOrigin = transformOrigin.x + PX + ' ' + transformOrigin.y + PX;\n                if (that._reverse) {\n                    start.scale = scale;\n                } else {\n                    end.scale = scale;\n                }\n            }\n        });\n        var CLIPS = {\n            top: 'rect(auto auto $size auto)',\n            bottom: 'rect($size auto auto auto)',\n            left: 'rect(auto $size auto auto)',\n            right: 'rect(auto auto auto $size)'\n        };\n        var ROTATIONS = {\n            top: {\n                start: 'rotatex(0deg)',\n                end: 'rotatex(180deg)'\n            },\n            bottom: {\n                start: 'rotatex(-180deg)',\n                end: 'rotatex(0deg)'\n            },\n            left: {\n                start: 'rotatey(0deg)',\n                end: 'rotatey(-180deg)'\n            },\n            right: {\n                start: 'rotatey(180deg)',\n                end: 'rotatey(0deg)'\n            }\n        };\n        function clipInHalf(container, direction) {\n            var vertical = kendo.directions[direction].vertical, size = container[vertical ? HEIGHT : WIDTH]() / 2 + 'px';\n            return CLIPS[direction].replace('$size', size);\n        }\n        createEffect('turningPage', {\n            directions: FOUR_DIRECTIONS,\n            init: function (element, direction, container) {\n                Effect.prototype.init.call(this, element, direction);\n                this._container = container;\n            },\n            prepare: function (start, end) {\n                var that = this, reverse = that._reverse, direction = reverse ? directions[that._direction].reverse : that._direction, rotation = ROTATIONS[direction];\n                start.zIndex = 1;\n                if (that._clipInHalf) {\n                    start.clip = clipInHalf(that._container, kendo.directions[direction].reverse);\n                }\n                start[BACKFACE] = HIDDEN;\n                end[TRANSFORM] = TRANSFORM_PERSPECTIVE + (reverse ? rotation.start : rotation.end);\n                start[TRANSFORM] = TRANSFORM_PERSPECTIVE + (reverse ? rotation.end : rotation.start);\n            },\n            setup: function () {\n                this._container.append(this.element);\n            },\n            face: function (value) {\n                this._face = value;\n                return this;\n            },\n            shouldHide: function () {\n                var that = this, reverse = that._reverse, face = that._face;\n                return reverse && !face || !reverse && face;\n            },\n            clipInHalf: function (value) {\n                this._clipInHalf = value;\n                return this;\n            },\n            temporary: function () {\n                this.element.addClass('temp-page');\n                return this;\n            }\n        });\n        createEffect('staticPage', {\n            directions: FOUR_DIRECTIONS,\n            init: function (element, direction, container) {\n                Effect.prototype.init.call(this, element, direction);\n                this._container = container;\n            },\n            restore: ['clip'],\n            prepare: function (start, end) {\n                var that = this, direction = that._reverse ? directions[that._direction].reverse : that._direction;\n                start.clip = clipInHalf(that._container, direction);\n                start.opacity = 0.999;\n                end.opacity = 1;\n            },\n            shouldHide: function () {\n                var that = this, reverse = that._reverse, face = that._face;\n                return reverse && !face || !reverse && face;\n            },\n            face: function (value) {\n                this._face = value;\n                return this;\n            }\n        });\n        createEffect('pageturn', {\n            directions: [\n                'horizontal',\n                'vertical'\n            ],\n            init: function (element, direction, face, back) {\n                Effect.prototype.init.call(this, element, direction);\n                this.options = {};\n                this.options.face = face;\n                this.options.back = back;\n            },\n            children: function () {\n                var that = this, options = that.options, direction = that._direction === 'horizontal' ? 'left' : 'top', reverseDirection = kendo.directions[direction].reverse, reverse = that._reverse, temp, faceClone = options.face.clone(true).removeAttr('id'), backClone = options.back.clone(true).removeAttr('id'), element = that.element;\n                if (reverse) {\n                    temp = direction;\n                    direction = reverseDirection;\n                    reverseDirection = temp;\n                }\n                return [\n                    kendo.fx(options.face).staticPage(direction, element).face(true).setReverse(reverse),\n                    kendo.fx(options.back).staticPage(reverseDirection, element).setReverse(reverse),\n                    kendo.fx(faceClone).turningPage(direction, element).face(true).clipInHalf(true).temporary().setReverse(reverse),\n                    kendo.fx(backClone).turningPage(reverseDirection, element).clipInHalf(true).temporary().setReverse(reverse)\n                ];\n            },\n            prepare: function (start, end) {\n                start[PERSPECTIVE] = DEFAULT_PERSPECTIVE;\n                start.transformStyle = 'preserve-3d';\n                start.opacity = 0.999;\n                end.opacity = 1;\n            },\n            teardown: function () {\n                this.element.find('.temp-page').remove();\n            }\n        });\n        createEffect('flip', {\n            directions: [\n                'horizontal',\n                'vertical'\n            ],\n            init: function (element, direction, face, back) {\n                Effect.prototype.init.call(this, element, direction);\n                this.options = {};\n                this.options.face = face;\n                this.options.back = back;\n            },\n            children: function () {\n                var that = this, options = that.options, direction = that._direction === 'horizontal' ? 'left' : 'top', reverseDirection = kendo.directions[direction].reverse, reverse = that._reverse, temp, element = that.element;\n                if (reverse) {\n                    temp = direction;\n                    direction = reverseDirection;\n                    reverseDirection = temp;\n                }\n                return [\n                    kendo.fx(options.face).turningPage(direction, element).face(true).setReverse(reverse),\n                    kendo.fx(options.back).turningPage(reverseDirection, element).setReverse(reverse)\n                ];\n            },\n            prepare: function (start) {\n                start[PERSPECTIVE] = DEFAULT_PERSPECTIVE;\n                start.transformStyle = 'preserve-3d';\n            }\n        });\n        var RESTORE_OVERFLOW = !support.mobileOS.android;\n        var IGNORE_TRANSITION_EVENT_SELECTOR = '.km-touch-scrollbar, .km-actionsheet-wrapper';\n        createEffect('replace', {\n            _before: $.noop,\n            _after: $.noop,\n            init: function (element, previous, transitionClass) {\n                Effect.prototype.init.call(this, element);\n                this._previous = $(previous);\n                this._transitionClass = transitionClass;\n            },\n            duration: function () {\n                throw new Error('The replace effect does not support duration setting; the effect duration may be customized through the transition class rule');\n            },\n            beforeTransition: function (callback) {\n                this._before = callback;\n                return this;\n            },\n            afterTransition: function (callback) {\n                this._after = callback;\n                return this;\n            },\n            _both: function () {\n                return $().add(this._element).add(this._previous);\n            },\n            _containerClass: function () {\n                var direction = this._direction, containerClass = 'k-fx k-fx-start k-fx-' + this._transitionClass;\n                if (direction) {\n                    containerClass += ' k-fx-' + direction;\n                }\n                if (this._reverse) {\n                    containerClass += ' k-fx-reverse';\n                }\n                return containerClass;\n            },\n            complete: function (e) {\n                if (!this.deferred || e && $(e.target).is(IGNORE_TRANSITION_EVENT_SELECTOR)) {\n                    return;\n                }\n                var container = this.container;\n                container.removeClass('k-fx-end').removeClass(this._containerClass()).off(transitions.event, this.completeProxy);\n                this._previous.hide().removeClass('k-fx-current');\n                this.element.removeClass('k-fx-next');\n                if (RESTORE_OVERFLOW) {\n                    container.css(OVERFLOW, '');\n                }\n                if (!this.isAbsolute) {\n                    this._both().css(POSITION, '');\n                }\n                this.deferred.resolve();\n                delete this.deferred;\n            },\n            run: function () {\n                if (this._additionalEffects && this._additionalEffects[0]) {\n                    return this.compositeRun();\n                }\n                var that = this, element = that.element, previous = that._previous, container = element.parents().filter(previous.parents()).first(), both = that._both(), deferred = $.Deferred(), originalPosition = element.css(POSITION), originalOverflow;\n                if (!container.length) {\n                    container = element.parent();\n                }\n                this.container = container;\n                this.deferred = deferred;\n                this.isAbsolute = originalPosition == 'absolute';\n                if (!this.isAbsolute) {\n                    both.css(POSITION, 'absolute');\n                }\n                if (RESTORE_OVERFLOW) {\n                    originalOverflow = container.css(OVERFLOW);\n                    container.css(OVERFLOW, 'hidden');\n                }\n                if (!transitions) {\n                    this.complete();\n                } else {\n                    element.addClass('k-fx-hidden');\n                    container.addClass(this._containerClass());\n                    this.completeProxy = $.proxy(this, 'complete');\n                    container.on(transitions.event, this.completeProxy);\n                    kendo.animationFrame(function () {\n                        element.removeClass('k-fx-hidden').addClass('k-fx-next');\n                        previous.css('display', '').addClass('k-fx-current');\n                        that._before(previous, element);\n                        kendo.animationFrame(function () {\n                            container.removeClass('k-fx-start').addClass('k-fx-end');\n                            that._after(previous, element);\n                        });\n                    });\n                }\n                return deferred.promise();\n            },\n            stop: function () {\n                this.complete();\n            }\n        });\n        var Animation = kendo.Class.extend({\n            init: function () {\n                var that = this;\n                that._tickProxy = proxy(that._tick, that);\n                that._started = false;\n            },\n            tick: $.noop,\n            done: $.noop,\n            onEnd: $.noop,\n            onCancel: $.noop,\n            start: function () {\n                if (!this.enabled()) {\n                    return;\n                }\n                if (!this.done()) {\n                    this._started = true;\n                    kendo.animationFrame(this._tickProxy);\n                } else {\n                    this.onEnd();\n                }\n            },\n            enabled: function () {\n                return true;\n            },\n            cancel: function () {\n                this._started = false;\n                this.onCancel();\n            },\n            _tick: function () {\n                var that = this;\n                if (!that._started) {\n                    return;\n                }\n                that.tick();\n                if (!that.done()) {\n                    kendo.animationFrame(that._tickProxy);\n                } else {\n                    that._started = false;\n                    that.onEnd();\n                }\n            }\n        });\n        var Transition = Animation.extend({\n            init: function (options) {\n                var that = this;\n                extend(that, options);\n                Animation.fn.init.call(that);\n            },\n            done: function () {\n                return this.timePassed() >= this.duration;\n            },\n            timePassed: function () {\n                return Math.min(this.duration, new Date() - this.startDate);\n            },\n            moveTo: function (options) {\n                var that = this, movable = that.movable;\n                that.initial = movable[that.axis];\n                that.delta = options.location - that.initial;\n                that.duration = typeof options.duration == 'number' ? options.duration : 300;\n                that.tick = that._easeProxy(options.ease);\n                that.startDate = new Date();\n                that.start();\n            },\n            _easeProxy: function (ease) {\n                var that = this;\n                return function () {\n                    that.movable.moveAxis(that.axis, ease(that.timePassed(), that.initial, that.delta, that.duration));\n                };\n            }\n        });\n        extend(Transition, {\n            easeOutExpo: function (t, b, c, d) {\n                return t == d ? b + c : c * (-Math.pow(2, -10 * t / d) + 1) + b;\n            },\n            easeOutBack: function (t, b, c, d, s) {\n                s = 1.70158;\n                return c * ((t = t / d - 1) * t * ((s + 1) * t + s) + 1) + b;\n            }\n        });\n        fx.Animation = Animation;\n        fx.Transition = Transition;\n        fx.createEffect = createEffect;\n        fx.box = function (element) {\n            element = $(element);\n            var result = element.offset();\n            result.width = kendo._outerWidth(element);\n            result.height = kendo._outerHeight(element);\n            return result;\n        };\n        fx.transformOrigin = function (inner, outer) {\n            var x = (inner.left - outer.left) * outer.width / (outer.width - inner.width), y = (inner.top - outer.top) * outer.height / (outer.height - inner.height);\n            return {\n                x: isNaN(x) ? 0 : x,\n                y: isNaN(y) ? 0 : y\n            };\n        };\n        fx.fillScale = function (inner, outer) {\n            return Math.min(inner.width / outer.width, inner.height / outer.height);\n        };\n        fx.fitScale = function (inner, outer) {\n            return Math.max(inner.width / outer.width, inner.height / outer.height);\n        };\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.view', [\n        'kendo.core',\n        'kendo.binder',\n        'kendo.fx'\n    ], f);\n}(function () {\n    var __meta__ = {\n        id: 'view',\n        name: 'View',\n        category: 'framework',\n        description: 'The View class instantiates and handles the events of a certain screen from the application.',\n        depends: [\n            'core',\n            'binder',\n            'fx'\n        ],\n        hidden: false\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, Observable = kendo.Observable, SCRIPT = 'SCRIPT', INIT = 'init', SHOW = 'show', HIDE = 'hide', TRANSITION_START = 'transitionStart', TRANSITION_END = 'transitionEnd', ATTACH = 'attach', DETACH = 'detach', sizzleErrorRegExp = /unrecognized expression/;\n        var View = Observable.extend({\n            init: function (content, options) {\n                var that = this;\n                options = options || {};\n                Observable.fn.init.call(that);\n                that.content = content;\n                that.id = kendo.guid();\n                that.tagName = options.tagName || 'div';\n                that.model = options.model;\n                that._wrap = options.wrap !== false;\n                this._evalTemplate = options.evalTemplate || false;\n                that._fragments = {};\n                that.bind([\n                    INIT,\n                    SHOW,\n                    HIDE,\n                    TRANSITION_START,\n                    TRANSITION_END\n                ], options);\n            },\n            render: function (container) {\n                var that = this, notInitialized = !that.element;\n                if (notInitialized) {\n                    that.element = that._createElement();\n                }\n                if (container) {\n                    $(container).append(that.element);\n                }\n                if (notInitialized) {\n                    kendo.bind(that.element, that.model);\n                    that.trigger(INIT);\n                }\n                if (container) {\n                    that._eachFragment(ATTACH);\n                    that.trigger(SHOW);\n                }\n                return that.element;\n            },\n            clone: function () {\n                return new ViewClone(this);\n            },\n            triggerBeforeShow: function () {\n                return true;\n            },\n            triggerBeforeHide: function () {\n                return true;\n            },\n            showStart: function () {\n                this.element.css('display', '');\n            },\n            showEnd: function () {\n            },\n            hideEnd: function () {\n                this.hide();\n            },\n            beforeTransition: function (type) {\n                this.trigger(TRANSITION_START, { type: type });\n            },\n            afterTransition: function (type) {\n                this.trigger(TRANSITION_END, { type: type });\n            },\n            hide: function () {\n                this._eachFragment(DETACH);\n                this.element.detach();\n                this.trigger(HIDE);\n            },\n            destroy: function () {\n                var element = this.element;\n                if (element) {\n                    kendo.unbind(element);\n                    kendo.destroy(element);\n                    element.remove();\n                }\n            },\n            fragments: function (fragments) {\n                $.extend(this._fragments, fragments);\n            },\n            _eachFragment: function (methodName) {\n                for (var placeholder in this._fragments) {\n                    this._fragments[placeholder][methodName](this, placeholder);\n                }\n            },\n            _createElement: function () {\n                var that = this, wrapper = '<' + that.tagName + ' />', element, content;\n                try {\n                    content = $(document.getElementById(that.content) || that.content);\n                    if (content[0].tagName === SCRIPT) {\n                        content = content.html();\n                    }\n                } catch (e) {\n                    if (sizzleErrorRegExp.test(e.message)) {\n                        content = that.content;\n                    }\n                }\n                if (typeof content === 'string') {\n                    content = content.replace(/^\\s+|\\s+$/g, '');\n                    if (that._evalTemplate) {\n                        content = kendo.template(content)(that.model || {});\n                    }\n                    element = $(wrapper).append(content);\n                    if (!that._wrap) {\n                        element = element.contents();\n                    }\n                } else {\n                    element = content;\n                    if (that._evalTemplate) {\n                        var result = $(kendo.template($('<div />').append(element.clone(true)).html())(that.model || {}));\n                        if ($.contains(document, element[0])) {\n                            element.replaceWith(result);\n                        }\n                        element = result;\n                    }\n                    if (that._wrap) {\n                        element = element.wrapAll(wrapper).parent();\n                    }\n                }\n                return element;\n            }\n        });\n        var ViewClone = kendo.Class.extend({\n            init: function (view) {\n                $.extend(this, {\n                    element: view.element.clone(true),\n                    transition: view.transition,\n                    id: view.id\n                });\n                view.element.parent().append(this.element);\n            },\n            hideEnd: function () {\n                this.element.remove();\n            },\n            beforeTransition: $.noop,\n            afterTransition: $.noop\n        });\n        var Layout = View.extend({\n            init: function (content, options) {\n                View.fn.init.call(this, content, options);\n                this.containers = {};\n            },\n            container: function (selector) {\n                var container = this.containers[selector];\n                if (!container) {\n                    container = this._createContainer(selector);\n                    this.containers[selector] = container;\n                }\n                return container;\n            },\n            showIn: function (selector, view, transition) {\n                this.container(selector).show(view, transition);\n            },\n            _createContainer: function (selector) {\n                var root = this.render(), element = root.find(selector), container;\n                if (!element.length && root.is(selector)) {\n                    if (root.is(selector)) {\n                        element = root;\n                    } else {\n                        throw new Error('can\\'t find a container with the specified ' + selector + ' selector');\n                    }\n                }\n                container = new ViewContainer(element);\n                container.bind('accepted', function (e) {\n                    e.view.render(element);\n                });\n                return container;\n            }\n        });\n        var Fragment = View.extend({\n            attach: function (view, placeholder) {\n                view.element.find(placeholder).replaceWith(this.render());\n            },\n            detach: function () {\n            }\n        });\n        var transitionRegExp = /^(\\w+)(:(\\w+))?( (\\w+))?$/;\n        function parseTransition(transition) {\n            if (!transition) {\n                return {};\n            }\n            var matches = transition.match(transitionRegExp) || [];\n            return {\n                type: matches[1],\n                direction: matches[3],\n                reverse: matches[5] === 'reverse'\n            };\n        }\n        var ViewContainer = Observable.extend({\n            init: function (container) {\n                Observable.fn.init.call(this);\n                this.container = container;\n                this.history = [];\n                this.view = null;\n                this.running = false;\n            },\n            after: function () {\n                this.running = false;\n                this.trigger('complete', { view: this.view });\n                this.trigger('after');\n            },\n            end: function () {\n                this.view.showEnd();\n                this.previous.hideEnd();\n                this.after();\n            },\n            show: function (view, transition, locationID) {\n                if (!view.triggerBeforeShow() || this.view && !this.view.triggerBeforeHide()) {\n                    this.trigger('after');\n                    return false;\n                }\n                locationID = locationID || view.id;\n                var that = this, current = view === that.view ? view.clone() : that.view, history = that.history, previousEntry = history[history.length - 2] || {}, back = previousEntry.id === locationID, theTransition = transition || (back ? history[history.length - 1].transition : view.transition), transitionData = parseTransition(theTransition);\n                if (that.running) {\n                    that.effect.stop();\n                }\n                if (theTransition === 'none') {\n                    theTransition = null;\n                }\n                that.trigger('accepted', { view: view });\n                that.view = view;\n                that.previous = current;\n                that.running = true;\n                if (!back) {\n                    history.push({\n                        id: locationID,\n                        transition: theTransition\n                    });\n                } else {\n                    history.pop();\n                }\n                if (!current) {\n                    view.showStart();\n                    view.showEnd();\n                    that.after();\n                    return true;\n                }\n                if (!theTransition || !kendo.effects.enabled) {\n                    view.showStart();\n                    that.end();\n                } else {\n                    view.element.addClass('k-fx-hidden');\n                    view.showStart();\n                    if (back && !transition) {\n                        transitionData.reverse = !transitionData.reverse;\n                    }\n                    that.effect = kendo.fx(view.element).replace(current.element, transitionData.type).beforeTransition(function () {\n                        view.beforeTransition('show');\n                        current.beforeTransition('hide');\n                    }).afterTransition(function () {\n                        view.afterTransition('show');\n                        current.afterTransition('hide');\n                    }).direction(transitionData.direction).setReverse(transitionData.reverse);\n                    that.effect.run().then(function () {\n                        that.end();\n                    });\n                }\n                return true;\n            }\n        });\n        kendo.ViewContainer = ViewContainer;\n        kendo.Fragment = Fragment;\n        kendo.Layout = Layout;\n        kendo.View = View;\n        kendo.ViewClone = ViewClone;\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.dom', ['kendo.core'], f);\n}(function () {\n    var __meta__ = {\n        id: 'dom',\n        name: 'Virtual DOM',\n        category: 'framework',\n        depends: ['core'],\n        advanced: true\n    };\n    (function (kendo) {\n        function Node() {\n            this.node = null;\n        }\n        Node.prototype = {\n            remove: function () {\n                if (this.node.parentNode) {\n                    this.node.parentNode.removeChild(this.node);\n                }\n                this.attr = {};\n            },\n            attr: {},\n            text: function () {\n                return '';\n            }\n        };\n        function NullNode() {\n        }\n        NullNode.prototype = {\n            nodeName: '#null',\n            attr: { style: {} },\n            children: [],\n            remove: function () {\n            }\n        };\n        var NULL_NODE = new NullNode();\n        function Element(nodeName, attr, children) {\n            this.nodeName = nodeName;\n            this.attr = attr || {};\n            this.children = children || [];\n        }\n        Element.prototype = new Node();\n        Element.prototype.appendTo = function (parent) {\n            var node = document.createElement(this.nodeName);\n            var children = this.children;\n            for (var index = 0; index < children.length; index++) {\n                children[index].render(node, NULL_NODE);\n            }\n            parent.appendChild(node);\n            return node;\n        };\n        Element.prototype.render = function (parent, cached) {\n            var node;\n            if (cached.nodeName !== this.nodeName) {\n                cached.remove();\n                node = this.appendTo(parent);\n            } else {\n                node = cached.node;\n                var index;\n                var children = this.children;\n                var length = children.length;\n                var cachedChildren = cached.children;\n                var cachedLength = cachedChildren.length;\n                if (Math.abs(cachedLength - length) > 2) {\n                    this.render({\n                        appendChild: function (node) {\n                            parent.replaceChild(node, cached.node);\n                        }\n                    }, NULL_NODE);\n                    return;\n                }\n                for (index = 0; index < length; index++) {\n                    children[index].render(node, cachedChildren[index] || NULL_NODE);\n                }\n                for (index = length; index < cachedLength; index++) {\n                    cachedChildren[index].remove();\n                }\n            }\n            this.node = node;\n            this.syncAttributes(cached.attr);\n            this.removeAttributes(cached.attr);\n        };\n        Element.prototype.syncAttributes = function (cachedAttr) {\n            var attr = this.attr;\n            for (var name in attr) {\n                var value = attr[name];\n                var cachedValue = cachedAttr[name];\n                if (name === 'style') {\n                    this.setStyle(value, cachedValue);\n                } else if (value !== cachedValue) {\n                    this.setAttribute(name, value, cachedValue);\n                }\n            }\n        };\n        Element.prototype.setStyle = function (style, cachedValue) {\n            var node = this.node;\n            var key;\n            if (cachedValue) {\n                for (key in style) {\n                    if (style[key] !== cachedValue[key]) {\n                        node.style[key] = style[key];\n                    }\n                }\n            } else {\n                for (key in style) {\n                    node.style[key] = style[key];\n                }\n            }\n        };\n        Element.prototype.removeStyle = function (cachedStyle) {\n            var style = this.attr.style || {};\n            var node = this.node;\n            for (var key in cachedStyle) {\n                if (style[key] === undefined) {\n                    node.style[key] = '';\n                }\n            }\n        };\n        Element.prototype.removeAttributes = function (cachedAttr) {\n            var attr = this.attr;\n            for (var name in cachedAttr) {\n                if (name === 'style') {\n                    this.removeStyle(cachedAttr.style);\n                } else if (attr[name] === undefined) {\n                    this.removeAttribute(name);\n                }\n            }\n        };\n        Element.prototype.removeAttribute = function (name) {\n            var node = this.node;\n            if (name === 'style') {\n                node.style.cssText = '';\n            } else if (name === 'className') {\n                node.className = '';\n            } else {\n                node.removeAttribute(name);\n            }\n        };\n        Element.prototype.setAttribute = function (name, value) {\n            var node = this.node;\n            if (node[name] !== undefined) {\n                node[name] = value;\n            } else {\n                node.setAttribute(name, value);\n            }\n        };\n        Element.prototype.text = function () {\n            var str = '';\n            for (var i = 0; i < this.children.length; ++i) {\n                str += this.children[i].text();\n            }\n            return str;\n        };\n        function TextNode(nodeValue) {\n            this.nodeValue = String(nodeValue);\n        }\n        TextNode.prototype = new Node();\n        TextNode.prototype.nodeName = '#text';\n        TextNode.prototype.render = function (parent, cached) {\n            var node;\n            if (cached.nodeName !== this.nodeName) {\n                cached.remove();\n                node = document.createTextNode(this.nodeValue);\n                parent.appendChild(node);\n            } else {\n                node = cached.node;\n                if (this.nodeValue !== cached.nodeValue) {\n                    if (node.parentNode) {\n                        node.nodeValue = this.nodeValue;\n                    }\n                }\n            }\n            this.node = node;\n        };\n        TextNode.prototype.text = function () {\n            return this.nodeValue;\n        };\n        function HtmlNode(html) {\n            this.html = html;\n        }\n        HtmlNode.prototype = {\n            nodeName: '#html',\n            attr: {},\n            remove: function () {\n                for (var index = 0; index < this.nodes.length; index++) {\n                    var el = this.nodes[index];\n                    if (el.parentNode) {\n                        el.parentNode.removeChild(el);\n                    }\n                }\n            },\n            render: function (parent, cached) {\n                if (cached.nodeName !== this.nodeName || cached.html !== this.html) {\n                    cached.remove();\n                    var lastChild = parent.lastChild;\n                    insertHtml(parent, this.html);\n                    this.nodes = [];\n                    for (var child = lastChild ? lastChild.nextSibling : parent.firstChild; child; child = child.nextSibling) {\n                        this.nodes.push(child);\n                    }\n                } else {\n                    this.nodes = cached.nodes.slice(0);\n                }\n            }\n        };\n        var HTML_CONTAINER = document.createElement('div');\n        function insertHtml(node, html) {\n            HTML_CONTAINER.innerHTML = html;\n            while (HTML_CONTAINER.firstChild) {\n                node.appendChild(HTML_CONTAINER.firstChild);\n            }\n        }\n        function html(value) {\n            return new HtmlNode(value);\n        }\n        function element(nodeName, attrs, children) {\n            return new Element(nodeName, attrs, children);\n        }\n        function text(value) {\n            return new TextNode(value);\n        }\n        function Tree(root) {\n            this.root = root;\n            this.children = [];\n        }\n        Tree.prototype = {\n            html: html,\n            element: element,\n            text: text,\n            render: function (children) {\n                var cachedChildren = this.children;\n                var index;\n                var length;\n                for (index = 0, length = children.length; index < length; index++) {\n                    var cached = cachedChildren[index];\n                    if (!cached) {\n                        cached = NULL_NODE;\n                    } else if (!cached.node || !cached.node.parentNode) {\n                        cached.remove();\n                        cached = NULL_NODE;\n                    }\n                    children[index].render(this.root, cached);\n                }\n                for (index = length; index < cachedChildren.length; index++) {\n                    cachedChildren[index].remove();\n                }\n                this.children = children;\n            }\n        };\n        kendo.dom = {\n            html: html,\n            text: text,\n            element: element,\n            Tree: Tree,\n            Node: Node\n        };\n    }(window.kendo));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.ooxml', ['kendo.core'], f);\n}(function () {\n    var __meta__ = {\n        id: 'ooxml',\n        name: 'XLSX generation',\n        category: 'framework',\n        advanced: true,\n        depends: ['core']\n    };\n    (function ($, kendo) {\n        var RELS = '<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\\r\\n' + '<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\">' + '<Relationship Id=\"rId3\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties\" Target=\"docProps/app.xml\"/>' + '<Relationship Id=\"rId2\" Type=\"http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties\" Target=\"docProps/core.xml\"/>' + '<Relationship Id=\"rId1\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument\" Target=\"xl/workbook.xml\"/>' + '</Relationships>';\n        var CORE = kendo.template('<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\\r\\n' + '<cp:coreProperties xmlns:cp=\"http://schemas.openxmlformats.org/package/2006/metadata/core-properties\" ' + 'xmlns:dc=\"http://purl.org/dc/elements/1.1/\" xmlns:dcterms=\"http://purl.org/dc/terms/\" ' + 'xmlns:dcmitype=\"http://purl.org/dc/dcmitype/\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">' + '<dc:creator>${creator}</dc:creator>' + '<cp:lastModifiedBy>${lastModifiedBy}</cp:lastModifiedBy>' + '<dcterms:created xsi:type=\"dcterms:W3CDTF\">${created}</dcterms:created>' + '<dcterms:modified xsi:type=\"dcterms:W3CDTF\">${modified}</dcterms:modified>' + '</cp:coreProperties>');\n        var APP = kendo.template('<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\\r\\n' + '<Properties xmlns=\"http://schemas.openxmlformats.org/officeDocument/2006/extended-properties\" xmlns:vt=\"http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes\">' + '<Application>Microsoft Excel</Application>' + '<DocSecurity>0</DocSecurity>' + '<ScaleCrop>false</ScaleCrop>' + '<HeadingPairs>' + '<vt:vector size=\"2\" baseType=\"variant\">' + '<vt:variant>' + '<vt:lpstr>Worksheets</vt:lpstr>' + '</vt:variant>' + '<vt:variant>' + '<vt:i4>${sheets.length}</vt:i4>' + '</vt:variant>' + '</vt:vector>' + '</HeadingPairs>' + '<TitlesOfParts>' + '<vt:vector size=\"${sheets.length}\" baseType=\"lpstr\">' + '# for (var idx = 0; idx < sheets.length; idx++) { #' + '# if (sheets[idx].options.title) { #' + '<vt:lpstr>${sheets[idx].options.title}</vt:lpstr>' + '# } else { #' + '<vt:lpstr>Sheet${idx+1}</vt:lpstr>' + '# } #' + '# } #' + '</vt:vector>' + '</TitlesOfParts>' + '<LinksUpToDate>false</LinksUpToDate>' + '<SharedDoc>false</SharedDoc>' + '<HyperlinksChanged>false</HyperlinksChanged>' + '<AppVersion>14.0300</AppVersion>' + '</Properties>');\n        var CONTENT_TYPES = kendo.template('<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\\r\\n' + '<Types xmlns=\"http://schemas.openxmlformats.org/package/2006/content-types\">' + '<Default Extension=\"rels\" ContentType=\"application/vnd.openxmlformats-package.relationships+xml\" />' + '<Default Extension=\"xml\" ContentType=\"application/xml\" />' + '<Override PartName=\"/xl/workbook.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml\" />' + '<Override PartName=\"/xl/styles.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml\"/>' + '<Override PartName=\"/xl/sharedStrings.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml\"/>' + '# for (var idx = 1; idx <= count; idx++) { #' + '<Override PartName=\"/xl/worksheets/sheet${idx}.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml\" />' + '# } #' + '<Override PartName=\"/docProps/core.xml\" ContentType=\"application/vnd.openxmlformats-package.core-properties+xml\" />' + '<Override PartName=\"/docProps/app.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.extended-properties+xml\" />' + '</Types>');\n        var WORKBOOK = kendo.template('<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\\r\\n' + '<workbook xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\">' + '<fileVersion appName=\"xl\" lastEdited=\"5\" lowestEdited=\"5\" rupBuild=\"9303\" />' + '<workbookPr defaultThemeVersion=\"124226\" />' + '<bookViews>' + '<workbookView xWindow=\"240\" yWindow=\"45\" windowWidth=\"18195\" windowHeight=\"7995\" />' + '</bookViews>' + '<sheets>' + '# for (var idx = 0; idx < sheets.length; idx++) { #' + '# var options = sheets[idx].options; #' + '# var name = options.name || options.title #' + '# if (name) { #' + '<sheet name=\"${name}\" sheetId=\"${idx+1}\" r:id=\"rId${idx+1}\" />' + '# } else { #' + '<sheet name=\"Sheet${idx+1}\" sheetId=\"${idx+1}\" r:id=\"rId${idx+1}\" />' + '# } #' + '# } #' + '</sheets>' + '# if (filterNames.length || userNames.length) { #' + '<definedNames>' + ' # for (var di = 0; di < filterNames.length; di++) { #' + '<definedName name=\"_xlnm._FilterDatabase\" hidden=\"1\" localSheetId=\"${filterNames[di].localSheetId}\">' + '${filterNames[di].name}!$${filterNames[di].from}:$${filterNames[di].to}' + '</definedName>' + ' # } #' + ' # for (var i = 0; i < userNames.length; ++i) { #' + '<definedName name=\"${userNames[i].name}\" hidden=\"${userNames[i].hidden ? 1 : 0}\"' + ' # if (userNames[i].localSheetId != null) { # localSheetId=\"${userNames[i].localSheetId}\" # } #' + '>${userNames[i].value}</definedName>' + ' # } #' + '</definedNames>' + '# } #' + '<calcPr fullCalcOnLoad=\"1\" calcId=\"145621\" />' + '</workbook>');\n        var WORKSHEET = kendo.template('<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\\r\\n' + '<worksheet xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\" xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\" xmlns:x14ac=\"http://schemas.microsoft.com/office/spreadsheetml/2009/9/ac\" mc:Ignorable=\"x14ac\">' + '<dimension ref=\"A1\" />' + '<sheetViews>' + '<sheetView #if(index==0) {# tabSelected=\"1\" #}# workbookViewId=\"0\" #if (showGridLines === false) {# showGridLines=\"0\" #}#>' + '# if (frozenRows || frozenColumns) { #' + '<pane state=\"frozen\"' + '# if (frozenColumns) { #' + ' xSplit=\"${frozenColumns}\"' + '# } #' + '# if (frozenRows) { #' + ' ySplit=\"${frozenRows}\"' + '# } #' + ' topLeftCell=\"${String.fromCharCode(65 + (frozenColumns || 0))}${(frozenRows || 0)+1}\"' + '/>' + '# } #' + '</sheetView>' + '</sheetViews>' + '<sheetFormatPr x14ac:dyDescent=\"0.25\" defaultRowHeight=\"#= defaults.rowHeight ? defaults.rowHeight * 0.75 : 15 #\" ' + '# if (defaults.columnWidth) { # defaultColWidth=\"#= kendo.ooxml.toWidth(defaults.columnWidth) #\" # } #' + ' />' + '# if (defaultCellStyleId != null || (columns && columns.length > 0)) { #' + '<cols>' + '# if (!columns || !columns.length) { #' + '<col min=\"1\" max=\"16384\" style=\"${defaultCellStyleId}\" ' + '# if (defaults.columnWidth) { # width=\"#= kendo.ooxml.toWidth(defaults.columnWidth) #\" # } #' + ' />' + '# } #' + '# for (var ci = 0; ci < columns.length; ci++) { #' + '# var column = columns[ci]; #' + '# var columnIndex = typeof column.index === \"number\" ? column.index + 1 : (ci + 1); #' + '# if (column.width === 0) { #' + '<col #if(defaultCellStyleId!=null){# style=\"${defaultCellStyleId}\" #}#' + 'min=\"${columnIndex}\" max=\"${columnIndex}\" hidden=\"1\" customWidth=\"1\" />' + '# } else if (column.width) { #' + '<col #if(defaultCellStyleId!=null){# style=\"${defaultCellStyleId}\" #}#' + 'min=\"${columnIndex}\" max=\"${columnIndex}\" customWidth=\"1\"' + '# if (column.autoWidth) { #' + ' width=\"${((column.width*7+5)/7*256)/256}\" bestFit=\"1\"' + '# } else { #' + ' width=\"#= kendo.ooxml.toWidth(column.width) #\" ' + '# } #' + '/>' + '# } #' + '# } #' + '</cols>' + '# } #' + '<sheetData>' + '# for (var ri = 0; ri < data.length; ri++) { #' + '# var row = data[ri]; #' + '# var rowIndex = typeof row.index === \"number\" ? row.index + 1 : (ri + 1); #' + '<row r=\"${rowIndex}\" x14ac:dyDescent=\"0.25\" ' + '# if (row.height === 0) { # hidden=\"1\" # } ' + '  else if (row.height) { # ht=\"#= kendo.ooxml.toHeight(row.height) #\" customHeight=\"1\" # } #' + ' >' + '# for (var ci = 0; ci < row.data.length; ci++) { #' + '# var cell = row.data[ci];#' + '<c r=\"#=cell.ref#\"# if (cell.style) { # s=\"#=cell.style#\" # } ## if (cell.type) { # t=\"#=cell.type#\"# } #>' + '# if (cell.formula != null) { #' + '<f>${cell.formula}</f>' + '# } #' + '# if (cell.value != null) { #' + '<v>${cell.value}</v>' + '# } #' + '</c>' + '# } #' + '</row>' + '# } #' + '</sheetData>' + '# if (autoFilter) { #' + '<autoFilter ref=\"${autoFilter.from}:${autoFilter.to}\"/>' + '# } else if (filter) { #' + '#= kendo.ooxml.spreadsheetFilters(filter) #' + '# } #' + '# if (mergeCells.length) { #' + '<mergeCells count=\"${mergeCells.length}\">' + '# for (var ci = 0; ci < mergeCells.length; ci++) { #' + '<mergeCell ref=\"${mergeCells[ci]}\"/>' + '# } #' + '</mergeCells>' + '# } #' + '# if (validations.length) { #' + '<dataValidations>' + '# for (var vi = 0; vi < validations.length; vi++) { #' + '# var val = validations[vi]; #' + '<dataValidation sqref=\"#= val.sqref.join(\" \") #\"' + ' showErrorMessage=\"#= val.showErrorMessage #\"' + ' type=\"#= val.type #\"' + '# if (val.type != \"list\") {# operator=\"#= val.operator #\" # } #' + ' allowBlank=\"#= val.allowBlank #\"' + ' showDropDown=\"#= val.showDropDown #\"' + '# if (val.error) {# error=\"#= val.error #\" # } #' + '# if (val.errorTitle) {# errorTitle=\"#= val.errorTitle #\" # } #' + '>' + '# if (val.formula1) { #' + '<formula1>#: val.formula1 #</formula1>' + '# } #' + '# if (val.formula2) { #' + '<formula2>#: val.formula2 #</formula2>' + '# } #' + '</dataValidation>' + '# } #' + '</dataValidations>' + '# } #' + '# if (hyperlinks.length) { #' + '<hyperlinks>' + '# for (var hi = 0; hi < hyperlinks.length; hi++) { #' + '<hyperlink ref=\"${hyperlinks[hi].ref}\" r:id=\"rId${hi}\"/>' + '# } #' + '</hyperlinks>' + '# } #' + '<pageMargins left=\"0.7\" right=\"0.7\" top=\"0.75\" bottom=\"0.75\" header=\"0.3\" footer=\"0.3\" />' + '</worksheet>');\n        var WORKBOOK_RELS = kendo.template('<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\\r\\n' + '<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\">' + '# for (var idx = 1; idx <= count; idx++) { #' + '<Relationship Id=\"rId${idx}\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet\" Target=\"worksheets/sheet${idx}.xml\" />' + '# } #' + '<Relationship Id=\"rId${count+1}\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles\" Target=\"styles.xml\" />' + '<Relationship Id=\"rId${count+2}\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings\" Target=\"sharedStrings.xml\" />' + '</Relationships>');\n        var WORKSHEET_RELS = kendo.template('<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\\r\\n' + '<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\">' + '# for (var i = 0; i < hyperlinks.length; i++) { #' + '<Relationship Id=\"rId${i}\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink\" Target=\"${hyperlinks[i].target}\" TargetMode=\"External\" />' + '# } #' + '</Relationships>');\n        var SHARED_STRINGS = kendo.template('<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\\r\\n' + '<sst xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\" count=\"${count}\" uniqueCount=\"${uniqueCount}\">' + '# for (var index in indexes) { #' + '<si><t>${index.substring(1)}</t></si>' + '# } #' + '</sst>');\n        var STYLES = kendo.template('<?xml version=\"1.0\" encoding=\"UTF-8\"?>' + '<styleSheet' + ' xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\"' + ' xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"' + ' mc:Ignorable=\"x14ac\"' + ' xmlns:x14ac=\"http://schemas.microsoft.com/office/spreadsheetml/2009/9/ac\">' + '<numFmts count=\"${formats.length}\">' + '# for (var fi = 0; fi < formats.length; fi++) { #' + '# var format = formats[fi]; #' + '<numFmt formatCode=\"${format.format}\" numFmtId=\"${165+fi}\" />' + '# } #' + '</numFmts>' + '<fonts count=\"${fonts.length+1}\" x14ac:knownFonts=\"1\">' + '<font>' + '<sz val=\"11\" />' + '<color theme=\"1\" />' + '<name val=\"Calibri\" />' + '<family val=\"2\" />' + '<scheme val=\"minor\" />' + '</font>' + '# for (var fi = 0; fi < fonts.length; fi++) { #' + '# var font = fonts[fi]; #' + '<font>' + '# if (font.fontSize) { #' + '<sz val=\"${font.fontSize}\" />' + '# } else { #' + '<sz val=\"11\" />' + '# } #' + '# if (font.bold) { #' + '<b/>' + '# } #' + '# if (font.italic) { #' + '<i/>' + '# } #' + '# if (font.underline) { #' + '<u/>' + '# } #' + '# if (font.color) { #' + '<color rgb=\"${font.color}\" />' + '# } else { #' + '<color theme=\"1\" />' + '# } #' + '# if (font.fontFamily) { #' + '<name val=\"${font.fontFamily}\" />' + '<family val=\"2\" />' + '# } else { #' + '<name val=\"Calibri\" />' + '<family val=\"2\" />' + '<scheme val=\"minor\" />' + '# } #' + '</font>' + '# } #' + '</fonts>' + '<fills count=\"${fills.length+2}\">' + '<fill><patternFill patternType=\"none\"/></fill>' + '<fill><patternFill patternType=\"gray125\"/></fill>' + '# for (var fi = 0; fi < fills.length; fi++) { #' + '# var fill = fills[fi]; #' + '# if (fill.background) { #' + '<fill>' + '<patternFill patternType=\"solid\">' + '<fgColor rgb=\"${fill.background}\"/>' + '</patternFill>' + '</fill>' + '# } #' + '# } #' + '</fills>' + '<borders count=\"${borders.length+1}\">' + '<border><left/><right/><top/><bottom/><diagonal/></border>' + '# for (var bi = 0; bi < borders.length; bi++) { #' + '#= kendo.ooxml.borderTemplate(borders[bi]) #' + '# } #' + '</borders>' + '<cellStyleXfs count=\"1\">' + '<xf borderId=\"0\" fillId=\"0\" fontId=\"0\" />' + '</cellStyleXfs>' + '<cellXfs count=\"${styles.length+1}\">' + '<xf numFmtId=\"0\" fontId=\"0\" fillId=\"0\" borderId=\"0\" xfId=\"0\"/>' + '# for (var si = 0; si < styles.length; si++) { #' + '# var style = styles[si]; #' + '<xf xfId=\"0\"' + '# if (style.fontId) { #' + ' fontId=\"${style.fontId}\" applyFont=\"1\"' + '# } #' + '# if (style.fillId) { #' + ' fillId=\"${style.fillId}\" applyFill=\"1\"' + '# } #' + '# if (style.numFmtId) { #' + ' numFmtId=\"${style.numFmtId}\" applyNumberFormat=\"1\"' + '# } #' + '# if (style.textAlign || style.verticalAlign || style.wrap) { #' + ' applyAlignment=\"1\"' + '# } #' + '# if (style.borderId) { #' + ' borderId=\"${style.borderId}\" applyBorder=\"1\"' + '# } #' + '>' + '# if (style.textAlign || style.verticalAlign || style.wrap) { #' + '<alignment' + '# if (style.textAlign) { #' + ' horizontal=\"${style.textAlign}\"' + '# } #' + '# if (style.verticalAlign) { #' + ' vertical=\"${style.verticalAlign}\"' + '# } #' + '# if (style.wrap) { #' + ' wrapText=\"1\"' + '# } #' + '/>' + '# } #' + '</xf>' + '# } #' + '</cellXfs>' + '<cellStyles count=\"1\">' + '<cellStyle name=\"Normal\" xfId=\"0\" builtinId=\"0\"/>' + '</cellStyles>' + '<dxfs count=\"0\" />' + '<tableStyles count=\"0\" defaultTableStyle=\"TableStyleMedium2\" defaultPivotStyle=\"PivotStyleMedium9\" />' + '</styleSheet>');\n        function numChar(colIndex) {\n            var letter = Math.floor(colIndex / 26) - 1;\n            return (letter >= 0 ? numChar(letter) : '') + String.fromCharCode(65 + colIndex % 26);\n        }\n        function ref(rowIndex, colIndex) {\n            return numChar(colIndex) + (rowIndex + 1);\n        }\n        function $ref(rowIndex, colIndex) {\n            return numChar(colIndex) + '$' + (rowIndex + 1);\n        }\n        function filterRowIndex(options) {\n            var frozenRows = options.frozenRows || (options.freezePane || {}).rowSplit || 1;\n            return frozenRows - 1;\n        }\n        function toWidth(px) {\n            return (px / 7 * 100 + 0.5) / 100;\n        }\n        function toHeight(px) {\n            return px * 0.75;\n        }\n        function stripFunnyChars(value) {\n            return (value + '').replace(/[\\x00-\\x08]/g, '').replace(/\\n/g, '\\r\\n');\n        }\n        var DATE_EPOCH = new Date(1900, 0, 0);\n        var Worksheet = kendo.Class.extend({\n            init: function (options, sharedStrings, styles, borders) {\n                this.options = options;\n                this._strings = sharedStrings;\n                this._styles = styles;\n                this._borders = borders;\n                this._validations = {};\n            },\n            relsToXML: function () {\n                var hyperlinks = this.options.hyperlinks || [];\n                if (!hyperlinks.length) {\n                    return '';\n                }\n                return WORKSHEET_RELS({ hyperlinks: hyperlinks });\n            },\n            toXML: function (index) {\n                var mergeCells = this.options.mergedCells || [];\n                var rows = this.options.rows || [];\n                var data = inflate(rows, mergeCells);\n                this._readCells(data);\n                var autoFilter = this.options.filter;\n                var filter;\n                if (autoFilter && typeof autoFilter.from === 'number' && typeof autoFilter.to === 'number') {\n                    autoFilter = {\n                        from: ref(filterRowIndex(this.options), autoFilter.from),\n                        to: ref(filterRowIndex(this.options), autoFilter.to)\n                    };\n                } else if (autoFilter && autoFilter.ref && autoFilter.columns) {\n                    filter = autoFilter;\n                    autoFilter = null;\n                }\n                var validations = [];\n                for (var i in this._validations) {\n                    if (Object.prototype.hasOwnProperty.call(this._validations, i)) {\n                        validations.push(this._validations[i]);\n                    }\n                }\n                var defaultCellStyleId = null;\n                if (this.options.defaultCellStyle) {\n                    defaultCellStyleId = this._lookupStyle(this.options.defaultCellStyle);\n                }\n                var freezePane = this.options.freezePane || {};\n                return WORKSHEET({\n                    frozenColumns: this.options.frozenColumns || freezePane.colSplit,\n                    frozenRows: this.options.frozenRows || freezePane.rowSplit,\n                    columns: this.options.columns,\n                    defaults: this.options.defaults || {},\n                    data: data,\n                    index: index,\n                    mergeCells: mergeCells,\n                    autoFilter: autoFilter,\n                    filter: filter,\n                    showGridLines: this.options.showGridLines,\n                    hyperlinks: this.options.hyperlinks || [],\n                    validations: validations,\n                    defaultCellStyleId: defaultCellStyleId\n                });\n            },\n            _lookupString: function (value) {\n                var key = '$' + value;\n                var index = this._strings.indexes[key];\n                if (index !== undefined) {\n                    value = index;\n                } else {\n                    value = this._strings.indexes[key] = this._strings.uniqueCount;\n                    this._strings.uniqueCount++;\n                }\n                this._strings.count++;\n                return value;\n            },\n            _lookupStyle: function (style) {\n                var json = kendo.stringify(style);\n                if (json == '{}') {\n                    return 0;\n                }\n                var index = $.inArray(json, this._styles);\n                if (index < 0) {\n                    index = this._styles.push(json) - 1;\n                }\n                return index + 1;\n            },\n            _lookupBorder: function (border) {\n                var json = kendo.stringify(border);\n                if (json == '{}') {\n                    return;\n                }\n                var index = $.inArray(json, this._borders);\n                if (index < 0) {\n                    index = this._borders.push(json) - 1;\n                }\n                return index + 1;\n            },\n            _readCells: function (rowData) {\n                for (var i = 0; i < rowData.length; i++) {\n                    var row = rowData[i];\n                    var cells = row.cells;\n                    row.data = [];\n                    for (var j = 0; j < cells.length; j++) {\n                        var cellData = this._cell(cells[j], row.index, j);\n                        if (cellData) {\n                            row.data.push(cellData);\n                        }\n                    }\n                }\n            },\n            _cell: function (data, rowIndex, cellIndex) {\n                if (!data || data === EMPTY_CELL) {\n                    return null;\n                }\n                var value = data.value;\n                var border = {};\n                if (data.borderLeft) {\n                    border.left = data.borderLeft;\n                }\n                if (data.borderRight) {\n                    border.right = data.borderRight;\n                }\n                if (data.borderTop) {\n                    border.top = data.borderTop;\n                }\n                if (data.borderBottom) {\n                    border.bottom = data.borderBottom;\n                }\n                border = this._lookupBorder(border);\n                var defStyle = this.options.defaultCellStyle || {};\n                var style = { borderId: border };\n                (function (add) {\n                    add('color');\n                    add('background');\n                    add('bold');\n                    add('italic');\n                    add('underline');\n                    if (!add('fontFamily')) {\n                        add('fontName', 'fontFamily');\n                    }\n                    add('fontSize');\n                    add('format');\n                    if (!add('textAlign')) {\n                        add('hAlign', 'textAlign');\n                    }\n                    if (!add('verticalAlign')) {\n                        add('vAlign', 'verticalAlign');\n                    }\n                    add('wrap');\n                }(function (prop, target) {\n                    var val = data[prop];\n                    if (val === undefined) {\n                        val = defStyle[prop];\n                    }\n                    if (val !== undefined) {\n                        style[target || prop] = val;\n                        return true;\n                    }\n                }));\n                var columns = this.options.columns || [];\n                var column = columns[cellIndex];\n                var type = typeof value;\n                if (column && column.autoWidth) {\n                    var displayValue = value;\n                    if (type === 'number') {\n                        displayValue = kendo.toString(value, data.format);\n                    }\n                    column.width = Math.max(column.width || 0, (displayValue + '').length);\n                }\n                if (type === 'string') {\n                    value = stripFunnyChars(value);\n                    value = this._lookupString(value);\n                    type = 's';\n                } else if (type === 'number') {\n                    type = 'n';\n                } else if (type === 'boolean') {\n                    type = 'b';\n                    value = +value;\n                } else if (value && value.getTime) {\n                    type = null;\n                    var offset = (value.getTimezoneOffset() - DATE_EPOCH.getTimezoneOffset()) * kendo.date.MS_PER_MINUTE;\n                    value = (value - DATE_EPOCH - offset) / kendo.date.MS_PER_DAY + 1;\n                    if (!style.format) {\n                        style.format = 'mm-dd-yy';\n                    }\n                } else {\n                    type = null;\n                    value = null;\n                }\n                style = this._lookupStyle(style);\n                var cellName = ref(rowIndex, cellIndex);\n                if (data.validation) {\n                    this._addValidation(data.validation, cellName);\n                }\n                return {\n                    value: value,\n                    formula: data.formula,\n                    type: type,\n                    style: style,\n                    ref: cellName\n                };\n            },\n            _addValidation: function (v, ref) {\n                var tmp = {\n                    showErrorMessage: v.type == 'reject' ? 1 : 0,\n                    formula1: v.from,\n                    formula2: v.to,\n                    type: MAP_EXCEL_TYPE[v.dataType] || v.dataType,\n                    operator: MAP_EXCEL_OPERATOR[v.comparerType] || v.comparerType,\n                    allowBlank: v.allowNulls ? 1 : 0,\n                    showDropDown: v.showButton ? 0 : 1,\n                    error: v.messageTemplate,\n                    errorTitle: v.titleTemplate\n                };\n                var json = JSON.stringify(tmp);\n                if (!this._validations[json]) {\n                    this._validations[json] = tmp;\n                    tmp.sqref = [];\n                }\n                this._validations[json].sqref.push(ref);\n            }\n        });\n        var MAP_EXCEL_OPERATOR = {\n            greaterThanOrEqualTo: 'greaterThanOrEqual',\n            lessThanOrEqualTo: 'lessThanOrEqual'\n        };\n        var MAP_EXCEL_TYPE = { number: 'decimal' };\n        var defaultFormats = {\n            'General': 0,\n            '0': 1,\n            '0.00': 2,\n            '#,##0': 3,\n            '#,##0.00': 4,\n            '0%': 9,\n            '0.00%': 10,\n            '0.00E+00': 11,\n            '# ?/?': 12,\n            '# ??/??': 13,\n            'mm-dd-yy': 14,\n            'd-mmm-yy': 15,\n            'd-mmm': 16,\n            'mmm-yy': 17,\n            'h:mm AM/PM': 18,\n            'h:mm:ss AM/PM': 19,\n            'h:mm': 20,\n            'h:mm:ss': 21,\n            'm/d/yy h:mm': 22,\n            '#,##0 ;(#,##0)': 37,\n            '#,##0 ;[Red](#,##0)': 38,\n            '#,##0.00;(#,##0.00)': 39,\n            '#,##0.00;[Red](#,##0.00)': 40,\n            'mm:ss': 45,\n            '[h]:mm:ss': 46,\n            'mmss.0': 47,\n            '##0.0E+0': 48,\n            '@': 49,\n            '[$-404]e/m/d': 27,\n            'm/d/yy': 30,\n            't0': 59,\n            't0.00': 60,\n            't#,##0': 61,\n            't#,##0.00': 62,\n            't0%': 67,\n            't0.00%': 68,\n            't# ?/?': 69,\n            't# ??/??': 70\n        };\n        function convertColor(color) {\n            if (color.length < 6) {\n                color = color.replace(/(\\w)/g, function ($0, $1) {\n                    return $1 + $1;\n                });\n            }\n            color = color.substring(1).toUpperCase();\n            if (color.length < 8) {\n                color = 'FF' + color;\n            }\n            return color;\n        }\n        var Workbook = kendo.Class.extend({\n            init: function (options) {\n                this.options = options || {};\n                this._strings = {\n                    indexes: {},\n                    count: 0,\n                    uniqueCount: 0\n                };\n                this._styles = [];\n                this._borders = [];\n                this._sheets = $.map(this.options.sheets || [], $.proxy(function (options) {\n                    options.defaults = this.options;\n                    return new Worksheet(options, this._strings, this._styles, this._borders);\n                }, this));\n            },\n            toDataURL: function () {\n                if (typeof JSZip === 'undefined') {\n                    throw new Error('JSZip not found. Check http://docs.telerik.com/kendo-ui/framework/excel/introduction#requirements for more details.');\n                }\n                var zip = new JSZip();\n                var docProps = zip.folder('docProps');\n                docProps.file('core.xml', CORE({\n                    creator: this.options.creator || 'Kendo UI',\n                    lastModifiedBy: this.options.creator || 'Kendo UI',\n                    created: this.options.date || new Date().toJSON(),\n                    modified: this.options.date || new Date().toJSON()\n                }));\n                var sheetCount = this._sheets.length;\n                docProps.file('app.xml', APP({ sheets: this._sheets }));\n                var rels = zip.folder('_rels');\n                rels.file('.rels', RELS);\n                var xl = zip.folder('xl');\n                var xlRels = xl.folder('_rels');\n                xlRels.file('workbook.xml.rels', WORKBOOK_RELS({ count: sheetCount }));\n                var sheetIds = {};\n                xl.file('workbook.xml', WORKBOOK({\n                    sheets: this._sheets,\n                    filterNames: $.map(this._sheets, function (sheet, index) {\n                        var options = sheet.options;\n                        var sheetName = options.name || options.title || 'Sheet' + (index + 1);\n                        sheetIds[sheetName.toLowerCase()] = index;\n                        var filter = options.filter;\n                        if (filter && typeof filter.from !== 'undefined' && typeof filter.to !== 'undefined') {\n                            return {\n                                localSheetId: index,\n                                name: sheetName,\n                                from: $ref(filterRowIndex(options), filter.from),\n                                to: $ref(filterRowIndex(options), filter.to)\n                            };\n                        }\n                    }),\n                    userNames: $.map(this.options.names || [], function (def) {\n                        return {\n                            name: def.localName,\n                            localSheetId: def.sheet ? sheetIds[def.sheet.toLowerCase()] : null,\n                            value: def.value,\n                            hidden: def.hidden\n                        };\n                    })\n                }));\n                var worksheets = xl.folder('worksheets');\n                var sheetRels = worksheets.folder('_rels');\n                for (var idx = 0; idx < sheetCount; idx++) {\n                    var sheet = this._sheets[idx];\n                    var sheetName = kendo.format('sheet{0}.xml', idx + 1);\n                    var relsXml = sheet.relsToXML();\n                    if (relsXml) {\n                        sheetRels.file(sheetName + '.rels', relsXml);\n                    }\n                    worksheets.file(sheetName, sheet.toXML(idx));\n                }\n                var borders = $.map(this._borders, $.parseJSON);\n                var styles = $.map(this._styles, $.parseJSON);\n                var hasFont = function (style) {\n                    return style.underline || style.bold || style.italic || style.color || style.fontFamily || style.fontSize;\n                };\n                var fonts = $.map(styles, function (style) {\n                    if (style.color) {\n                        style.color = convertColor(style.color);\n                    }\n                    if (hasFont(style)) {\n                        return style;\n                    }\n                });\n                var formats = $.map(styles, function (style) {\n                    if (style.format && defaultFormats[style.format] === undefined) {\n                        return style;\n                    }\n                });\n                var fills = $.map(styles, function (style) {\n                    if (style.background) {\n                        style.background = convertColor(style.background);\n                        return style;\n                    }\n                });\n                xl.file('styles.xml', STYLES({\n                    fonts: fonts,\n                    fills: fills,\n                    formats: formats,\n                    borders: borders,\n                    styles: $.map(styles, function (style) {\n                        var result = {};\n                        if (hasFont(style)) {\n                            result.fontId = $.inArray(style, fonts) + 1;\n                        }\n                        if (style.background) {\n                            result.fillId = $.inArray(style, fills) + 2;\n                        }\n                        result.textAlign = style.textAlign;\n                        result.verticalAlign = style.verticalAlign;\n                        result.wrap = style.wrap;\n                        result.borderId = style.borderId;\n                        if (style.format) {\n                            if (defaultFormats[style.format] !== undefined) {\n                                result.numFmtId = defaultFormats[style.format];\n                            } else {\n                                result.numFmtId = 165 + $.inArray(style, formats);\n                            }\n                        }\n                        return result;\n                    })\n                }));\n                xl.file('sharedStrings.xml', SHARED_STRINGS(this._strings));\n                zip.file('[Content_Types].xml', CONTENT_TYPES({ count: sheetCount }));\n                return 'data:application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;base64,' + zip.generate({ compression: 'DEFLATE' });\n            }\n        });\n        function borderStyle(width) {\n            var alias = 'thin';\n            if (width === 2) {\n                alias = 'medium';\n            } else if (width === 3) {\n                alias = 'thick';\n            }\n            return alias;\n        }\n        function borderSideTemplate(name, style) {\n            var result = '';\n            if (style) {\n                result += '<' + name + ' style=\"' + borderStyle(style.size) + '\">';\n                if (style.color) {\n                    result += '<color rgb=\"' + convertColor(style.color) + '\"/>';\n                }\n                result += '</' + name + '>';\n            }\n            return result;\n        }\n        function borderTemplate(border) {\n            return '<border>' + borderSideTemplate('left', border.left) + borderSideTemplate('right', border.right) + borderSideTemplate('top', border.top) + borderSideTemplate('bottom', border.bottom) + '</border>';\n        }\n        var EMPTY_CELL = {};\n        function inflate(rows, mergedCells) {\n            var rowData = [];\n            var rowsByIndex = [];\n            indexRows(rows, function (row, index) {\n                var data = {\n                    _source: row,\n                    index: index,\n                    height: row.height,\n                    cells: []\n                };\n                rowData.push(data);\n                rowsByIndex[index] = data;\n            });\n            var sorted = sortByIndex(rowData).slice(0);\n            var ctx = {\n                rowData: rowData,\n                rowsByIndex: rowsByIndex,\n                mergedCells: mergedCells\n            };\n            for (var i = 0; i < sorted.length; i++) {\n                fillCells(sorted[i], ctx);\n                delete sorted[i]._source;\n            }\n            return sortByIndex(rowData);\n        }\n        function indexRows(rows, callback) {\n            for (var i = 0; i < rows.length; i++) {\n                var row = rows[i];\n                if (!row) {\n                    continue;\n                }\n                var index = row.index;\n                if (typeof index !== 'number') {\n                    index = i;\n                }\n                callback(row, index);\n            }\n        }\n        function sortByIndex(items) {\n            return items.sort(function (a, b) {\n                return a.index - b.index;\n            });\n        }\n        function pushUnique(array, el) {\n            if (array.indexOf(el) < 0) {\n                array.push(el);\n            }\n        }\n        function getSpan(mergedCells, ref) {\n            ref = ref;\n            for (var i = 0; i < mergedCells.length; ++i) {\n                var range = mergedCells[i];\n                var topLeft = range.substr(0, 2);\n                if (topLeft == ref) {\n                    var bottomRight = range.substr(3);\n                    topLeft = parseRef(topLeft);\n                    bottomRight = parseRef(bottomRight);\n                    return {\n                        rowSpan: bottomRight.row - topLeft.row + 1,\n                        colSpan: bottomRight.col - topLeft.col + 1\n                    };\n                }\n            }\n        }\n        function parseRef(ref) {\n            function getcol(str) {\n                str = str.toUpperCase();\n                for (var col = 0, i = 0; i < str.length; ++i) {\n                    col = col * 26 + str.charCodeAt(i) - 64;\n                }\n                return col - 1;\n            }\n            function getrow(str) {\n                return parseInt(str, 10) - 1;\n            }\n            var m = /^([a-z]+)(\\d+)$/i.exec(ref);\n            return {\n                row: getrow(m[2]),\n                col: getcol(m[1])\n            };\n        }\n        function fillCells(data, ctx) {\n            var row = data._source;\n            var rowIndex = data.index;\n            var cells = row.cells;\n            var cellData = data.cells;\n            if (!cells) {\n                return;\n            }\n            for (var i = 0; i < cells.length; i++) {\n                var cell = cells[i] || EMPTY_CELL;\n                var rowSpan = cell.rowSpan || 1;\n                var colSpan = cell.colSpan || 1;\n                var cellIndex = insertCell(cellData, cell);\n                var topLeftRef = ref(rowIndex, cellIndex);\n                if (rowSpan == 1 && colSpan == 1) {\n                    var tmp = getSpan(ctx.mergedCells, topLeftRef);\n                    if (tmp) {\n                        colSpan = tmp.colSpan;\n                        rowSpan = tmp.rowSpan;\n                    }\n                }\n                spanCell(cell, cellData, cellIndex, colSpan);\n                if (rowSpan > 1 || colSpan > 1) {\n                    pushUnique(ctx.mergedCells, topLeftRef + ':' + ref(rowIndex + rowSpan - 1, cellIndex + colSpan - 1));\n                }\n                if (rowSpan > 1) {\n                    for (var ri = rowIndex + 1; ri < rowIndex + rowSpan; ri++) {\n                        var nextRow = ctx.rowsByIndex[ri];\n                        if (!nextRow) {\n                            nextRow = ctx.rowsByIndex[ri] = {\n                                index: ri,\n                                cells: []\n                            };\n                            ctx.rowData.push(nextRow);\n                        }\n                        spanCell(cell, nextRow.cells, cellIndex - 1, colSpan + 1);\n                    }\n                }\n            }\n        }\n        function insertCell(data, cell) {\n            var index;\n            if (typeof cell.index === 'number') {\n                index = cell.index;\n                insertCellAt(data, cell, cell.index);\n            } else {\n                index = appendCell(data, cell);\n            }\n            return index;\n        }\n        function insertCellAt(data, cell, index) {\n            data[index] = cell;\n        }\n        function appendCell(data, cell) {\n            var index = data.length;\n            for (var i = 0; i < data.length + 1; i++) {\n                if (!data[i]) {\n                    data[i] = cell;\n                    index = i;\n                    break;\n                }\n            }\n            return index;\n        }\n        function spanCell(cell, row, startIndex, colSpan) {\n            for (var i = 1; i < colSpan; i++) {\n                var tmp = {\n                    borderTop: cell.borderTop,\n                    borderRight: cell.borderRight,\n                    borderBottom: cell.borderBottom,\n                    borderLeft: cell.borderLeft\n                };\n                insertCellAt(row, tmp, startIndex + i);\n            }\n        }\n        var SPREADSHEET_FILTERS = kendo.template('<autoFilter ref=\"${ref}\">' + '# for (var i = 0; i < columns.length; ++i) { #' + '# var col = columns[i]; #' + '<filterColumn colId=\"${col.index}\">' + '#= generators[col.filter](col) #' + '</filterColumn>' + '# } #' + '</autoFilter>');\n        var SPREADSHEET_CUSTOM_FILTER = kendo.template('<customFilters# if (logic == \"and\") {# and=\"1\"# } #>' + '# for (var i = 0; i < criteria.length; ++i) { #' + '# var f = criteria[i]; #' + '# var op = kendo.ooxml.spreadsheetFilters.customOperator(f); #' + '# var val = kendo.ooxml.spreadsheetFilters.customValue(f); #' + '<customFilter# if (op) {# operator=\"${op}\"#}# val=\"${val}\"/>' + '# } #' + '</customFilters>');\n        var SPREADSHEET_DYNAMIC_FILTER = kendo.template('<dynamicFilter type=\"${kendo.ooxml.spreadsheetFilters.dynamicFilterType(type)}\" />');\n        var SPREADSHEET_TOP_FILTER = kendo.template('<top10 percent=\"#= /percent$/i.test(type) ? 1 : 0 #\"' + ' top=\"#= /^top/i.test(type) ? 1 : 0 #\" ' + ' val=\"#: value #\" />');\n        var SPREADSHEET_VALUE_FILTER = kendo.template('<filters# if (blanks) {# blank=\"1\"#}#>' + '# for (var i = 0; i < values.length; ++i) { #' + '<filter val=\"${values[i]}\" />' + '# } #' + '</filters>');\n        function spreadsheetFilters(filter) {\n            return SPREADSHEET_FILTERS({\n                ref: filter.ref,\n                columns: filter.columns,\n                generators: {\n                    custom: SPREADSHEET_CUSTOM_FILTER,\n                    dynamic: SPREADSHEET_DYNAMIC_FILTER,\n                    top: SPREADSHEET_TOP_FILTER,\n                    value: SPREADSHEET_VALUE_FILTER\n                }\n            });\n        }\n        spreadsheetFilters.customOperator = function (f) {\n            return {\n                eq: 'equal',\n                gt: 'greaterThan',\n                gte: 'greaterThanOrEqual',\n                lt: 'lessThan',\n                lte: 'lessThanOrEqual',\n                ne: 'notEqual',\n                doesnotstartwith: 'notEqual',\n                doesnotendwith: 'notEqual',\n                doesnotcontain: 'notEqual',\n                doesnotmatch: 'notEqual'\n            }[f.operator.toLowerCase()];\n        };\n        spreadsheetFilters.customValue = function (f) {\n            function esc(str) {\n                return str.replace(/([*?])/g, '~$1');\n            }\n            switch (f.operator.toLowerCase()) {\n            case 'startswith':\n            case 'doesnotstartwith':\n                return esc(f.value) + '*';\n            case 'endswith':\n            case 'doesnotendwith':\n                return '*' + esc(f.value);\n            case 'contains':\n            case 'doesnotcontain':\n                return '*' + esc(f.value) + '*';\n            }\n            return f.value;\n        };\n        spreadsheetFilters.dynamicFilterType = function (type) {\n            return {\n                quarter1: 'Q1',\n                quarter2: 'Q2',\n                quarter3: 'Q3',\n                quarter4: 'Q4',\n                january: 'M1',\n                february: 'M2',\n                march: 'M3',\n                april: 'M4',\n                may: 'M5',\n                june: 'M6',\n                july: 'M7',\n                august: 'M8',\n                september: 'M9',\n                october: 'M10',\n                november: 'M11',\n                december: 'M12'\n            }[type.toLowerCase()] || type;\n        };\n        kendo.ooxml = {\n            Workbook: Workbook,\n            Worksheet: Worksheet,\n            toWidth: toWidth,\n            toHeight: toHeight,\n            borderTemplate: borderTemplate,\n            spreadsheetFilters: spreadsheetFilters\n        };\n    }(kendo.jQuery, kendo));\n    return kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.excel', [\n        'kendo.core',\n        'kendo.data',\n        'kendo.ooxml'\n    ], f);\n}(function () {\n    var __meta__ = {\n        id: 'excel',\n        name: 'Excel export',\n        category: 'framework',\n        advanced: true,\n        mixin: true,\n        depends: [\n            'data',\n            'ooxml'\n        ]\n    };\n    (function ($, kendo) {\n        kendo.ExcelExporter = kendo.Class.extend({\n            init: function (options) {\n                options.columns = this._trimColumns(options.columns || []);\n                this.allColumns = $.map(this._leafColumns(options.columns || []), this._prepareColumn);\n                this.columns = $.grep(this.allColumns, function (column) {\n                    return !column.hidden;\n                });\n                this.options = options;\n                var dataSource = options.dataSource;\n                if (dataSource instanceof kendo.data.DataSource) {\n                    this.dataSource = new dataSource.constructor($.extend({}, dataSource.options, {\n                        page: options.allPages ? 0 : dataSource.page(),\n                        filter: dataSource.filter(),\n                        pageSize: options.allPages ? dataSource.total() : dataSource.pageSize(),\n                        sort: dataSource.sort(),\n                        group: dataSource.group(),\n                        aggregate: dataSource.aggregate()\n                    }));\n                    var data = dataSource.data();\n                    if (data.length > 0) {\n                        this.dataSource._data = data;\n                        var transport = this.dataSource.transport;\n                        if (dataSource._isServerGrouped() && transport.options && transport.options.data) {\n                            transport.options.data = null;\n                        }\n                    }\n                } else {\n                    this.dataSource = kendo.data.DataSource.create(dataSource);\n                }\n            },\n            _trimColumns: function (columns) {\n                var that = this;\n                return $.grep(columns, function (column) {\n                    var result = !!column.field;\n                    if (!result && column.columns) {\n                        result = that._trimColumns(column.columns).length > 0;\n                    }\n                    return result;\n                });\n            },\n            _leafColumns: function (columns) {\n                var result = [];\n                for (var idx = 0; idx < columns.length; idx++) {\n                    if (!columns[idx].columns) {\n                        result.push(columns[idx]);\n                        continue;\n                    }\n                    result = result.concat(this._leafColumns(columns[idx].columns));\n                }\n                return result;\n            },\n            workbook: function () {\n                return $.Deferred($.proxy(function (d) {\n                    this.dataSource.fetch().then($.proxy(function () {\n                        var workbook = {\n                            sheets: [{\n                                    columns: this._columns(),\n                                    rows: this._rows(),\n                                    freezePane: this._freezePane(),\n                                    filter: this._filter()\n                                }]\n                        };\n                        d.resolve(workbook, this.dataSource.view());\n                    }, this));\n                }, this)).promise();\n            },\n            _prepareColumn: function (column) {\n                if (!column.field) {\n                    return;\n                }\n                var value = function (dataItem) {\n                    return dataItem.get(column.field);\n                };\n                var values = null;\n                if (column.values) {\n                    values = {};\n                    $.each(column.values, function () {\n                        values[this.value] = this.text;\n                    });\n                    value = function (dataItem) {\n                        return values[dataItem.get(column.field)];\n                    };\n                }\n                return $.extend({}, column, {\n                    value: value,\n                    values: values,\n                    groupHeaderTemplate: kendo.template(column.groupHeaderTemplate || '#= title #: #= value #'),\n                    groupFooterTemplate: column.groupFooterTemplate ? kendo.template(column.groupFooterTemplate) : null,\n                    footerTemplate: column.footerTemplate ? kendo.template(column.footerTemplate) : null\n                });\n            },\n            _filter: function () {\n                if (!this.options.filterable) {\n                    return null;\n                }\n                var depth = this._depth();\n                return {\n                    from: depth,\n                    to: depth + this.columns.length - 1\n                };\n            },\n            _dataRow: function (dataItem, level, depth) {\n                if (this._hierarchical()) {\n                    level = this.dataSource.level(dataItem) + 1;\n                }\n                var cells = [];\n                for (var li = 0; li < level; li++) {\n                    cells[li] = {\n                        background: '#dfdfdf',\n                        color: '#333'\n                    };\n                }\n                if (depth && dataItem.items) {\n                    var column = $.grep(this.allColumns, function (column) {\n                        return column.field == dataItem.field;\n                    })[0];\n                    var title = column && column.title ? column.title : dataItem.field;\n                    var template = column ? column.groupHeaderTemplate : null;\n                    var value = title + ': ' + dataItem.value;\n                    var group = $.extend({\n                        title: title,\n                        field: dataItem.field,\n                        value: column && column.values ? column.values[dataItem.value] : dataItem.value,\n                        aggregates: dataItem.aggregates,\n                        items: dataItem.items\n                    }, dataItem.aggregates[dataItem.field]);\n                    if (template) {\n                        value = template(group);\n                    }\n                    cells.push({\n                        value: value,\n                        background: '#dfdfdf',\n                        color: '#333',\n                        colSpan: this.columns.length + depth - level\n                    });\n                    var rows = this._dataRows(dataItem.items, level + 1);\n                    rows.unshift({\n                        type: 'group-header',\n                        cells: cells\n                    });\n                    return rows.concat(this._footer(dataItem));\n                } else {\n                    var dataCells = [];\n                    for (var ci = 0; ci < this.columns.length; ci++) {\n                        dataCells[ci] = this._cell(dataItem, this.columns[ci]);\n                    }\n                    if (this._hierarchical()) {\n                        dataCells[0].colSpan = depth - level + 1;\n                    }\n                    return [{\n                            type: 'data',\n                            cells: cells.concat(dataCells)\n                        }];\n                }\n            },\n            _dataRows: function (dataItems, level) {\n                var depth = this._depth();\n                var rows = [];\n                for (var i = 0; i < dataItems.length; i++) {\n                    rows.push.apply(rows, this._dataRow(dataItems[i], level, depth));\n                }\n                return rows;\n            },\n            _footer: function (dataItem) {\n                var rows = [];\n                var footer = false;\n                var cells = $.map(this.columns, $.proxy(function (column) {\n                    if (column.groupFooterTemplate) {\n                        var groupData = {\n                            group: {\n                                items: dataItem.items,\n                                field: dataItem.field,\n                                value: dataItem.value\n                            }\n                        };\n                        footer = true;\n                        return {\n                            background: '#dfdfdf',\n                            color: '#333',\n                            value: column.groupFooterTemplate($.extend({}, this.dataSource.aggregates(), dataItem.aggregates, dataItem.aggregates[column.field], groupData))\n                        };\n                    } else {\n                        return {\n                            background: '#dfdfdf',\n                            color: '#333'\n                        };\n                    }\n                }, this));\n                if (footer) {\n                    rows.push({\n                        type: 'group-footer',\n                        cells: $.map(new Array(this.dataSource.group().length), function () {\n                            return {\n                                background: '#dfdfdf',\n                                color: '#333'\n                            };\n                        }).concat(cells)\n                    });\n                }\n                return rows;\n            },\n            _isColumnVisible: function (column) {\n                return this._visibleColumns([column]).length > 0 && (column.field || column.columns);\n            },\n            _visibleColumns: function (columns) {\n                var that = this;\n                return $.grep(columns, function (column) {\n                    var result = !column.hidden;\n                    if (result && column.columns) {\n                        result = that._visibleColumns(column.columns).length > 0;\n                    }\n                    return result;\n                });\n            },\n            _headerRow: function (row, groups) {\n                var headers = $.map(row.cells, function (cell) {\n                    return {\n                        background: '#7a7a7a',\n                        color: '#fff',\n                        value: cell.title,\n                        colSpan: cell.colSpan > 1 ? cell.colSpan : 1,\n                        rowSpan: row.rowSpan > 1 && !cell.colSpan ? row.rowSpan : 1\n                    };\n                });\n                if (this._hierarchical()) {\n                    headers[0].colSpan = this._depth() + 1;\n                }\n                return {\n                    type: 'header',\n                    cells: $.map(new Array(groups.length), function () {\n                        return {\n                            background: '#7a7a7a',\n                            color: '#fff'\n                        };\n                    }).concat(headers)\n                };\n            },\n            _prependHeaderRows: function (rows) {\n                var groups = this.dataSource.group();\n                var headerRows = [{\n                        rowSpan: 1,\n                        cells: [],\n                        index: 0\n                    }];\n                this._prepareHeaderRows(headerRows, this.options.columns);\n                for (var idx = headerRows.length - 1; idx >= 0; idx--) {\n                    rows.unshift(this._headerRow(headerRows[idx], groups));\n                }\n            },\n            _prepareHeaderRows: function (rows, columns, parentCell, parentRow) {\n                var row = parentRow || rows[rows.length - 1];\n                var childRow = rows[row.index + 1];\n                var totalColSpan = 0;\n                var column;\n                var cell;\n                for (var idx = 0; idx < columns.length; idx++) {\n                    column = columns[idx];\n                    if (this._isColumnVisible(column)) {\n                        cell = {\n                            title: column.title || column.field,\n                            colSpan: 0\n                        };\n                        row.cells.push(cell);\n                        if (column.columns && column.columns.length) {\n                            if (!childRow) {\n                                childRow = {\n                                    rowSpan: 0,\n                                    cells: [],\n                                    index: rows.length\n                                };\n                                rows.push(childRow);\n                            }\n                            cell.colSpan = this._trimColumns(this._visibleColumns(column.columns)).length;\n                            this._prepareHeaderRows(rows, column.columns, cell, childRow);\n                            totalColSpan += cell.colSpan - 1;\n                            row.rowSpan = rows.length - row.index;\n                        }\n                    }\n                }\n                if (parentCell) {\n                    parentCell.colSpan += totalColSpan;\n                }\n            },\n            _rows: function () {\n                var groups = this.dataSource.group();\n                var rows = this._dataRows(this.dataSource.view(), 0);\n                if (this.columns.length) {\n                    this._prependHeaderRows(rows);\n                    var footer = false;\n                    var cells = $.map(this.columns, $.proxy(function (column) {\n                        if (column.footerTemplate) {\n                            footer = true;\n                            var aggregates = this.dataSource.aggregates();\n                            return {\n                                background: '#dfdfdf',\n                                color: '#333',\n                                value: column.footerTemplate($.extend({}, aggregates, aggregates[column.field]))\n                            };\n                        } else {\n                            return {\n                                background: '#dfdfdf',\n                                color: '#333'\n                            };\n                        }\n                    }, this));\n                    if (footer) {\n                        rows.push({\n                            type: 'footer',\n                            cells: $.map(new Array(groups.length), function () {\n                                return {\n                                    background: '#dfdfdf',\n                                    color: '#333'\n                                };\n                            }).concat(cells)\n                        });\n                    }\n                }\n                return rows;\n            },\n            _headerDepth: function (columns) {\n                var result = 1;\n                var max = 0;\n                for (var idx = 0; idx < columns.length; idx++) {\n                    if (columns[idx].columns) {\n                        var temp = this._headerDepth(columns[idx].columns);\n                        if (temp > max) {\n                            max = temp;\n                        }\n                    }\n                }\n                return result + max;\n            },\n            _freezePane: function () {\n                var columns = this._visibleColumns(this.options.columns || []);\n                var colSplit = this._visibleColumns(this._trimColumns(this._leafColumns($.grep(columns, function (column) {\n                    return column.locked;\n                })))).length;\n                return {\n                    rowSplit: this._headerDepth(columns),\n                    colSplit: colSplit ? colSplit + this.dataSource.group().length : 0\n                };\n            },\n            _cell: function (dataItem, column) {\n                return { value: column.value(dataItem) };\n            },\n            _hierarchical: function () {\n                return this.options.hierarchy && this.dataSource.level;\n            },\n            _depth: function () {\n                var dataSource = this.dataSource;\n                var depth = 0;\n                var view, i, level;\n                if (this._hierarchical()) {\n                    view = dataSource.view();\n                    for (i = 0; i < view.length; i++) {\n                        level = dataSource.level(view[i]);\n                        if (level > depth) {\n                            depth = level;\n                        }\n                    }\n                    depth++;\n                } else {\n                    depth = dataSource.group().length;\n                }\n                return depth;\n            },\n            _columns: function () {\n                var depth = this._depth();\n                var columns = $.map(new Array(depth), function () {\n                    return { width: 20 };\n                });\n                return columns.concat($.map(this.columns, function (column) {\n                    return {\n                        width: parseInt(column.width, 10),\n                        autoWidth: column.width ? false : true\n                    };\n                }));\n            }\n        });\n        kendo.ExcelMixin = {\n            extend: function (proto) {\n                proto.events.push('excelExport');\n                proto.options.excel = $.extend(proto.options.excel, this.options);\n                proto.saveAsExcel = this.saveAsExcel;\n            },\n            options: {\n                proxyURL: '',\n                allPages: false,\n                filterable: false,\n                fileName: 'Export.xlsx'\n            },\n            saveAsExcel: function () {\n                var excel = this.options.excel || {};\n                var exporter = new kendo.ExcelExporter({\n                    columns: this.columns,\n                    dataSource: this.dataSource,\n                    allPages: excel.allPages,\n                    filterable: excel.filterable,\n                    hierarchy: excel.hierarchy\n                });\n                exporter.workbook().then($.proxy(function (book, data) {\n                    if (!this.trigger('excelExport', {\n                            workbook: book,\n                            data: data\n                        })) {\n                        var workbook = new kendo.ooxml.Workbook(book);\n                        kendo.saveAs({\n                            dataURI: workbook.toDataURL(),\n                            fileName: book.fileName || excel.fileName,\n                            proxyURL: excel.proxyURL,\n                            forceProxy: excel.forceProxy\n                        });\n                    }\n                }, this));\n            }\n        };\n    }(kendo.jQuery, kendo));\n    return kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.data.signalr', ['kendo.data'], f);\n}(function () {\n    var __meta__ = {\n        id: 'data.signalr',\n        name: 'SignalR',\n        category: 'framework',\n        depends: ['data'],\n        hidden: true\n    };\n    (function ($) {\n        var transport = kendo.data.RemoteTransport.extend({\n            init: function (options) {\n                var signalr = options && options.signalr ? options.signalr : {};\n                var promise = signalr.promise;\n                if (!promise) {\n                    throw new Error('The \"promise\" option must be set.');\n                }\n                if (typeof promise.done != 'function' || typeof promise.fail != 'function') {\n                    throw new Error('The \"promise\" option must be a Promise.');\n                }\n                this.promise = promise;\n                var hub = signalr.hub;\n                if (!hub) {\n                    throw new Error('The \"hub\" option must be set.');\n                }\n                if (typeof hub.on != 'function' || typeof hub.invoke != 'function') {\n                    throw new Error('The \"hub\" option is not a valid SignalR hub proxy.');\n                }\n                this.hub = hub;\n                kendo.data.RemoteTransport.fn.init.call(this, options);\n            },\n            push: function (callbacks) {\n                var client = this.options.signalr.client || {};\n                if (client.create) {\n                    this.hub.on(client.create, callbacks.pushCreate);\n                }\n                if (client.update) {\n                    this.hub.on(client.update, callbacks.pushUpdate);\n                }\n                if (client.destroy) {\n                    this.hub.on(client.destroy, callbacks.pushDestroy);\n                }\n            },\n            _crud: function (options, type) {\n                var hub = this.hub;\n                var server = this.options.signalr.server;\n                if (!server || !server[type]) {\n                    throw new Error(kendo.format('The \"server.{0}\" option must be set.', type));\n                }\n                var args = [server[type]];\n                var data = this.parameterMap(options.data, type);\n                if (!$.isEmptyObject(data)) {\n                    args.push(data);\n                }\n                this.promise.done(function () {\n                    hub.invoke.apply(hub, args).done(options.success).fail(options.error);\n                });\n            },\n            read: function (options) {\n                this._crud(options, 'read');\n            },\n            create: function (options) {\n                this._crud(options, 'create');\n            },\n            update: function (options) {\n                this._crud(options, 'update');\n            },\n            destroy: function (options) {\n                this._crud(options, 'destroy');\n            }\n        });\n        $.extend(true, kendo.data, { transports: { signalr: transport } });\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('drawing/util', ['kendo.core'], f);\n}(function () {\n    (function ($) {\n        function createPromise() {\n            return $.Deferred();\n        }\n        function promiseAll(promises) {\n            return $.when.apply($, promises);\n        }\n        kendo.drawing.util = kendo.drawing.util || {};\n        kendo.deepExtend(kendo.drawing.util, {\n            createPromise: createPromise,\n            promiseAll: promiseAll\n        });\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.color', ['kendo.core'], f);\n}(function () {\n    var __meta__ = {\n        id: 'color',\n        name: 'Color utils',\n        category: 'framework',\n        advanced: true,\n        description: 'Color utilities used across components',\n        depends: ['core']\n    };\n    window.kendo = window.kendo || {};\n    var Class = kendo.Class;\n    var support = kendo.support;\n    var namedColors = {\n        aliceblue: 'f0f8ff',\n        antiquewhite: 'faebd7',\n        aqua: '00ffff',\n        aquamarine: '7fffd4',\n        azure: 'f0ffff',\n        beige: 'f5f5dc',\n        bisque: 'ffe4c4',\n        black: '000000',\n        blanchedalmond: 'ffebcd',\n        blue: '0000ff',\n        blueviolet: '8a2be2',\n        brown: 'a52a2a',\n        burlywood: 'deb887',\n        cadetblue: '5f9ea0',\n        chartreuse: '7fff00',\n        chocolate: 'd2691e',\n        coral: 'ff7f50',\n        cornflowerblue: '6495ed',\n        cornsilk: 'fff8dc',\n        crimson: 'dc143c',\n        cyan: '00ffff',\n        darkblue: '00008b',\n        darkcyan: '008b8b',\n        darkgoldenrod: 'b8860b',\n        darkgray: 'a9a9a9',\n        darkgrey: 'a9a9a9',\n        darkgreen: '006400',\n        darkkhaki: 'bdb76b',\n        darkmagenta: '8b008b',\n        darkolivegreen: '556b2f',\n        darkorange: 'ff8c00',\n        darkorchid: '9932cc',\n        darkred: '8b0000',\n        darksalmon: 'e9967a',\n        darkseagreen: '8fbc8f',\n        darkslateblue: '483d8b',\n        darkslategray: '2f4f4f',\n        darkslategrey: '2f4f4f',\n        darkturquoise: '00ced1',\n        darkviolet: '9400d3',\n        deeppink: 'ff1493',\n        deepskyblue: '00bfff',\n        dimgray: '696969',\n        dimgrey: '696969',\n        dodgerblue: '1e90ff',\n        firebrick: 'b22222',\n        floralwhite: 'fffaf0',\n        forestgreen: '228b22',\n        fuchsia: 'ff00ff',\n        gainsboro: 'dcdcdc',\n        ghostwhite: 'f8f8ff',\n        gold: 'ffd700',\n        goldenrod: 'daa520',\n        gray: '808080',\n        grey: '808080',\n        green: '008000',\n        greenyellow: 'adff2f',\n        honeydew: 'f0fff0',\n        hotpink: 'ff69b4',\n        indianred: 'cd5c5c',\n        indigo: '4b0082',\n        ivory: 'fffff0',\n        khaki: 'f0e68c',\n        lavender: 'e6e6fa',\n        lavenderblush: 'fff0f5',\n        lawngreen: '7cfc00',\n        lemonchiffon: 'fffacd',\n        lightblue: 'add8e6',\n        lightcoral: 'f08080',\n        lightcyan: 'e0ffff',\n        lightgoldenrodyellow: 'fafad2',\n        lightgray: 'd3d3d3',\n        lightgrey: 'd3d3d3',\n        lightgreen: '90ee90',\n        lightpink: 'ffb6c1',\n        lightsalmon: 'ffa07a',\n        lightseagreen: '20b2aa',\n        lightskyblue: '87cefa',\n        lightslategray: '778899',\n        lightslategrey: '778899',\n        lightsteelblue: 'b0c4de',\n        lightyellow: 'ffffe0',\n        lime: '00ff00',\n        limegreen: '32cd32',\n        linen: 'faf0e6',\n        magenta: 'ff00ff',\n        maroon: '800000',\n        mediumaquamarine: '66cdaa',\n        mediumblue: '0000cd',\n        mediumorchid: 'ba55d3',\n        mediumpurple: '9370d8',\n        mediumseagreen: '3cb371',\n        mediumslateblue: '7b68ee',\n        mediumspringgreen: '00fa9a',\n        mediumturquoise: '48d1cc',\n        mediumvioletred: 'c71585',\n        midnightblue: '191970',\n        mintcream: 'f5fffa',\n        mistyrose: 'ffe4e1',\n        moccasin: 'ffe4b5',\n        navajowhite: 'ffdead',\n        navy: '000080',\n        oldlace: 'fdf5e6',\n        olive: '808000',\n        olivedrab: '6b8e23',\n        orange: 'ffa500',\n        orangered: 'ff4500',\n        orchid: 'da70d6',\n        palegoldenrod: 'eee8aa',\n        palegreen: '98fb98',\n        paleturquoise: 'afeeee',\n        palevioletred: 'd87093',\n        papayawhip: 'ffefd5',\n        peachpuff: 'ffdab9',\n        peru: 'cd853f',\n        pink: 'ffc0cb',\n        plum: 'dda0dd',\n        powderblue: 'b0e0e6',\n        purple: '800080',\n        red: 'ff0000',\n        rosybrown: 'bc8f8f',\n        royalblue: '4169e1',\n        saddlebrown: '8b4513',\n        salmon: 'fa8072',\n        sandybrown: 'f4a460',\n        seagreen: '2e8b57',\n        seashell: 'fff5ee',\n        sienna: 'a0522d',\n        silver: 'c0c0c0',\n        skyblue: '87ceeb',\n        slateblue: '6a5acd',\n        slategray: '708090',\n        slategrey: '708090',\n        snow: 'fffafa',\n        springgreen: '00ff7f',\n        steelblue: '4682b4',\n        tan: 'd2b48c',\n        teal: '008080',\n        thistle: 'd8bfd8',\n        tomato: 'ff6347',\n        turquoise: '40e0d0',\n        violet: 'ee82ee',\n        wheat: 'f5deb3',\n        white: 'ffffff',\n        whitesmoke: 'f5f5f5',\n        yellow: 'ffff00',\n        yellowgreen: '9acd32'\n    };\n    var browser = support.browser;\n    var namedColorRegexp = ['transparent'];\n    for (var i in namedColors) {\n        if (namedColors.hasOwnProperty(i)) {\n            namedColorRegexp.push(i);\n        }\n    }\n    namedColorRegexp = new RegExp('^(' + namedColorRegexp.join('|') + ')(\\\\W|$)', 'i');\n    var BaseColor = Class.extend({\n        init: function () {\n        },\n        toHSV: function () {\n            return this;\n        },\n        toRGB: function () {\n            return this;\n        },\n        toHex: function () {\n            return this.toBytes().toHex();\n        },\n        toBytes: function () {\n            return this;\n        },\n        toCss: function () {\n            return '#' + this.toHex();\n        },\n        toCssRgba: function () {\n            var rgb = this.toBytes();\n            return 'rgba(' + rgb.r + ', ' + rgb.g + ', ' + rgb.b + ', ' + parseFloat(Number(this.a).toFixed(3)) + ')';\n        },\n        toDisplay: function () {\n            if (browser.msie && browser.version < 9) {\n                return this.toCss();\n            }\n            return this.toCssRgba();\n        },\n        equals: function (c) {\n            return c === this || c !== null && this.toCssRgba() === parseColor(c).toCssRgba();\n        },\n        diff: function (other) {\n            if (other === null) {\n                return NaN;\n            }\n            var c1 = this.toBytes();\n            var c2 = other.toBytes();\n            return Math.sqrt(Math.pow((c1.r - c2.r) * 0.3, 2) + Math.pow((c1.g - c2.g) * 0.59, 2) + Math.pow((c1.b - c2.b) * 0.11, 2));\n        },\n        clone: function () {\n            var c = this.toBytes();\n            if (c === this) {\n                c = new Bytes(c.r, c.g, c.b, c.a);\n            }\n            return c;\n        }\n    });\n    var RGB = BaseColor.extend({\n        init: function (r, g, b, a) {\n            BaseColor.fn.init.call(this);\n            this.r = r;\n            this.g = g;\n            this.b = b;\n            this.a = a;\n        },\n        toHSV: function () {\n            var ref = this;\n            var r = ref.r;\n            var g = ref.g;\n            var b = ref.b;\n            var min = Math.min(r, g, b);\n            var max = Math.max(r, g, b);\n            var delta = max - min;\n            var v = max;\n            var h, s;\n            if (delta === 0) {\n                return new HSV(0, 0, v, this.a);\n            }\n            if (max !== 0) {\n                s = delta / max;\n                if (r === max) {\n                    h = (g - b) / delta;\n                } else if (g === max) {\n                    h = 2 + (b - r) / delta;\n                } else {\n                    h = 4 + (r - g) / delta;\n                }\n                h *= 60;\n                if (h < 0) {\n                    h += 360;\n                }\n            } else {\n                s = 0;\n                h = -1;\n            }\n            return new HSV(h, s, v, this.a);\n        },\n        toHSL: function () {\n            var ref = this;\n            var r = ref.r;\n            var g = ref.g;\n            var b = ref.b;\n            var max = Math.max(r, g, b);\n            var min = Math.min(r, g, b);\n            var h, s, l = (max + min) / 2;\n            if (max === min) {\n                h = s = 0;\n            } else {\n                var d = max - min;\n                s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n                switch (max) {\n                case r:\n                    h = (g - b) / d + (g < b ? 6 : 0);\n                    break;\n                case g:\n                    h = (b - r) / d + 2;\n                    break;\n                case b:\n                    h = (r - g) / d + 4;\n                    break;\n                default:\n                    break;\n                }\n                h *= 60;\n                s *= 100;\n                l *= 100;\n            }\n            return new HSL(h, s, l, this.a);\n        },\n        toBytes: function () {\n            return new Bytes(this.r * 255, this.g * 255, this.b * 255, this.a);\n        }\n    });\n    var Bytes = RGB.extend({\n        init: function (r, g, b, a) {\n            RGB.fn.init.call(this, Math.round(r), Math.round(g), Math.round(b), a);\n        },\n        toRGB: function () {\n            return new RGB(this.r / 255, this.g / 255, this.b / 255, this.a);\n        },\n        toHSV: function () {\n            return this.toRGB().toHSV();\n        },\n        toHSL: function () {\n            return this.toRGB().toHSL();\n        },\n        toHex: function () {\n            return hex(this.r, 2) + hex(this.g, 2) + hex(this.b, 2);\n        },\n        toBytes: function () {\n            return this;\n        }\n    });\n    function hex(n, width, pad) {\n        if (pad === void 0) {\n            pad = '0';\n        }\n        var result = n.toString(16);\n        while (width > result.length) {\n            result = pad + result;\n        }\n        return result;\n    }\n    var HSV = BaseColor.extend({\n        init: function (h, s, v, a) {\n            BaseColor.fn.init.call(this);\n            this.h = h;\n            this.s = s;\n            this.v = v;\n            this.a = a;\n        },\n        toRGB: function () {\n            var ref = this;\n            var h = ref.h;\n            var s = ref.s;\n            var v = ref.v;\n            var r, g, b;\n            if (s === 0) {\n                r = g = b = v;\n            } else {\n                h /= 60;\n                var i = Math.floor(h);\n                var f = h - i;\n                var p = v * (1 - s);\n                var q = v * (1 - s * f);\n                var t = v * (1 - s * (1 - f));\n                switch (i) {\n                case 0:\n                    r = v;\n                    g = t;\n                    b = p;\n                    break;\n                case 1:\n                    r = q;\n                    g = v;\n                    b = p;\n                    break;\n                case 2:\n                    r = p;\n                    g = v;\n                    b = t;\n                    break;\n                case 3:\n                    r = p;\n                    g = q;\n                    b = v;\n                    break;\n                case 4:\n                    r = t;\n                    g = p;\n                    b = v;\n                    break;\n                default:\n                    r = v;\n                    g = p;\n                    b = q;\n                    break;\n                }\n            }\n            return new RGB(r, g, b, this.a);\n        },\n        toHSL: function () {\n            return this.toRGB().toHSL();\n        },\n        toBytes: function () {\n            return this.toRGB().toBytes();\n        }\n    });\n    var HSL = BaseColor.extend({\n        init: function (h, s, l, a) {\n            BaseColor.fn.init.call(this);\n            this.h = h;\n            this.s = s;\n            this.l = l;\n            this.a = a;\n        },\n        toRGB: function () {\n            var ref = this;\n            var h = ref.h;\n            var s = ref.s;\n            var l = ref.l;\n            var r, g, b;\n            if (s === 0) {\n                r = g = b = l;\n            } else {\n                h /= 360;\n                s /= 100;\n                l /= 100;\n                var q = l < 0.5 ? l * (1 + s) : l + s - l * s;\n                var p = 2 * l - q;\n                r = hue2rgb(p, q, h + 1 / 3);\n                g = hue2rgb(p, q, h);\n                b = hue2rgb(p, q, h - 1 / 3);\n            }\n            return new RGB(r, g, b, this.a);\n        },\n        toHSV: function () {\n            return this.toRGB().toHSV();\n        },\n        toBytes: function () {\n            return this.toRGB().toBytes();\n        }\n    });\n    function hue2rgb(p, q, s) {\n        var t = s;\n        if (t < 0) {\n            t += 1;\n        }\n        if (t > 1) {\n            t -= 1;\n        }\n        if (t < 1 / 6) {\n            return p + (q - p) * 6 * t;\n        }\n        if (t < 1 / 2) {\n            return q;\n        }\n        if (t < 2 / 3) {\n            return p + (q - p) * (2 / 3 - t) * 6;\n        }\n        return p;\n    }\n    function parseColor(value, safe) {\n        var m, ret;\n        if (value == null || value === 'none') {\n            return null;\n        }\n        if (value instanceof BaseColor) {\n            return value;\n        }\n        var color = value.toLowerCase();\n        if (m = namedColorRegexp.exec(color)) {\n            if (m[1] === 'transparent') {\n                color = new RGB(1, 1, 1, 0);\n            } else {\n                color = parseColor(namedColors[m[1]], safe);\n            }\n            color.match = [m[1]];\n            return color;\n        }\n        if (m = /^#?([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})\\b/i.exec(color)) {\n            ret = new Bytes(parseInt(m[1], 16), parseInt(m[2], 16), parseInt(m[3], 16), 1);\n        } else if (m = /^#?([0-9a-f])([0-9a-f])([0-9a-f])\\b/i.exec(color)) {\n            ret = new Bytes(parseInt(m[1] + m[1], 16), parseInt(m[2] + m[2], 16), parseInt(m[3] + m[3], 16), 1);\n        } else if (m = /^rgb\\(\\s*([0-9]+)\\s*,\\s*([0-9]+)\\s*,\\s*([0-9]+)\\s*\\)/.exec(color)) {\n            ret = new Bytes(parseInt(m[1], 10), parseInt(m[2], 10), parseInt(m[3], 10), 1);\n        } else if (m = /^rgba\\(\\s*([0-9]+)\\s*,\\s*([0-9]+)\\s*,\\s*([0-9]+)\\s*,\\s*([0-9.]+)\\s*\\)/.exec(color)) {\n            ret = new Bytes(parseInt(m[1], 10), parseInt(m[2], 10), parseInt(m[3], 10), parseFloat(m[4]));\n        } else if (m = /^rgb\\(\\s*([0-9]*\\.?[0-9]+)%\\s*,\\s*([0-9]*\\.?[0-9]+)%\\s*,\\s*([0-9]*\\.?[0-9]+)%\\s*\\)/.exec(color)) {\n            ret = new RGB(parseFloat(m[1]) / 100, parseFloat(m[2]) / 100, parseFloat(m[3]) / 100, 1);\n        } else if (m = /^rgba\\(\\s*([0-9]*\\.?[0-9]+)%\\s*,\\s*([0-9]*\\.?[0-9]+)%\\s*,\\s*([0-9]*\\.?[0-9]+)%\\s*,\\s*([0-9.]+)\\s*\\)/.exec(color)) {\n            ret = new RGB(parseFloat(m[1]) / 100, parseFloat(m[2]) / 100, parseFloat(m[3]) / 100, parseFloat(m[4]));\n        }\n        if (ret) {\n            ret.match = m;\n        } else if (!safe) {\n            throw new Error('Cannot parse color: ' + color);\n        }\n        return ret;\n    }\n    var Color = Class.extend({\n        init: function (value) {\n            var this$1 = this;\n            if (arguments.length === 1) {\n                var formats = Color.formats;\n                var resolvedColor = this.resolveColor(value);\n                for (var idx = 0; idx < formats.length; idx++) {\n                    var formatRegex = formats[idx].re;\n                    var processor = formats[idx].process;\n                    var parts = formatRegex.exec(resolvedColor);\n                    if (parts) {\n                        var channels = processor(parts);\n                        this$1.r = channels[0];\n                        this$1.g = channels[1];\n                        this$1.b = channels[2];\n                    }\n                }\n            } else {\n                this.r = arguments[0];\n                this.g = arguments[1];\n                this.b = arguments[2];\n            }\n            this.r = this.normalizeByte(this.r);\n            this.g = this.normalizeByte(this.g);\n            this.b = this.normalizeByte(this.b);\n        },\n        toHex: function () {\n            var pad = this.padDigit;\n            var r = this.r.toString(16);\n            var g = this.g.toString(16);\n            var b = this.b.toString(16);\n            return '#' + pad(r) + pad(g) + pad(b);\n        },\n        resolveColor: function (value) {\n            var color = value || 'black';\n            if (color.charAt(0) === '#') {\n                color = color.substr(1, 6);\n            }\n            color = color.replace(/ /g, '');\n            color = color.toLowerCase();\n            color = Color.namedColors[color] || color;\n            return color;\n        },\n        normalizeByte: function (value) {\n            if (value < 0 || isNaN(value)) {\n                return 0;\n            }\n            return value > 255 ? 255 : value;\n        },\n        padDigit: function (value) {\n            return value.length === 1 ? '0' + value : value;\n        },\n        brightness: function (value) {\n            var round = Math.round;\n            this.r = round(this.normalizeByte(this.r * value));\n            this.g = round(this.normalizeByte(this.g * value));\n            this.b = round(this.normalizeByte(this.b * value));\n            return this;\n        },\n        percBrightness: function () {\n            return Math.sqrt(0.241 * this.r * this.r + 0.691 * this.g * this.g + 0.068 * this.b * this.b);\n        }\n    });\n    Color.fromBytes = function (r, g, b, a) {\n        return new Bytes(r, g, b, a != null ? a : 1);\n    };\n    Color.fromRGB = function (r, g, b, a) {\n        return new RGB(r, g, b, a != null ? a : 1);\n    };\n    Color.fromHSV = function (h, s, v, a) {\n        return new HSV(h, s, v, a != null ? a : 1);\n    };\n    Color.fromHSL = function (h, s, l, a) {\n        return new HSL(h, s, l, a != null ? a : 1);\n    };\n    Color.formats = [\n        {\n            re: /^rgb\\((\\d{1,3}),\\s*(\\d{1,3}),\\s*(\\d{1,3})\\)$/,\n            process: function (parts) {\n                return [\n                    parseInt(parts[1], 10),\n                    parseInt(parts[2], 10),\n                    parseInt(parts[3], 10)\n                ];\n            }\n        },\n        {\n            re: /^(\\w{2})(\\w{2})(\\w{2})$/,\n            process: function (parts) {\n                return [\n                    parseInt(parts[1], 16),\n                    parseInt(parts[2], 16),\n                    parseInt(parts[3], 16)\n                ];\n            }\n        },\n        {\n            re: /^(\\w{1})(\\w{1})(\\w{1})$/,\n            process: function (parts) {\n                return [\n                    parseInt(parts[1] + parts[1], 16),\n                    parseInt(parts[2] + parts[2], 16),\n                    parseInt(parts[3] + parts[3], 16)\n                ];\n            }\n        }\n    ];\n    Color.namedColors = namedColors;\n    kendo.deepExtend(kendo, {\n        parseColor: parseColor,\n        Color: Color\n    });\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('util/text-metrics', ['kendo.core'], f);\n}(function () {\n    (function ($) {\n        window.kendo.util = window.kendo.util || {};\n        var LRUCache = kendo.Class.extend({\n            init: function (size) {\n                this._size = size;\n                this._length = 0;\n                this._map = {};\n            },\n            put: function (key, value) {\n                var map = this._map;\n                var entry = {\n                    key: key,\n                    value: value\n                };\n                map[key] = entry;\n                if (!this._head) {\n                    this._head = this._tail = entry;\n                } else {\n                    this._tail.newer = entry;\n                    entry.older = this._tail;\n                    this._tail = entry;\n                }\n                if (this._length >= this._size) {\n                    map[this._head.key] = null;\n                    this._head = this._head.newer;\n                    this._head.older = null;\n                } else {\n                    this._length++;\n                }\n            },\n            get: function (key) {\n                var entry = this._map[key];\n                if (entry) {\n                    if (entry === this._head && entry !== this._tail) {\n                        this._head = entry.newer;\n                        this._head.older = null;\n                    }\n                    if (entry !== this._tail) {\n                        if (entry.older) {\n                            entry.older.newer = entry.newer;\n                            entry.newer.older = entry.older;\n                        }\n                        entry.older = this._tail;\n                        entry.newer = null;\n                        this._tail.newer = entry;\n                        this._tail = entry;\n                    }\n                    return entry.value;\n                }\n            }\n        });\n        function objectKey(object) {\n            var parts = [];\n            for (var key in object) {\n                parts.push(key + object[key]);\n            }\n            return parts.sort().join('');\n        }\n        function hashKey(str) {\n            var hash = 2166136261;\n            for (var i = 0; i < str.length; ++i) {\n                hash += (hash << 1) + (hash << 4) + (hash << 7) + (hash << 8) + (hash << 24);\n                hash ^= str.charCodeAt(i);\n            }\n            return hash >>> 0;\n        }\n        function zeroSize() {\n            return {\n                width: 0,\n                height: 0,\n                baseline: 0\n            };\n        }\n        var DEFAULT_OPTIONS = { baselineMarkerSize: 1 };\n        var defaultMeasureBox;\n        if (typeof document !== 'undefined') {\n            defaultMeasureBox = document.createElement('div');\n            defaultMeasureBox.style.cssText = 'position: absolute !important; top: -4000px !important; width: auto !important; height: auto !important;' + 'padding: 0 !important; margin: 0 !important; border: 0 !important;' + 'line-height: normal !important; visibility: hidden !important; white-space: nowrap!important;';\n        }\n        var TextMetrics = kendo.Class.extend({\n            init: function (options) {\n                this._cache = new LRUCache(1000);\n                this.options = $.extend({}, DEFAULT_OPTIONS, options);\n            },\n            measure: function (text, style, box) {\n                if (!text) {\n                    return zeroSize();\n                }\n                var styleKey = objectKey(style);\n                var cacheKey = hashKey(text + styleKey);\n                var cachedResult = this._cache.get(cacheKey);\n                if (cachedResult) {\n                    return cachedResult;\n                }\n                var size = zeroSize();\n                var measureBox = box || defaultMeasureBox;\n                var baselineMarker = this._baselineMarker().cloneNode(false);\n                for (var key in style) {\n                    var value = style[key];\n                    if (typeof value !== 'undefined') {\n                        measureBox.style[key] = value;\n                    }\n                }\n                measureBox.textContent = text;\n                measureBox.appendChild(baselineMarker);\n                document.body.appendChild(measureBox);\n                if (String(text).length) {\n                    size.width = measureBox.offsetWidth - this.options.baselineMarkerSize;\n                    size.height = measureBox.offsetHeight;\n                    size.baseline = baselineMarker.offsetTop + this.options.baselineMarkerSize;\n                }\n                if (size.width > 0 && size.height > 0) {\n                    this._cache.put(cacheKey, size);\n                }\n                measureBox.parentNode.removeChild(measureBox);\n                return size;\n            },\n            _baselineMarker: function () {\n                var marker = document.createElement('div');\n                marker.style.cssText = 'display: inline-block; vertical-align: baseline;width: ' + this.options.baselineMarkerSize + 'px; height: ' + this.options.baselineMarkerSize + 'px;overflow: hidden;';\n                return marker;\n            }\n        });\n        TextMetrics.current = new TextMetrics();\n        function measureText(text, style, measureBox) {\n            return TextMetrics.current.measure(text, style, measureBox);\n        }\n        kendo.deepExtend(kendo.util, {\n            LRUCache: LRUCache,\n            TextMetrics: TextMetrics,\n            measureText: measureText,\n            objectKey: objectKey,\n            hashKey: hashKey\n        });\n    }(window.kendo.jQuery));\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('drawing/kendo-drawing', [\n        'drawing/util',\n        'kendo.color',\n        'util/text-metrics'\n    ], f);\n}(function () {\n    (function ($) {\n        window.kendo = window.kendo || {};\n        var kendoDrawing = kendo.drawing;\n        var kendoDrawingUtil = kendoDrawing.util;\n        var Class = kendo.Class;\n        var kendoUtil = kendo.util;\n        var support = kendo.support;\n        var createPromise = kendoDrawingUtil.createPromise;\n        var promiseAll = kendoDrawingUtil.promiseAll;\n        var ObserversMixin = {\n            extend: function (proto) {\n                var this$1 = this;\n                for (var method in this) {\n                    if (method !== 'extend') {\n                        proto[method] = this$1[method];\n                    }\n                }\n            },\n            observers: function () {\n                this._observers = this._observers || [];\n                return this._observers;\n            },\n            addObserver: function (element) {\n                if (!this._observers) {\n                    this._observers = [element];\n                } else {\n                    this._observers.push(element);\n                }\n                return this;\n            },\n            removeObserver: function (element) {\n                var observers = this.observers();\n                var index = observers.indexOf(element);\n                if (index !== -1) {\n                    observers.splice(index, 1);\n                }\n                return this;\n            },\n            trigger: function (methodName, event) {\n                var observers = this._observers;\n                if (observers && !this._suspended) {\n                    for (var idx = 0; idx < observers.length; idx++) {\n                        var observer = observers[idx];\n                        if (observer[methodName]) {\n                            observer[methodName](event);\n                        }\n                    }\n                }\n                return this;\n            },\n            optionsChange: function (e) {\n                if (e === void 0) {\n                    e = {};\n                }\n                e.element = this;\n                this.trigger('optionsChange', e);\n            },\n            geometryChange: function () {\n                this.trigger('geometryChange', { element: this });\n            },\n            suspend: function () {\n                this._suspended = (this._suspended || 0) + 1;\n                return this;\n            },\n            resume: function () {\n                this._suspended = Math.max((this._suspended || 0) - 1, 0);\n                return this;\n            },\n            _observerField: function (field, value) {\n                if (this[field]) {\n                    this[field].removeObserver(this);\n                }\n                this[field] = value;\n                value.addObserver(this);\n            }\n        };\n        function append(first, second) {\n            first.push.apply(first, second);\n            return first;\n        }\n        var literals = {\n            1: 'i',\n            10: 'x',\n            100: 'c',\n            2: 'ii',\n            20: 'xx',\n            200: 'cc',\n            3: 'iii',\n            30: 'xxx',\n            300: 'ccc',\n            4: 'iv',\n            40: 'xl',\n            400: 'cd',\n            5: 'v',\n            50: 'l',\n            500: 'd',\n            6: 'vi',\n            60: 'lx',\n            600: 'dc',\n            7: 'vii',\n            70: 'lxx',\n            700: 'dcc',\n            8: 'viii',\n            80: 'lxxx',\n            800: 'dccc',\n            9: 'ix',\n            90: 'xc',\n            900: 'cm',\n            1000: 'm'\n        };\n        function arabicToRoman(n) {\n            var values = [\n                1000,\n                900,\n                800,\n                700,\n                600,\n                500,\n                400,\n                300,\n                200,\n                100,\n                90,\n                80,\n                70,\n                60,\n                50,\n                40,\n                30,\n                20,\n                10,\n                9,\n                8,\n                7,\n                6,\n                5,\n                4,\n                3,\n                2,\n                1\n            ];\n            var roman = '';\n            while (n > 0) {\n                if (n < values[0]) {\n                    values.shift();\n                } else {\n                    roman += literals[values[0]];\n                    n -= values[0];\n                }\n            }\n            return roman;\n        }\n        var UNDEFINED = 'undefined';\n        function defined(value) {\n            return typeof value !== UNDEFINED;\n        }\n        var defId = 1;\n        function definitionId() {\n            return 'kdef' + defId++;\n        }\n        var DEG_TO_RAD = Math.PI / 180;\n        var MAX_NUM = Number.MAX_VALUE;\n        var MIN_NUM = -Number.MAX_VALUE;\n        function deg(radians) {\n            return radians / DEG_TO_RAD;\n        }\n        var KEY_STR = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';\n        var fromCharCode = String.fromCharCode;\n        function encodeUTF8(input) {\n            var output = '';\n            for (var i = 0; i < input.length; i++) {\n                var c = input.charCodeAt(i);\n                if (c < 128) {\n                    output += fromCharCode(c);\n                } else if (c < 2048) {\n                    output += fromCharCode(192 | c >>> 6);\n                    output += fromCharCode(128 | c & 63);\n                } else if (c < 65536) {\n                    output += fromCharCode(224 | c >>> 12);\n                    output += fromCharCode(128 | c >>> 6 & 63);\n                    output += fromCharCode(128 | c & 63);\n                }\n            }\n            return output;\n        }\n        function encodeBase64(input) {\n            var output = '';\n            var i = 0;\n            var utfInput = encodeUTF8(input);\n            while (i < utfInput.length) {\n                var chr1 = utfInput.charCodeAt(i++);\n                var chr2 = utfInput.charCodeAt(i++);\n                var chr3 = utfInput.charCodeAt(i++);\n                var enc1 = chr1 >> 2;\n                var enc2 = (chr1 & 3) << 4 | chr2 >> 4;\n                var enc3 = (chr2 & 15) << 2 | chr3 >> 6;\n                var enc4 = chr3 & 63;\n                if (isNaN(chr2)) {\n                    enc3 = enc4 = 64;\n                } else if (isNaN(chr3)) {\n                    enc4 = 64;\n                }\n                output = output + KEY_STR.charAt(enc1) + KEY_STR.charAt(enc2) + KEY_STR.charAt(enc3) + KEY_STR.charAt(enc4);\n            }\n            return output;\n        }\n        function eventCoordinates(e) {\n            if (defined((e.x || {}).location)) {\n                return {\n                    x: e.x.location,\n                    y: e.y.location\n                };\n            }\n            return {\n                x: e.pageX || e.clientX || 0,\n                y: e.pageY || e.clientY || 0\n            };\n        }\n        function eventElement(e) {\n            if (e === void 0) {\n                e = {};\n            }\n            return e.touch ? e.touch.initialTouch : e.target;\n        }\n        function isTransparent(color) {\n            return color === '' || color === null || color === 'none' || color === 'transparent' || !defined(color);\n        }\n        function last(array) {\n            if (array) {\n                return array[array.length - 1];\n            }\n        }\n        function limitValue(value, min, max) {\n            return Math.max(Math.min(value, max), min);\n        }\n        function mergeSort(a, cmp) {\n            if (a.length < 2) {\n                return a.slice();\n            }\n            function merge(a, b) {\n                var r = [], ai = 0, bi = 0, i = 0;\n                while (ai < a.length && bi < b.length) {\n                    if (cmp(a[ai], b[bi]) <= 0) {\n                        r[i++] = a[ai++];\n                    } else {\n                        r[i++] = b[bi++];\n                    }\n                }\n                if (ai < a.length) {\n                    r.push.apply(r, a.slice(ai));\n                }\n                if (bi < b.length) {\n                    r.push.apply(r, b.slice(bi));\n                }\n                return r;\n            }\n            return function sort(a) {\n                if (a.length <= 1) {\n                    return a;\n                }\n                var m = Math.floor(a.length / 2);\n                var left = a.slice(0, m);\n                var right = a.slice(m);\n                left = sort(left);\n                right = sort(right);\n                return merge(left, right);\n            }(a);\n        }\n        function rad(degrees) {\n            return degrees * DEG_TO_RAD;\n        }\n        function pow(p) {\n            if (p) {\n                return Math.pow(10, p);\n            }\n            return 1;\n        }\n        function round(value, precision) {\n            var power = pow(precision);\n            return Math.round(value * power) / power;\n        }\n        function valueOrDefault(value, defaultValue) {\n            return defined(value) ? value : defaultValue;\n        }\n        function bindEvents(element, events) {\n            for (var eventName in events) {\n                var eventNames = eventName.trim().split(' ');\n                for (var idx = 0; idx < eventNames.length; idx++) {\n                    element.addEventListener(eventNames[idx], events[eventName], false);\n                }\n            }\n        }\n        function elementOffset(element) {\n            var box = element.getBoundingClientRect();\n            var documentElement = document.documentElement;\n            return {\n                top: box.top + (window.pageYOffset || documentElement.scrollTop) - (documentElement.clientTop || 0),\n                left: box.left + (window.pageXOffset || documentElement.scrollLeft) - (documentElement.clientLeft || 0)\n            };\n        }\n        function elementStyles(element, styles) {\n            var result = {};\n            var style = window.getComputedStyle(element);\n            var stylesArray = Array.isArray(styles) ? styles : [styles];\n            for (var idx = 0; idx < stylesArray.length; idx++) {\n                var field = stylesArray[idx];\n                result[field] = style[field];\n            }\n            return result;\n        }\n        function getPixels(value) {\n            if (isNaN(value)) {\n                return value;\n            }\n            return value + 'px';\n        }\n        function elementSize(element, size) {\n            if (size) {\n                var width = size.width;\n                var height = size.height;\n                if (defined(width)) {\n                    element.style.width = getPixels(width);\n                }\n                if (defined(height)) {\n                    element.style.height = getPixels(height);\n                }\n            } else {\n                var size$1 = elementStyles(element, [\n                    'width',\n                    'height'\n                ]);\n                return {\n                    width: parseInt(size$1.width, 10),\n                    height: parseInt(size$1.height, 10)\n                };\n            }\n        }\n        function unbindEvents(element, events) {\n            if (events === void 0) {\n                events = {};\n            }\n            for (var name in events) {\n                var eventNames = name.trim().split(' ');\n                for (var idx = 0; idx < eventNames.length; idx++) {\n                    element.removeEventListener(eventNames[idx], events[name], false);\n                }\n            }\n        }\n        var util = {\n            append: append,\n            arabicToRoman: arabicToRoman,\n            createPromise: createPromise,\n            defined: defined,\n            definitionId: definitionId,\n            deg: deg,\n            encodeBase64: encodeBase64,\n            eventCoordinates: eventCoordinates,\n            eventElement: eventElement,\n            isTransparent: isTransparent,\n            last: last,\n            limitValue: limitValue,\n            mergeSort: mergeSort,\n            promiseAll: promiseAll,\n            rad: rad,\n            round: round,\n            valueOrDefault: valueOrDefault,\n            bindEvents: bindEvents,\n            elementOffset: elementOffset,\n            elementSize: elementSize,\n            elementStyles: elementStyles,\n            unbindEvents: unbindEvents,\n            DEG_TO_RAD: DEG_TO_RAD,\n            MAX_NUM: MAX_NUM,\n            MIN_NUM: MIN_NUM\n        };\n        var toString = {}.toString;\n        var OptionsStore = Class.extend({\n            init: function (options, prefix) {\n                var this$1 = this;\n                if (prefix === void 0) {\n                    prefix = '';\n                }\n                this.prefix = prefix;\n                for (var field in options) {\n                    var member = options[field];\n                    member = this$1._wrap(member, field);\n                    this$1[field] = member;\n                }\n            },\n            get: function (field) {\n                var parts = field.split('.');\n                var result = this;\n                while (parts.length && result) {\n                    var part = parts.shift();\n                    result = result[part];\n                }\n                return result;\n            },\n            set: function (field, value) {\n                var current = this.get(field);\n                if (current !== value) {\n                    this._set(field, this._wrap(value, field));\n                    this.optionsChange({\n                        field: this.prefix + field,\n                        value: value\n                    });\n                }\n            },\n            _set: function (field, value) {\n                var this$1 = this;\n                var composite = field.indexOf('.') >= 0;\n                var parentObj = this;\n                var fieldName = field;\n                if (composite) {\n                    var parts = fieldName.split('.');\n                    var prefix = this.prefix;\n                    while (parts.length > 1) {\n                        fieldName = parts.shift();\n                        prefix += fieldName + '.';\n                        var obj = parentObj[fieldName];\n                        if (!obj) {\n                            obj = new OptionsStore({}, prefix);\n                            obj.addObserver(this$1);\n                            parentObj[fieldName] = obj;\n                        }\n                        parentObj = obj;\n                    }\n                    fieldName = parts[0];\n                }\n                parentObj._clear(fieldName);\n                parentObj[fieldName] = value;\n            },\n            _clear: function (field) {\n                var current = this[field];\n                if (current && current.removeObserver) {\n                    current.removeObserver(this);\n                }\n            },\n            _wrap: function (object, field) {\n                var type = toString.call(object);\n                var wrapped = object;\n                if (wrapped !== null && defined(wrapped) && type === '[object Object]') {\n                    if (!(object instanceof OptionsStore) && !(object instanceof Class)) {\n                        wrapped = new OptionsStore(wrapped, this.prefix + field + '.');\n                    }\n                    wrapped.addObserver(this);\n                }\n                return wrapped;\n            }\n        });\n        ObserversMixin.extend(OptionsStore.prototype);\n        function setAccessor(field) {\n            return function (value) {\n                if (this[field] !== value) {\n                    this[field] = value;\n                    this.geometryChange();\n                }\n                return this;\n            };\n        }\n        function getAccessor(field) {\n            return function () {\n                return this[field];\n            };\n        }\n        function defineAccessors(fn, fields) {\n            for (var i = 0; i < fields.length; i++) {\n                var name = fields[i];\n                var capitalized = name.charAt(0).toUpperCase() + name.substring(1, name.length);\n                fn['set' + capitalized] = setAccessor(name);\n                fn['get' + capitalized] = getAccessor(name);\n            }\n        }\n        var Matrix = Class.extend({\n            init: function (a, b, c, d, e, f) {\n                if (a === void 0) {\n                    a = 0;\n                }\n                if (b === void 0) {\n                    b = 0;\n                }\n                if (c === void 0) {\n                    c = 0;\n                }\n                if (d === void 0) {\n                    d = 0;\n                }\n                if (e === void 0) {\n                    e = 0;\n                }\n                if (f === void 0) {\n                    f = 0;\n                }\n                this.a = a;\n                this.b = b;\n                this.c = c;\n                this.d = d;\n                this.e = e;\n                this.f = f;\n            },\n            multiplyCopy: function (matrix) {\n                return new Matrix(this.a * matrix.a + this.c * matrix.b, this.b * matrix.a + this.d * matrix.b, this.a * matrix.c + this.c * matrix.d, this.b * matrix.c + this.d * matrix.d, this.a * matrix.e + this.c * matrix.f + this.e, this.b * matrix.e + this.d * matrix.f + this.f);\n            },\n            invert: function () {\n                var ref = this;\n                var a = ref.a;\n                var b = ref.b;\n                var d = ref.c;\n                var e = ref.d;\n                var g = ref.e;\n                var h = ref.f;\n                var det = a * e - b * d;\n                if (det === 0) {\n                    return null;\n                }\n                return new Matrix(e / det, -b / det, -d / det, a / det, (d * h - e * g) / det, (b * g - a * h) / det);\n            },\n            clone: function () {\n                return new Matrix(this.a, this.b, this.c, this.d, this.e, this.f);\n            },\n            equals: function (other) {\n                if (!other) {\n                    return false;\n                }\n                return this.a === other.a && this.b === other.b && this.c === other.c && this.d === other.d && this.e === other.e && this.f === other.f;\n            },\n            round: function (precision) {\n                this.a = round(this.a, precision);\n                this.b = round(this.b, precision);\n                this.c = round(this.c, precision);\n                this.d = round(this.d, precision);\n                this.e = round(this.e, precision);\n                this.f = round(this.f, precision);\n                return this;\n            },\n            toArray: function (precision) {\n                var result = [\n                    this.a,\n                    this.b,\n                    this.c,\n                    this.d,\n                    this.e,\n                    this.f\n                ];\n                if (defined(precision)) {\n                    for (var i = 0; i < result.length; i++) {\n                        result[i] = round(result[i], precision);\n                    }\n                }\n                return result;\n            },\n            toString: function (precision, separator) {\n                if (separator === void 0) {\n                    separator = ',';\n                }\n                return this.toArray(precision).join(separator);\n            }\n        });\n        Matrix.translate = function (x, y) {\n            return new Matrix(1, 0, 0, 1, x, y);\n        };\n        Matrix.unit = function () {\n            return new Matrix(1, 0, 0, 1, 0, 0);\n        };\n        Matrix.rotate = function (angle, x, y) {\n            var matrix = new Matrix();\n            matrix.a = Math.cos(rad(angle));\n            matrix.b = Math.sin(rad(angle));\n            matrix.c = -matrix.b;\n            matrix.d = matrix.a;\n            matrix.e = x - x * matrix.a + y * matrix.b || 0;\n            matrix.f = y - y * matrix.a - x * matrix.b || 0;\n            return matrix;\n        };\n        Matrix.scale = function (scaleX, scaleY) {\n            return new Matrix(scaleX, 0, 0, scaleY, 0, 0);\n        };\n        Matrix.IDENTITY = Matrix.unit();\n        function toMatrix(transformation) {\n            if (transformation && typeof transformation.matrix === 'function') {\n                return transformation.matrix();\n            }\n            return transformation;\n        }\n        var Point = Class.extend({\n            init: function (x, y) {\n                this.x = x || 0;\n                this.y = y || 0;\n            },\n            equals: function (other) {\n                return other && other.x === this.x && other.y === this.y;\n            },\n            clone: function () {\n                return new Point(this.x, this.y);\n            },\n            rotate: function (angle, origin) {\n                var originPoint = Point.create(origin) || Point.ZERO;\n                return this.transform(Matrix.rotate(angle, originPoint.x, originPoint.y));\n            },\n            translate: function (x, y) {\n                this.x += x;\n                this.y += y;\n                this.geometryChange();\n                return this;\n            },\n            translateWith: function (point) {\n                return this.translate(point.x, point.y);\n            },\n            move: function (x, y) {\n                this.x = this.y = 0;\n                return this.translate(x, y);\n            },\n            scale: function (scaleX, scaleY) {\n                if (scaleY === void 0) {\n                    scaleY = scaleX;\n                }\n                this.x *= scaleX;\n                this.y *= scaleY;\n                this.geometryChange();\n                return this;\n            },\n            scaleCopy: function (scaleX, scaleY) {\n                return this.clone().scale(scaleX, scaleY);\n            },\n            transform: function (transformation) {\n                var matrix = toMatrix(transformation);\n                var ref = this;\n                var x = ref.x;\n                var y = ref.y;\n                this.x = matrix.a * x + matrix.c * y + matrix.e;\n                this.y = matrix.b * x + matrix.d * y + matrix.f;\n                this.geometryChange();\n                return this;\n            },\n            transformCopy: function (transformation) {\n                var point = this.clone();\n                if (transformation) {\n                    point.transform(transformation);\n                }\n                return point;\n            },\n            distanceTo: function (point) {\n                var dx = this.x - point.x;\n                var dy = this.y - point.y;\n                return Math.sqrt(dx * dx + dy * dy);\n            },\n            round: function (digits) {\n                this.x = round(this.x, digits);\n                this.y = round(this.y, digits);\n                this.geometryChange();\n                return this;\n            },\n            toArray: function (digits) {\n                var doRound = defined(digits);\n                var x = doRound ? round(this.x, digits) : this.x;\n                var y = doRound ? round(this.y, digits) : this.y;\n                return [\n                    x,\n                    y\n                ];\n            },\n            toString: function (digits, separator) {\n                if (separator === void 0) {\n                    separator = ' ';\n                }\n                var ref = this;\n                var x = ref.x;\n                var y = ref.y;\n                if (defined(digits)) {\n                    x = round(x, digits);\n                    y = round(y, digits);\n                }\n                return x + separator + y;\n            }\n        });\n        Point.create = function (arg0, arg1) {\n            if (defined(arg0)) {\n                if (arg0 instanceof Point) {\n                    return arg0;\n                } else if (arguments.length === 1 && arg0.length === 2) {\n                    return new Point(arg0[0], arg0[1]);\n                }\n                return new Point(arg0, arg1);\n            }\n        };\n        Point.min = function () {\n            var arguments$1 = arguments;\n            var minX = MAX_NUM;\n            var minY = MAX_NUM;\n            for (var i = 0; i < arguments.length; i++) {\n                var point = arguments$1[i];\n                minX = Math.min(point.x, minX);\n                minY = Math.min(point.y, minY);\n            }\n            return new Point(minX, minY);\n        };\n        Point.max = function () {\n            var arguments$1 = arguments;\n            var maxX = MIN_NUM;\n            var maxY = MIN_NUM;\n            for (var i = 0; i < arguments.length; i++) {\n                var point = arguments$1[i];\n                maxX = Math.max(point.x, maxX);\n                maxY = Math.max(point.y, maxY);\n            }\n            return new Point(maxX, maxY);\n        };\n        Point.minPoint = function () {\n            return new Point(MIN_NUM, MIN_NUM);\n        };\n        Point.maxPoint = function () {\n            return new Point(MAX_NUM, MAX_NUM);\n        };\n        if (Object.defineProperties) {\n            Object.defineProperties(Point, {\n                ZERO: {\n                    get: function () {\n                        return new Point(0, 0);\n                    }\n                }\n            });\n        }\n        defineAccessors(Point.prototype, [\n            'x',\n            'y'\n        ]);\n        ObserversMixin.extend(Point.prototype);\n        var Size = Class.extend({\n            init: function (width, height) {\n                this.width = width || 0;\n                this.height = height || 0;\n            },\n            equals: function (other) {\n                return other && other.width === this.width && other.height === this.height;\n            },\n            clone: function () {\n                return new Size(this.width, this.height);\n            },\n            toArray: function (digits) {\n                var doRound = defined(digits);\n                var width = doRound ? round(this.width, digits) : this.width;\n                var height = doRound ? round(this.height, digits) : this.height;\n                return [\n                    width,\n                    height\n                ];\n            }\n        });\n        Size.create = function (arg0, arg1) {\n            if (defined(arg0)) {\n                if (arg0 instanceof Size) {\n                    return arg0;\n                } else if (arguments.length === 1 && arg0.length === 2) {\n                    return new Size(arg0[0], arg0[1]);\n                }\n                return new Size(arg0, arg1);\n            }\n        };\n        if (Object.defineProperties) {\n            Object.defineProperties(Size, {\n                ZERO: {\n                    get: function () {\n                        return new Size(0, 0);\n                    }\n                }\n            });\n        }\n        defineAccessors(Size.prototype, [\n            'width',\n            'height'\n        ]);\n        ObserversMixin.extend(Size.prototype);\n        var Rect = Class.extend({\n            init: function (origin, size) {\n                if (origin === void 0) {\n                    origin = new Point();\n                }\n                if (size === void 0) {\n                    size = new Size();\n                }\n                this.setOrigin(origin);\n                this.setSize(size);\n            },\n            clone: function () {\n                return new Rect(this.origin.clone(), this.size.clone());\n            },\n            equals: function (other) {\n                return other && other.origin.equals(this.origin) && other.size.equals(this.size);\n            },\n            setOrigin: function (value) {\n                this._observerField('origin', Point.create(value));\n                this.geometryChange();\n                return this;\n            },\n            getOrigin: function () {\n                return this.origin;\n            },\n            setSize: function (value) {\n                this._observerField('size', Size.create(value));\n                this.geometryChange();\n                return this;\n            },\n            getSize: function () {\n                return this.size;\n            },\n            width: function () {\n                return this.size.width;\n            },\n            height: function () {\n                return this.size.height;\n            },\n            topLeft: function () {\n                return this.origin.clone();\n            },\n            bottomRight: function () {\n                return this.origin.clone().translate(this.width(), this.height());\n            },\n            topRight: function () {\n                return this.origin.clone().translate(this.width(), 0);\n            },\n            bottomLeft: function () {\n                return this.origin.clone().translate(0, this.height());\n            },\n            center: function () {\n                return this.origin.clone().translate(this.width() / 2, this.height() / 2);\n            },\n            bbox: function (matrix) {\n                var tl = this.topLeft().transformCopy(matrix);\n                var tr = this.topRight().transformCopy(matrix);\n                var br = this.bottomRight().transformCopy(matrix);\n                var bl = this.bottomLeft().transformCopy(matrix);\n                return Rect.fromPoints(tl, tr, br, bl);\n            },\n            transformCopy: function (m) {\n                return Rect.fromPoints(this.topLeft().transform(m), this.bottomRight().transform(m));\n            },\n            expand: function (x, y) {\n                if (y === void 0) {\n                    y = x;\n                }\n                this.size.width += 2 * x;\n                this.size.height += 2 * y;\n                this.origin.translate(-x, -y);\n                return this;\n            },\n            expandCopy: function (x, y) {\n                return this.clone().expand(x, y);\n            },\n            containsPoint: function (point) {\n                var origin = this.origin;\n                var bottomRight = this.bottomRight();\n                return !(point.x < origin.x || point.y < origin.y || bottomRight.x < point.x || bottomRight.y < point.y);\n            },\n            _isOnPath: function (point, width) {\n                var rectOuter = this.expandCopy(width, width);\n                var rectInner = this.expandCopy(-width, -width);\n                return rectOuter.containsPoint(point) && !rectInner.containsPoint(point);\n            }\n        });\n        Rect.fromPoints = function () {\n            var topLeft = Point.min.apply(null, arguments);\n            var bottomRight = Point.max.apply(null, arguments);\n            var size = new Size(bottomRight.x - topLeft.x, bottomRight.y - topLeft.y);\n            return new Rect(topLeft, size);\n        };\n        Rect.union = function (a, b) {\n            return Rect.fromPoints(Point.min(a.topLeft(), b.topLeft()), Point.max(a.bottomRight(), b.bottomRight()));\n        };\n        Rect.intersect = function (a, b) {\n            var rect1 = {\n                left: a.topLeft().x,\n                top: a.topLeft().y,\n                right: a.bottomRight().x,\n                bottom: a.bottomRight().y\n            };\n            var rect2 = {\n                left: b.topLeft().x,\n                top: b.topLeft().y,\n                right: b.bottomRight().x,\n                bottom: b.bottomRight().y\n            };\n            if (rect1.left <= rect2.right && rect2.left <= rect1.right && rect1.top <= rect2.bottom && rect2.top <= rect1.bottom) {\n                return Rect.fromPoints(new Point(Math.max(rect1.left, rect2.left), Math.max(rect1.top, rect2.top)), new Point(Math.min(rect1.right, rect2.right), Math.min(rect1.bottom, rect2.bottom)));\n            }\n        };\n        ObserversMixin.extend(Rect.prototype);\n        var Transformation = Class.extend({\n            init: function (matrix) {\n                if (matrix === void 0) {\n                    matrix = Matrix.unit();\n                }\n                this._matrix = matrix;\n            },\n            clone: function () {\n                return new Transformation(this._matrix.clone());\n            },\n            equals: function (other) {\n                return other && other._matrix.equals(this._matrix);\n            },\n            translate: function (x, y) {\n                this._matrix = this._matrix.multiplyCopy(Matrix.translate(x, y));\n                this._optionsChange();\n                return this;\n            },\n            scale: function (scaleX, scaleY, origin) {\n                if (scaleY === void 0) {\n                    scaleY = scaleX;\n                }\n                if (origin === void 0) {\n                    origin = null;\n                }\n                var originPoint = origin;\n                if (originPoint) {\n                    originPoint = Point.create(originPoint);\n                    this._matrix = this._matrix.multiplyCopy(Matrix.translate(originPoint.x, originPoint.y));\n                }\n                this._matrix = this._matrix.multiplyCopy(Matrix.scale(scaleX, scaleY));\n                if (originPoint) {\n                    this._matrix = this._matrix.multiplyCopy(Matrix.translate(-originPoint.x, -originPoint.y));\n                }\n                this._optionsChange();\n                return this;\n            },\n            rotate: function (angle, origin) {\n                var originPoint = Point.create(origin) || Point.ZERO;\n                this._matrix = this._matrix.multiplyCopy(Matrix.rotate(angle, originPoint.x, originPoint.y));\n                this._optionsChange();\n                return this;\n            },\n            multiply: function (transformation) {\n                var matrix = toMatrix(transformation);\n                this._matrix = this._matrix.multiplyCopy(matrix);\n                this._optionsChange();\n                return this;\n            },\n            matrix: function (value) {\n                if (value) {\n                    this._matrix = value;\n                    this._optionsChange();\n                    return this;\n                }\n                return this._matrix;\n            },\n            _optionsChange: function () {\n                this.optionsChange({\n                    field: 'transform',\n                    value: this\n                });\n            }\n        });\n        ObserversMixin.extend(Transformation.prototype);\n        function transform(matrix) {\n            if (matrix === null) {\n                return null;\n            }\n            if (matrix instanceof Transformation) {\n                return matrix;\n            }\n            return new Transformation(matrix);\n        }\n        var Element$1 = Class.extend({\n            init: function (options) {\n                this._initOptions(options);\n            },\n            _initOptions: function (options) {\n                if (options === void 0) {\n                    options = {};\n                }\n                var clip = options.clip;\n                var transform$$1 = options.transform;\n                if (transform$$1) {\n                    options.transform = transform(transform$$1);\n                }\n                if (clip && !clip.id) {\n                    clip.id = definitionId();\n                }\n                this.options = new OptionsStore(options);\n                this.options.addObserver(this);\n            },\n            transform: function (value) {\n                if (defined(value)) {\n                    this.options.set('transform', transform(value));\n                } else {\n                    return this.options.get('transform');\n                }\n            },\n            parentTransform: function () {\n                var element = this;\n                var parentMatrix;\n                while (element.parent) {\n                    element = element.parent;\n                    var transformation = element.transform();\n                    if (transformation) {\n                        parentMatrix = transformation.matrix().multiplyCopy(parentMatrix || Matrix.unit());\n                    }\n                }\n                if (parentMatrix) {\n                    return transform(parentMatrix);\n                }\n            },\n            currentTransform: function (parentTransform) {\n                if (parentTransform === void 0) {\n                    parentTransform = this.parentTransform();\n                }\n                var elementTransform = this.transform();\n                var elementMatrix = toMatrix(elementTransform);\n                var parentMatrix = toMatrix(parentTransform);\n                var combinedMatrix;\n                if (elementMatrix && parentMatrix) {\n                    combinedMatrix = parentMatrix.multiplyCopy(elementMatrix);\n                } else {\n                    combinedMatrix = elementMatrix || parentMatrix;\n                }\n                if (combinedMatrix) {\n                    return transform(combinedMatrix);\n                }\n            },\n            visible: function (value) {\n                if (defined(value)) {\n                    this.options.set('visible', value);\n                    return this;\n                }\n                return this.options.get('visible') !== false;\n            },\n            clip: function (value) {\n                var options = this.options;\n                if (defined(value)) {\n                    if (value && !value.id) {\n                        value.id = definitionId();\n                    }\n                    options.set('clip', value);\n                    return this;\n                }\n                return options.get('clip');\n            },\n            opacity: function (value) {\n                if (defined(value)) {\n                    this.options.set('opacity', value);\n                    return this;\n                }\n                return valueOrDefault(this.options.get('opacity'), 1);\n            },\n            clippedBBox: function (transformation) {\n                var bbox = this._clippedBBox(transformation);\n                if (bbox) {\n                    var clip = this.clip();\n                    return clip ? Rect.intersect(bbox, clip.bbox(transformation)) : bbox;\n                }\n            },\n            containsPoint: function (point, parentTransform) {\n                if (this.visible()) {\n                    var transform$$1 = this.currentTransform(parentTransform);\n                    var transformedPoint = point;\n                    if (transform$$1) {\n                        transformedPoint = point.transformCopy(transform$$1.matrix().invert());\n                    }\n                    return this._hasFill() && this._containsPoint(transformedPoint) || this._isOnPath && this._hasStroke() && this._isOnPath(transformedPoint);\n                }\n                return false;\n            },\n            _hasFill: function () {\n                var fill = this.options.fill;\n                return fill && !isTransparent(fill.color);\n            },\n            _hasStroke: function () {\n                var stroke = this.options.stroke;\n                return stroke && stroke.width > 0 && !isTransparent(stroke.color);\n            },\n            _clippedBBox: function (transformation) {\n                return this.bbox(transformation);\n            }\n        });\n        Element$1.prototype.nodeType = 'Element';\n        ObserversMixin.extend(Element$1.prototype);\n        function ellipseExtremeAngles(center, rx, ry, matrix) {\n            var extremeX = 0;\n            var extremeY = 0;\n            if (matrix) {\n                extremeX = Math.atan2(matrix.c * ry, matrix.a * rx);\n                if (matrix.b !== 0) {\n                    extremeY = Math.atan2(matrix.d * ry, matrix.b * rx);\n                }\n            }\n            return {\n                x: extremeX,\n                y: extremeY\n            };\n        }\n        var PI_DIV_2 = Math.PI / 2;\n        var Circle$2 = Class.extend({\n            init: function (center, radius) {\n                if (center === void 0) {\n                    center = new Point();\n                }\n                if (radius === void 0) {\n                    radius = 0;\n                }\n                this.setCenter(center);\n                this.setRadius(radius);\n            },\n            setCenter: function (value) {\n                this._observerField('center', Point.create(value));\n                this.geometryChange();\n                return this;\n            },\n            getCenter: function () {\n                return this.center;\n            },\n            equals: function (other) {\n                return other && other.center.equals(this.center) && other.radius === this.radius;\n            },\n            clone: function () {\n                return new Circle$2(this.center.clone(), this.radius);\n            },\n            pointAt: function (angle) {\n                return this._pointAt(rad(angle));\n            },\n            bbox: function (matrix) {\n                var this$1 = this;\n                var extremeAngles = ellipseExtremeAngles(this.center, this.radius, this.radius, matrix);\n                var minPoint = Point.maxPoint();\n                var maxPoint = Point.minPoint();\n                for (var i = 0; i < 4; i++) {\n                    var currentPointX = this$1._pointAt(extremeAngles.x + i * PI_DIV_2).transformCopy(matrix);\n                    var currentPointY = this$1._pointAt(extremeAngles.y + i * PI_DIV_2).transformCopy(matrix);\n                    var currentPoint = new Point(currentPointX.x, currentPointY.y);\n                    minPoint = Point.min(minPoint, currentPoint);\n                    maxPoint = Point.max(maxPoint, currentPoint);\n                }\n                return Rect.fromPoints(minPoint, maxPoint);\n            },\n            _pointAt: function (angle) {\n                var ref = this;\n                var center = ref.center;\n                var radius = ref.radius;\n                return new Point(center.x + radius * Math.cos(angle), center.y + radius * Math.sin(angle));\n            },\n            containsPoint: function (point) {\n                var ref = this;\n                var center = ref.center;\n                var radius = ref.radius;\n                var inCircle = Math.pow(point.x - center.x, 2) + Math.pow(point.y - center.y, 2) <= Math.pow(radius, 2);\n                return inCircle;\n            },\n            _isOnPath: function (point, width) {\n                var ref = this;\n                var center = ref.center;\n                var radius = ref.radius;\n                var pointDistance = center.distanceTo(point);\n                return radius - width <= pointDistance && pointDistance <= radius + width;\n            }\n        });\n        defineAccessors(Circle$2.prototype, ['radius']);\n        ObserversMixin.extend(Circle$2.prototype);\n        var GRADIENT = 'Gradient';\n        var Paintable = {\n            extend: function (proto) {\n                proto.fill = this.fill;\n                proto.stroke = this.stroke;\n            },\n            fill: function (color, opacity) {\n                var options = this.options;\n                if (defined(color)) {\n                    if (color && color.nodeType !== GRADIENT) {\n                        var newFill = { color: color };\n                        if (defined(opacity)) {\n                            newFill.opacity = opacity;\n                        }\n                        options.set('fill', newFill);\n                    } else {\n                        options.set('fill', color);\n                    }\n                    return this;\n                }\n                return options.get('fill');\n            },\n            stroke: function (color, width, opacity) {\n                if (defined(color)) {\n                    this.options.set('stroke.color', color);\n                    if (defined(width)) {\n                        this.options.set('stroke.width', width);\n                    }\n                    if (defined(opacity)) {\n                        this.options.set('stroke.opacity', opacity);\n                    }\n                    return this;\n                }\n                return this.options.get('stroke');\n            }\n        };\n        var IDENTITY_MATRIX_HASH = Matrix.IDENTITY.toString();\n        var Measurable = {\n            extend: function (proto) {\n                proto.bbox = this.bbox;\n                proto.geometryChange = this.geometryChange;\n            },\n            bbox: function (transformation) {\n                var combinedMatrix = toMatrix(this.currentTransform(transformation));\n                var matrixHash = combinedMatrix ? combinedMatrix.toString() : IDENTITY_MATRIX_HASH;\n                var bbox;\n                if (this._bboxCache && this._matrixHash === matrixHash) {\n                    bbox = this._bboxCache.clone();\n                } else {\n                    bbox = this._bbox(combinedMatrix);\n                    this._bboxCache = bbox ? bbox.clone() : null;\n                    this._matrixHash = matrixHash;\n                }\n                var strokeWidth = this.options.get('stroke.width');\n                if (strokeWidth && bbox) {\n                    bbox.expand(strokeWidth / 2);\n                }\n                return bbox;\n            },\n            geometryChange: function () {\n                delete this._bboxCache;\n                this.trigger('geometryChange', { element: this });\n            }\n        };\n        function geometryAccessor(name) {\n            var fieldName = '_' + name;\n            return function (value) {\n                if (defined(value)) {\n                    this._observerField(fieldName, value);\n                    this.geometryChange();\n                    return this;\n                }\n                return this[fieldName];\n            };\n        }\n        function defineGeometryAccessors(fn, names) {\n            for (var i = 0; i < names.length; i++) {\n                fn[names[i]] = geometryAccessor(names[i]);\n            }\n        }\n        var DEFAULT_STROKE = '#000';\n        var Circle = Element$1.extend({\n            init: function (geometry, options) {\n                if (geometry === void 0) {\n                    geometry = new Circle$2();\n                }\n                if (options === void 0) {\n                    options = {};\n                }\n                Element$1.fn.init.call(this, options);\n                this.geometry(geometry);\n                if (!defined(this.options.stroke)) {\n                    this.stroke(DEFAULT_STROKE);\n                }\n            },\n            rawBBox: function () {\n                return this._geometry.bbox();\n            },\n            _bbox: function (matrix) {\n                return this._geometry.bbox(matrix);\n            },\n            _containsPoint: function (point) {\n                return this.geometry().containsPoint(point);\n            },\n            _isOnPath: function (point) {\n                return this.geometry()._isOnPath(point, this.options.stroke.width / 2);\n            }\n        });\n        Circle.prototype.nodeType = 'Circle';\n        Paintable.extend(Circle.prototype);\n        Measurable.extend(Circle.prototype);\n        defineGeometryAccessors(Circle.prototype, ['geometry']);\n        var PRECISION = 10;\n        function close(a, b, tolerance) {\n            if (tolerance === void 0) {\n                tolerance = PRECISION;\n            }\n            return round(Math.abs(a - b), tolerance) === 0;\n        }\n        function closeOrLess(a, b, tolerance) {\n            return a < b || close(a, b, tolerance);\n        }\n        function lineIntersection(p0, p1, p2, p3) {\n            var s1x = p1.x - p0.x;\n            var s2x = p3.x - p2.x;\n            var s1y = p1.y - p0.y;\n            var s2y = p3.y - p2.y;\n            var nx = p0.x - p2.x;\n            var ny = p0.y - p2.y;\n            var d = s1x * s2y - s2x * s1y;\n            var s = (s1x * ny - s1y * nx) / d;\n            var t = (s2x * ny - s2y * nx) / d;\n            if (s >= 0 && s <= 1 && t >= 0 && t <= 1) {\n                return new Point(p0.x + t * s1x, p0.y + t * s1y);\n            }\n        }\n        var MAX_INTERVAL = 45;\n        var pow$1 = Math.pow;\n        var Arc$2 = Class.extend({\n            init: function (center, options) {\n                if (center === void 0) {\n                    center = new Point();\n                }\n                if (options === void 0) {\n                    options = {};\n                }\n                this.setCenter(center);\n                this.radiusX = options.radiusX;\n                this.radiusY = options.radiusY || options.radiusX;\n                this.startAngle = options.startAngle;\n                this.endAngle = options.endAngle;\n                this.anticlockwise = options.anticlockwise || false;\n                this.xRotation = options.xRotation;\n            },\n            clone: function () {\n                return new Arc$2(this.center, {\n                    radiusX: this.radiusX,\n                    radiusY: this.radiusY,\n                    startAngle: this.startAngle,\n                    endAngle: this.endAngle,\n                    anticlockwise: this.anticlockwise\n                });\n            },\n            setCenter: function (value) {\n                this._observerField('center', Point.create(value));\n                this.geometryChange();\n                return this;\n            },\n            getCenter: function () {\n                return this.center;\n            },\n            pointAt: function (angle) {\n                var center = this.center;\n                var radian = rad(angle);\n                return new Point(center.x + this.radiusX * Math.cos(radian), center.y + this.radiusY * Math.sin(radian));\n            },\n            curvePoints: function () {\n                var this$1 = this;\n                var startAngle = this.startAngle;\n                var dir = this.anticlockwise ? -1 : 1;\n                var curvePoints = [this.pointAt(startAngle)];\n                var interval = this._arcInterval();\n                var intervalAngle = interval.endAngle - interval.startAngle;\n                var subIntervalsCount = Math.ceil(intervalAngle / MAX_INTERVAL);\n                var subIntervalAngle = intervalAngle / subIntervalsCount;\n                var currentAngle = startAngle;\n                var transformation;\n                if (this.xRotation) {\n                    transformation = transform().rotate(this.xRotation, this.center);\n                }\n                for (var i = 1; i <= subIntervalsCount; i++) {\n                    var nextAngle = currentAngle + dir * subIntervalAngle;\n                    var points = this$1._intervalCurvePoints(currentAngle, nextAngle, transformation);\n                    curvePoints.push(points.cp1, points.cp2, points.p2);\n                    currentAngle = nextAngle;\n                }\n                return curvePoints;\n            },\n            bbox: function (matrix) {\n                var this$1 = this;\n                var interval = this._arcInterval();\n                var startAngle = interval.startAngle;\n                var endAngle = interval.endAngle;\n                var extremeAngles = ellipseExtremeAngles(this.center, this.radiusX, this.radiusY, matrix);\n                var extremeX = deg(extremeAngles.x);\n                var extremeY = deg(extremeAngles.y);\n                var endPoint = this.pointAt(endAngle).transformCopy(matrix);\n                var currentAngleX = bboxStartAngle(extremeX, startAngle);\n                var currentAngleY = bboxStartAngle(extremeY, startAngle);\n                var currentPoint = this.pointAt(startAngle).transformCopy(matrix);\n                var minPoint = Point.min(currentPoint, endPoint);\n                var maxPoint = Point.max(currentPoint, endPoint);\n                while (currentAngleX < endAngle || currentAngleY < endAngle) {\n                    var currentPointX = void 0;\n                    if (currentAngleX < endAngle) {\n                        currentPointX = this$1.pointAt(currentAngleX).transformCopy(matrix);\n                        currentAngleX += 90;\n                    }\n                    var currentPointY = void 0;\n                    if (currentAngleY < endAngle) {\n                        currentPointY = this$1.pointAt(currentAngleY).transformCopy(matrix);\n                        currentAngleY += 90;\n                    }\n                    currentPoint = new Point(currentPointX.x, currentPointY.y);\n                    minPoint = Point.min(minPoint, currentPoint);\n                    maxPoint = Point.max(maxPoint, currentPoint);\n                }\n                return Rect.fromPoints(minPoint, maxPoint);\n            },\n            _arcInterval: function () {\n                var ref = this;\n                var startAngle = ref.startAngle;\n                var endAngle = ref.endAngle;\n                var anticlockwise = ref.anticlockwise;\n                if (anticlockwise) {\n                    var oldStart = startAngle;\n                    startAngle = endAngle;\n                    endAngle = oldStart;\n                }\n                if (startAngle > endAngle || anticlockwise && startAngle === endAngle) {\n                    endAngle += 360;\n                }\n                return {\n                    startAngle: startAngle,\n                    endAngle: endAngle\n                };\n            },\n            _intervalCurvePoints: function (startAngle, endAngle, transformation) {\n                var p1 = this.pointAt(startAngle);\n                var p2 = this.pointAt(endAngle);\n                var p1Derivative = this._derivativeAt(startAngle);\n                var p2Derivative = this._derivativeAt(endAngle);\n                var t = (rad(endAngle) - rad(startAngle)) / 3;\n                var cp1 = new Point(p1.x + t * p1Derivative.x, p1.y + t * p1Derivative.y);\n                var cp2 = new Point(p2.x - t * p2Derivative.x, p2.y - t * p2Derivative.y);\n                if (transformation) {\n                    p1.transform(transformation);\n                    p2.transform(transformation);\n                    cp1.transform(transformation);\n                    cp2.transform(transformation);\n                }\n                return {\n                    p1: p1,\n                    cp1: cp1,\n                    cp2: cp2,\n                    p2: p2\n                };\n            },\n            _derivativeAt: function (angle) {\n                var radian = rad(angle);\n                return new Point(-this.radiusX * Math.sin(radian), this.radiusY * Math.cos(radian));\n            },\n            containsPoint: function (point) {\n                var interval = this._arcInterval();\n                var intervalAngle = interval.endAngle - interval.startAngle;\n                var ref = this;\n                var center = ref.center;\n                var radiusX = ref.radiusX;\n                var radiusY = ref.radiusY;\n                var distance = center.distanceTo(point);\n                var angleRad = Math.atan2(point.y - center.y, point.x - center.x);\n                var pointRadius = radiusX * radiusY / Math.sqrt(pow$1(radiusX, 2) * pow$1(Math.sin(angleRad), 2) + pow$1(radiusY, 2) * pow$1(Math.cos(angleRad), 2));\n                var startPoint = this.pointAt(this.startAngle).round(PRECISION);\n                var endPoint = this.pointAt(this.endAngle).round(PRECISION);\n                var intersection = lineIntersection(center, point.round(PRECISION), startPoint, endPoint);\n                var containsPoint;\n                if (intervalAngle < 180) {\n                    containsPoint = intersection && closeOrLess(center.distanceTo(intersection), distance) && closeOrLess(distance, pointRadius);\n                } else {\n                    var angle = calculateAngle(center.x, center.y, radiusX, radiusY, point.x, point.y);\n                    if (angle !== 360) {\n                        angle = (360 + angle) % 360;\n                    }\n                    var inAngleRange = interval.startAngle <= angle && angle <= interval.endAngle;\n                    containsPoint = inAngleRange && closeOrLess(distance, pointRadius) || !inAngleRange && (!intersection || intersection.equals(point));\n                }\n                return containsPoint;\n            },\n            _isOnPath: function (point, width) {\n                var interval = this._arcInterval();\n                var center = this.center;\n                var angle = calculateAngle(center.x, center.y, this.radiusX, this.radiusY, point.x, point.y);\n                if (angle !== 360) {\n                    angle = (360 + angle) % 360;\n                }\n                var inAngleRange = interval.startAngle <= angle && angle <= interval.endAngle;\n                return inAngleRange && this.pointAt(angle).distanceTo(point) <= width;\n            }\n        });\n        Arc$2.fromPoints = function (start, end, rx, ry, largeArc, swipe, rotation) {\n            var arcParameters = normalizeArcParameters({\n                x1: start.x,\n                y1: start.y,\n                x2: end.x,\n                y2: end.y,\n                rx: rx,\n                ry: ry,\n                largeArc: largeArc,\n                swipe: swipe,\n                rotation: rotation\n            });\n            return new Arc$2(arcParameters.center, {\n                startAngle: arcParameters.startAngle,\n                endAngle: arcParameters.endAngle,\n                radiusX: arcParameters.radiusX,\n                radiusY: arcParameters.radiusY,\n                xRotation: arcParameters.xRotation,\n                anticlockwise: swipe === 0\n            });\n        };\n        defineAccessors(Arc$2.prototype, [\n            'radiusX',\n            'radiusY',\n            'startAngle',\n            'endAngle',\n            'anticlockwise'\n        ]);\n        ObserversMixin.extend(Arc$2.prototype);\n        function calculateAngle(cx, cy, rx, ry, x, y) {\n            var cos = round((x - cx) / rx, 3);\n            var sin = round((y - cy) / ry, 3);\n            return round(deg(Math.atan2(sin, cos)));\n        }\n        function normalizeArcParameters(parameters) {\n            var x1 = parameters.x1;\n            var y1 = parameters.y1;\n            var x2 = parameters.x2;\n            var y2 = parameters.y2;\n            var rx = parameters.rx;\n            var ry = parameters.ry;\n            var largeArc = parameters.largeArc;\n            var swipe = parameters.swipe;\n            var rotation = parameters.rotation;\n            if (rotation === void 0) {\n                rotation = 0;\n            }\n            var radians = rad(rotation);\n            var cosine = Math.cos(radians);\n            var sine = Math.sin(radians);\n            var xT = cosine * (x1 - x2) / 2 + sine * (y1 - y2) / 2;\n            var yT = -sine * (x1 - x2) / 2 + cosine * (y1 - y2) / 2;\n            var sign = largeArc !== swipe ? 1 : -1;\n            var xt2 = Math.pow(xT, 2);\n            var yt2 = Math.pow(yT, 2);\n            var rx2 = Math.pow(rx, 2);\n            var ry2 = Math.pow(ry, 2);\n            var delta = xt2 / rx2 + yt2 / ry2;\n            if (delta > 1) {\n                delta = Math.sqrt(xt2 / rx2 + yt2 / ry2);\n                rx = delta * rx;\n                rx2 = Math.pow(rx, 2);\n                ry = delta * ry;\n                ry2 = Math.pow(ry, 2);\n            }\n            var constT = sign * Math.sqrt((rx2 * ry2 - rx2 * yt2 - ry2 * xt2) / (rx2 * yt2 + ry2 * xt2));\n            if (isNaN(constT)) {\n                constT = 0;\n            }\n            var cxT = constT * (rx * yT) / ry;\n            var cyT = -constT * (ry * xT) / rx;\n            var cx = cosine * cxT - sine * cyT + (x1 + x2) / 2;\n            var cy = sine * cxT + cosine * cyT + (y1 + y2) / 2;\n            var uX = (xT - cxT) / rx;\n            var uY = (yT - cyT) / ry;\n            var vX = -(xT + cxT) / rx;\n            var vY = -(yT + cyT) / ry;\n            var startAngle = (uY >= 0 ? 1 : -1) * deg(Math.acos(uX / Math.sqrt(uX * uX + uY * uY)));\n            var angleCosine = round((uX * vX + uY * vY) / (Math.sqrt(uX * uX + uY * uY) * Math.sqrt(vX * vX + vY * vY)), 10);\n            var angle = (uX * vY - uY * vX >= 0 ? 1 : -1) * deg(Math.acos(angleCosine));\n            if (!swipe && angle > 0) {\n                angle -= 360;\n            }\n            if (swipe && angle < 0) {\n                angle += 360;\n            }\n            var endAngle = startAngle + angle;\n            var signEndAngle = endAngle >= 0 ? 1 : -1;\n            endAngle = Math.abs(endAngle) % 360 * signEndAngle;\n            return {\n                center: new Point(cx, cy),\n                startAngle: startAngle,\n                endAngle: endAngle,\n                radiusX: rx,\n                radiusY: ry,\n                xRotation: rotation\n            };\n        }\n        function bboxStartAngle(angle, start) {\n            var startAngle = angle;\n            while (startAngle < start) {\n                startAngle += 90;\n            }\n            return startAngle;\n        }\n        var push = [].push;\n        var pop = [].pop;\n        var splice = [].splice;\n        var shift = [].shift;\n        var slice = [].slice;\n        var unshift = [].unshift;\n        var ElementsArray = Class.extend({\n            init: function (array) {\n                if (array === void 0) {\n                    array = [];\n                }\n                this.length = 0;\n                this._splice(0, array.length, array);\n            },\n            elements: function (value) {\n                if (value) {\n                    this._splice(0, this.length, value);\n                    this._change();\n                    return this;\n                }\n                return this.slice(0);\n            },\n            push: function () {\n                var elements = arguments;\n                var result = push.apply(this, elements);\n                this._add(elements);\n                return result;\n            },\n            slice: function () {\n                return slice.call(this);\n            },\n            pop: function () {\n                var length = this.length;\n                var result = pop.apply(this);\n                if (length) {\n                    this._remove([result]);\n                }\n                return result;\n            },\n            splice: function (index, howMany) {\n                var elements = slice.call(arguments, 2);\n                var result = this._splice(index, howMany, elements);\n                this._change();\n                return result;\n            },\n            shift: function () {\n                var length = this.length;\n                var result = shift.apply(this);\n                if (length) {\n                    this._remove([result]);\n                }\n                return result;\n            },\n            unshift: function () {\n                var elements = arguments;\n                var result = unshift.apply(this, elements);\n                this._add(elements);\n                return result;\n            },\n            indexOf: function (element) {\n                var this$1 = this;\n                var length = this.length;\n                for (var idx = 0; idx < length; idx++) {\n                    if (this$1[idx] === element) {\n                        return idx;\n                    }\n                }\n                return -1;\n            },\n            _splice: function (index, howMany, elements) {\n                var result = splice.apply(this, [\n                    index,\n                    howMany\n                ].concat(elements));\n                this._clearObserver(result);\n                this._setObserver(elements);\n                return result;\n            },\n            _add: function (elements) {\n                this._setObserver(elements);\n                this._change();\n            },\n            _remove: function (elements) {\n                this._clearObserver(elements);\n                this._change();\n            },\n            _setObserver: function (elements) {\n                var this$1 = this;\n                for (var idx = 0; idx < elements.length; idx++) {\n                    elements[idx].addObserver(this$1);\n                }\n            },\n            _clearObserver: function (elements) {\n                var this$1 = this;\n                for (var idx = 0; idx < elements.length; idx++) {\n                    elements[idx].removeObserver(this$1);\n                }\n            },\n            _change: function () {\n            }\n        });\n        ObserversMixin.extend(ElementsArray.prototype);\n        var GeometryElementsArray = ElementsArray.extend({\n            _change: function () {\n                this.geometryChange();\n            }\n        });\n        function pointAccessor(name) {\n            var fieldName = '_' + name;\n            return function (value) {\n                if (defined(value)) {\n                    this._observerField(fieldName, Point.create(value));\n                    this.geometryChange();\n                    return this;\n                }\n                return this[fieldName];\n            };\n        }\n        function definePointAccessors(fn, names) {\n            for (var i = 0; i < names.length; i++) {\n                fn[names[i]] = pointAccessor(names[i]);\n            }\n        }\n        function isOutOfEndPoint(endPoint, controlPoint, point) {\n            var angle = deg(Math.atan2(controlPoint.y - endPoint.y, controlPoint.x - endPoint.x));\n            var rotatedPoint = point.transformCopy(transform().rotate(-angle, endPoint));\n            return rotatedPoint.x < endPoint.x;\n        }\n        function calculateCurveAt(t, field, points) {\n            var t1 = 1 - t;\n            return Math.pow(t1, 3) * points[0][field] + 3 * Math.pow(t1, 2) * t * points[1][field] + 3 * Math.pow(t, 2) * t1 * points[2][field] + Math.pow(t, 3) * points[3][field];\n        }\n        function toCubicPolynomial(points, field) {\n            return [\n                -points[0][field] + 3 * points[1][field] - 3 * points[2][field] + points[3][field],\n                3 * (points[0][field] - 2 * points[1][field] + points[2][field]),\n                3 * (-points[0][field] + points[1][field]),\n                points[0][field]\n            ];\n        }\n        var ComplexNumber = Class.extend({\n            init: function (real, img) {\n                if (real === void 0) {\n                    real = 0;\n                }\n                if (img === void 0) {\n                    img = 0;\n                }\n                this.real = real;\n                this.img = img;\n            },\n            add: function (cNumber) {\n                return new ComplexNumber(round(this.real + cNumber.real, PRECISION), round(this.img + cNumber.img, PRECISION));\n            },\n            addConstant: function (value) {\n                return new ComplexNumber(this.real + value, this.img);\n            },\n            negate: function () {\n                return new ComplexNumber(-this.real, -this.img);\n            },\n            multiply: function (cNumber) {\n                return new ComplexNumber(this.real * cNumber.real - this.img * cNumber.img, this.real * cNumber.img + this.img * cNumber.real);\n            },\n            multiplyConstant: function (value) {\n                return new ComplexNumber(this.real * value, this.img * value);\n            },\n            nthRoot: function (n) {\n                var rad$$1 = Math.atan2(this.img, this.real);\n                var r = Math.sqrt(Math.pow(this.img, 2) + Math.pow(this.real, 2));\n                var nthR = Math.pow(r, 1 / n);\n                return new ComplexNumber(nthR * Math.cos(rad$$1 / n), nthR * Math.sin(rad$$1 / n));\n            },\n            equals: function (cNumber) {\n                return this.real === cNumber.real && this.img === cNumber.img;\n            },\n            isReal: function () {\n                return this.img === 0;\n            }\n        });\n        function numberSign(x) {\n            return x < 0 ? -1 : 1;\n        }\n        function solveQuadraticEquation(a, b, c) {\n            var squareRoot = Math.sqrt(Math.pow(b, 2) - 4 * a * c);\n            return [\n                (-b + squareRoot) / (2 * a),\n                (-b - squareRoot) / (2 * a)\n            ];\n        }\n        function solveCubicEquation(a, b, c, d) {\n            if (a === 0) {\n                return solveQuadraticEquation(b, c, d);\n            }\n            var p = (3 * a * c - Math.pow(b, 2)) / (3 * Math.pow(a, 2));\n            var q = (2 * Math.pow(b, 3) - 9 * a * b * c + 27 * Math.pow(a, 2) * d) / (27 * Math.pow(a, 3));\n            var Q = Math.pow(p / 3, 3) + Math.pow(q / 2, 2);\n            var i = new ComplexNumber(0, 1);\n            var b3a = -b / (3 * a);\n            var x1, x2, y1, y2, y3, z1, z2;\n            if (Q < 0) {\n                x1 = new ComplexNumber(-q / 2, Math.sqrt(-Q)).nthRoot(3);\n                x2 = new ComplexNumber(-q / 2, -Math.sqrt(-Q)).nthRoot(3);\n            } else {\n                x1 = -q / 2 + Math.sqrt(Q);\n                x1 = new ComplexNumber(numberSign(x1) * Math.pow(Math.abs(x1), 1 / 3));\n                x2 = -q / 2 - Math.sqrt(Q);\n                x2 = new ComplexNumber(numberSign(x2) * Math.pow(Math.abs(x2), 1 / 3));\n            }\n            y1 = x1.add(x2);\n            z1 = x1.add(x2).multiplyConstant(-1 / 2);\n            z2 = x1.add(x2.negate()).multiplyConstant(Math.sqrt(3) / 2);\n            y2 = z1.add(i.multiply(z2));\n            y3 = z1.add(i.negate().multiply(z2));\n            var result = [];\n            if (y1.isReal()) {\n                result.push(round(y1.real + b3a, PRECISION));\n            }\n            if (y2.isReal()) {\n                result.push(round(y2.real + b3a, PRECISION));\n            }\n            if (y3.isReal()) {\n                result.push(round(y3.real + b3a, PRECISION));\n            }\n            return result;\n        }\n        function hasRootsInRange(points, point, field, rootField, range) {\n            var polynomial = toCubicPolynomial(points, rootField);\n            var roots = solveCubicEquation(polynomial[0], polynomial[1], polynomial[2], polynomial[3] - point[rootField]);\n            var intersection;\n            for (var idx = 0; idx < roots.length; idx++) {\n                if (0 <= roots[idx] && roots[idx] <= 1) {\n                    intersection = calculateCurveAt(roots[idx], field, points);\n                    if (Math.abs(intersection - point[field]) <= range) {\n                        return true;\n                    }\n                }\n            }\n        }\n        function curveIntersectionsCount(points, point, bbox) {\n            var polynomial = toCubicPolynomial(points, 'x');\n            var roots = solveCubicEquation(polynomial[0], polynomial[1], polynomial[2], polynomial[3] - point.x);\n            var rayIntersection, intersectsRay;\n            var count = 0;\n            for (var i = 0; i < roots.length; i++) {\n                rayIntersection = calculateCurveAt(roots[i], 'y', points);\n                intersectsRay = close(rayIntersection, point.y) || rayIntersection > point.y;\n                if (intersectsRay && ((roots[i] === 0 || roots[i] === 1) && bbox.bottomRight().x > point.x || 0 < roots[i] && roots[i] < 1)) {\n                    count++;\n                }\n            }\n            return count;\n        }\n        function lineIntersectionsCount(a, b, point) {\n            var intersects;\n            if (a.x !== b.x) {\n                var minX = Math.min(a.x, b.x);\n                var maxX = Math.max(a.x, b.x);\n                var minY = Math.min(a.y, b.y);\n                var maxY = Math.max(a.y, b.y);\n                var inRange = minX <= point.x && point.x < maxX;\n                if (minY === maxY) {\n                    intersects = point.y <= minY && inRange;\n                } else {\n                    intersects = inRange && (maxY - minY) * ((a.x - b.x) * (a.y - b.y) > 0 ? point.x - minX : maxX - point.x) / (maxX - minX) + minY - point.y >= 0;\n                }\n            }\n            return intersects ? 1 : 0;\n        }\n        var Segment = Class.extend({\n            init: function (anchor, controlIn, controlOut) {\n                this.anchor(anchor || new Point());\n                this.controlIn(controlIn);\n                this.controlOut(controlOut);\n            },\n            bboxTo: function (toSegment, matrix) {\n                var segmentAnchor = this.anchor().transformCopy(matrix);\n                var toSegmentAnchor = toSegment.anchor().transformCopy(matrix);\n                var rect;\n                if (this.controlOut() && toSegment.controlIn()) {\n                    rect = this._curveBoundingBox(segmentAnchor, this.controlOut().transformCopy(matrix), toSegment.controlIn().transformCopy(matrix), toSegmentAnchor);\n                } else {\n                    rect = this._lineBoundingBox(segmentAnchor, toSegmentAnchor);\n                }\n                return rect;\n            },\n            _lineBoundingBox: function (p1, p2) {\n                return Rect.fromPoints(p1, p2);\n            },\n            _curveBoundingBox: function (p1, cp1, cp2, p2) {\n                var points = [\n                    p1,\n                    cp1,\n                    cp2,\n                    p2\n                ];\n                var extremesX = this._curveExtremesFor(points, 'x');\n                var extremesY = this._curveExtremesFor(points, 'y');\n                var xLimits = arrayLimits([\n                    extremesX.min,\n                    extremesX.max,\n                    p1.x,\n                    p2.x\n                ]);\n                var yLimits = arrayLimits([\n                    extremesY.min,\n                    extremesY.max,\n                    p1.y,\n                    p2.y\n                ]);\n                return Rect.fromPoints(new Point(xLimits.min, yLimits.min), new Point(xLimits.max, yLimits.max));\n            },\n            _curveExtremesFor: function (points, field) {\n                var extremes = this._curveExtremes(points[0][field], points[1][field], points[2][field], points[3][field]);\n                return {\n                    min: calculateCurveAt(extremes.min, field, points),\n                    max: calculateCurveAt(extremes.max, field, points)\n                };\n            },\n            _curveExtremes: function (x1, x2, x3, x4) {\n                var a = x1 - 3 * x2 + 3 * x3 - x4;\n                var b = -2 * (x1 - 2 * x2 + x3);\n                var c = x1 - x2;\n                var sqrt = Math.sqrt(b * b - 4 * a * c);\n                var t1 = 0;\n                var t2 = 1;\n                if (a === 0) {\n                    if (b !== 0) {\n                        t1 = t2 = -c / b;\n                    }\n                } else if (!isNaN(sqrt)) {\n                    t1 = (-b + sqrt) / (2 * a);\n                    t2 = (-b - sqrt) / (2 * a);\n                }\n                var min = Math.max(Math.min(t1, t2), 0);\n                if (min < 0 || min > 1) {\n                    min = 0;\n                }\n                var max = Math.min(Math.max(t1, t2), 1);\n                if (max > 1 || max < 0) {\n                    max = 1;\n                }\n                return {\n                    min: min,\n                    max: max\n                };\n            },\n            _intersectionsTo: function (segment, point) {\n                var intersectionsCount;\n                if (this.controlOut() && segment.controlIn()) {\n                    intersectionsCount = curveIntersectionsCount([\n                        this.anchor(),\n                        this.controlOut(),\n                        segment.controlIn(),\n                        segment.anchor()\n                    ], point, this.bboxTo(segment));\n                } else {\n                    intersectionsCount = lineIntersectionsCount(this.anchor(), segment.anchor(), point);\n                }\n                return intersectionsCount;\n            },\n            _isOnCurveTo: function (segment, point, width, endSegment) {\n                var bbox = this.bboxTo(segment).expand(width, width);\n                if (bbox.containsPoint(point)) {\n                    var p1 = this.anchor();\n                    var p2 = this.controlOut();\n                    var p3 = segment.controlIn();\n                    var p4 = segment.anchor();\n                    if (endSegment === 'start' && p1.distanceTo(point) <= width) {\n                        return !isOutOfEndPoint(p1, p2, point);\n                    } else if (endSegment === 'end' && p4.distanceTo(point) <= width) {\n                        return !isOutOfEndPoint(p4, p3, point);\n                    }\n                    var points = [\n                        p1,\n                        p2,\n                        p3,\n                        p4\n                    ];\n                    if (hasRootsInRange(points, point, 'x', 'y', width) || hasRootsInRange(points, point, 'y', 'x', width)) {\n                        return true;\n                    }\n                    var rotation = transform().rotate(45, point);\n                    var rotatedPoints = [\n                        p1.transformCopy(rotation),\n                        p2.transformCopy(rotation),\n                        p3.transformCopy(rotation),\n                        p4.transformCopy(rotation)\n                    ];\n                    return hasRootsInRange(rotatedPoints, point, 'x', 'y', width) || hasRootsInRange(rotatedPoints, point, 'y', 'x', width);\n                }\n            },\n            _isOnLineTo: function (segment, point, width) {\n                var p1 = this.anchor();\n                var p2 = segment.anchor();\n                var angle = deg(Math.atan2(p2.y - p1.y, p2.x - p1.x));\n                var rect = new Rect([\n                    p1.x,\n                    p1.y - width / 2\n                ], [\n                    p1.distanceTo(p2),\n                    width\n                ]);\n                return rect.containsPoint(point.transformCopy(transform().rotate(-angle, p1)));\n            },\n            _isOnPathTo: function (segment, point, width, endSegment) {\n                var isOnPath;\n                if (this.controlOut() && segment.controlIn()) {\n                    isOnPath = this._isOnCurveTo(segment, point, width / 2, endSegment);\n                } else {\n                    isOnPath = this._isOnLineTo(segment, point, width);\n                }\n                return isOnPath;\n            }\n        });\n        definePointAccessors(Segment.prototype, [\n            'anchor',\n            'controlIn',\n            'controlOut'\n        ]);\n        ObserversMixin.extend(Segment.prototype);\n        function arrayLimits(arr) {\n            var length = arr.length;\n            var min = MAX_NUM;\n            var max = MIN_NUM;\n            for (var i = 0; i < length; i++) {\n                max = Math.max(max, arr[i]);\n                min = Math.min(min, arr[i]);\n            }\n            return {\n                min: min,\n                max: max\n            };\n        }\n        var Path = Element$1.extend({\n            init: function (options) {\n                Element$1.fn.init.call(this, options);\n                this.segments = new GeometryElementsArray();\n                this.segments.addObserver(this);\n                if (!defined(this.options.stroke)) {\n                    this.stroke('#000');\n                    if (!defined(this.options.stroke.lineJoin)) {\n                        this.options.set('stroke.lineJoin', 'miter');\n                    }\n                }\n            },\n            moveTo: function (x, y) {\n                this.suspend();\n                this.segments.elements([]);\n                this.resume();\n                this.lineTo(x, y);\n                return this;\n            },\n            lineTo: function (x, y) {\n                var point = defined(y) ? new Point(x, y) : x;\n                var segment = new Segment(point);\n                this.segments.push(segment);\n                return this;\n            },\n            curveTo: function (controlOut, controlIn, point) {\n                if (this.segments.length > 0) {\n                    var lastSegment = last(this.segments);\n                    var segment = new Segment(point, controlIn);\n                    this.suspend();\n                    lastSegment.controlOut(controlOut);\n                    this.resume();\n                    this.segments.push(segment);\n                }\n                return this;\n            },\n            arc: function (startAngle, endAngle, radiusX, radiusY, anticlockwise) {\n                if (this.segments.length > 0) {\n                    var lastSegment = last(this.segments);\n                    var anchor = lastSegment.anchor();\n                    var start = rad(startAngle);\n                    var center = new Point(anchor.x - radiusX * Math.cos(start), anchor.y - radiusY * Math.sin(start));\n                    var arc = new Arc$2(center, {\n                        startAngle: startAngle,\n                        endAngle: endAngle,\n                        radiusX: radiusX,\n                        radiusY: radiusY,\n                        anticlockwise: anticlockwise\n                    });\n                    this._addArcSegments(arc);\n                }\n                return this;\n            },\n            arcTo: function (end, rx, ry, largeArc, swipe, rotation) {\n                if (this.segments.length > 0) {\n                    var lastSegment = last(this.segments);\n                    var anchor = lastSegment.anchor();\n                    var arc = Arc$2.fromPoints(anchor, end, rx, ry, largeArc, swipe, rotation);\n                    this._addArcSegments(arc);\n                }\n                return this;\n            },\n            _addArcSegments: function (arc) {\n                var this$1 = this;\n                this.suspend();\n                var curvePoints = arc.curvePoints();\n                for (var i = 1; i < curvePoints.length; i += 3) {\n                    this$1.curveTo(curvePoints[i], curvePoints[i + 1], curvePoints[i + 2]);\n                }\n                this.resume();\n                this.geometryChange();\n            },\n            close: function () {\n                this.options.closed = true;\n                this.geometryChange();\n                return this;\n            },\n            rawBBox: function () {\n                return this._bbox();\n            },\n            _containsPoint: function (point) {\n                var segments = this.segments;\n                var length = segments.length;\n                var intersectionsCount = 0;\n                var previous, current;\n                for (var idx = 1; idx < length; idx++) {\n                    previous = segments[idx - 1];\n                    current = segments[idx];\n                    intersectionsCount += previous._intersectionsTo(current, point);\n                }\n                if (this.options.closed || !segments[0].anchor().equals(segments[length - 1].anchor())) {\n                    intersectionsCount += lineIntersectionsCount(segments[0].anchor(), segments[length - 1].anchor(), point);\n                }\n                return intersectionsCount % 2 !== 0;\n            },\n            _isOnPath: function (point, width) {\n                var segments = this.segments;\n                var length = segments.length;\n                var pathWidth = width || this.options.stroke.width;\n                if (length > 1) {\n                    if (segments[0]._isOnPathTo(segments[1], point, pathWidth, 'start')) {\n                        return true;\n                    }\n                    for (var idx = 2; idx <= length - 2; idx++) {\n                        if (segments[idx - 1]._isOnPathTo(segments[idx], point, pathWidth)) {\n                            return true;\n                        }\n                    }\n                    if (segments[length - 2]._isOnPathTo(segments[length - 1], point, pathWidth, 'end')) {\n                        return true;\n                    }\n                }\n                return false;\n            },\n            _bbox: function (matrix) {\n                var segments = this.segments;\n                var length = segments.length;\n                var boundingBox;\n                if (length === 1) {\n                    var anchor = segments[0].anchor().transformCopy(matrix);\n                    boundingBox = new Rect(anchor, Size.ZERO);\n                } else if (length > 0) {\n                    for (var i = 1; i < length; i++) {\n                        var segmentBox = segments[i - 1].bboxTo(segments[i], matrix);\n                        if (boundingBox) {\n                            boundingBox = Rect.union(boundingBox, segmentBox);\n                        } else {\n                            boundingBox = segmentBox;\n                        }\n                    }\n                }\n                return boundingBox;\n            }\n        });\n        Path.fromRect = function (rect, options) {\n            return new Path(options).moveTo(rect.topLeft()).lineTo(rect.topRight()).lineTo(rect.bottomRight()).lineTo(rect.bottomLeft()).close();\n        };\n        Path.fromPoints = function (points, options) {\n            if (points) {\n                var path = new Path(options);\n                for (var i = 0; i < points.length; i++) {\n                    var point = Point.create(points[i]);\n                    if (point) {\n                        if (i === 0) {\n                            path.moveTo(point);\n                        } else {\n                            path.lineTo(point);\n                        }\n                    }\n                }\n                return path;\n            }\n        };\n        Path.fromArc = function (arc, options) {\n            var path = new Path(options);\n            var startAngle = arc.startAngle;\n            var start = arc.pointAt(startAngle);\n            path.moveTo(start.x, start.y);\n            path.arc(startAngle, arc.endAngle, arc.radiusX, arc.radiusY, arc.anticlockwise);\n            return path;\n        };\n        Path.prototype.nodeType = 'Path';\n        Paintable.extend(Path.prototype);\n        Measurable.extend(Path.prototype);\n        var DEFAULT_STROKE$1 = '#000';\n        var Arc = Element$1.extend({\n            init: function (geometry, options) {\n                if (geometry === void 0) {\n                    geometry = new Arc$2();\n                }\n                if (options === void 0) {\n                    options = {};\n                }\n                Element$1.fn.init.call(this, options);\n                this.geometry(geometry);\n                if (!defined(this.options.stroke)) {\n                    this.stroke(DEFAULT_STROKE$1);\n                }\n            },\n            _bbox: function (matrix) {\n                return this._geometry.bbox(matrix);\n            },\n            rawBBox: function () {\n                return this.geometry().bbox();\n            },\n            toPath: function () {\n                var path = new Path();\n                var curvePoints = this.geometry().curvePoints();\n                if (curvePoints.length > 0) {\n                    path.moveTo(curvePoints[0].x, curvePoints[0].y);\n                    for (var i = 1; i < curvePoints.length; i += 3) {\n                        path.curveTo(curvePoints[i], curvePoints[i + 1], curvePoints[i + 2]);\n                    }\n                }\n                return path;\n            },\n            _containsPoint: function (point) {\n                return this.geometry().containsPoint(point);\n            },\n            _isOnPath: function (point) {\n                return this.geometry()._isOnPath(point, this.options.stroke.width / 2);\n            }\n        });\n        Arc.prototype.nodeType = 'Arc';\n        Paintable.extend(Arc.prototype);\n        Measurable.extend(Arc.prototype);\n        defineGeometryAccessors(Arc.prototype, ['geometry']);\n        function elementsBoundingBox(elements, applyTransform, transformation) {\n            var boundingBox;\n            for (var i = 0; i < elements.length; i++) {\n                var element = elements[i];\n                if (element.visible()) {\n                    var elementBoundingBox = applyTransform ? element.bbox(transformation) : element.rawBBox();\n                    if (elementBoundingBox) {\n                        if (boundingBox) {\n                            boundingBox = Rect.union(boundingBox, elementBoundingBox);\n                        } else {\n                            boundingBox = elementBoundingBox;\n                        }\n                    }\n                }\n            }\n            return boundingBox;\n        }\n        function elementsClippedBoundingBox(elements, transformation) {\n            var boundingBox;\n            for (var i = 0; i < elements.length; i++) {\n                var element = elements[i];\n                if (element.visible()) {\n                    var elementBoundingBox = element.clippedBBox(transformation);\n                    if (elementBoundingBox) {\n                        if (boundingBox) {\n                            boundingBox = Rect.union(boundingBox, elementBoundingBox);\n                        } else {\n                            boundingBox = elementBoundingBox;\n                        }\n                    }\n                }\n            }\n            return boundingBox;\n        }\n        var MultiPath = Element$1.extend({\n            init: function (options) {\n                Element$1.fn.init.call(this, options);\n                this.paths = new GeometryElementsArray();\n                this.paths.addObserver(this);\n                if (!defined(this.options.stroke)) {\n                    this.stroke('#000');\n                }\n            },\n            moveTo: function (x, y) {\n                var path = new Path();\n                path.moveTo(x, y);\n                this.paths.push(path);\n                return this;\n            },\n            lineTo: function (x, y) {\n                if (this.paths.length > 0) {\n                    last(this.paths).lineTo(x, y);\n                }\n                return this;\n            },\n            curveTo: function (controlOut, controlIn, point) {\n                if (this.paths.length > 0) {\n                    last(this.paths).curveTo(controlOut, controlIn, point);\n                }\n                return this;\n            },\n            arc: function (startAngle, endAngle, radiusX, radiusY, anticlockwise) {\n                if (this.paths.length > 0) {\n                    last(this.paths).arc(startAngle, endAngle, radiusX, radiusY, anticlockwise);\n                }\n                return this;\n            },\n            arcTo: function (end, rx, ry, largeArc, swipe, rotation) {\n                if (this.paths.length > 0) {\n                    last(this.paths).arcTo(end, rx, ry, largeArc, swipe, rotation);\n                }\n                return this;\n            },\n            close: function () {\n                if (this.paths.length > 0) {\n                    last(this.paths).close();\n                }\n                return this;\n            },\n            _bbox: function (matrix) {\n                return elementsBoundingBox(this.paths, true, matrix);\n            },\n            rawBBox: function () {\n                return elementsBoundingBox(this.paths, false);\n            },\n            _containsPoint: function (point) {\n                var paths = this.paths;\n                for (var idx = 0; idx < paths.length; idx++) {\n                    if (paths[idx]._containsPoint(point)) {\n                        return true;\n                    }\n                }\n                return false;\n            },\n            _isOnPath: function (point) {\n                var paths = this.paths;\n                var width = this.options.stroke.width;\n                for (var idx = 0; idx < paths.length; idx++) {\n                    if (paths[idx]._isOnPath(point, width)) {\n                        return true;\n                    }\n                }\n                return false;\n            },\n            _clippedBBox: function (transformation) {\n                return elementsClippedBoundingBox(this.paths, this.currentTransform(transformation));\n            }\n        });\n        MultiPath.prototype.nodeType = 'MultiPath';\n        Paintable.extend(MultiPath.prototype);\n        Measurable.extend(MultiPath.prototype);\n        var DEFAULT_FONT = '12px sans-serif';\n        var DEFAULT_FILL = '#000';\n        var Text = Element$1.extend({\n            init: function (content, position, options) {\n                if (position === void 0) {\n                    position = new Point();\n                }\n                if (options === void 0) {\n                    options = {};\n                }\n                Element$1.fn.init.call(this, options);\n                this.content(content);\n                this.position(position);\n                if (!this.options.font) {\n                    this.options.font = DEFAULT_FONT;\n                }\n                if (!defined(this.options.fill)) {\n                    this.fill(DEFAULT_FILL);\n                }\n            },\n            content: function (value) {\n                if (defined(value)) {\n                    this.options.set('content', value);\n                    return this;\n                }\n                return this.options.get('content');\n            },\n            measure: function () {\n                var metrics = kendoUtil.measureText(this.content(), { font: this.options.get('font') });\n                return metrics;\n            },\n            rect: function () {\n                var size = this.measure();\n                var pos = this.position().clone();\n                return new Rect(pos, [\n                    size.width,\n                    size.height\n                ]);\n            },\n            bbox: function (transformation) {\n                var combinedMatrix = toMatrix(this.currentTransform(transformation));\n                return this.rect().bbox(combinedMatrix);\n            },\n            rawBBox: function () {\n                return this.rect().bbox();\n            },\n            _containsPoint: function (point) {\n                return this.rect().containsPoint(point);\n            }\n        });\n        Text.prototype.nodeType = 'Text';\n        Paintable.extend(Text.prototype);\n        definePointAccessors(Text.prototype, ['position']);\n        var Image$1 = Element$1.extend({\n            init: function (src, rect, options) {\n                if (rect === void 0) {\n                    rect = new Rect();\n                }\n                if (options === void 0) {\n                    options = {};\n                }\n                Element$1.fn.init.call(this, options);\n                this.src(src);\n                this.rect(rect);\n            },\n            src: function (value) {\n                if (defined(value)) {\n                    this.options.set('src', value);\n                    return this;\n                }\n                return this.options.get('src');\n            },\n            bbox: function (transformation) {\n                var combinedMatrix = toMatrix(this.currentTransform(transformation));\n                return this._rect.bbox(combinedMatrix);\n            },\n            rawBBox: function () {\n                return this._rect.bbox();\n            },\n            _containsPoint: function (point) {\n                return this._rect.containsPoint(point);\n            },\n            _hasFill: function () {\n                return this.src();\n            }\n        });\n        Image$1.prototype.nodeType = 'Image';\n        defineGeometryAccessors(Image$1.prototype, ['rect']);\n        var Traversable = {\n            extend: function (proto, childrenField) {\n                proto.traverse = function (callback) {\n                    var children = this[childrenField];\n                    for (var i = 0; i < children.length; i++) {\n                        var child = children[i];\n                        if (child.traverse) {\n                            child.traverse(callback);\n                        } else {\n                            callback(child);\n                        }\n                    }\n                    return this;\n                };\n            }\n        };\n        var Group = Element$1.extend({\n            init: function (options) {\n                Element$1.fn.init.call(this, options);\n                this.children = [];\n            },\n            childrenChange: function (action, items, index) {\n                this.trigger('childrenChange', {\n                    action: action,\n                    items: items,\n                    index: index\n                });\n            },\n            append: function () {\n                append(this.children, arguments);\n                this._reparent(arguments, this);\n                this.childrenChange('add', arguments);\n                return this;\n            },\n            insert: function (index, element) {\n                this.children.splice(index, 0, element);\n                element.parent = this;\n                this.childrenChange('add', [element], index);\n                return this;\n            },\n            insertAt: function (element, index) {\n                return this.insert(index, element);\n            },\n            remove: function (element) {\n                var index = this.children.indexOf(element);\n                if (index >= 0) {\n                    this.children.splice(index, 1);\n                    element.parent = null;\n                    this.childrenChange('remove', [element], index);\n                }\n                return this;\n            },\n            removeAt: function (index) {\n                if (0 <= index && index < this.children.length) {\n                    var element = this.children[index];\n                    this.children.splice(index, 1);\n                    element.parent = null;\n                    this.childrenChange('remove', [element], index);\n                }\n                return this;\n            },\n            clear: function () {\n                var items = this.children;\n                this.children = [];\n                this._reparent(items, null);\n                this.childrenChange('remove', items, 0);\n                return this;\n            },\n            bbox: function (transformation) {\n                return elementsBoundingBox(this.children, true, this.currentTransform(transformation));\n            },\n            rawBBox: function () {\n                return elementsBoundingBox(this.children, false);\n            },\n            _clippedBBox: function (transformation) {\n                return elementsClippedBoundingBox(this.children, this.currentTransform(transformation));\n            },\n            currentTransform: function (transformation) {\n                return Element$1.prototype.currentTransform.call(this, transformation) || null;\n            },\n            containsPoint: function (point, parentTransform) {\n                if (this.visible()) {\n                    var children = this.children;\n                    var transform = this.currentTransform(parentTransform);\n                    for (var idx = 0; idx < children.length; idx++) {\n                        if (children[idx].containsPoint(point, transform)) {\n                            return true;\n                        }\n                    }\n                }\n                return false;\n            },\n            _reparent: function (elements, newParent) {\n                var this$1 = this;\n                for (var i = 0; i < elements.length; i++) {\n                    var child = elements[i];\n                    var parent = child.parent;\n                    if (parent && parent !== this$1 && parent.remove) {\n                        parent.remove(child);\n                    }\n                    child.parent = newParent;\n                }\n            }\n        });\n        Group.prototype.nodeType = 'Group';\n        Traversable.extend(Group.prototype, 'children');\n        function translateToPoint(point, bbox, element) {\n            var transofrm = element.transform() || transform();\n            var matrix = transofrm.matrix();\n            matrix.e += point.x - bbox.origin.x;\n            matrix.f += point.y - bbox.origin.y;\n            transofrm.matrix(matrix);\n            element.transform(transofrm);\n        }\n        function alignStart(size, rect, align, axis, sizeField) {\n            var start;\n            if (align === 'start') {\n                start = rect.origin[axis];\n            } else if (align === 'end') {\n                start = rect.origin[axis] + rect.size[sizeField] - size;\n            } else {\n                start = rect.origin[axis] + (rect.size[sizeField] - size) / 2;\n            }\n            return start;\n        }\n        var DEFAULT_OPTIONS = {\n            alignContent: 'start',\n            justifyContent: 'start',\n            alignItems: 'start',\n            spacing: 0,\n            orientation: 'horizontal',\n            lineSpacing: 0,\n            wrap: true\n        };\n        var Layout = Group.extend({\n            init: function (rect, options) {\n                Group.fn.init.call(this, $.extend({}, DEFAULT_OPTIONS, options));\n                this._rect = rect;\n                this._fieldMap = {};\n            },\n            rect: function (value) {\n                if (value) {\n                    this._rect = value;\n                    return this;\n                }\n                return this._rect;\n            },\n            _initMap: function () {\n                var options = this.options;\n                var fieldMap = this._fieldMap;\n                if (options.orientation === 'horizontal') {\n                    fieldMap.sizeField = 'width';\n                    fieldMap.groupsSizeField = 'height';\n                    fieldMap.groupAxis = 'x';\n                    fieldMap.groupsAxis = 'y';\n                } else {\n                    fieldMap.sizeField = 'height';\n                    fieldMap.groupsSizeField = 'width';\n                    fieldMap.groupAxis = 'y';\n                    fieldMap.groupsAxis = 'x';\n                }\n            },\n            reflow: function () {\n                if (!this._rect || this.children.length === 0) {\n                    return;\n                }\n                this._initMap();\n                if (this.options.transform) {\n                    this.transform(null);\n                }\n                var options = this.options;\n                var rect = this._rect;\n                var ref = this._initGroups();\n                var groups = ref.groups;\n                var groupsSize = ref.groupsSize;\n                var ref$1 = this._fieldMap;\n                var sizeField = ref$1.sizeField;\n                var groupsSizeField = ref$1.groupsSizeField;\n                var groupAxis = ref$1.groupAxis;\n                var groupsAxis = ref$1.groupsAxis;\n                var groupOrigin = new Point();\n                var elementOrigin = new Point();\n                var size = new Size();\n                var groupStart = alignStart(groupsSize, rect, options.alignContent, groupsAxis, groupsSizeField);\n                var elementStart, bbox, element, group, groupBox;\n                for (var groupIdx = 0; groupIdx < groups.length; groupIdx++) {\n                    group = groups[groupIdx];\n                    groupOrigin[groupAxis] = elementStart = alignStart(group.size, rect, options.justifyContent, groupAxis, sizeField);\n                    groupOrigin[groupsAxis] = groupStart;\n                    size[sizeField] = group.size;\n                    size[groupsSizeField] = group.lineSize;\n                    groupBox = new Rect(groupOrigin, size);\n                    for (var idx = 0; idx < group.bboxes.length; idx++) {\n                        element = group.elements[idx];\n                        bbox = group.bboxes[idx];\n                        elementOrigin[groupAxis] = elementStart;\n                        elementOrigin[groupsAxis] = alignStart(bbox.size[groupsSizeField], groupBox, options.alignItems, groupsAxis, groupsSizeField);\n                        translateToPoint(elementOrigin, bbox, element);\n                        elementStart += bbox.size[sizeField] + options.spacing;\n                    }\n                    groupStart += group.lineSize + options.lineSpacing;\n                }\n                if (!options.wrap && group.size > rect.size[sizeField]) {\n                    var scale = rect.size[sizeField] / groupBox.size[sizeField];\n                    var scaledStart = groupBox.topLeft().scale(scale, scale);\n                    var scaledSize = groupBox.size[groupsSizeField] * scale;\n                    var newStart = alignStart(scaledSize, rect, options.alignContent, groupsAxis, groupsSizeField);\n                    var transform$$1 = transform();\n                    if (groupAxis === 'x') {\n                        transform$$1.translate(rect.origin.x - scaledStart.x, newStart - scaledStart.y);\n                    } else {\n                        transform$$1.translate(newStart - scaledStart.x, rect.origin.y - scaledStart.y);\n                    }\n                    transform$$1.scale(scale, scale);\n                    this.transform(transform$$1);\n                }\n            },\n            _initGroups: function () {\n                var this$1 = this;\n                var ref = this;\n                var options = ref.options;\n                var children = ref.children;\n                var lineSpacing = options.lineSpacing;\n                var wrap = options.wrap;\n                var spacing = options.spacing;\n                var sizeField = this._fieldMap.sizeField;\n                var group = this._newGroup();\n                var groups = [];\n                var addGroup = function () {\n                    groups.push(group);\n                    groupsSize += group.lineSize + lineSpacing;\n                };\n                var groupsSize = -lineSpacing;\n                for (var idx = 0; idx < children.length; idx++) {\n                    var element = children[idx];\n                    var bbox = children[idx].clippedBBox();\n                    if (element.visible() && bbox) {\n                        if (wrap && group.size + bbox.size[sizeField] + spacing > this$1._rect.size[sizeField]) {\n                            if (group.bboxes.length === 0) {\n                                this$1._addToGroup(group, bbox, element);\n                                addGroup();\n                                group = this$1._newGroup();\n                            } else {\n                                addGroup();\n                                group = this$1._newGroup();\n                                this$1._addToGroup(group, bbox, element);\n                            }\n                        } else {\n                            this$1._addToGroup(group, bbox, element);\n                        }\n                    }\n                }\n                if (group.bboxes.length) {\n                    addGroup();\n                }\n                return {\n                    groups: groups,\n                    groupsSize: groupsSize\n                };\n            },\n            _addToGroup: function (group, bbox, element) {\n                group.size += bbox.size[this._fieldMap.sizeField] + this.options.spacing;\n                group.lineSize = Math.max(bbox.size[this._fieldMap.groupsSizeField], group.lineSize);\n                group.bboxes.push(bbox);\n                group.elements.push(element);\n            },\n            _newGroup: function () {\n                return {\n                    lineSize: 0,\n                    size: -this.options.spacing,\n                    bboxes: [],\n                    elements: []\n                };\n            }\n        });\n        var Rect$2 = Element$1.extend({\n            init: function (geometry, options) {\n                if (geometry === void 0) {\n                    geometry = new Rect();\n                }\n                if (options === void 0) {\n                    options = {};\n                }\n                Element$1.fn.init.call(this, options);\n                this.geometry(geometry);\n                if (!defined(this.options.stroke)) {\n                    this.stroke('#000');\n                }\n            },\n            _bbox: function (matrix) {\n                return this._geometry.bbox(matrix);\n            },\n            rawBBox: function () {\n                return this._geometry.bbox();\n            },\n            _containsPoint: function (point) {\n                return this._geometry.containsPoint(point);\n            },\n            _isOnPath: function (point) {\n                return this.geometry()._isOnPath(point, this.options.stroke.width / 2);\n            }\n        });\n        Rect$2.prototype.nodeType = 'Rect';\n        Paintable.extend(Rect$2.prototype);\n        Measurable.extend(Rect$2.prototype);\n        defineGeometryAccessors(Rect$2.prototype, ['geometry']);\n        function alignElements(elements, rect, alignment, axis, sizeField) {\n            for (var idx = 0; idx < elements.length; idx++) {\n                var bbox = elements[idx].clippedBBox();\n                if (bbox) {\n                    var point = bbox.origin.clone();\n                    point[axis] = alignStart(bbox.size[sizeField], rect, alignment || 'start', axis, sizeField);\n                    translateToPoint(point, bbox, elements[idx]);\n                }\n            }\n        }\n        function align(elements, rect, alignment) {\n            alignElements(elements, rect, alignment, 'x', 'width');\n        }\n        function vAlign(elements, rect, alignment) {\n            alignElements(elements, rect, alignment, 'y', 'height');\n        }\n        function stackElements(elements, stackAxis, otherAxis, sizeField) {\n            if (elements.length > 1) {\n                var origin = new Point();\n                var previousBBox = elements[0].bbox;\n                for (var idx = 1; idx < elements.length; idx++) {\n                    var element = elements[idx].element;\n                    var bbox = elements[idx].bbox;\n                    origin[stackAxis] = previousBBox.origin[stackAxis] + previousBBox.size[sizeField];\n                    origin[otherAxis] = bbox.origin[otherAxis];\n                    translateToPoint(origin, bbox, element);\n                    bbox.origin[stackAxis] = origin[stackAxis];\n                    previousBBox = bbox;\n                }\n            }\n        }\n        function createStackElements(elements) {\n            var stackElements = [];\n            for (var idx = 0; idx < elements.length; idx++) {\n                var element = elements[idx];\n                var bbox = element.clippedBBox();\n                if (bbox) {\n                    stackElements.push({\n                        element: element,\n                        bbox: bbox\n                    });\n                }\n            }\n            return stackElements;\n        }\n        function stack(elements) {\n            stackElements(createStackElements(elements), 'x', 'y', 'width');\n        }\n        function vStack(elements) {\n            stackElements(createStackElements(elements), 'y', 'x', 'height');\n        }\n        function getStacks(elements, rect, sizeField) {\n            var maxSize = rect.size[sizeField];\n            var stacks = [];\n            var stack = [];\n            var stackSize = 0;\n            var element, bbox;\n            var addElementToStack = function () {\n                stack.push({\n                    element: element,\n                    bbox: bbox\n                });\n            };\n            for (var idx = 0; idx < elements.length; idx++) {\n                element = elements[idx];\n                bbox = element.clippedBBox();\n                if (bbox) {\n                    var size = bbox.size[sizeField];\n                    if (stackSize + size > maxSize) {\n                        if (stack.length) {\n                            stacks.push(stack);\n                            stack = [];\n                            addElementToStack();\n                            stackSize = size;\n                        } else {\n                            addElementToStack();\n                            stacks.push(stack);\n                            stack = [];\n                            stackSize = 0;\n                        }\n                    } else {\n                        addElementToStack();\n                        stackSize += size;\n                    }\n                }\n            }\n            if (stack.length) {\n                stacks.push(stack);\n            }\n            return stacks;\n        }\n        function wrapElements(elements, rect, axis, otherAxis, sizeField) {\n            var stacks = getStacks(elements, rect, sizeField);\n            var origin = rect.origin.clone();\n            var result = [];\n            for (var idx = 0; idx < stacks.length; idx++) {\n                var stack = stacks[idx];\n                var startElement = stack[0];\n                origin[otherAxis] = startElement.bbox.origin[otherAxis];\n                translateToPoint(origin, startElement.bbox, startElement.element);\n                startElement.bbox.origin[axis] = origin[axis];\n                stackElements(stack, axis, otherAxis, sizeField);\n                result.push([]);\n                for (var elementIdx = 0; elementIdx < stack.length; elementIdx++) {\n                    result[idx].push(stack[elementIdx].element);\n                }\n            }\n            return result;\n        }\n        function wrap(elements, rect) {\n            return wrapElements(elements, rect, 'x', 'y', 'width');\n        }\n        function vWrap(elements, rect) {\n            return wrapElements(elements, rect, 'y', 'x', 'height');\n        }\n        function fit(element, rect) {\n            var bbox = element.clippedBBox();\n            if (bbox) {\n                var elementSize = bbox.size;\n                var rectSize = rect.size;\n                if (rectSize.width < elementSize.width || rectSize.height < elementSize.height) {\n                    var scale = Math.min(rectSize.width / elementSize.width, rectSize.height / elementSize.height);\n                    var transform$$1 = element.transform() || transform();\n                    transform$$1.scale(scale, scale);\n                    element.transform(transform$$1);\n                }\n            }\n        }\n        var StopsArray = ElementsArray.extend({\n            _change: function () {\n                this.optionsChange({ field: 'stops' });\n            }\n        });\n        function optionsAccessor(name) {\n            return function (value) {\n                if (defined(value)) {\n                    this.options.set(name, value);\n                    return this;\n                }\n                return this.options.get(name);\n            };\n        }\n        function defineOptionsAccessors(fn, names) {\n            for (var i = 0; i < names.length; i++) {\n                fn[names[i]] = optionsAccessor(names[i]);\n            }\n        }\n        var GradientStop = Class.extend({\n            init: function (offset, color, opacity) {\n                this.options = new OptionsStore({\n                    offset: offset,\n                    color: color,\n                    opacity: defined(opacity) ? opacity : 1\n                });\n                this.options.addObserver(this);\n            }\n        });\n        GradientStop.create = function (arg) {\n            if (defined(arg)) {\n                var stop;\n                if (arg instanceof GradientStop) {\n                    stop = arg;\n                } else if (arg.length > 1) {\n                    stop = new GradientStop(arg[0], arg[1], arg[2]);\n                } else {\n                    stop = new GradientStop(arg.offset, arg.color, arg.opacity);\n                }\n                return stop;\n            }\n        };\n        defineOptionsAccessors(GradientStop.prototype, [\n            'offset',\n            'color',\n            'opacity'\n        ]);\n        ObserversMixin.extend(GradientStop.prototype);\n        var Gradient = Class.extend({\n            init: function (options) {\n                if (options === void 0) {\n                    options = {};\n                }\n                this.stops = new StopsArray(this._createStops(options.stops));\n                this.stops.addObserver(this);\n                this._userSpace = options.userSpace;\n                this.id = definitionId();\n            },\n            userSpace: function (value) {\n                if (defined(value)) {\n                    this._userSpace = value;\n                    this.optionsChange();\n                    return this;\n                }\n                return this._userSpace;\n            },\n            _createStops: function (stops) {\n                if (stops === void 0) {\n                    stops = [];\n                }\n                var result = [];\n                for (var idx = 0; idx < stops.length; idx++) {\n                    result.push(GradientStop.create(stops[idx]));\n                }\n                return result;\n            },\n            addStop: function (offset, color, opacity) {\n                this.stops.push(new GradientStop(offset, color, opacity));\n            },\n            removeStop: function (stop) {\n                var index = this.stops.indexOf(stop);\n                if (index >= 0) {\n                    this.stops.splice(index, 1);\n                }\n            }\n        });\n        Gradient.prototype.nodeType = 'Gradient';\n        ObserversMixin.extend(Gradient.prototype);\n        $.extend(Gradient.prototype, {\n            optionsChange: function (e) {\n                this.trigger('optionsChange', {\n                    field: 'gradient' + (e ? '.' + e.field : ''),\n                    value: this\n                });\n            },\n            geometryChange: function () {\n                this.optionsChange();\n            }\n        });\n        var LinearGradient = Gradient.extend({\n            init: function (options) {\n                if (options === void 0) {\n                    options = {};\n                }\n                Gradient.fn.init.call(this, options);\n                this.start(options.start || new Point());\n                this.end(options.end || new Point(1, 0));\n            }\n        });\n        definePointAccessors(LinearGradient.prototype, [\n            'start',\n            'end'\n        ]);\n        var RadialGradient = Gradient.extend({\n            init: function (options) {\n                if (options === void 0) {\n                    options = {};\n                }\n                Gradient.fn.init.call(this, options);\n                this.center(options.center || new Point());\n                this._radius = defined(options.radius) ? options.radius : 1;\n                this._fallbackFill = options.fallbackFill;\n            },\n            radius: function (value) {\n                if (defined(value)) {\n                    this._radius = value;\n                    this.geometryChange();\n                    return this;\n                }\n                return this._radius;\n            },\n            fallbackFill: function (value) {\n                if (defined(value)) {\n                    this._fallbackFill = value;\n                    this.optionsChange();\n                    return this;\n                }\n                return this._fallbackFill;\n            }\n        });\n        definePointAccessors(RadialGradient.prototype, ['center']);\n        function swing(position) {\n            return 0.5 - Math.cos(position * Math.PI) / 2;\n        }\n        function linear(position) {\n            return position;\n        }\n        function easeOutElastic(position, time, start, diff) {\n            var s = 1.70158, p = 0, a = diff;\n            if (position === 0) {\n                return start;\n            }\n            if (position === 1) {\n                return start + diff;\n            }\n            if (!p) {\n                p = 0.5;\n            }\n            if (a < Math.abs(diff)) {\n                a = diff;\n                s = p / 4;\n            } else {\n                s = p / (2 * Math.PI) * Math.asin(diff / a);\n            }\n            return a * Math.pow(2, -10 * position) * Math.sin((Number(position) - s) * (1.1 * Math.PI) / p) + diff + start;\n        }\n        var easingFunctions = {\n            swing: swing,\n            linear: linear,\n            easeOutElastic: easeOutElastic\n        };\n        var now = Date.now || function () {\n            return new Date().getTime();\n        };\n        var Animation = Class.extend({\n            init: function (element, options) {\n                this.options = $.extend({}, this.options, options);\n                this.element = element;\n            },\n            setup: function () {\n            },\n            step: function () {\n            },\n            play: function () {\n                var this$1 = this;\n                var options = this.options;\n                var duration = options.duration;\n                var delay = options.delay;\n                if (delay === void 0) {\n                    delay = 0;\n                }\n                var easing = easingFunctions[options.easing];\n                var start = now() + delay;\n                var finish = start + duration;\n                if (duration === 0) {\n                    this.step(1);\n                    this.abort();\n                } else {\n                    setTimeout(function () {\n                        var loop = function () {\n                            if (this$1._stopped) {\n                                return;\n                            }\n                            var wallTime = now();\n                            var time = limitValue(wallTime - start, 0, duration);\n                            var position = time / duration;\n                            var easingPosition = easing(position, time, 0, 1, duration);\n                            this$1.step(easingPosition);\n                            if (wallTime < finish) {\n                                kendo.animationFrame(loop);\n                            } else {\n                                this$1.abort();\n                            }\n                        };\n                        loop();\n                    }, delay);\n                }\n            },\n            abort: function () {\n                this._stopped = true;\n            },\n            destroy: function () {\n                this.abort();\n            }\n        });\n        Animation.prototype.options = {\n            duration: 500,\n            easing: 'swing'\n        };\n        var AnimationFactory = Class.extend({\n            init: function () {\n                this._items = [];\n            },\n            register: function (name, type) {\n                this._items.push({\n                    name: name,\n                    type: type\n                });\n            },\n            create: function (element, options) {\n                var items = this._items;\n                var match;\n                if (options && options.type) {\n                    var type = options.type.toLowerCase();\n                    for (var i = 0; i < items.length; i++) {\n                        if (items[i].name.toLowerCase() === type) {\n                            match = items[i];\n                            break;\n                        }\n                    }\n                }\n                if (match) {\n                    return new match.type(element, options);\n                }\n            }\n        });\n        AnimationFactory.current = new AnimationFactory();\n        Animation.create = function (type, element, options) {\n            return AnimationFactory.current.create(type, element, options);\n        };\n        var ShapeMap = {\n            l: function (path, options) {\n                var parameters = options.parameters;\n                var position = options.position;\n                for (var i = 0; i < parameters.length; i += 2) {\n                    var point = new Point(parameters[i], parameters[i + 1]);\n                    if (options.isRelative) {\n                        point.translateWith(position);\n                    }\n                    path.lineTo(point.x, point.y);\n                    position.x = point.x;\n                    position.y = point.y;\n                }\n            },\n            c: function (path, options) {\n                var parameters = options.parameters;\n                var position = options.position;\n                for (var i = 0; i < parameters.length; i += 6) {\n                    var controlOut = new Point(parameters[i], parameters[i + 1]);\n                    var controlIn = new Point(parameters[i + 2], parameters[i + 3]);\n                    var point = new Point(parameters[i + 4], parameters[i + 5]);\n                    if (options.isRelative) {\n                        controlIn.translateWith(position);\n                        controlOut.translateWith(position);\n                        point.translateWith(position);\n                    }\n                    path.curveTo(controlOut, controlIn, point);\n                    position.x = point.x;\n                    position.y = point.y;\n                }\n            },\n            v: function (path, options) {\n                var value = options.isRelative ? 0 : options.position.x;\n                toLineParamaters(options.parameters, true, value);\n                this.l(path, options);\n            },\n            h: function (path, options) {\n                var value = options.isRelative ? 0 : options.position.y;\n                toLineParamaters(options.parameters, false, value);\n                this.l(path, options);\n            },\n            a: function (path, options) {\n                var parameters = options.parameters;\n                var position = options.position;\n                for (var i = 0; i < parameters.length; i += 7) {\n                    var radiusX = parameters[i];\n                    var radiusY = parameters[i + 1];\n                    var rotation = parameters[i + 2];\n                    var largeArc = parameters[i + 3];\n                    var swipe = parameters[i + 4];\n                    var endPoint = new Point(parameters[i + 5], parameters[i + 6]);\n                    if (options.isRelative) {\n                        endPoint.translateWith(position);\n                    }\n                    if (position.x !== endPoint.x || position.y !== endPoint.y) {\n                        path.arcTo(endPoint, radiusX, radiusY, largeArc, swipe, rotation);\n                        position.x = endPoint.x;\n                        position.y = endPoint.y;\n                    }\n                }\n            },\n            s: function (path, options) {\n                var parameters = options.parameters;\n                var position = options.position;\n                var previousCommand = options.previousCommand;\n                var lastControlIn;\n                if (previousCommand === 's' || previousCommand === 'c') {\n                    lastControlIn = last(last(path.paths).segments).controlIn();\n                }\n                for (var i = 0; i < parameters.length; i += 4) {\n                    var controlIn = new Point(parameters[i], parameters[i + 1]);\n                    var endPoint = new Point(parameters[i + 2], parameters[i + 3]);\n                    var controlOut = void 0;\n                    if (options.isRelative) {\n                        controlIn.translateWith(position);\n                        endPoint.translateWith(position);\n                    }\n                    if (lastControlIn) {\n                        controlOut = reflectionPoint(lastControlIn, position);\n                    } else {\n                        controlOut = position.clone();\n                    }\n                    lastControlIn = controlIn;\n                    path.curveTo(controlOut, controlIn, endPoint);\n                    position.x = endPoint.x;\n                    position.y = endPoint.y;\n                }\n            },\n            q: function (path, options) {\n                var parameters = options.parameters;\n                var position = options.position;\n                for (var i = 0; i < parameters.length; i += 4) {\n                    var controlPoint = new Point(parameters[i], parameters[i + 1]);\n                    var endPoint = new Point(parameters[i + 2], parameters[i + 3]);\n                    if (options.isRelative) {\n                        controlPoint.translateWith(position);\n                        endPoint.translateWith(position);\n                    }\n                    var cubicControlPoints = quadraticToCubicControlPoints(position, controlPoint, endPoint);\n                    path.curveTo(cubicControlPoints.controlOut, cubicControlPoints.controlIn, endPoint);\n                    position.x = endPoint.x;\n                    position.y = endPoint.y;\n                }\n            },\n            t: function (path, options) {\n                var parameters = options.parameters;\n                var position = options.position;\n                var previousCommand = options.previousCommand;\n                var controlPoint;\n                if (previousCommand === 'q' || previousCommand === 't') {\n                    var lastSegment = last(last(path.paths).segments);\n                    controlPoint = lastSegment.controlIn().clone().translateWith(position.scaleCopy(-1 / 3)).scale(3 / 2);\n                }\n                for (var i = 0; i < parameters.length; i += 2) {\n                    var endPoint = new Point(parameters[i], parameters[i + 1]);\n                    if (options.isRelative) {\n                        endPoint.translateWith(position);\n                    }\n                    if (controlPoint) {\n                        controlPoint = reflectionPoint(controlPoint, position);\n                    } else {\n                        controlPoint = position.clone();\n                    }\n                    var cubicControlPoints = quadraticToCubicControlPoints(position, controlPoint, endPoint);\n                    path.curveTo(cubicControlPoints.controlOut, cubicControlPoints.controlIn, endPoint);\n                    position.x = endPoint.x;\n                    position.y = endPoint.y;\n                }\n            }\n        };\n        function toLineParamaters(parameters, isVertical, value) {\n            var insertPosition = isVertical ? 0 : 1;\n            for (var i = 0; i < parameters.length; i += 2) {\n                parameters.splice(i + insertPosition, 0, value);\n            }\n        }\n        function reflectionPoint(point, center) {\n            if (point && center) {\n                return center.scaleCopy(2).translate(-point.x, -point.y);\n            }\n        }\n        var third = 1 / 3;\n        function quadraticToCubicControlPoints(position, controlPoint, endPoint) {\n            var scaledPoint = controlPoint.clone().scale(2 / 3);\n            return {\n                controlOut: scaledPoint.clone().translateWith(position.scaleCopy(third)),\n                controlIn: scaledPoint.translateWith(endPoint.scaleCopy(third))\n            };\n        }\n        var SEGMENT_REGEX = /([a-df-z]{1})([^a-df-z]*)(z)?/gi;\n        var SPLIT_REGEX = /[,\\s]?([+\\-]?(?:\\d*\\.\\d+|\\d+)(?:[eE][+\\-]?\\d+)?)/g;\n        var MOVE = 'm';\n        var CLOSE = 'z';\n        function parseParameters(str) {\n            var parameters = [];\n            str.replace(SPLIT_REGEX, function (match, number) {\n                parameters.push(parseFloat(number));\n            });\n            return parameters;\n        }\n        var PathParser = Class.extend({\n            parse: function (str, options) {\n                var multiPath = new MultiPath(options);\n                var position = new Point();\n                var previousCommand;\n                str.replace(SEGMENT_REGEX, function (match, element, params, closePath) {\n                    var command = element.toLowerCase();\n                    var isRelative = command === element;\n                    var parameters = parseParameters(params.trim());\n                    if (command === MOVE) {\n                        if (isRelative) {\n                            position.x += parameters[0];\n                            position.y += parameters[1];\n                        } else {\n                            position.x = parameters[0];\n                            position.y = parameters[1];\n                        }\n                        multiPath.moveTo(position.x, position.y);\n                        if (parameters.length > 2) {\n                            command = 'l';\n                            parameters.splice(0, 2);\n                        }\n                    }\n                    if (ShapeMap[command]) {\n                        ShapeMap[command](multiPath, {\n                            parameters: parameters,\n                            position: position,\n                            isRelative: isRelative,\n                            previousCommand: previousCommand\n                        });\n                        if (closePath && closePath.toLowerCase() === CLOSE) {\n                            multiPath.close();\n                        }\n                    } else if (command !== MOVE) {\n                        throw new Error('Error while parsing SVG path. Unsupported command: ' + command);\n                    }\n                    previousCommand = command;\n                });\n                return multiPath;\n            }\n        });\n        PathParser.current = new PathParser();\n        Path.parse = function (str, options) {\n            return PathParser.current.parse(str, options);\n        };\n        var SurfaceFactory = Class.extend({\n            init: function () {\n                this._items = [];\n            },\n            register: function (name, type, order) {\n                var items = this._items;\n                var first = items[0];\n                var entry = {\n                    name: name,\n                    type: type,\n                    order: order\n                };\n                if (!first || order < first.order) {\n                    items.unshift(entry);\n                } else {\n                    items.push(entry);\n                }\n            },\n            create: function (element, options) {\n                var items = this._items;\n                var match = items[0];\n                if (options && options.type) {\n                    var preferred = options.type.toLowerCase();\n                    for (var i = 0; i < items.length; i++) {\n                        if (items[i].name === preferred) {\n                            match = items[i];\n                            break;\n                        }\n                    }\n                }\n                if (match) {\n                    return new match.type(element, options);\n                }\n                kendo.logToConsole('Warning: Unable to create Kendo UI Drawing Surface. Possible causes:\\n' + '- The browser does not support SVG and Canvas. User agent: ' + navigator.userAgent);\n            }\n        });\n        SurfaceFactory.current = new SurfaceFactory();\n        var events = [\n            'click',\n            'mouseenter',\n            'mouseleave',\n            'mousemove',\n            'resize',\n            'tooltipOpen',\n            'tooltipClose'\n        ];\n        var Surface = kendo.Observable.extend({\n            init: function (element, options) {\n                kendo.Observable.fn.init.call(this);\n                this.options = $.extend({}, options);\n                this.element = element;\n                this._click = this._handler('click');\n                this._mouseenter = this._handler('mouseenter');\n                this._mouseleave = this._handler('mouseleave');\n                this._mousemove = this._handler('mousemove');\n                this._visual = new Group();\n                elementSize(element, this.options);\n                this.bind(events, this.options);\n                this._enableTracking();\n            },\n            draw: function (element) {\n                this._visual.children.push(element);\n            },\n            clear: function () {\n                this._visual.children = [];\n            },\n            destroy: function () {\n                this._visual = null;\n                this.unbind();\n            },\n            eventTarget: function (e) {\n                var this$1 = this;\n                var domNode = eventElement(e);\n                var node;\n                while (!node && domNode) {\n                    node = domNode._kendoNode;\n                    if (domNode === this$1.element) {\n                        break;\n                    }\n                    domNode = domNode.parentElement;\n                }\n                if (node) {\n                    return node.srcElement;\n                }\n            },\n            exportVisual: function () {\n                return this._visual;\n            },\n            getSize: function () {\n                return elementSize(this.element);\n            },\n            currentSize: function (size) {\n                if (size) {\n                    this._size = size;\n                } else {\n                    return this._size;\n                }\n            },\n            setSize: function (size) {\n                elementSize(this.element, size);\n                this.currentSize(size);\n                this._resize();\n            },\n            resize: function (force) {\n                var size = this.getSize();\n                var currentSize = this.currentSize();\n                if (force || (size.width > 0 || size.height > 0) && (!currentSize || size.width !== currentSize.width || size.height !== currentSize.height)) {\n                    this.currentSize(size);\n                    this._resize(size, force);\n                    this.trigger('resize', size);\n                }\n            },\n            size: function (value) {\n                if (!value) {\n                    return this.getSize();\n                }\n                this.setSize(value);\n            },\n            suspendTracking: function () {\n                this._suspendedTracking = true;\n            },\n            resumeTracking: function () {\n                this._suspendedTracking = false;\n            },\n            _enableTracking: function () {\n            },\n            _resize: function () {\n            },\n            _handler: function (eventName) {\n                var this$1 = this;\n                return function (e) {\n                    var node = this$1.eventTarget(e);\n                    if (node && !this$1._suspendedTracking) {\n                        this$1.trigger(eventName, {\n                            element: node,\n                            originalEvent: e,\n                            type: eventName\n                        });\n                    }\n                };\n            },\n            _elementOffset: function () {\n                var element = this.element;\n                var ref = elementStyles(element, [\n                    'paddingLeft',\n                    'paddingTop'\n                ]);\n                var paddingLeft = ref.paddingLeft;\n                var paddingTop = ref.paddingTop;\n                var ref$1 = elementOffset(element);\n                var left = ref$1.left;\n                var top = ref$1.top;\n                return {\n                    left: left + parseInt(paddingLeft, 10),\n                    top: top + parseInt(paddingTop, 10)\n                };\n            },\n            _surfacePoint: function (e) {\n                var offset = this._elementOffset();\n                var coord = eventCoordinates(e);\n                var x = coord.x - offset.left;\n                var y = coord.y - offset.top;\n                return new Point(x, y);\n            }\n        });\n        Surface.create = function (element, options) {\n            return SurfaceFactory.current.create(element, options);\n        };\n        Surface.support = {};\n        var BaseNode = Class.extend({\n            init: function (srcElement) {\n                this.childNodes = [];\n                this.parent = null;\n                if (srcElement) {\n                    this.srcElement = srcElement;\n                    this.observe();\n                }\n            },\n            destroy: function () {\n                var this$1 = this;\n                if (this.srcElement) {\n                    this.srcElement.removeObserver(this);\n                }\n                var children = this.childNodes;\n                for (var i = 0; i < children.length; i++) {\n                    this$1.childNodes[i].destroy();\n                }\n                this.parent = null;\n            },\n            load: function () {\n            },\n            observe: function () {\n                if (this.srcElement) {\n                    this.srcElement.addObserver(this);\n                }\n            },\n            append: function (node) {\n                this.childNodes.push(node);\n                node.parent = this;\n            },\n            insertAt: function (node, pos) {\n                this.childNodes.splice(pos, 0, node);\n                node.parent = this;\n            },\n            remove: function (index, count) {\n                var this$1 = this;\n                var end = index + count;\n                for (var i = index; i < end; i++) {\n                    this$1.childNodes[i].removeSelf();\n                }\n                this.childNodes.splice(index, count);\n            },\n            removeSelf: function () {\n                this.clear();\n                this.destroy();\n            },\n            clear: function () {\n                this.remove(0, this.childNodes.length);\n            },\n            invalidate: function () {\n                if (this.parent) {\n                    this.parent.invalidate();\n                }\n            },\n            geometryChange: function () {\n                this.invalidate();\n            },\n            optionsChange: function () {\n                this.invalidate();\n            },\n            childrenChange: function (e) {\n                if (e.action === 'add') {\n                    this.load(e.items, e.index);\n                } else if (e.action === 'remove') {\n                    this.remove(e.index, e.items.length);\n                }\n                this.invalidate();\n            }\n        });\n        function renderAttr(name, value) {\n            return defined(value) && value !== null ? ' ' + name + '=\\'' + value + '\\' ' : '';\n        }\n        function renderAllAttr(attrs) {\n            var output = '';\n            for (var i = 0; i < attrs.length; i++) {\n                output += renderAttr(attrs[i][0], attrs[i][1]);\n            }\n            return output;\n        }\n        function renderStyle(attrs) {\n            var output = '';\n            for (var i = 0; i < attrs.length; i++) {\n                var value = attrs[i][1];\n                if (defined(value)) {\n                    output += attrs[i][0] + ':' + value + ';';\n                }\n            }\n            if (output !== '') {\n                return output;\n            }\n        }\n        var NODE_MAP = {};\n        var SVG_NS = 'http://www.w3.org/2000/svg';\n        var NONE = 'none';\n        var renderSVG = function (container, svg) {\n            container.innerHTML = svg;\n        };\n        if (typeof document !== 'undefined') {\n            var testFragment = '<svg xmlns=\\'' + SVG_NS + '\\'></svg>';\n            var testContainer = document.createElement('div');\n            var hasParser = typeof DOMParser !== 'undefined';\n            testContainer.innerHTML = testFragment;\n            if (hasParser && testContainer.firstChild.namespaceURI !== SVG_NS) {\n                renderSVG = function (container, svg) {\n                    var parser = new DOMParser();\n                    var chartDoc = parser.parseFromString(svg, 'text/xml');\n                    var importedDoc = document.adoptNode(chartDoc.documentElement);\n                    container.innerHTML = '';\n                    container.appendChild(importedDoc);\n                };\n            }\n        }\n        var renderSVG$1 = renderSVG;\n        var TRANSFORM = 'transform';\n        var DefinitionMap = {\n            clip: 'clip-path',\n            fill: 'fill'\n        };\n        function isDefinition(type, value) {\n            return type === 'clip' || type === 'fill' && (!value || value.nodeType === 'Gradient');\n        }\n        function baseUrl() {\n            var base = document.getElementsByTagName('base')[0];\n            var href = document.location.href;\n            var hashIndex = href.indexOf('#');\n            var url = '';\n            if (base && !support.browser.msie) {\n                if (hashIndex !== -1) {\n                    href = href.substring(0, hashIndex);\n                }\n                url = href;\n            }\n            return url;\n        }\n        function refUrl(id, skipBaseHref) {\n            var base = skipBaseHref ? '' : baseUrl();\n            return 'url(' + base + '#' + id + ')';\n        }\n        var Node = BaseNode.extend({\n            init: function (srcElement, options) {\n                BaseNode.fn.init.call(this, srcElement);\n                this.definitions = {};\n                this.options = options;\n            },\n            destroy: function () {\n                if (this.element) {\n                    this.element._kendoNode = null;\n                    this.element = null;\n                }\n                this.clearDefinitions();\n                BaseNode.fn.destroy.call(this);\n            },\n            load: function (elements, pos) {\n                var this$1 = this;\n                for (var i = 0; i < elements.length; i++) {\n                    var srcElement = elements[i];\n                    var children = srcElement.children;\n                    var childNode = new NODE_MAP[srcElement.nodeType](srcElement, this$1.options);\n                    if (defined(pos)) {\n                        this$1.insertAt(childNode, pos);\n                    } else {\n                        this$1.append(childNode);\n                    }\n                    childNode.createDefinitions();\n                    if (children && children.length > 0) {\n                        childNode.load(children);\n                    }\n                    var element = this$1.element;\n                    if (element) {\n                        childNode.attachTo(element, pos);\n                    }\n                }\n            },\n            root: function () {\n                var root = this;\n                while (root.parent) {\n                    root = root.parent;\n                }\n                return root;\n            },\n            attachTo: function (domElement, pos) {\n                var container = document.createElement('div');\n                renderSVG$1(container, '<svg xmlns=\\'' + SVG_NS + '\\' version=\\'1.1\\'>' + this.render() + '</svg>');\n                var element = container.firstChild.firstChild;\n                if (element) {\n                    if (defined(pos)) {\n                        domElement.insertBefore(element, domElement.childNodes[pos] || null);\n                    } else {\n                        domElement.appendChild(element);\n                    }\n                    this.setElement(element);\n                }\n            },\n            setElement: function (element) {\n                if (this.element) {\n                    this.element._kendoNode = null;\n                }\n                this.element = element;\n                this.element._kendoNode = this;\n                var nodes = this.childNodes;\n                for (var i = 0; i < nodes.length; i++) {\n                    var childElement = element.childNodes[i];\n                    nodes[i].setElement(childElement);\n                }\n            },\n            clear: function () {\n                this.clearDefinitions();\n                if (this.element) {\n                    this.element.innerHTML = '';\n                }\n                var children = this.childNodes;\n                for (var i = 0; i < children.length; i++) {\n                    children[i].destroy();\n                }\n                this.childNodes = [];\n            },\n            removeSelf: function () {\n                if (this.element) {\n                    var parentNode = this.element.parentNode;\n                    if (parentNode) {\n                        parentNode.removeChild(this.element);\n                    }\n                    this.element = null;\n                }\n                BaseNode.fn.removeSelf.call(this);\n            },\n            template: function () {\n                return this.renderChildren();\n            },\n            render: function () {\n                return this.template();\n            },\n            renderChildren: function () {\n                var nodes = this.childNodes;\n                var output = '';\n                for (var i = 0; i < nodes.length; i++) {\n                    output += nodes[i].render();\n                }\n                return output;\n            },\n            optionsChange: function (e) {\n                var field = e.field;\n                var value = e.value;\n                if (field === 'visible') {\n                    this.css('display', value ? '' : NONE);\n                } else if (DefinitionMap[field] && isDefinition(field, value)) {\n                    this.updateDefinition(field, value);\n                } else if (field === 'opacity') {\n                    this.attr('opacity', value);\n                } else if (field === 'cursor') {\n                    this.css('cursor', value);\n                }\n                BaseNode.fn.optionsChange.call(this, e);\n            },\n            attr: function (name, value) {\n                if (this.element) {\n                    this.element.setAttribute(name, value);\n                }\n            },\n            allAttr: function (attrs) {\n                var this$1 = this;\n                for (var i = 0; i < attrs.length; i++) {\n                    this$1.attr(attrs[i][0], attrs[i][1]);\n                }\n            },\n            css: function (name, value) {\n                if (this.element) {\n                    this.element.style[name] = value;\n                }\n            },\n            allCss: function (styles) {\n                var this$1 = this;\n                for (var i = 0; i < styles.length; i++) {\n                    this$1.css(styles[i][0], styles[i][1]);\n                }\n            },\n            removeAttr: function (name) {\n                if (this.element) {\n                    this.element.removeAttribute(name);\n                }\n            },\n            mapTransform: function (transform) {\n                var attrs = [];\n                if (transform) {\n                    attrs.push([\n                        TRANSFORM,\n                        'matrix(' + transform.matrix().toString(6) + ')'\n                    ]);\n                }\n                return attrs;\n            },\n            renderTransform: function () {\n                return renderAllAttr(this.mapTransform(this.srcElement.transform()));\n            },\n            transformChange: function (value) {\n                if (value) {\n                    this.allAttr(this.mapTransform(value));\n                } else {\n                    this.removeAttr(TRANSFORM);\n                }\n            },\n            mapStyle: function () {\n                var options = this.srcElement.options;\n                var style = [[\n                        'cursor',\n                        options.cursor\n                    ]];\n                if (options.visible === false) {\n                    style.push([\n                        'display',\n                        NONE\n                    ]);\n                }\n                return style;\n            },\n            renderStyle: function () {\n                return renderAttr('style', renderStyle(this.mapStyle(true)));\n            },\n            renderOpacity: function () {\n                return renderAttr('opacity', this.srcElement.options.opacity);\n            },\n            createDefinitions: function () {\n                var srcElement = this.srcElement;\n                var definitions = this.definitions;\n                if (srcElement) {\n                    var options = srcElement.options;\n                    var hasDefinitions;\n                    for (var field in DefinitionMap) {\n                        var definition = options.get(field);\n                        if (definition && isDefinition(field, definition)) {\n                            definitions[field] = definition;\n                            hasDefinitions = true;\n                        }\n                    }\n                    if (hasDefinitions) {\n                        this.definitionChange({\n                            action: 'add',\n                            definitions: definitions\n                        });\n                    }\n                }\n            },\n            definitionChange: function (e) {\n                if (this.parent) {\n                    this.parent.definitionChange(e);\n                }\n            },\n            updateDefinition: function (type, value) {\n                var definitions = this.definitions;\n                var current = definitions[type];\n                var attr = DefinitionMap[type];\n                var definition = {};\n                if (current) {\n                    definition[type] = current;\n                    this.definitionChange({\n                        action: 'remove',\n                        definitions: definition\n                    });\n                    delete definitions[type];\n                }\n                if (!value) {\n                    if (current) {\n                        this.removeAttr(attr);\n                    }\n                } else {\n                    definition[type] = value;\n                    this.definitionChange({\n                        action: 'add',\n                        definitions: definition\n                    });\n                    definitions[type] = value;\n                    this.attr(attr, this.refUrl(value.id));\n                }\n            },\n            clearDefinitions: function () {\n                var definitions = this.definitions;\n                this.definitionChange({\n                    action: 'remove',\n                    definitions: definitions\n                });\n                this.definitions = {};\n            },\n            renderDefinitions: function () {\n                return renderAllAttr(this.mapDefinitions());\n            },\n            mapDefinitions: function () {\n                var this$1 = this;\n                var definitions = this.definitions;\n                var attrs = [];\n                for (var field in definitions) {\n                    attrs.push([\n                        DefinitionMap[field],\n                        this$1.refUrl(definitions[field].id)\n                    ]);\n                }\n                return attrs;\n            },\n            refUrl: function (id) {\n                var skipBaseHref = (this.options || {}).skipBaseHref;\n                return refUrl(id, skipBaseHref);\n            }\n        });\n        var GradientStopNode = Node.extend({\n            template: function () {\n                return '<stop ' + this.renderOffset() + ' ' + this.renderStyle() + ' />';\n            },\n            renderOffset: function () {\n                return renderAttr('offset', this.srcElement.offset());\n            },\n            mapStyle: function () {\n                var srcElement = this.srcElement;\n                return [\n                    [\n                        'stop-color',\n                        srcElement.color()\n                    ],\n                    [\n                        'stop-opacity',\n                        srcElement.opacity()\n                    ]\n                ];\n            },\n            optionsChange: function (e) {\n                if (e.field === 'offset') {\n                    this.attr(e.field, e.value);\n                } else if (e.field === 'color' || e.field === 'opacity') {\n                    this.css('stop-' + e.field, e.value);\n                }\n            }\n        });\n        var GradientNode = Node.extend({\n            init: function (srcElement) {\n                Node.fn.init.call(this, srcElement);\n                this.id = srcElement.id;\n                this.loadStops();\n            },\n            loadStops: function () {\n                var this$1 = this;\n                var stops = this.srcElement.stops;\n                var element = this.element;\n                for (var idx = 0; idx < stops.length; idx++) {\n                    var stopNode = new GradientStopNode(stops[idx]);\n                    this$1.append(stopNode);\n                    if (element) {\n                        stopNode.attachTo(element);\n                    }\n                }\n            },\n            optionsChange: function (e) {\n                if (e.field === 'gradient.stops') {\n                    BaseNode.prototype.clear.call(this);\n                    this.loadStops();\n                } else if (e.field === 'gradient') {\n                    this.allAttr(this.mapCoordinates());\n                }\n            },\n            renderCoordinates: function () {\n                return renderAllAttr(this.mapCoordinates());\n            },\n            mapSpace: function () {\n                return [\n                    'gradientUnits',\n                    this.srcElement.userSpace() ? 'userSpaceOnUse' : 'objectBoundingBox'\n                ];\n            }\n        });\n        var LinearGradientNode = GradientNode.extend({\n            template: function () {\n                return '<linearGradient id=\\'' + this.id + '\\' ' + this.renderCoordinates() + '>' + this.renderChildren() + '</linearGradient>';\n            },\n            mapCoordinates: function () {\n                var srcElement = this.srcElement;\n                var start = srcElement.start();\n                var end = srcElement.end();\n                var attrs = [\n                    [\n                        'x1',\n                        start.x\n                    ],\n                    [\n                        'y1',\n                        start.y\n                    ],\n                    [\n                        'x2',\n                        end.x\n                    ],\n                    [\n                        'y2',\n                        end.y\n                    ],\n                    this.mapSpace()\n                ];\n                return attrs;\n            }\n        });\n        var RadialGradientNode = GradientNode.extend({\n            template: function () {\n                return '<radialGradient id=\\'' + this.id + '\\' ' + this.renderCoordinates() + '>' + this.renderChildren() + '</radialGradient>';\n            },\n            mapCoordinates: function () {\n                var srcElement = this.srcElement;\n                var center = srcElement.center();\n                var radius = srcElement.radius();\n                var attrs = [\n                    [\n                        'cx',\n                        center.x\n                    ],\n                    [\n                        'cy',\n                        center.y\n                    ],\n                    [\n                        'r',\n                        radius\n                    ],\n                    this.mapSpace()\n                ];\n                return attrs;\n            }\n        });\n        var ClipNode = Node.extend({\n            init: function (srcElement) {\n                Node.fn.init.call(this);\n                this.srcElement = srcElement;\n                this.id = srcElement.id;\n                this.load([srcElement]);\n            },\n            template: function () {\n                return '<clipPath id=\\'' + this.id + '\\'>' + this.renderChildren() + '</clipPath>';\n            }\n        });\n        var DefinitionNode = Node.extend({\n            init: function () {\n                Node.fn.init.call(this);\n                this.definitionMap = {};\n            },\n            attachTo: function (domElement) {\n                this.element = domElement;\n            },\n            template: function () {\n                return '<defs>' + this.renderChildren() + '</defs>';\n            },\n            definitionChange: function (e) {\n                var definitions = e.definitions;\n                var action = e.action;\n                if (action === 'add') {\n                    this.addDefinitions(definitions);\n                } else if (action === 'remove') {\n                    this.removeDefinitions(definitions);\n                }\n            },\n            createDefinition: function (type, item) {\n                var nodeType;\n                if (type === 'clip') {\n                    nodeType = ClipNode;\n                } else if (type === 'fill') {\n                    if (item instanceof LinearGradient) {\n                        nodeType = LinearGradientNode;\n                    } else if (item instanceof RadialGradient) {\n                        nodeType = RadialGradientNode;\n                    }\n                }\n                return new nodeType(item);\n            },\n            addDefinitions: function (definitions) {\n                var this$1 = this;\n                for (var field in definitions) {\n                    this$1.addDefinition(field, definitions[field]);\n                }\n            },\n            addDefinition: function (type, srcElement) {\n                var ref = this;\n                var element = ref.element;\n                var definitionMap = ref.definitionMap;\n                var id = srcElement.id;\n                var mapItem = definitionMap[id];\n                if (!mapItem) {\n                    var node = this.createDefinition(type, srcElement);\n                    definitionMap[id] = {\n                        element: node,\n                        count: 1\n                    };\n                    this.append(node);\n                    if (element) {\n                        node.attachTo(this.element);\n                    }\n                } else {\n                    mapItem.count++;\n                }\n            },\n            removeDefinitions: function (definitions) {\n                var this$1 = this;\n                for (var field in definitions) {\n                    this$1.removeDefinition(definitions[field]);\n                }\n            },\n            removeDefinition: function (srcElement) {\n                var definitionMap = this.definitionMap;\n                var id = srcElement.id;\n                var mapItem = definitionMap[id];\n                if (mapItem) {\n                    mapItem.count--;\n                    if (mapItem.count === 0) {\n                        this.remove(this.childNodes.indexOf(mapItem.element), 1);\n                        delete definitionMap[id];\n                    }\n                }\n            }\n        });\n        var RootNode = Node.extend({\n            init: function (options) {\n                Node.fn.init.call(this);\n                this.options = options;\n                this.defs = new DefinitionNode();\n            },\n            attachTo: function (domElement) {\n                this.element = domElement;\n                this.defs.attachTo(domElement.firstElementChild);\n            },\n            clear: function () {\n                BaseNode.prototype.clear.call(this);\n            },\n            template: function () {\n                return this.defs.render() + this.renderChildren();\n            },\n            definitionChange: function (e) {\n                this.defs.definitionChange(e);\n            }\n        });\n        var RTL = 'rtl';\n        function alignToScreen(element) {\n            var ctm;\n            try {\n                ctm = element.getScreenCTM ? element.getScreenCTM() : null;\n            } catch (e) {\n            }\n            if (ctm) {\n                var left = -ctm.e % 1;\n                var top = -ctm.f % 1;\n                var style = element.style;\n                if (left !== 0 || top !== 0) {\n                    style.left = left + 'px';\n                    style.top = top + 'px';\n                }\n            }\n        }\n        var Surface$1 = Surface.extend({\n            init: function (element, options) {\n                Surface.fn.init.call(this, element, options);\n                this._root = new RootNode($.extend({ rtl: elementStyles(element, 'direction').direction === RTL }, this.options));\n                renderSVG$1(this.element, this._template());\n                this._rootElement = this.element.firstElementChild;\n                alignToScreen(this._rootElement);\n                this._root.attachTo(this._rootElement);\n                bindEvents(this.element, {\n                    click: this._click,\n                    mouseover: this._mouseenter,\n                    mouseout: this._mouseleave,\n                    mousemove: this._mousemove\n                });\n                this.resize();\n            },\n            destroy: function () {\n                if (this._root) {\n                    this._root.destroy();\n                    this._root = null;\n                    this._rootElement = null;\n                    unbindEvents(this.element, {\n                        click: this._click,\n                        mouseover: this._mouseenter,\n                        mouseout: this._mouseleave,\n                        mousemove: this._mousemove\n                    });\n                }\n                Surface.fn.destroy.call(this);\n            },\n            translate: function (offset) {\n                var viewBox = Math.round(offset.x) + ' ' + Math.round(offset.y) + ' ' + this._size.width + ' ' + this._size.height;\n                this._offset = offset;\n                this._rootElement.setAttribute('viewBox', viewBox);\n            },\n            draw: function (element) {\n                Surface.fn.draw.call(this, element);\n                this._root.load([element]);\n            },\n            clear: function () {\n                Surface.fn.clear.call(this);\n                this._root.clear();\n            },\n            svg: function () {\n                return '<?xml version=\\'1.0\\' ?>' + this._template();\n            },\n            exportVisual: function () {\n                var ref = this;\n                var visual = ref._visual;\n                var offset = ref._offset;\n                if (offset) {\n                    var wrap = new Group();\n                    wrap.children.push(visual);\n                    wrap.transform(transform().translate(-offset.x, -offset.y));\n                    visual = wrap;\n                }\n                return visual;\n            },\n            _resize: function () {\n                if (this._offset) {\n                    this.translate(this._offset);\n                }\n            },\n            _template: function () {\n                return '<svg style=\\'width: 100%; height: 100%; overflow: hidden;\\' xmlns=\\'' + SVG_NS + '\\' xmlns:xlink=\\'http://www.w3.org/1999/xlink\\' version=\\'1.1\\'>' + this._root.render() + '</svg>';\n            }\n        });\n        Surface$1.prototype.type = 'svg';\n        if (typeof document !== 'undefined' && document.implementation.hasFeature('http://www.w3.org/TR/SVG11/feature#BasicStructure', '1.1')) {\n            Surface.support.svg = true;\n            SurfaceFactory.current.register('svg', Surface$1, 10);\n        }\n        var GroupNode = Node.extend({\n            template: function () {\n                return '<g' + (this.renderTransform() + this.renderStyle() + this.renderOpacity() + this.renderDefinitions()) + '>' + this.renderChildren() + '</g>';\n            },\n            optionsChange: function (e) {\n                if (e.field === 'transform') {\n                    this.transformChange(e.value);\n                }\n                Node.fn.optionsChange.call(this, e);\n            }\n        });\n        NODE_MAP.Group = GroupNode;\n        var DASH_ARRAYS = {\n            dot: [\n                1.5,\n                3.5\n            ],\n            dash: [\n                4,\n                3.5\n            ],\n            longdash: [\n                8,\n                3.5\n            ],\n            dashdot: [\n                3.5,\n                3.5,\n                1.5,\n                3.5\n            ],\n            longdashdot: [\n                8,\n                3.5,\n                1.5,\n                3.5\n            ],\n            longdashdotdot: [\n                8,\n                3.5,\n                1.5,\n                3.5,\n                1.5,\n                3.5\n            ]\n        };\n        var SOLID = 'solid';\n        var BUTT = 'butt';\n        var ATTRIBUTE_MAP = {\n            'fill.opacity': 'fill-opacity',\n            'stroke.color': 'stroke',\n            'stroke.width': 'stroke-width',\n            'stroke.opacity': 'stroke-opacity'\n        };\n        var SPACE = ' ';\n        var PathNode = Node.extend({\n            geometryChange: function () {\n                this.attr('d', this.renderData());\n                this.invalidate();\n            },\n            optionsChange: function (e) {\n                switch (e.field) {\n                case 'fill':\n                    if (e.value) {\n                        this.allAttr(this.mapFill(e.value));\n                    } else {\n                        this.removeAttr('fill');\n                    }\n                    break;\n                case 'fill.color':\n                    this.allAttr(this.mapFill({ color: e.value }));\n                    break;\n                case 'stroke':\n                    if (e.value) {\n                        this.allAttr(this.mapStroke(e.value));\n                    } else {\n                        this.removeAttr('stroke');\n                    }\n                    break;\n                case 'transform':\n                    this.transformChange(e.value);\n                    break;\n                default:\n                    var name = ATTRIBUTE_MAP[e.field];\n                    if (name) {\n                        this.attr(name, e.value);\n                    }\n                    break;\n                }\n                Node.fn.optionsChange.call(this, e);\n            },\n            content: function () {\n                if (this.element) {\n                    this.element.textContent = this.srcElement.content();\n                }\n            },\n            renderData: function () {\n                return this.printPath(this.srcElement);\n            },\n            printPath: function (path) {\n                var this$1 = this;\n                var segments = path.segments;\n                var length = segments.length;\n                if (length > 0) {\n                    var parts = [];\n                    var output, currentType;\n                    for (var i = 1; i < length; i++) {\n                        var segmentType = this$1.segmentType(segments[i - 1], segments[i]);\n                        if (segmentType !== currentType) {\n                            currentType = segmentType;\n                            parts.push(segmentType);\n                        }\n                        if (segmentType === 'L') {\n                            parts.push(this$1.printPoints(segments[i].anchor()));\n                        } else {\n                            parts.push(this$1.printPoints(segments[i - 1].controlOut(), segments[i].controlIn(), segments[i].anchor()));\n                        }\n                    }\n                    output = 'M' + this.printPoints(segments[0].anchor()) + SPACE + parts.join(SPACE);\n                    if (path.options.closed) {\n                        output += 'Z';\n                    }\n                    return output;\n                }\n            },\n            printPoints: function () {\n                var points = arguments;\n                var length = points.length;\n                var result = [];\n                for (var i = 0; i < length; i++) {\n                    result.push(points[i].toString(3));\n                }\n                return result.join(' ');\n            },\n            segmentType: function (segmentStart, segmentEnd) {\n                return segmentStart.controlOut() && segmentEnd.controlIn() ? 'C' : 'L';\n            },\n            mapStroke: function (stroke) {\n                var attrs = [];\n                if (stroke && !isTransparent(stroke.color)) {\n                    attrs.push([\n                        'stroke',\n                        stroke.color\n                    ]);\n                    attrs.push([\n                        'stroke-width',\n                        stroke.width\n                    ]);\n                    attrs.push([\n                        'stroke-linecap',\n                        this.renderLinecap(stroke)\n                    ]);\n                    attrs.push([\n                        'stroke-linejoin',\n                        stroke.lineJoin\n                    ]);\n                    if (defined(stroke.opacity)) {\n                        attrs.push([\n                            'stroke-opacity',\n                            stroke.opacity\n                        ]);\n                    }\n                    if (defined(stroke.dashType)) {\n                        attrs.push([\n                            'stroke-dasharray',\n                            this.renderDashType(stroke)\n                        ]);\n                    }\n                } else {\n                    attrs.push([\n                        'stroke',\n                        NONE\n                    ]);\n                }\n                return attrs;\n            },\n            renderStroke: function () {\n                return renderAllAttr(this.mapStroke(this.srcElement.options.stroke));\n            },\n            renderDashType: function (stroke) {\n                var dashType = stroke.dashType;\n                var width = stroke.width;\n                if (width === void 0) {\n                    width = 1;\n                }\n                if (dashType && dashType !== SOLID) {\n                    var dashArray = DASH_ARRAYS[dashType.toLowerCase()];\n                    var result = [];\n                    for (var i = 0; i < dashArray.length; i++) {\n                        result.push(dashArray[i] * width);\n                    }\n                    return result.join(' ');\n                }\n            },\n            renderLinecap: function (stroke) {\n                var dashType = stroke.dashType;\n                var lineCap = stroke.lineCap;\n                return dashType && dashType !== 'solid' ? BUTT : lineCap;\n            },\n            mapFill: function (fill) {\n                var attrs = [];\n                if (!(fill && fill.nodeType === 'Gradient')) {\n                    if (fill && !isTransparent(fill.color)) {\n                        attrs.push([\n                            'fill',\n                            fill.color\n                        ]);\n                        if (defined(fill.opacity)) {\n                            attrs.push([\n                                'fill-opacity',\n                                fill.opacity\n                            ]);\n                        }\n                    } else {\n                        attrs.push([\n                            'fill',\n                            NONE\n                        ]);\n                    }\n                }\n                return attrs;\n            },\n            renderFill: function () {\n                return renderAllAttr(this.mapFill(this.srcElement.options.fill));\n            },\n            template: function () {\n                return '<path ' + this.renderStyle() + ' ' + this.renderOpacity() + ' ' + renderAttr('d', this.renderData()) + '' + this.renderStroke() + this.renderFill() + this.renderDefinitions() + this.renderTransform() + '></path>';\n            }\n        });\n        NODE_MAP.Path = PathNode;\n        var ArcNode = PathNode.extend({\n            renderData: function () {\n                return this.printPath(this.srcElement.toPath());\n            }\n        });\n        NODE_MAP.Arc = ArcNode;\n        var CircleNode = PathNode.extend({\n            geometryChange: function () {\n                var center = this.center();\n                this.attr('cx', center.x);\n                this.attr('cy', center.y);\n                this.attr('r', this.radius());\n                this.invalidate();\n            },\n            center: function () {\n                return this.srcElement.geometry().center;\n            },\n            radius: function () {\n                return this.srcElement.geometry().radius;\n            },\n            template: function () {\n                return '<circle ' + this.renderStyle() + ' ' + this.renderOpacity() + 'cx=\\'' + this.center().x + '\\' cy=\\'' + this.center().y + '\\' r=\\'' + this.radius() + '\\'' + this.renderStroke() + ' ' + this.renderFill() + ' ' + this.renderDefinitions() + this.renderTransform() + ' ></circle>';\n            }\n        });\n        NODE_MAP.Circle = CircleNode;\n        var RectNode = PathNode.extend({\n            geometryChange: function () {\n                var geometry = this.srcElement.geometry();\n                this.attr('x', geometry.origin.x);\n                this.attr('y', geometry.origin.y);\n                this.attr('width', geometry.size.width);\n                this.attr('height', geometry.size.height);\n                this.invalidate();\n            },\n            size: function () {\n                return this.srcElement.geometry().size;\n            },\n            origin: function () {\n                return this.srcElement.geometry().origin;\n            },\n            template: function () {\n                return '<rect ' + this.renderStyle() + ' ' + this.renderOpacity() + ' x=\\'' + this.origin().x + '\\' y=\\'' + this.origin().y + '\\' ' + 'width=\\'' + this.size().width + '\\' height=\\'' + this.size().height + '\\' ' + this.renderStroke() + ' ' + this.renderFill() + ' ' + this.renderDefinitions() + ' ' + this.renderTransform() + ' />';\n            }\n        });\n        NODE_MAP.Rect = RectNode;\n        var ImageNode = PathNode.extend({\n            geometryChange: function () {\n                this.allAttr(this.mapPosition());\n                this.invalidate();\n            },\n            optionsChange: function (e) {\n                if (e.field === 'src') {\n                    this.allAttr(this.mapSource());\n                }\n                PathNode.fn.optionsChange.call(this, e);\n            },\n            mapPosition: function () {\n                var rect = this.srcElement.rect();\n                var tl = rect.topLeft();\n                return [\n                    [\n                        'x',\n                        tl.x\n                    ],\n                    [\n                        'y',\n                        tl.y\n                    ],\n                    [\n                        'width',\n                        rect.width() + 'px'\n                    ],\n                    [\n                        'height',\n                        rect.height() + 'px'\n                    ]\n                ];\n            },\n            renderPosition: function () {\n                return renderAllAttr(this.mapPosition());\n            },\n            mapSource: function (encode) {\n                var src = this.srcElement.src();\n                if (encode) {\n                    src = kendo.htmlEncode(src);\n                }\n                return [[\n                        'xlink:href',\n                        src\n                    ]];\n            },\n            renderSource: function () {\n                return renderAllAttr(this.mapSource(true));\n            },\n            template: function () {\n                return '<image preserveAspectRatio=\\'none\\' ' + this.renderStyle() + ' ' + this.renderTransform() + ' ' + this.renderOpacity() + this.renderPosition() + ' ' + this.renderSource() + ' ' + this.renderDefinitions() + '>' + '</image>';\n            }\n        });\n        NODE_MAP.Image = ImageNode;\n        function decodeEntities(text) {\n            if (!text || !text.indexOf || text.indexOf('&') < 0) {\n                return text;\n            }\n            var element = decodeEntities._element;\n            element.innerHTML = text;\n            return element.textContent || element.innerText;\n        }\n        if (typeof document !== 'undefined') {\n            decodeEntities._element = document.createElement('span');\n        }\n        var TextNode = PathNode.extend({\n            geometryChange: function () {\n                var pos = this.pos();\n                this.attr('x', pos.x);\n                this.attr('y', pos.y);\n                this.invalidate();\n            },\n            optionsChange: function (e) {\n                if (e.field === 'font') {\n                    this.attr('style', renderStyle(this.mapStyle()));\n                    this.geometryChange();\n                } else if (e.field === 'content') {\n                    PathNode.fn.content.call(this, this.srcElement.content());\n                }\n                PathNode.fn.optionsChange.call(this, e);\n            },\n            mapStyle: function (encode) {\n                var style = PathNode.fn.mapStyle.call(this, encode);\n                var font = this.srcElement.options.font;\n                if (encode) {\n                    font = kendo.htmlEncode(font);\n                }\n                style.push([\n                    'font',\n                    font\n                ]);\n                return style;\n            },\n            pos: function () {\n                var pos = this.srcElement.position();\n                var size = this.srcElement.measure();\n                return pos.clone().setY(pos.y + size.baseline);\n            },\n            renderContent: function () {\n                var content = this.srcElement.content();\n                content = decodeEntities(content);\n                content = kendo.htmlEncode(content);\n                return content;\n            },\n            renderTextAnchor: function () {\n                var anchor;\n                if ((this.options || {}).rtl) {\n                    anchor = 'end';\n                }\n                return renderAttr('text-anchor', anchor);\n            },\n            template: function () {\n                return '<text ' + this.renderTextAnchor() + ' ' + this.renderStyle() + ' ' + this.renderOpacity() + ' x=\\'' + this.pos().x + '\\' y=\\'' + this.pos().y + '\\'' + this.renderStroke() + ' ' + this.renderTransform() + ' ' + this.renderDefinitions() + this.renderFill() + '>' + this.renderContent() + '</text>';\n            }\n        });\n        NODE_MAP.Text = TextNode;\n        var MultiPathNode = PathNode.extend({\n            renderData: function () {\n                var this$1 = this;\n                var paths = this.srcElement.paths;\n                if (paths.length > 0) {\n                    var result = [];\n                    for (var i = 0; i < paths.length; i++) {\n                        result.push(this$1.printPath(paths[i]));\n                    }\n                    return result.join(' ');\n                }\n            }\n        });\n        NODE_MAP.MultiPath = MultiPathNode;\n        var geometry = {\n            Circle: Circle$2,\n            Arc: Arc$2,\n            Rect: Rect,\n            Point: Point,\n            Segment: Segment,\n            Matrix: Matrix,\n            Size: Size,\n            toMatrix: toMatrix,\n            Transformation: Transformation,\n            transform: transform\n        };\n        function exportGroup(group) {\n            var root = new RootNode({ skipBaseHref: true });\n            var bbox = group.clippedBBox();\n            var rootGroup = group;\n            if (bbox) {\n                var origin = bbox.getOrigin();\n                var exportRoot = new Group();\n                exportRoot.transform(transform().translate(-origin.x, -origin.y));\n                exportRoot.children.push(group);\n                rootGroup = exportRoot;\n            }\n            root.load([rootGroup]);\n            var svg = '<?xml version=\\'1.0\\' ?><svg xmlns=\\'' + SVG_NS + '\\' xmlns:xlink=\\'http://www.w3.org/1999/xlink\\' version=\\'1.1\\'>' + root.render() + '</svg>';\n            root.destroy();\n            return svg;\n        }\n        var svg = {\n            Surface: Surface$1,\n            RootNode: RootNode,\n            Node: Node,\n            GroupNode: GroupNode,\n            ArcNode: ArcNode,\n            CircleNode: CircleNode,\n            RectNode: RectNode,\n            ImageNode: ImageNode,\n            TextNode: TextNode,\n            PathNode: PathNode,\n            MultiPathNode: MultiPathNode,\n            DefinitionNode: DefinitionNode,\n            ClipNode: ClipNode,\n            GradientStopNode: GradientStopNode,\n            LinearGradientNode: LinearGradientNode,\n            RadialGradientNode: RadialGradientNode,\n            exportGroup: exportGroup\n        };\n        var NODE_MAP$2 = {};\n        function renderPath(ctx, path) {\n            var segments = path.segments;\n            if (segments.length === 0) {\n                return;\n            }\n            var segment = segments[0];\n            var anchor = segment.anchor();\n            ctx.moveTo(anchor.x, anchor.y);\n            for (var i = 1; i < segments.length; i++) {\n                segment = segments[i];\n                anchor = segment.anchor();\n                var prevSeg = segments[i - 1];\n                var prevOut = prevSeg.controlOut();\n                var controlIn = segment.controlIn();\n                if (prevOut && controlIn) {\n                    ctx.bezierCurveTo(prevOut.x, prevOut.y, controlIn.x, controlIn.y, anchor.x, anchor.y);\n                } else {\n                    ctx.lineTo(anchor.x, anchor.y);\n                }\n            }\n            if (path.options.closed) {\n                ctx.closePath();\n            }\n        }\n        var Node$2 = BaseNode.extend({\n            init: function (srcElement) {\n                BaseNode.fn.init.call(this, srcElement);\n                if (srcElement) {\n                    this.initClip();\n                }\n            },\n            initClip: function () {\n                var clip = this.srcElement.clip();\n                if (clip) {\n                    this.clip = clip;\n                    clip.addObserver(this);\n                }\n            },\n            clear: function () {\n                if (this.srcElement) {\n                    this.srcElement.removeObserver(this);\n                }\n                this.clearClip();\n                BaseNode.fn.clear.call(this);\n            },\n            clearClip: function () {\n                if (this.clip) {\n                    this.clip.removeObserver(this);\n                    delete this.clip;\n                }\n            },\n            setClip: function (ctx) {\n                if (this.clip) {\n                    ctx.beginPath();\n                    renderPath(ctx, this.clip);\n                    ctx.clip();\n                }\n            },\n            optionsChange: function (e) {\n                if (e.field === 'clip') {\n                    this.clearClip();\n                    this.initClip();\n                }\n                BaseNode.fn.optionsChange.call(this, e);\n            },\n            setTransform: function (ctx) {\n                if (this.srcElement) {\n                    var transform = this.srcElement.transform();\n                    if (transform) {\n                        ctx.transform.apply(ctx, transform.matrix().toArray(6));\n                    }\n                }\n            },\n            loadElements: function (elements, pos, cors) {\n                var this$1 = this;\n                for (var i = 0; i < elements.length; i++) {\n                    var srcElement = elements[i];\n                    var children = srcElement.children;\n                    var childNode = new NODE_MAP$2[srcElement.nodeType](srcElement, cors);\n                    if (children && children.length > 0) {\n                        childNode.load(children, pos, cors);\n                    }\n                    if (defined(pos)) {\n                        this$1.insertAt(childNode, pos);\n                    } else {\n                        this$1.append(childNode);\n                    }\n                }\n            },\n            load: function (elements, pos, cors) {\n                this.loadElements(elements, pos, cors);\n                this.invalidate();\n            },\n            setOpacity: function (ctx) {\n                if (this.srcElement) {\n                    var opacity = this.srcElement.opacity();\n                    if (defined(opacity)) {\n                        this.globalAlpha(ctx, opacity);\n                    }\n                }\n            },\n            globalAlpha: function (ctx, value) {\n                var opactity = value;\n                if (opactity && ctx.globalAlpha) {\n                    opactity *= ctx.globalAlpha;\n                }\n                ctx.globalAlpha = opactity;\n            },\n            visible: function () {\n                var src = this.srcElement;\n                return !src || src && src.options.visible !== false;\n            }\n        });\n        var GroupNode$2 = Node$2.extend({\n            renderTo: function (ctx) {\n                if (!this.visible()) {\n                    return;\n                }\n                ctx.save();\n                this.setTransform(ctx);\n                this.setClip(ctx);\n                this.setOpacity(ctx);\n                var childNodes = this.childNodes;\n                for (var i = 0; i < childNodes.length; i++) {\n                    var child = childNodes[i];\n                    if (child.visible()) {\n                        child.renderTo(ctx);\n                    }\n                }\n                ctx.restore();\n            }\n        });\n        Traversable.extend(GroupNode$2.prototype, 'childNodes');\n        NODE_MAP$2.Group = GroupNode$2;\n        var FRAME_DELAY = 1000 / 60;\n        var RootNode$2 = GroupNode$2.extend({\n            init: function (canvas) {\n                GroupNode$2.fn.init.call(this);\n                this.canvas = canvas;\n                this.ctx = canvas.getContext('2d');\n                var invalidateHandler = this._invalidate.bind(this);\n                this.invalidate = kendo.throttle(function () {\n                    kendo.animationFrame(invalidateHandler);\n                }, FRAME_DELAY);\n            },\n            destroy: function () {\n                GroupNode$2.fn.destroy.call(this);\n                this.canvas = null;\n                this.ctx = null;\n            },\n            load: function (elements, pos, cors) {\n                this.loadElements(elements, pos, cors);\n                this._invalidate();\n            },\n            _invalidate: function () {\n                if (!this.ctx) {\n                    return;\n                }\n                this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);\n                this.renderTo(this.ctx);\n            }\n        });\n        Traversable.extend(RootNode$2.prototype, 'childNodes');\n        var QuadRoot = Class.extend({\n            init: function () {\n                this.shapes = [];\n            },\n            _add: function (shape, bbox) {\n                this.shapes.push({\n                    bbox: bbox,\n                    shape: shape\n                });\n                shape._quadNode = this;\n            },\n            pointShapes: function (point) {\n                var shapes = this.shapes;\n                var length = shapes.length;\n                var result = [];\n                for (var idx = 0; idx < length; idx++) {\n                    if (shapes[idx].bbox.containsPoint(point)) {\n                        result.push(shapes[idx].shape);\n                    }\n                }\n                return result;\n            },\n            insert: function (shape, bbox) {\n                this._add(shape, bbox);\n            },\n            remove: function (shape) {\n                var shapes = this.shapes;\n                var length = shapes.length;\n                for (var idx = 0; idx < length; idx++) {\n                    if (shapes[idx].shape === shape) {\n                        shapes.splice(idx, 1);\n                        break;\n                    }\n                }\n            }\n        });\n        var QuadNode = QuadRoot.extend({\n            init: function (rect) {\n                QuadRoot.fn.init.call(this);\n                this.children = [];\n                this.rect = rect;\n            },\n            inBounds: function (rect) {\n                var nodeRect = this.rect;\n                var nodeBottomRight = nodeRect.bottomRight();\n                var bottomRight = rect.bottomRight();\n                var inBounds = nodeRect.origin.x <= rect.origin.x && nodeRect.origin.y <= rect.origin.y && bottomRight.x <= nodeBottomRight.x && bottomRight.y <= nodeBottomRight.y;\n                return inBounds;\n            },\n            pointShapes: function (point) {\n                var children = this.children;\n                var length = children.length;\n                var result = QuadRoot.fn.pointShapes.call(this, point);\n                for (var idx = 0; idx < length; idx++) {\n                    append(result, children[idx].pointShapes(point));\n                }\n                return result;\n            },\n            insert: function (shape, bbox) {\n                var children = this.children;\n                var inserted = false;\n                if (this.inBounds(bbox)) {\n                    if (this.shapes.length < 4) {\n                        this._add(shape, bbox);\n                    } else {\n                        if (!children.length) {\n                            this._initChildren();\n                        }\n                        for (var idx = 0; idx < children.length; idx++) {\n                            if (children[idx].insert(shape, bbox)) {\n                                inserted = true;\n                                break;\n                            }\n                        }\n                        if (!inserted) {\n                            this._add(shape, bbox);\n                        }\n                    }\n                    inserted = true;\n                }\n                return inserted;\n            },\n            _initChildren: function () {\n                var ref = this;\n                var rect = ref.rect;\n                var children = ref.children;\n                var center = rect.center();\n                var halfWidth = rect.width() / 2;\n                var halfHeight = rect.height() / 2;\n                children.push(new QuadNode(new Rect([\n                    rect.origin.x,\n                    rect.origin.y\n                ], [\n                    halfWidth,\n                    halfHeight\n                ])), new QuadNode(new Rect([\n                    center.x,\n                    rect.origin.y\n                ], [\n                    halfWidth,\n                    halfHeight\n                ])), new QuadNode(new Rect([\n                    rect.origin.x,\n                    center.y\n                ], [\n                    halfWidth,\n                    halfHeight\n                ])), new QuadNode(new Rect([\n                    center.x,\n                    center.y\n                ], [\n                    halfWidth,\n                    halfHeight\n                ])));\n            }\n        });\n        var ROOT_SIZE = 3000;\n        var LEVEL_STEP = 10000;\n        var MAX_LEVEL = 75;\n        var ShapesQuadTree = Class.extend({\n            init: function () {\n                this.initRoots();\n            },\n            initRoots: function () {\n                this.rootMap = {};\n                this.root = new QuadRoot();\n                this.rootElements = [];\n            },\n            clear: function () {\n                var this$1 = this;\n                var rootElements = this.rootElements;\n                for (var idx = 0; idx < rootElements.length; idx++) {\n                    this$1.remove(rootElements[idx]);\n                }\n                this.initRoots();\n            },\n            pointShape: function (point) {\n                var sectorRoot = (this.rootMap[Math.floor(point.x / ROOT_SIZE)] || {})[Math.floor(point.y / ROOT_SIZE)];\n                var result = this.root.pointShapes(point);\n                if (sectorRoot) {\n                    result = result.concat(sectorRoot.pointShapes(point));\n                }\n                this.assignZindex(result);\n                result.sort(zIndexComparer);\n                for (var idx = 0; idx < result.length; idx++) {\n                    if (result[idx].containsPoint(point)) {\n                        return result[idx];\n                    }\n                }\n            },\n            assignZindex: function (elements) {\n                var this$1 = this;\n                for (var idx = 0; idx < elements.length; idx++) {\n                    var element = elements[idx];\n                    var zIndex = 0;\n                    var levelWeight = Math.pow(LEVEL_STEP, MAX_LEVEL);\n                    var parents = [];\n                    while (element) {\n                        parents.push(element);\n                        element = element.parent;\n                    }\n                    while (parents.length) {\n                        element = parents.pop();\n                        zIndex += ((element.parent ? element.parent.children : this$1.rootElements).indexOf(element) + 1) * levelWeight;\n                        levelWeight /= LEVEL_STEP;\n                    }\n                    elements[idx]._zIndex = zIndex;\n                }\n            },\n            optionsChange: function (e) {\n                if (e.field === 'transform' || e.field === 'stroke.width') {\n                    this.bboxChange(e.element);\n                }\n            },\n            geometryChange: function (e) {\n                this.bboxChange(e.element);\n            },\n            bboxChange: function (element) {\n                var this$1 = this;\n                if (element.nodeType === 'Group') {\n                    for (var idx = 0; idx < element.children.length; idx++) {\n                        this$1.bboxChange(element.children[idx]);\n                    }\n                } else {\n                    if (element._quadNode) {\n                        element._quadNode.remove(element);\n                    }\n                    this._insertShape(element);\n                }\n            },\n            add: function (elements) {\n                var elementsArray = Array.isArray(elements) ? elements.slice(0) : [elements];\n                append(this.rootElements, elementsArray);\n                this._insert(elementsArray);\n            },\n            childrenChange: function (e) {\n                var this$1 = this;\n                if (e.action === 'remove') {\n                    for (var idx = 0; idx < e.items.length; idx++) {\n                        this$1.remove(e.items[idx]);\n                    }\n                } else {\n                    this._insert(Array.prototype.slice.call(e.items, 0));\n                }\n            },\n            _insert: function (elements) {\n                var this$1 = this;\n                var element;\n                while (elements.length > 0) {\n                    element = elements.pop();\n                    element.addObserver(this$1);\n                    if (element.nodeType === 'Group') {\n                        append(elements, element.children);\n                    } else {\n                        this$1._insertShape(element);\n                    }\n                }\n            },\n            _insertShape: function (shape) {\n                var bbox = shape.bbox();\n                if (bbox) {\n                    var sectors = this.getSectors(bbox);\n                    var x = sectors[0][0];\n                    var y = sectors[1][0];\n                    if (this.inRoot(sectors)) {\n                        this.root.insert(shape, bbox);\n                    } else {\n                        var rootMap = this.rootMap;\n                        if (!rootMap[x]) {\n                            rootMap[x] = {};\n                        }\n                        if (!rootMap[x][y]) {\n                            rootMap[x][y] = new QuadNode(new Rect([\n                                x * ROOT_SIZE,\n                                y * ROOT_SIZE\n                            ], [\n                                ROOT_SIZE,\n                                ROOT_SIZE\n                            ]));\n                        }\n                        rootMap[x][y].insert(shape, bbox);\n                    }\n                }\n            },\n            remove: function (element) {\n                var this$1 = this;\n                element.removeObserver(this);\n                if (element.nodeType === 'Group') {\n                    var children = element.children;\n                    for (var idx = 0; idx < children.length; idx++) {\n                        this$1.remove(children[idx]);\n                    }\n                } else if (element._quadNode) {\n                    element._quadNode.remove(element);\n                    delete element._quadNode;\n                }\n            },\n            inRoot: function (sectors) {\n                return sectors[0].length > 1 || sectors[1].length > 1;\n            },\n            getSectors: function (rect) {\n                var bottomRight = rect.bottomRight();\n                var bottomX = Math.floor(bottomRight.x / ROOT_SIZE);\n                var bottomY = Math.floor(bottomRight.y / ROOT_SIZE);\n                var sectors = [\n                    [],\n                    []\n                ];\n                for (var x = Math.floor(rect.origin.x / ROOT_SIZE); x <= bottomX; x++) {\n                    sectors[0].push(x);\n                }\n                for (var y = Math.floor(rect.origin.y / ROOT_SIZE); y <= bottomY; y++) {\n                    sectors[1].push(y);\n                }\n                return sectors;\n            }\n        });\n        function zIndexComparer(x1, x2) {\n            if (x1._zIndex < x2._zIndex) {\n                return 1;\n            }\n            if (x1._zIndex > x2._zIndex) {\n                return -1;\n            }\n            return 0;\n        }\n        var SurfaceCursor = Class.extend({\n            init: function (surface) {\n                surface.bind('mouseenter', this._mouseenter.bind(this));\n                surface.bind('mouseleave', this._mouseleave.bind(this));\n                this.element = surface.element;\n            },\n            clear: function () {\n                this._resetCursor();\n            },\n            destroy: function () {\n                this._resetCursor();\n                delete this.element;\n            },\n            _mouseenter: function (e) {\n                var cursor = this._shapeCursor(e);\n                if (!cursor) {\n                    this._resetCursor();\n                } else {\n                    if (!this._current) {\n                        this._defaultCursor = this._getCursor();\n                    }\n                    this._setCursor(cursor);\n                }\n            },\n            _mouseleave: function () {\n                this._resetCursor();\n            },\n            _shapeCursor: function (e) {\n                var shape = e.element;\n                while (shape && !defined(shape.options.cursor)) {\n                    shape = shape.parent;\n                }\n                if (shape) {\n                    return shape.options.cursor;\n                }\n            },\n            _getCursor: function () {\n                if (this.element) {\n                    return this.element.style.cursor;\n                }\n            },\n            _setCursor: function (cursor) {\n                if (this.element) {\n                    this.element.style.cursor = cursor;\n                    this._current = cursor;\n                }\n            },\n            _resetCursor: function () {\n                if (this._current) {\n                    this._setCursor(this._defaultCursor || '');\n                    delete this._current;\n                }\n            }\n        });\n        var Surface$3 = Surface.extend({\n            init: function (element, options) {\n                Surface.fn.init.call(this, element, options);\n                this.element.innerHTML = this._template(this);\n                var canvas = this.element.firstElementChild;\n                var size = elementSize(element);\n                canvas.width = size.width;\n                canvas.height = size.height;\n                this._rootElement = canvas;\n                this._root = new RootNode$2(canvas);\n                this._mouseTrackHandler = this._trackMouse.bind(this);\n                bindEvents(this.element, {\n                    click: this._mouseTrackHandler,\n                    mousemove: this._mouseTrackHandler\n                });\n            },\n            destroy: function () {\n                Surface.fn.destroy.call(this);\n                if (this._root) {\n                    this._root.destroy();\n                    this._root = null;\n                }\n                if (this._searchTree) {\n                    this._searchTree.clear();\n                    delete this._searchTree;\n                }\n                if (this._cursor) {\n                    this._cursor.destroy();\n                    delete this._cursor;\n                }\n                unbindEvents(this.element, {\n                    click: this._mouseTrackHandler,\n                    mousemove: this._mouseTrackHandler\n                });\n            },\n            draw: function (element) {\n                Surface.fn.draw.call(this, element);\n                this._root.load([element], undefined, this.options.cors);\n                if (this._searchTree) {\n                    this._searchTree.add([element]);\n                }\n            },\n            clear: function () {\n                Surface.fn.clear.call(this);\n                this._root.clear();\n                if (this._searchTree) {\n                    this._searchTree.clear();\n                }\n                if (this._cursor) {\n                    this._cursor.clear();\n                }\n            },\n            eventTarget: function (e) {\n                if (this._searchTree) {\n                    var point = this._surfacePoint(e);\n                    var shape = this._searchTree.pointShape(point);\n                    return shape;\n                }\n            },\n            image: function () {\n                var ref = this;\n                var root = ref._root;\n                var rootElement = ref._rootElement;\n                var loadingStates = [];\n                root.traverse(function (childNode) {\n                    if (childNode.loading) {\n                        loadingStates.push(childNode.loading);\n                    }\n                });\n                var promise = createPromise();\n                var resolveDataURL = function () {\n                    root._invalidate();\n                    try {\n                        var data = rootElement.toDataURL();\n                        promise.resolve(data);\n                    } catch (e) {\n                        promise.reject(e);\n                    }\n                };\n                promiseAll(loadingStates).then(resolveDataURL, resolveDataURL);\n                return promise;\n            },\n            suspendTracking: function () {\n                Surface.fn.suspendTracking.call(this);\n                if (this._searchTree) {\n                    this._searchTree.clear();\n                    delete this._searchTree;\n                }\n            },\n            resumeTracking: function () {\n                Surface.fn.resumeTracking.call(this);\n                if (!this._searchTree) {\n                    this._searchTree = new ShapesQuadTree();\n                    var childNodes = this._root.childNodes;\n                    var rootElements = [];\n                    for (var idx = 0; idx < childNodes.length; idx++) {\n                        rootElements.push(childNodes[idx].srcElement);\n                    }\n                    this._searchTree.add(rootElements);\n                }\n            },\n            _resize: function () {\n                this._rootElement.width = this._size.width;\n                this._rootElement.height = this._size.height;\n                this._root.invalidate();\n            },\n            _template: function () {\n                return '<canvas style=\\'width: 100%; height: 100%;\\'></canvas>';\n            },\n            _enableTracking: function () {\n                this._searchTree = new ShapesQuadTree();\n                this._cursor = new SurfaceCursor(this);\n                Surface.fn._enableTracking.call(this);\n            },\n            _trackMouse: function (e) {\n                if (this._suspendedTracking) {\n                    return;\n                }\n                var shape = this.eventTarget(e);\n                if (e.type !== 'click') {\n                    var currentShape = this._currentShape;\n                    if (currentShape && currentShape !== shape) {\n                        this.trigger('mouseleave', {\n                            element: currentShape,\n                            originalEvent: e,\n                            type: 'mouseleave'\n                        });\n                    }\n                    if (shape && currentShape !== shape) {\n                        this.trigger('mouseenter', {\n                            element: shape,\n                            originalEvent: e,\n                            type: 'mouseenter'\n                        });\n                    }\n                    this.trigger('mousemove', {\n                        element: shape,\n                        originalEvent: e,\n                        type: 'mousemove'\n                    });\n                    this._currentShape = shape;\n                } else if (shape) {\n                    this.trigger('click', {\n                        element: shape,\n                        originalEvent: e,\n                        type: 'click'\n                    });\n                }\n            }\n        });\n        Surface$3.prototype.type = 'canvas';\n        if (typeof document !== 'undefined' && document.createElement('canvas').getContext) {\n            Surface.support.canvas = true;\n            SurfaceFactory.current.register('canvas', Surface$3, 20);\n        }\n        function addGradientStops(gradient, stops) {\n            for (var idx = 0; idx < stops.length; idx++) {\n                var stop = stops[idx];\n                var color = kendo.parseColor(stop.color());\n                color.a *= stop.opacity();\n                gradient.addColorStop(stop.offset(), color.toCssRgba());\n            }\n        }\n        var PathNode$2 = Node$2.extend({\n            renderTo: function (ctx) {\n                ctx.save();\n                this.setTransform(ctx);\n                this.setClip(ctx);\n                this.setOpacity(ctx);\n                ctx.beginPath();\n                this.renderPoints(ctx, this.srcElement);\n                this.setLineDash(ctx);\n                this.setLineCap(ctx);\n                this.setLineJoin(ctx);\n                this.setFill(ctx);\n                this.setStroke(ctx);\n                ctx.restore();\n            },\n            setFill: function (ctx) {\n                var fill = this.srcElement.options.fill;\n                var hasFill = false;\n                if (fill) {\n                    if (fill.nodeType === 'Gradient') {\n                        this.setGradientFill(ctx, fill);\n                        hasFill = true;\n                    } else if (!isTransparent(fill.color)) {\n                        ctx.fillStyle = fill.color;\n                        ctx.save();\n                        this.globalAlpha(ctx, fill.opacity);\n                        ctx.fill();\n                        ctx.restore();\n                        hasFill = true;\n                    }\n                }\n                return hasFill;\n            },\n            setGradientFill: function (ctx, fill) {\n                var bbox = this.srcElement.rawBBox();\n                var gradient;\n                if (fill instanceof LinearGradient) {\n                    var start = fill.start();\n                    var end = fill.end();\n                    gradient = ctx.createLinearGradient(start.x, start.y, end.x, end.y);\n                } else if (fill instanceof RadialGradient) {\n                    var center = fill.center();\n                    gradient = ctx.createRadialGradient(center.x, center.y, 0, center.x, center.y, fill.radius());\n                }\n                addGradientStops(gradient, fill.stops);\n                ctx.save();\n                if (!fill.userSpace()) {\n                    ctx.transform(bbox.width(), 0, 0, bbox.height(), bbox.origin.x, bbox.origin.y);\n                }\n                ctx.fillStyle = gradient;\n                ctx.fill();\n                ctx.restore();\n            },\n            setStroke: function (ctx) {\n                var stroke = this.srcElement.options.stroke;\n                if (stroke && !isTransparent(stroke.color) && stroke.width > 0) {\n                    ctx.strokeStyle = stroke.color;\n                    ctx.lineWidth = valueOrDefault(stroke.width, 1);\n                    ctx.save();\n                    this.globalAlpha(ctx, stroke.opacity);\n                    ctx.stroke();\n                    ctx.restore();\n                    return true;\n                }\n            },\n            dashType: function () {\n                var stroke = this.srcElement.options.stroke;\n                if (stroke && stroke.dashType) {\n                    return stroke.dashType.toLowerCase();\n                }\n            },\n            setLineDash: function (ctx) {\n                var dashType = this.dashType();\n                if (dashType && dashType !== SOLID) {\n                    var dashArray = DASH_ARRAYS[dashType];\n                    if (ctx.setLineDash) {\n                        ctx.setLineDash(dashArray);\n                    } else {\n                        ctx.mozDash = dashArray;\n                        ctx.webkitLineDash = dashArray;\n                    }\n                }\n            },\n            setLineCap: function (ctx) {\n                var dashType = this.dashType();\n                var stroke = this.srcElement.options.stroke;\n                if (dashType && dashType !== SOLID) {\n                    ctx.lineCap = BUTT;\n                } else if (stroke && stroke.lineCap) {\n                    ctx.lineCap = stroke.lineCap;\n                }\n            },\n            setLineJoin: function (ctx) {\n                var stroke = this.srcElement.options.stroke;\n                if (stroke && stroke.lineJoin) {\n                    ctx.lineJoin = stroke.lineJoin;\n                }\n            },\n            renderPoints: function (ctx, path) {\n                renderPath(ctx, path);\n            }\n        });\n        NODE_MAP$2.Path = PathNode$2;\n        var ArcNode$2 = PathNode$2.extend({\n            renderPoints: function (ctx) {\n                var path = this.srcElement.toPath();\n                renderPath(ctx, path);\n            }\n        });\n        NODE_MAP$2.Arc = ArcNode$2;\n        var CircleNode$2 = PathNode$2.extend({\n            renderPoints: function (ctx) {\n                var ref = this.srcElement.geometry();\n                var center = ref.center;\n                var radius = ref.radius;\n                ctx.arc(center.x, center.y, radius, 0, Math.PI * 2);\n            }\n        });\n        NODE_MAP$2.Circle = CircleNode$2;\n        var RectNode$2 = PathNode$2.extend({\n            renderPoints: function (ctx) {\n                var ref = this.srcElement.geometry();\n                var origin = ref.origin;\n                var size = ref.size;\n                ctx.rect(origin.x, origin.y, size.width, size.height);\n            }\n        });\n        NODE_MAP$2.Rect = RectNode$2;\n        var ImageNode$2 = PathNode$2.extend({\n            init: function (srcElement, cors) {\n                PathNode$2.fn.init.call(this, srcElement);\n                this.onLoad = this.onLoad.bind(this);\n                this.onError = this.onError.bind(this);\n                this.loading = createPromise();\n                var img = this.img = new Image();\n                if (cors && !/^data:/i.test(srcElement.src())) {\n                    img.crossOrigin = cors;\n                }\n                img.src = srcElement.src();\n                if (img.complete) {\n                    this.onLoad();\n                } else {\n                    img.onload = this.onLoad;\n                    img.onerror = this.onError;\n                }\n            },\n            renderTo: function (ctx) {\n                if (this.loading.state() === 'resolved') {\n                    ctx.save();\n                    this.setTransform(ctx);\n                    this.setClip(ctx);\n                    this.drawImage(ctx);\n                    ctx.restore();\n                }\n            },\n            optionsChange: function (e) {\n                if (e.field === 'src') {\n                    this.loading = createPromise();\n                    this.img.src = this.srcElement.src();\n                } else {\n                    PathNode$2.fn.optionsChange.call(this, e);\n                }\n            },\n            onLoad: function () {\n                this.loading.resolve();\n                this.invalidate();\n            },\n            onError: function () {\n                this.loading.reject(new Error('Unable to load image \\'' + this.img.src + '\\'. Check for connectivity and verify CORS headers.'));\n            },\n            drawImage: function (ctx) {\n                var rect = this.srcElement.rect();\n                var topLeft = rect.topLeft();\n                ctx.drawImage(this.img, topLeft.x, topLeft.y, rect.width(), rect.height());\n            }\n        });\n        NODE_MAP$2.Image = ImageNode$2;\n        var TextNode$2 = PathNode$2.extend({\n            renderTo: function (ctx) {\n                var text = this.srcElement;\n                var pos = text.position();\n                var size = text.measure();\n                ctx.save();\n                this.setTransform(ctx);\n                this.setClip(ctx);\n                this.setOpacity(ctx);\n                ctx.beginPath();\n                ctx.font = text.options.font;\n                ctx.textAlign = 'left';\n                if (this.setFill(ctx)) {\n                    ctx.fillText(text.content(), pos.x, pos.y + size.baseline);\n                }\n                if (this.setStroke(ctx)) {\n                    this.setLineDash(ctx);\n                    ctx.strokeText(text.content(), pos.x, pos.y + size.baseline);\n                }\n                ctx.restore();\n            }\n        });\n        NODE_MAP$2.Text = TextNode$2;\n        var MultiPathNode$2 = PathNode$2.extend({\n            renderPoints: function (ctx) {\n                var paths = this.srcElement.paths;\n                for (var i = 0; i < paths.length; i++) {\n                    renderPath(ctx, paths[i]);\n                }\n            }\n        });\n        NODE_MAP$2.MultiPath = MultiPathNode$2;\n        var canvas = {\n            Surface: Surface$3,\n            RootNode: RootNode$2,\n            Node: Node$2,\n            GroupNode: GroupNode$2,\n            ArcNode: ArcNode$2,\n            CircleNode: CircleNode$2,\n            RectNode: RectNode$2,\n            ImageNode: ImageNode$2,\n            TextNode: TextNode$2,\n            PathNode: PathNode$2,\n            MultiPathNode: MultiPathNode$2\n        };\n        function exportImage(group, options) {\n            var defaults = {\n                width: '800px',\n                height: '600px',\n                cors: 'Anonymous'\n            };\n            var exportRoot = group;\n            var bbox = group.clippedBBox();\n            if (bbox) {\n                var origin = bbox.getOrigin();\n                exportRoot = new Group();\n                exportRoot.transform(transform().translate(-origin.x, -origin.y));\n                exportRoot.children.push(group);\n                var size = bbox.getSize();\n                defaults.width = size.width + 'px';\n                defaults.height = size.height + 'px';\n            }\n            var surfaceOptions = $.extend(defaults, options);\n            var container = document.createElement('div');\n            var style = container.style;\n            style.display = 'none';\n            style.width = surfaceOptions.width;\n            style.height = surfaceOptions.height;\n            document.body.appendChild(container);\n            var surface = new Surface$3(container, surfaceOptions);\n            surface.suspendTracking();\n            surface.draw(exportRoot);\n            var promise = surface.image();\n            var destroy = function () {\n                surface.destroy();\n                document.body.removeChild(container);\n            };\n            promise.then(destroy, destroy);\n            return promise;\n        }\n        function exportSVG(group, options) {\n            var svg = exportGroup(group);\n            if (!options || !options.raw) {\n                svg = 'data:image/svg+xml;base64,' + encodeBase64(svg);\n            }\n            return createPromise().resolve(svg);\n        }\n        var browser = support.browser;\n        function slice$1(thing) {\n            return Array.prototype.slice.call(thing);\n        }\n        var KENDO_PSEUDO_ELEMENT = 'KENDO-PSEUDO-ELEMENT';\n        var IMAGE_CACHE = {};\n        var nodeInfo = {};\n        nodeInfo._root = nodeInfo;\n        var TextRect = Text.extend({\n            init: function (str, rect, options) {\n                Text.fn.init.call(this, str, rect.getOrigin(), options);\n                this._pdfRect = rect;\n            },\n            rect: function () {\n                return this._pdfRect;\n            },\n            rawBBox: function () {\n                return this._pdfRect;\n            }\n        });\n        function addClass(el, cls) {\n            if (el.classList) {\n                el.classList.add(cls);\n            } else {\n                el.className += ' ' + cls;\n            }\n        }\n        function removeClass(el, cls) {\n            if (el.classList) {\n                el.classList.remove(cls);\n            } else {\n                el.className = el.className.split(/\\s+/).reduce(function (a, word) {\n                    if (word != cls) {\n                        a.push(word);\n                    }\n                    return a;\n                }, []).join(' ');\n            }\n        }\n        function setCSS(el, styles) {\n            Object.keys(styles).forEach(function (key) {\n                el.style[key] = styles[key];\n            });\n        }\n        var matches = typeof Element !== 'undefined' && Element.prototype && function (p) {\n            if (p.matches) {\n                return function (el, selector) {\n                    return el.matches(selector);\n                };\n            }\n            if (p.webkitMatchesSelector) {\n                return function (el, selector) {\n                    return el.webkitMatchesSelector(selector);\n                };\n            }\n            if (p.mozMatchesSelector) {\n                return function (el, selector) {\n                    return el.mozMatchesSelector(selector);\n                };\n            }\n            if (p.msMatchesSelector) {\n                return function (el, selector) {\n                    return el.msMatchesSelector(selector);\n                };\n            }\n            return function (s) {\n                return [].indexOf.call(document.querySelectorAll(s), this) !== -1;\n            };\n        }(Element.prototype);\n        function closest(el, selector) {\n            if (el.closest) {\n                return el.closest(selector);\n            }\n            while (el && !/^\\[object (?:HTML)?Document\\]$/.test(String(el))) {\n                if (matches(el, selector)) {\n                    return el;\n                }\n                el = el.parentNode;\n            }\n        }\n        var cloneNodes = function ($) {\n            if ($) {\n                return function cloneNodes(el) {\n                    var clone = el.cloneNode(false);\n                    if (el.nodeType == 1) {\n                        var $el = $(el), $clone = $(clone), i;\n                        var data = $el.data();\n                        for (i in data) {\n                            $clone.data(i, data[i]);\n                        }\n                        if (/^canvas$/i.test(el.tagName)) {\n                            clone.getContext('2d').drawImage(el, 0, 0);\n                        } else if (/^(?:input|select|textarea|option)$/i.test(el.tagName)) {\n                            clone.removeAttribute('id');\n                            clone.removeAttribute('name');\n                            clone.value = el.value;\n                            clone.checked = el.checked;\n                            clone.selected = el.selected;\n                        }\n                        for (i = el.firstChild; i; i = i.nextSibling) {\n                            clone.appendChild(cloneNodes(i));\n                        }\n                    }\n                    return clone;\n                };\n            } else {\n                return function cloneNodes(el) {\n                    var clone = el.cloneNode(true);\n                    var canvases = el.querySelectorAll('canvas');\n                    if (canvases.length) {\n                        slice$1(clone.querySelectorAll('canvas')).forEach(function (canvas$$1, i) {\n                            canvas$$1.getContext('2d').drawImage(canvases[i], 0, 0);\n                        });\n                    }\n                    var orig = el.querySelectorAll('input, select, textarea, option');\n                    slice$1(clone.querySelectorAll('input, select, textarea, option')).forEach(function (el, i) {\n                        el.removeAttribute('id');\n                        el.removeAttribute('name');\n                        el.value = orig[i].value;\n                        el.checked = orig[i].checked;\n                        el.selected = orig[i].selected;\n                    });\n                    return clone;\n                };\n            }\n        }(typeof window !== 'undefined' && window.kendo && window.kendo.jQuery);\n        function getXY(thing) {\n            if (typeof thing == 'number') {\n                return {\n                    x: thing,\n                    y: thing\n                };\n            }\n            if (Array.isArray(thing)) {\n                return {\n                    x: thing[0],\n                    y: thing[1]\n                };\n            }\n            return {\n                x: thing.x,\n                y: thing.y\n            };\n        }\n        function drawDOM(element, options) {\n            if (!options) {\n                options = {};\n            }\n            var promise = createPromise();\n            if (!element) {\n                return promise.reject('No element to export');\n            }\n            if (typeof window.getComputedStyle != 'function') {\n                throw new Error('window.getComputedStyle is missing.  You are using an unsupported browser, or running in IE8 compatibility mode.  Drawing HTML is supported in Chrome, Firefox, Safari and IE9+.');\n            }\n            kendo.pdf.defineFont(getFontFaces(element.ownerDocument));\n            var scale = getXY(options.scale || 1);\n            function doOne(element) {\n                var group = new Group();\n                var pos = element.getBoundingClientRect();\n                setTransform(group, [\n                    scale.x,\n                    0,\n                    0,\n                    scale.y,\n                    -pos.left * scale.x,\n                    -pos.top * scale.y\n                ]);\n                nodeInfo._clipbox = false;\n                nodeInfo._matrix = Matrix.unit();\n                nodeInfo._stackingContext = {\n                    element: element,\n                    group: group\n                };\n                if (options.avoidLinks === true) {\n                    nodeInfo._avoidLinks = 'a';\n                } else {\n                    nodeInfo._avoidLinks = options.avoidLinks;\n                }\n                addClass(element, 'k-pdf-export');\n                renderElement(element, group);\n                removeClass(element, 'k-pdf-export');\n                return group;\n            }\n            cacheImages(element, function () {\n                var forceBreak = options && options.forcePageBreak;\n                var hasPaperSize = options && options.paperSize && options.paperSize != 'auto';\n                var paperOptions = kendo.pdf.getPaperOptions(function (key, def) {\n                    if (key == 'paperSize') {\n                        return hasPaperSize ? options[key] : 'A4';\n                    }\n                    return key in options ? options[key] : def;\n                });\n                var pageWidth = hasPaperSize && paperOptions.paperSize[0];\n                var pageHeight = hasPaperSize && paperOptions.paperSize[1];\n                var margin = options.margin && paperOptions.margin;\n                var hasMargin = Boolean(margin);\n                if (forceBreak || pageHeight) {\n                    if (!margin) {\n                        margin = {\n                            left: 0,\n                            top: 0,\n                            right: 0,\n                            bottom: 0\n                        };\n                    }\n                    if (pageWidth) {\n                        pageWidth /= scale.x;\n                    }\n                    if (pageHeight) {\n                        pageHeight /= scale.y;\n                    }\n                    margin.left /= scale.x;\n                    margin.right /= scale.x;\n                    margin.top /= scale.y;\n                    margin.bottom /= scale.y;\n                    var group = new Group({\n                        pdf: {\n                            multiPage: true,\n                            paperSize: hasPaperSize ? paperOptions.paperSize : 'auto',\n                            _ignoreMargin: hasMargin\n                        }\n                    });\n                    handlePageBreaks(function (x) {\n                        if (options.progress) {\n                            var canceled = false, pageNum = 0;\n                            (function next() {\n                                if (pageNum < x.pages.length) {\n                                    var page = doOne(x.pages[pageNum]);\n                                    group.append(page);\n                                    options.progress({\n                                        page: page,\n                                        pageNum: ++pageNum,\n                                        totalPages: x.pages.length,\n                                        cancel: function () {\n                                            canceled = true;\n                                        }\n                                    });\n                                    if (!canceled) {\n                                        setTimeout(next);\n                                    } else {\n                                        x.container.parentNode.removeChild(x.container);\n                                    }\n                                } else {\n                                    x.container.parentNode.removeChild(x.container);\n                                    promise.resolve(group);\n                                }\n                            }());\n                        } else {\n                            x.pages.forEach(function (page) {\n                                group.append(doOne(page));\n                            });\n                            x.container.parentNode.removeChild(x.container);\n                            promise.resolve(group);\n                        }\n                    }, element, forceBreak, pageWidth ? pageWidth - margin.left - margin.right : null, pageHeight ? pageHeight - margin.top - margin.bottom : null, margin, options);\n                } else {\n                    promise.resolve(doOne(element));\n                }\n            });\n            function makeTemplate(template$$1) {\n                if (template$$1 != null) {\n                    if (typeof template$$1 == 'string') {\n                        template$$1 = kendo.template(template$$1.replace(/^\\s+|\\s+$/g, ''));\n                    }\n                    if (typeof template$$1 == 'function') {\n                        return function (data) {\n                            var el = template$$1(data);\n                            if (el && typeof el == 'string') {\n                                var div = document.createElement('div');\n                                div.innerHTML = el;\n                                el = div.firstElementChild;\n                            }\n                            return el;\n                        };\n                    }\n                    return function () {\n                        return template$$1.cloneNode(true);\n                    };\n                }\n            }\n            function handlePageBreaks(callback, element, forceBreak, pageWidth, pageHeight, margin, options) {\n                var template$$1 = makeTemplate(options.template);\n                var doc = element.ownerDocument;\n                var pages = [];\n                var copy = options._destructive ? element : cloneNodes(element);\n                var container = doc.createElement('KENDO-PDF-DOCUMENT');\n                var adjust = 0;\n                slice$1(copy.querySelectorAll('tfoot')).forEach(function (tfoot) {\n                    tfoot.parentNode.appendChild(tfoot);\n                });\n                slice$1(copy.querySelectorAll('ol')).forEach(function (ol) {\n                    slice$1(ol.children).forEach(function (li, index) {\n                        li.setAttribute('kendo-split-index', index);\n                    });\n                });\n                setCSS(container, {\n                    display: 'block',\n                    position: 'absolute',\n                    boxSizing: 'content-box',\n                    left: '-10000px',\n                    top: '-10000px'\n                });\n                if (pageWidth) {\n                    setCSS(container, {\n                        width: pageWidth + 'px',\n                        paddingLeft: margin.left + 'px',\n                        paddingRight: margin.right + 'px'\n                    });\n                    setCSS(copy, { overflow: 'hidden' });\n                }\n                element.parentNode.insertBefore(container, element);\n                container.appendChild(copy);\n                if (options.beforePageBreak) {\n                    setTimeout(function () {\n                        options.beforePageBreak(container, doPageBreak);\n                    }, 15);\n                } else {\n                    setTimeout(doPageBreak, 15);\n                }\n                function doPageBreak() {\n                    if (forceBreak != '-' || pageHeight) {\n                        splitElement(copy);\n                    }\n                    var page = makePage();\n                    copy.parentNode.insertBefore(page, copy);\n                    page.appendChild(copy);\n                    if (template$$1) {\n                        var count = pages.length;\n                        pages.forEach(function (page, i) {\n                            var el = template$$1({\n                                element: page,\n                                pageNum: i + 1,\n                                totalPages: pages.length\n                            });\n                            if (el) {\n                                page.appendChild(el);\n                                cacheImages(el, function () {\n                                    if (--count === 0) {\n                                        next();\n                                    }\n                                });\n                            }\n                        });\n                    } else {\n                        next();\n                    }\n                    function next() {\n                        whenImagesAreActuallyLoaded(pages, function () {\n                            callback({\n                                pages: pages,\n                                container: container\n                            });\n                        });\n                    }\n                }\n                function keepTogether(el) {\n                    if (options.keepTogether && matches(el, options.keepTogether) && el.offsetHeight <= pageHeight - adjust) {\n                        return true;\n                    }\n                    var tag = el.tagName;\n                    if (/^h[1-6]$/i.test(tag) && el.offsetHeight >= pageHeight - adjust) {\n                        return false;\n                    }\n                    return el.getAttribute('data-kendo-chart') || /^(?:img|tr|thead|th|tfoot|iframe|svg|object|canvas|input|textarea|select|video|h[1-6])/i.test(el.tagName);\n                }\n                function splitElement(element) {\n                    if (element.tagName == 'TABLE') {\n                        setCSS(element, { tableLayout: 'fixed' });\n                    }\n                    var style = getComputedStyle(element);\n                    var bottomPadding = parseFloat(getPropertyValue(style, 'padding-bottom'));\n                    var bottomBorder = parseFloat(getPropertyValue(style, 'border-bottom-width'));\n                    var saveAdjust = adjust;\n                    adjust += bottomPadding + bottomBorder;\n                    var isFirst = true;\n                    for (var el = element.firstChild; el; el = el.nextSibling) {\n                        if (el.nodeType == 1) {\n                            isFirst = false;\n                            if (matches(el, forceBreak)) {\n                                breakAtElement(el);\n                                continue;\n                            }\n                            if (!pageHeight) {\n                                splitElement(el);\n                                continue;\n                            }\n                            if (!/^(?:static|relative)$/.test(getPropertyValue(getComputedStyle(el), 'position'))) {\n                                continue;\n                            }\n                            var fall = fallsOnMargin(el);\n                            if (fall == 1) {\n                                breakAtElement(el);\n                            } else if (fall) {\n                                if (keepTogether(el)) {\n                                    breakAtElement(el);\n                                } else {\n                                    splitElement(el);\n                                }\n                            } else {\n                                splitElement(el);\n                            }\n                        } else if (el.nodeType == 3 && pageHeight) {\n                            splitText(el, isFirst);\n                            isFirst = false;\n                        }\n                    }\n                    adjust = saveAdjust;\n                }\n                function firstInParent(el) {\n                    var p = el.parentNode, first = p.firstChild;\n                    if (el === first) {\n                        return true;\n                    }\n                    if (el === p.children[0]) {\n                        if (first.nodeType == 7 || first.nodeType == 8) {\n                            return true;\n                        }\n                        if (first.nodeType == 3) {\n                            return !/\\S/.test(first.data);\n                        }\n                    }\n                    return false;\n                }\n                function breakAtElement(el) {\n                    if (el.nodeType == 1 && el !== copy && firstInParent(el)) {\n                        return breakAtElement(el.parentNode);\n                    }\n                    var table, colgroup, thead, grid, gridHead;\n                    table = closest(el, 'table');\n                    colgroup = table && table.querySelector('colgroup');\n                    if (options.repeatHeaders) {\n                        thead = table && table.querySelector('thead');\n                        grid = closest(el, '.k-grid.k-widget');\n                        if (grid && grid.querySelector('.k-auto-scrollable')) {\n                            gridHead = grid.querySelector('.k-grid-header');\n                        }\n                    }\n                    var page = makePage();\n                    var range = doc.createRange();\n                    range.setStartBefore(copy);\n                    range.setEndBefore(el);\n                    page.appendChild(range.extractContents());\n                    copy.parentNode.insertBefore(page, copy);\n                    preventBulletOnListItem(el.parentNode);\n                    if (table) {\n                        table = closest(el, 'table');\n                        if (options.repeatHeaders && thead) {\n                            table.insertBefore(thead.cloneNode(true), table.firstChild);\n                        }\n                        if (colgroup) {\n                            table.insertBefore(colgroup.cloneNode(true), table.firstChild);\n                        }\n                    }\n                    if (options.repeatHeaders && gridHead) {\n                        grid = closest(el, '.k-grid.k-widget');\n                        grid.insertBefore(gridHead.cloneNode(true), grid.firstChild);\n                    }\n                }\n                function makePage() {\n                    var page = doc.createElement('KENDO-PDF-PAGE');\n                    setCSS(page, {\n                        display: 'block',\n                        boxSizing: 'content-box',\n                        width: pageWidth ? pageWidth + 'px' : 'auto',\n                        padding: margin.top + 'px ' + margin.right + 'px ' + margin.bottom + 'px ' + margin.left + 'px',\n                        position: 'relative',\n                        height: pageHeight ? pageHeight + 'px' : 'auto',\n                        overflow: pageHeight || pageWidth ? 'hidden' : 'visible',\n                        clear: 'both'\n                    });\n                    if (options && options.pageClassName) {\n                        page.className = options.pageClassName;\n                    }\n                    pages.push(page);\n                    return page;\n                }\n                function fallsOnMargin(thing) {\n                    var box = thing.getBoundingClientRect();\n                    if (box.width === 0 || box.height === 0) {\n                        return 0;\n                    }\n                    var top = copy.getBoundingClientRect().top;\n                    var available = pageHeight - adjust;\n                    return box.height > available ? 3 : box.top - top > available ? 1 : box.bottom - top > available ? 2 : 0;\n                }\n                function splitText(node, isFirst) {\n                    if (!/\\S/.test(node.data)) {\n                        return;\n                    }\n                    var len = node.data.length;\n                    var range = doc.createRange();\n                    range.selectNodeContents(node);\n                    var fall = fallsOnMargin(range);\n                    if (!fall) {\n                        return;\n                    }\n                    var nextnode = node;\n                    if (fall == 1) {\n                        if (isFirst) {\n                            breakAtElement(node.parentNode);\n                        } else {\n                            breakAtElement(node);\n                        }\n                    } else {\n                        (function findEOP(min, pos, max) {\n                            range.setEnd(node, pos);\n                            if (min == pos || pos == max) {\n                                return pos;\n                            }\n                            if (fallsOnMargin(range)) {\n                                return findEOP(min, min + pos >> 1, pos);\n                            } else {\n                                return findEOP(pos, pos + max >> 1, max);\n                            }\n                        }(0, len >> 1, len));\n                        if (!/\\S/.test(range.toString()) && isFirst) {\n                            breakAtElement(node.parentNode);\n                        } else {\n                            nextnode = node.splitText(range.endOffset);\n                            var page = makePage();\n                            range.setStartBefore(copy);\n                            page.appendChild(range.extractContents());\n                            copy.parentNode.insertBefore(page, copy);\n                            preventBulletOnListItem(nextnode.parentNode);\n                        }\n                    }\n                    splitText(nextnode);\n                }\n                function preventBulletOnListItem(el) {\n                    var li = closest(el, 'li');\n                    if (li) {\n                        li.setAttribute('kendo-no-bullet', '1');\n                        preventBulletOnListItem(li.parentNode);\n                    }\n                }\n            }\n            return promise;\n        }\n        drawDOM.getFontFaces = getFontFaces;\n        drawDOM.drawText = function (element) {\n            var group = new Group();\n            nodeInfo._clipbox = false;\n            nodeInfo._matrix = Matrix.unit();\n            nodeInfo._stackingContext = {\n                element: element,\n                group: group\n            };\n            pushNodeInfo(element, getComputedStyle(element), group);\n            if (element.firstChild.nodeType == 3) {\n                renderText(element, element.firstChild, group);\n            } else {\n                _renderElement(element, group);\n            }\n            popNodeInfo();\n            return group;\n        };\n        var parseBackgroundImage = function () {\n            var tok_linear_gradient = /^((-webkit-|-moz-|-o-|-ms-)?linear-gradient\\s*)\\(/;\n            var tok_percent = /^([-0-9.]+%)/;\n            var tok_length = /^([-0-9.]+px)/;\n            var tok_keyword = /^(left|right|top|bottom|to|center)\\W/;\n            var tok_angle = /^([-0-9.]+(deg|grad|rad|turn))/;\n            var tok_whitespace = /^(\\s+)/;\n            var tok_popen = /^(\\()/;\n            var tok_pclose = /^(\\))/;\n            var tok_comma = /^(,)/;\n            var tok_url = /^(url)\\(/;\n            var tok_content = /^(.*?)\\)/;\n            var cache1 = {}, cache2 = {};\n            function parse(input) {\n                var orig = input;\n                if (hasOwnProperty(cache1, orig)) {\n                    return cache1[orig];\n                }\n                function skip_ws() {\n                    var m = tok_whitespace.exec(input);\n                    if (m) {\n                        input = input.substr(m[1].length);\n                    }\n                }\n                function read(token) {\n                    skip_ws();\n                    var m = token.exec(input);\n                    if (m) {\n                        input = input.substr(m[1].length);\n                        return m[1];\n                    }\n                }\n                function read_stop() {\n                    var color = kendo.parseColor(input, true);\n                    var length, percent;\n                    if (color) {\n                        var match = /^#[0-9a-f]+/i.exec(input) || /^rgba?\\(.*?\\)/i.exec(input) || /^..*?\\b/.exec(input);\n                        input = input.substr(match[0].length);\n                        color = color.toRGB();\n                        if (!(length = read(tok_length))) {\n                            percent = read(tok_percent);\n                        }\n                        return {\n                            color: color,\n                            length: length,\n                            percent: percent\n                        };\n                    }\n                }\n                function read_linear_gradient(propName) {\n                    var angle;\n                    var to1, to2;\n                    var stops = [];\n                    var reverse = false;\n                    if (read(tok_popen)) {\n                        angle = read(tok_angle);\n                        if (angle) {\n                            angle = parseAngle(angle);\n                            read(tok_comma);\n                        } else {\n                            to1 = read(tok_keyword);\n                            if (to1 == 'to') {\n                                to1 = read(tok_keyword);\n                            } else if (to1 && /^-/.test(propName)) {\n                                reverse = true;\n                            }\n                            to2 = read(tok_keyword);\n                            read(tok_comma);\n                        }\n                        if (/-moz-/.test(propName) && angle == null && to1 == null) {\n                            var x = read(tok_percent), y = read(tok_percent);\n                            reverse = true;\n                            if (x == '0%') {\n                                to1 = 'left';\n                            } else if (x == '100%') {\n                                to1 = 'right';\n                            }\n                            if (y == '0%') {\n                                to2 = 'top';\n                            } else if (y == '100%') {\n                                to2 = 'bottom';\n                            }\n                            read(tok_comma);\n                        }\n                        while (input && !read(tok_pclose)) {\n                            var stop = read_stop();\n                            if (!stop) {\n                                break;\n                            }\n                            stops.push(stop);\n                            read(tok_comma);\n                        }\n                        return {\n                            type: 'linear',\n                            angle: angle,\n                            to: to1 && to2 ? to1 + ' ' + to2 : to1 ? to1 : to2 ? to2 : null,\n                            stops: stops,\n                            reverse: reverse\n                        };\n                    }\n                }\n                function read_url() {\n                    if (read(tok_popen)) {\n                        var url = read(tok_content);\n                        url = url.replace(/^['\"]+|[\"']+$/g, '');\n                        read(tok_pclose);\n                        return {\n                            type: 'url',\n                            url: url\n                        };\n                    }\n                }\n                var tok;\n                if (tok = read(tok_linear_gradient)) {\n                    tok = read_linear_gradient(tok);\n                } else if (tok = read(tok_url)) {\n                    tok = read_url();\n                }\n                return cache1[orig] = tok || { type: 'none' };\n            }\n            return function (input) {\n                if (hasOwnProperty(cache2, input)) {\n                    return cache2[input];\n                }\n                return cache2[input] = splitProperty(input).map(parse);\n            };\n        }();\n        var splitProperty = function () {\n            var cache = {};\n            return function (input, separator) {\n                if (!separator) {\n                    separator = /^\\s*,\\s*/;\n                }\n                var cacheKey = input + separator;\n                if (hasOwnProperty(cache, cacheKey)) {\n                    return cache[cacheKey];\n                }\n                var ret = [];\n                var last$$1 = 0, pos = 0;\n                var in_paren = 0;\n                var in_string = false;\n                var m;\n                function looking_at(rx) {\n                    return m = rx.exec(input.substr(pos));\n                }\n                function trim(str) {\n                    return str.replace(/^\\s+|\\s+$/g, '');\n                }\n                while (pos < input.length) {\n                    if (!in_string && looking_at(/^[\\(\\[\\{]/)) {\n                        in_paren++;\n                        pos++;\n                    } else if (!in_string && looking_at(/^[\\)\\]\\}]/)) {\n                        in_paren--;\n                        pos++;\n                    } else if (!in_string && looking_at(/^[\\\"\\']/)) {\n                        in_string = m[0];\n                        pos++;\n                    } else if (in_string == '\\'' && looking_at(/^\\\\\\'/)) {\n                        pos += 2;\n                    } else if (in_string == '\"' && looking_at(/^\\\\\\\"/)) {\n                        pos += 2;\n                    } else if (in_string == '\\'' && looking_at(/^\\'/)) {\n                        in_string = false;\n                        pos++;\n                    } else if (in_string == '\"' && looking_at(/^\\\"/)) {\n                        in_string = false;\n                        pos++;\n                    } else if (looking_at(separator)) {\n                        if (!in_string && !in_paren && pos > last$$1) {\n                            ret.push(trim(input.substring(last$$1, pos)));\n                            last$$1 = pos + m[0].length;\n                        }\n                        pos += m[0].length;\n                    } else {\n                        pos++;\n                    }\n                }\n                if (last$$1 < pos) {\n                    ret.push(trim(input.substring(last$$1, pos)));\n                }\n                return cache[cacheKey] = ret;\n            };\n        }();\n        var getFontURL = function (cache) {\n            return function (el) {\n                var url = cache[el];\n                if (!url) {\n                    var m;\n                    if (m = /url\\((['\"]?)([^'\")]*?)\\1\\)\\s+format\\((['\"]?)truetype\\3\\)/.exec(el)) {\n                        url = cache[el] = m[2];\n                    } else if (m = /url\\((['\"]?)([^'\")]*?\\.ttf)\\1\\)/.exec(el)) {\n                        url = cache[el] = m[2];\n                    }\n                }\n                return url;\n            };\n        }(Object.create ? Object.create(null) : {});\n        var getFontHeight = function (cache) {\n            return function (font) {\n                var height = cache[font];\n                if (height == null) {\n                    height = cache[font] = kendoUtil.measureText('Mapq', { font: font }).height;\n                }\n                return height;\n            };\n        }(Object.create ? Object.create(null) : {});\n        function getFontFaces(doc) {\n            if (doc == null) {\n                doc = document;\n            }\n            var result = {};\n            for (var i = 0; i < doc.styleSheets.length; ++i) {\n                doStylesheet(doc.styleSheets[i]);\n            }\n            return result;\n            function doStylesheet(ss) {\n                if (ss) {\n                    var rules = null;\n                    try {\n                        rules = ss.cssRules;\n                    } catch (ex) {\n                    }\n                    if (rules) {\n                        addRules(ss, rules);\n                    }\n                }\n            }\n            function findFonts(rule) {\n                var src = getPropertyValue(rule.style, 'src');\n                if (src) {\n                    return splitProperty(src).reduce(function (a, el) {\n                        var font = getFontURL(el);\n                        if (font) {\n                            a.push(font);\n                        }\n                        return a;\n                    }, []);\n                } else {\n                    var font = getFontURL(rule.cssText);\n                    return font ? [font] : [];\n                }\n            }\n            function addRules(styleSheet, rules) {\n                for (var i = 0; i < rules.length; ++i) {\n                    var r = rules[i];\n                    switch (r.type) {\n                    case 3:\n                        doStylesheet(r.styleSheet);\n                        break;\n                    case 5:\n                        var style = r.style;\n                        var family = splitProperty(getPropertyValue(style, 'font-family'));\n                        var bold = /^([56789]00|bold)$/i.test(getPropertyValue(style, 'font-weight'));\n                        var italic = 'italic' == getPropertyValue(style, 'font-style');\n                        var src = findFonts(r);\n                        if (src.length > 0) {\n                            addRule(styleSheet, family, bold, italic, src[0]);\n                        }\n                    }\n                }\n            }\n            function addRule(styleSheet, names, bold, italic, url) {\n                if (!/^data:/i.test(url)) {\n                    if (!(/^[^\\/:]+:\\/\\//.test(url) || /^\\//.test(url))) {\n                        url = String(styleSheet.href).replace(/[^\\/]*$/, '') + url;\n                    }\n                }\n                names.forEach(function (name) {\n                    name = name.replace(/^(['\"]?)(.*?)\\1$/, '$2');\n                    if (bold) {\n                        name += '|bold';\n                    }\n                    if (italic) {\n                        name += '|italic';\n                    }\n                    result[name] = url;\n                });\n            }\n        }\n        function hasOwnProperty(obj, key) {\n            return Object.prototype.hasOwnProperty.call(obj, key);\n        }\n        function getCounter(name) {\n            name = '_counter_' + name;\n            return nodeInfo[name];\n        }\n        function getAllCounters(name) {\n            var values = [], p = nodeInfo;\n            name = '_counter_' + name;\n            while (p) {\n                if (hasOwnProperty(p, name)) {\n                    values.push(p[name]);\n                }\n                p = Object.getPrototypeOf(p);\n            }\n            return values.reverse();\n        }\n        function incCounter(name, inc) {\n            var p = nodeInfo;\n            name = '_counter_' + name;\n            while (p && !hasOwnProperty(p, name)) {\n                p = Object.getPrototypeOf(p);\n            }\n            if (!p) {\n                p = nodeInfo._root;\n            }\n            p[name] = (p[name] || 0) + (inc == null ? 1 : inc);\n        }\n        function resetCounter(name, val) {\n            name = '_counter_' + name;\n            nodeInfo[name] = val == null ? 0 : val;\n        }\n        function doCounters(a, f, def) {\n            for (var i = 0; i < a.length;) {\n                var name = a[i++];\n                var val = parseFloat(a[i]);\n                if (isNaN(val)) {\n                    f(name, def);\n                } else {\n                    f(name, val);\n                    ++i;\n                }\n            }\n        }\n        function updateCounters(style) {\n            var counterReset = getPropertyValue(style, 'counter-reset');\n            if (counterReset) {\n                doCounters(splitProperty(counterReset, /^\\s+/), resetCounter, 0);\n            }\n            var counterIncrement = getPropertyValue(style, 'counter-increment');\n            if (counterIncrement) {\n                doCounters(splitProperty(counterIncrement, /^\\s+/), incCounter, 1);\n            }\n        }\n        function parseColor$1(str, css) {\n            var color = kendo.parseColor(str, true);\n            if (color) {\n                color = color.toRGB();\n                if (css) {\n                    color = color.toCssRgba();\n                } else if (color.a === 0) {\n                    color = null;\n                }\n            }\n            return color;\n        }\n        function whenImagesAreActuallyLoaded(elements, callback) {\n            var pending = 0;\n            elements.forEach(function (el) {\n                var images = el.querySelectorAll('img');\n                for (var i = 0; i < images.length; ++i) {\n                    var img = images[i];\n                    if (!img.complete) {\n                        pending++;\n                        img.onload = img.onerror = next;\n                    }\n                }\n            });\n            if (!pending) {\n                next();\n            }\n            function next() {\n                if (--pending <= 0) {\n                    callback();\n                }\n            }\n        }\n        function cacheImages(element, callback) {\n            var urls = [];\n            function add(url) {\n                if (!IMAGE_CACHE[url]) {\n                    IMAGE_CACHE[url] = true;\n                    urls.push(url);\n                }\n            }\n            (function dive(element) {\n                if (/^img$/i.test(element.tagName)) {\n                    add(element.src);\n                }\n                parseBackgroundImage(getPropertyValue(getComputedStyle(element), 'background-image')).forEach(function (bg) {\n                    if (bg.type == 'url') {\n                        add(bg.url);\n                    }\n                });\n                if (element.children) {\n                    slice$1(element.children).forEach(dive);\n                }\n            }(element));\n            var count = urls.length;\n            function next() {\n                if (--count <= 0) {\n                    callback();\n                }\n            }\n            if (count === 0) {\n                next();\n            }\n            urls.forEach(function (url) {\n                var img = IMAGE_CACHE[url] = new window.Image();\n                if (!/^data:/i.test(url)) {\n                    img.crossOrigin = 'Anonymous';\n                }\n                img.src = url;\n                if (img.complete) {\n                    next();\n                } else {\n                    img.onload = next;\n                    img.onerror = function () {\n                        IMAGE_CACHE[url] = null;\n                        next();\n                    };\n                }\n            });\n        }\n        function alphaNumeral(n) {\n            var result = '';\n            do {\n                var r = n % 26;\n                result = String.fromCharCode(97 + r) + result;\n                n = Math.floor(n / 26);\n            } while (n > 0);\n            return result;\n        }\n        function pushNodeInfo(element, style, group) {\n            nodeInfo = Object.create(nodeInfo);\n            nodeInfo[element.tagName.toLowerCase()] = {\n                element: element,\n                style: style\n            };\n            var decoration = getPropertyValue(style, 'text-decoration');\n            if (decoration && decoration != 'none') {\n                var color = getPropertyValue(style, 'color');\n                decoration.split(/\\s+/g).forEach(function (name) {\n                    if (!nodeInfo[name]) {\n                        nodeInfo[name] = color;\n                    }\n                });\n            }\n            if (createsStackingContext(style)) {\n                nodeInfo._stackingContext = {\n                    element: element,\n                    group: group\n                };\n            }\n        }\n        function popNodeInfo() {\n            nodeInfo = Object.getPrototypeOf(nodeInfo);\n        }\n        function updateClipbox(path) {\n            if (nodeInfo._clipbox != null) {\n                var box = path.bbox(nodeInfo._matrix);\n                if (nodeInfo._clipbox) {\n                    nodeInfo._clipbox = Rect.intersect(nodeInfo._clipbox, box);\n                } else {\n                    nodeInfo._clipbox = box;\n                }\n            }\n        }\n        function emptyClipbox() {\n            var cb = nodeInfo._clipbox;\n            if (cb == null) {\n                return true;\n            }\n            if (cb) {\n                return cb.width() === 0 || cb.height() === 0;\n            }\n        }\n        function createsStackingContext(style) {\n            function prop(name) {\n                return getPropertyValue(style, name);\n            }\n            if (prop('transform') != 'none' || prop('position') != 'static' || prop('z-index') != 'auto' || prop('opacity') < 1) {\n                return true;\n            }\n        }\n        function getComputedStyle(element, pseudoElt) {\n            return window.getComputedStyle(element, pseudoElt || null);\n        }\n        function getPropertyValue(style, prop, defa) {\n            var val = style.getPropertyValue(prop);\n            if (val == null || val === '') {\n                if (browser.webkit) {\n                    val = style.getPropertyValue('-webkit-' + prop);\n                } else if (browser.mozilla) {\n                    val = style.getPropertyValue('-moz-' + prop);\n                } else if (browser.opera) {\n                    val = style.getPropertyValue('-o-' + prop);\n                } else if (browser.msie) {\n                    val = style.getPropertyValue('-ms-' + prop);\n                }\n            }\n            if (arguments.length > 2 && (val == null || val === '')) {\n                return defa;\n            } else {\n                return val;\n            }\n        }\n        function pleaseSetPropertyValue(style, prop, value, important) {\n            style.setProperty(prop, value, important);\n            if (browser.webkit) {\n                style.setProperty('-webkit-' + prop, value, important);\n            } else if (browser.mozilla) {\n                style.setProperty('-moz-' + prop, value, important);\n            } else if (browser.opera) {\n                style.setProperty('-o-' + prop, value, important);\n            } else if (browser.msie) {\n                style.setProperty('-ms-' + prop, value, important);\n                prop = 'ms' + prop.replace(/(^|-)([a-z])/g, function (s, p1, p2) {\n                    return p1 + p2.toUpperCase();\n                });\n                style[prop] = value;\n            }\n        }\n        function getBorder(style, side) {\n            side = 'border-' + side;\n            return {\n                width: parseFloat(getPropertyValue(style, side + '-width')),\n                style: getPropertyValue(style, side + '-style'),\n                color: parseColor$1(getPropertyValue(style, side + '-color'), true)\n            };\n        }\n        function saveStyle(element, func) {\n            var prev = element.style.cssText;\n            var result = func();\n            element.style.cssText = prev;\n            return result;\n        }\n        function getBorderRadius(style, side) {\n            var r = getPropertyValue(style, 'border-' + side + '-radius').split(/\\s+/g).map(parseFloat);\n            if (r.length == 1) {\n                r.push(r[0]);\n            }\n            return sanitizeRadius({\n                x: r[0],\n                y: r[1]\n            });\n        }\n        function getContentBox(element) {\n            var box = element.getBoundingClientRect();\n            box = innerBox(box, 'border-*-width', element);\n            box = innerBox(box, 'padding-*', element);\n            return box;\n        }\n        function innerBox(box, prop, element) {\n            var style, wt, wr, wb, wl;\n            if (typeof prop == 'string') {\n                style = getComputedStyle(element);\n                wt = parseFloat(getPropertyValue(style, prop.replace('*', 'top')));\n                wr = parseFloat(getPropertyValue(style, prop.replace('*', 'right')));\n                wb = parseFloat(getPropertyValue(style, prop.replace('*', 'bottom')));\n                wl = parseFloat(getPropertyValue(style, prop.replace('*', 'left')));\n            } else if (typeof prop == 'number') {\n                wt = wr = wb = wl = prop;\n            }\n            return {\n                top: box.top + wt,\n                right: box.right - wr,\n                bottom: box.bottom - wb,\n                left: box.left + wl,\n                width: box.right - box.left - wr - wl,\n                height: box.bottom - box.top - wb - wt\n            };\n        }\n        function getTransform(style) {\n            var transform$$1 = getPropertyValue(style, 'transform');\n            if (transform$$1 == 'none') {\n                return null;\n            }\n            var matrix = /^\\s*matrix\\(\\s*(.*?)\\s*\\)\\s*$/.exec(transform$$1);\n            if (matrix) {\n                var origin = getPropertyValue(style, 'transform-origin');\n                matrix = matrix[1].split(/\\s*,\\s*/g).map(parseFloat);\n                origin = origin.split(/\\s+/g).map(parseFloat);\n                return {\n                    matrix: matrix,\n                    origin: origin\n                };\n            }\n        }\n        function radiansToDegrees(radians) {\n            return 180 * radians / Math.PI % 360;\n        }\n        function parseAngle(angle) {\n            var num = parseFloat(angle);\n            if (/grad$/.test(angle)) {\n                return Math.PI * num / 200;\n            } else if (/rad$/.test(angle)) {\n                return num;\n            } else if (/turn$/.test(angle)) {\n                return Math.PI * num * 2;\n            } else if (/deg$/.test(angle)) {\n                return Math.PI * num / 180;\n            }\n        }\n        function setTransform(shape, m) {\n            m = new Matrix(m[0], m[1], m[2], m[3], m[4], m[5]);\n            shape.transform(m);\n            return m;\n        }\n        function setClipping(shape, clipPath) {\n            shape.clip(clipPath);\n        }\n        function addArcToPath(path, x, y, options) {\n            var points = new Arc$2([\n                    x,\n                    y\n                ], options).curvePoints(), i = 1;\n            while (i < points.length) {\n                path.curveTo(points[i++], points[i++], points[i++]);\n            }\n        }\n        function sanitizeRadius(r) {\n            if (r.x <= 0 || r.y <= 0) {\n                r.x = r.y = 0;\n            }\n            return r;\n        }\n        function adjustBorderRadiusForBox(box, rTL, rTR, rBR, rBL) {\n            var tl_x = Math.max(0, rTL.x), tl_y = Math.max(0, rTL.y);\n            var tr_x = Math.max(0, rTR.x), tr_y = Math.max(0, rTR.y);\n            var br_x = Math.max(0, rBR.x), br_y = Math.max(0, rBR.y);\n            var bl_x = Math.max(0, rBL.x), bl_y = Math.max(0, rBL.y);\n            var f = Math.min(box.width / (tl_x + tr_x), box.height / (tr_y + br_y), box.width / (br_x + bl_x), box.height / (bl_y + tl_y));\n            if (f < 1) {\n                tl_x *= f;\n                tl_y *= f;\n                tr_x *= f;\n                tr_y *= f;\n                br_x *= f;\n                br_y *= f;\n                bl_x *= f;\n                bl_y *= f;\n            }\n            return {\n                tl: {\n                    x: tl_x,\n                    y: tl_y\n                },\n                tr: {\n                    x: tr_x,\n                    y: tr_y\n                },\n                br: {\n                    x: br_x,\n                    y: br_y\n                },\n                bl: {\n                    x: bl_x,\n                    y: bl_y\n                }\n            };\n        }\n        function elementRoundBox(element, box, type) {\n            var style = getComputedStyle(element);\n            var rTL = getBorderRadius(style, 'top-left');\n            var rTR = getBorderRadius(style, 'top-right');\n            var rBL = getBorderRadius(style, 'bottom-left');\n            var rBR = getBorderRadius(style, 'bottom-right');\n            if (type == 'padding' || type == 'content') {\n                var bt = getBorder(style, 'top');\n                var br = getBorder(style, 'right');\n                var bb = getBorder(style, 'bottom');\n                var bl = getBorder(style, 'left');\n                rTL.x -= bl.width;\n                rTL.y -= bt.width;\n                rTR.x -= br.width;\n                rTR.y -= bt.width;\n                rBR.x -= br.width;\n                rBR.y -= bb.width;\n                rBL.x -= bl.width;\n                rBL.y -= bb.width;\n                if (type == 'content') {\n                    var pt = parseFloat(getPropertyValue(style, 'padding-top'));\n                    var pr = parseFloat(getPropertyValue(style, 'padding-right'));\n                    var pb = parseFloat(getPropertyValue(style, 'padding-bottom'));\n                    var pl = parseFloat(getPropertyValue(style, 'padding-left'));\n                    rTL.x -= pl;\n                    rTL.y -= pt;\n                    rTR.x -= pr;\n                    rTR.y -= pt;\n                    rBR.x -= pr;\n                    rBR.y -= pb;\n                    rBL.x -= pl;\n                    rBL.y -= pb;\n                }\n            }\n            if (typeof type == 'number') {\n                rTL.x -= type;\n                rTL.y -= type;\n                rTR.x -= type;\n                rTR.y -= type;\n                rBR.x -= type;\n                rBR.y -= type;\n                rBL.x -= type;\n                rBL.y -= type;\n            }\n            return roundBox(box, rTL, rTR, rBR, rBL);\n        }\n        function roundBox(box, rTL0, rTR0, rBR0, rBL0) {\n            var tmp = adjustBorderRadiusForBox(box, rTL0, rTR0, rBR0, rBL0);\n            var rTL = tmp.tl;\n            var rTR = tmp.tr;\n            var rBR = tmp.br;\n            var rBL = tmp.bl;\n            var path = new Path({\n                fill: null,\n                stroke: null\n            });\n            path.moveTo(box.left, box.top + rTL.y);\n            if (rTL.x) {\n                addArcToPath(path, box.left + rTL.x, box.top + rTL.y, {\n                    startAngle: -180,\n                    endAngle: -90,\n                    radiusX: rTL.x,\n                    radiusY: rTL.y\n                });\n            }\n            path.lineTo(box.right - rTR.x, box.top);\n            if (rTR.x) {\n                addArcToPath(path, box.right - rTR.x, box.top + rTR.y, {\n                    startAngle: -90,\n                    endAngle: 0,\n                    radiusX: rTR.x,\n                    radiusY: rTR.y\n                });\n            }\n            path.lineTo(box.right, box.bottom - rBR.y);\n            if (rBR.x) {\n                addArcToPath(path, box.right - rBR.x, box.bottom - rBR.y, {\n                    startAngle: 0,\n                    endAngle: 90,\n                    radiusX: rBR.x,\n                    radiusY: rBR.y\n                });\n            }\n            path.lineTo(box.left + rBL.x, box.bottom);\n            if (rBL.x) {\n                addArcToPath(path, box.left + rBL.x, box.bottom - rBL.y, {\n                    startAngle: 90,\n                    endAngle: 180,\n                    radiusX: rBL.x,\n                    radiusY: rBL.y\n                });\n            }\n            return path.close();\n        }\n        function formatCounter(val, style) {\n            var str = String(parseFloat(val));\n            switch (style) {\n            case 'decimal-leading-zero':\n                if (str.length < 2) {\n                    str = '0' + str;\n                }\n                return str;\n            case 'lower-roman':\n                return arabicToRoman(val).toLowerCase();\n            case 'upper-roman':\n                return arabicToRoman(val).toUpperCase();\n            case 'lower-latin':\n            case 'lower-alpha':\n                return alphaNumeral(val - 1);\n            case 'upper-latin':\n            case 'upper-alpha':\n                return alphaNumeral(val - 1).toUpperCase();\n            default:\n                return str;\n            }\n        }\n        function evalPseudoElementContent(element, content) {\n            function displayCounter(name, style, separator) {\n                if (!separator) {\n                    return formatCounter(getCounter(name) || 0, style);\n                }\n                separator = separator.replace(/^\\s*([\"'])(.*)\\1\\s*$/, '$2');\n                return getAllCounters(name).map(function (val) {\n                    return formatCounter(val, style);\n                }).join(separator);\n            }\n            var a = splitProperty(content, /^\\s+/);\n            var result = [], m;\n            a.forEach(function (el) {\n                var tmp;\n                if (m = /^\\s*([\"'])(.*)\\1\\s*$/.exec(el)) {\n                    result.push(m[2].replace(/\\\\([0-9a-f]{4})/gi, function (s, p) {\n                        return String.fromCharCode(parseInt(p, 16));\n                    }));\n                } else if (m = /^\\s*counter\\((.*?)\\)\\s*$/.exec(el)) {\n                    tmp = splitProperty(m[1]);\n                    result.push(displayCounter(tmp[0], tmp[1]));\n                } else if (m = /^\\s*counters\\((.*?)\\)\\s*$/.exec(el)) {\n                    tmp = splitProperty(m[1]);\n                    result.push(displayCounter(tmp[0], tmp[2], tmp[1]));\n                } else if (m = /^\\s*attr\\((.*?)\\)\\s*$/.exec(el)) {\n                    result.push(element.getAttribute(m[1]) || '');\n                } else {\n                    result.push(el);\n                }\n            });\n            return result.join('');\n        }\n        function getCssText(style) {\n            if (style.cssText) {\n                return style.cssText;\n            }\n            var result = [];\n            for (var i = 0; i < style.length; ++i) {\n                result.push(style[i] + ': ' + getPropertyValue(style, style[i]));\n            }\n            return result.join(';\\n');\n        }\n        function _renderWithPseudoElements(element, group) {\n            if (element.tagName == KENDO_PSEUDO_ELEMENT) {\n                _renderElement(element, group);\n                return;\n            }\n            var fake = [];\n            function pseudo(kind, place) {\n                var style = getComputedStyle(element, kind);\n                updateCounters(style);\n                if (style.content && style.content != 'normal' && style.content != 'none' && style.width != '0px') {\n                    var psel = element.ownerDocument.createElement(KENDO_PSEUDO_ELEMENT);\n                    psel.style.cssText = getCssText(style);\n                    psel.textContent = evalPseudoElementContent(element, style.content);\n                    element.insertBefore(psel, place);\n                    fake.push(psel);\n                }\n            }\n            pseudo(':before', element.firstChild);\n            pseudo(':after', null);\n            var saveClass = element.className;\n            element.className += ' kendo-pdf-hide-pseudo-elements';\n            _renderElement(element, group);\n            element.className = saveClass;\n            fake.forEach(function (el) {\n                element.removeChild(el);\n            });\n        }\n        function _renderElement(element, group) {\n            var style = getComputedStyle(element);\n            var top = getBorder(style, 'top');\n            var right = getBorder(style, 'right');\n            var bottom = getBorder(style, 'bottom');\n            var left = getBorder(style, 'left');\n            var rTL0 = getBorderRadius(style, 'top-left');\n            var rTR0 = getBorderRadius(style, 'top-right');\n            var rBL0 = getBorderRadius(style, 'bottom-left');\n            var rBR0 = getBorderRadius(style, 'bottom-right');\n            var dir = getPropertyValue(style, 'direction');\n            var backgroundColor = getPropertyValue(style, 'background-color');\n            backgroundColor = parseColor$1(backgroundColor);\n            var backgroundImage = parseBackgroundImage(getPropertyValue(style, 'background-image'));\n            var backgroundRepeat = splitProperty(getPropertyValue(style, 'background-repeat'));\n            var backgroundPosition = splitProperty(getPropertyValue(style, 'background-position'));\n            var backgroundOrigin = splitProperty(getPropertyValue(style, 'background-origin'));\n            var backgroundSize = splitProperty(getPropertyValue(style, 'background-size'));\n            if (browser.msie && browser.version < 10) {\n                backgroundPosition = splitProperty(element.currentStyle.backgroundPosition);\n            }\n            var innerbox = innerBox(element.getBoundingClientRect(), 'border-*-width', element);\n            (function () {\n                var clip = getPropertyValue(style, 'clip');\n                var m = /^\\s*rect\\((.*)\\)\\s*$/.exec(clip);\n                if (m) {\n                    var a = m[1].split(/[ ,]+/g);\n                    var top = a[0] == 'auto' ? innerbox.top : parseFloat(a[0]) + innerbox.top;\n                    var right = a[1] == 'auto' ? innerbox.right : parseFloat(a[1]) + innerbox.left;\n                    var bottom = a[2] == 'auto' ? innerbox.bottom : parseFloat(a[2]) + innerbox.top;\n                    var left = a[3] == 'auto' ? innerbox.left : parseFloat(a[3]) + innerbox.left;\n                    var tmp = new Group();\n                    var clipPath = new Path().moveTo(left, top).lineTo(right, top).lineTo(right, bottom).lineTo(left, bottom).close();\n                    setClipping(tmp, clipPath);\n                    group.append(tmp);\n                    group = tmp;\n                    updateClipbox(clipPath);\n                }\n            }());\n            var boxes, i, cells;\n            var display = getPropertyValue(style, 'display');\n            if (display == 'table-row') {\n                boxes = [];\n                for (i = 0, cells = element.children; i < cells.length; ++i) {\n                    boxes.push(cells[i].getBoundingClientRect());\n                }\n            } else {\n                boxes = element.getClientRects();\n                if (boxes.length == 1) {\n                    boxes = [element.getBoundingClientRect()];\n                }\n            }\n            boxes = adjustBoxes(boxes);\n            for (i = 0; i < boxes.length; ++i) {\n                drawOneBox(boxes[i], i === 0, i == boxes.length - 1);\n            }\n            if (boxes.length > 0 && display == 'list-item' && !element.getAttribute('kendo-no-bullet')) {\n                drawBullet(boxes[0]);\n            }\n            (function () {\n                function clipit() {\n                    var clipPath = elementRoundBox(element, innerbox, 'padding');\n                    var tmp = new Group();\n                    setClipping(tmp, clipPath);\n                    group.append(tmp);\n                    group = tmp;\n                    updateClipbox(clipPath);\n                }\n                if (isFormField(element)) {\n                    clipit();\n                } else if (/^(hidden|auto|scroll)/.test(getPropertyValue(style, 'overflow'))) {\n                    clipit();\n                } else if (/^(hidden|auto|scroll)/.test(getPropertyValue(style, 'overflow-x'))) {\n                    clipit();\n                } else if (/^(hidden|auto|scroll)/.test(getPropertyValue(style, 'overflow-y'))) {\n                    clipit();\n                }\n            }());\n            if (!maybeRenderWidget(element, group)) {\n                renderContents(element, group);\n            }\n            return group;\n            function adjustBoxes(boxes) {\n                if (/^td$/i.test(element.tagName)) {\n                    var table = nodeInfo.table;\n                    if (table && getPropertyValue(table.style, 'border-collapse') == 'collapse') {\n                        var tableBorderLeft = getBorder(table.style, 'left').width;\n                        var tableBorderTop = getBorder(table.style, 'top').width;\n                        if (tableBorderLeft === 0 && tableBorderTop === 0) {\n                            return boxes;\n                        }\n                        var tableBox = table.element.getBoundingClientRect();\n                        var firstCell = table.element.rows[0].cells[0];\n                        var firstCellBox = firstCell.getBoundingClientRect();\n                        if (firstCellBox.top == tableBox.top || firstCellBox.left == tableBox.left) {\n                            return slice$1(boxes).map(function (box) {\n                                return {\n                                    left: box.left + tableBorderLeft,\n                                    top: box.top + tableBorderTop,\n                                    right: box.right + tableBorderLeft,\n                                    bottom: box.bottom + tableBorderTop,\n                                    height: box.height,\n                                    width: box.width\n                                };\n                            });\n                        }\n                    }\n                }\n                return boxes;\n            }\n            function drawEdge(color, len, Wtop, Wleft, Wright, rl, rr, transform$$1) {\n                if (Wtop <= 0) {\n                    return;\n                }\n                var path, edge = new Group();\n                setTransform(edge, transform$$1);\n                group.append(edge);\n                sanitizeRadius(rl);\n                sanitizeRadius(rr);\n                path = new Path({\n                    fill: { color: color },\n                    stroke: null\n                });\n                edge.append(path);\n                path.moveTo(rl.x ? Math.max(rl.x, Wleft) : 0, 0).lineTo(len - (rr.x ? Math.max(rr.x, Wright) : 0), 0).lineTo(len - Math.max(rr.x, Wright), Wtop).lineTo(Math.max(rl.x, Wleft), Wtop).close();\n                if (rl.x) {\n                    drawRoundCorner(Wleft, rl, [\n                        -1,\n                        0,\n                        0,\n                        1,\n                        rl.x,\n                        0\n                    ]);\n                }\n                if (rr.x) {\n                    drawRoundCorner(Wright, rr, [\n                        1,\n                        0,\n                        0,\n                        1,\n                        len - rr.x,\n                        0\n                    ]);\n                }\n                function drawRoundCorner(Wright, r, transform$$1) {\n                    var angle = Math.PI / 2 * Wright / (Wright + Wtop);\n                    var ri = {\n                        x: r.x - Wright,\n                        y: r.y - Wtop\n                    };\n                    var path = new Path({\n                        fill: { color: color },\n                        stroke: null\n                    }).moveTo(0, 0);\n                    setTransform(path, transform$$1);\n                    addArcToPath(path, 0, r.y, {\n                        startAngle: -90,\n                        endAngle: -radiansToDegrees(angle),\n                        radiusX: r.x,\n                        radiusY: r.y\n                    });\n                    if (ri.x > 0 && ri.y > 0) {\n                        path.lineTo(ri.x * Math.cos(angle), r.y - ri.y * Math.sin(angle));\n                        addArcToPath(path, 0, r.y, {\n                            startAngle: -radiansToDegrees(angle),\n                            endAngle: -90,\n                            radiusX: ri.x,\n                            radiusY: ri.y,\n                            anticlockwise: true\n                        });\n                    } else if (ri.x > 0) {\n                        path.lineTo(ri.x, Wtop).lineTo(0, Wtop);\n                    } else {\n                        path.lineTo(ri.x, Wtop).lineTo(ri.x, 0);\n                    }\n                    edge.append(path.close());\n                }\n            }\n            function drawBackground(box) {\n                var background = new Group();\n                setClipping(background, roundBox(box, rTL0, rTR0, rBR0, rBL0));\n                group.append(background);\n                if (element.tagName == 'A' && element.href && !/^#?$/.test(element.getAttribute('href'))) {\n                    if (!nodeInfo._avoidLinks || !matches(element, nodeInfo._avoidLinks)) {\n                        background._pdfLink = {\n                            url: element.href,\n                            top: box.top,\n                            right: box.right,\n                            bottom: box.bottom,\n                            left: box.left\n                        };\n                    }\n                }\n                if (backgroundColor) {\n                    var path = new Path({\n                        fill: { color: backgroundColor.toCssRgba() },\n                        stroke: null\n                    });\n                    path.moveTo(box.left, box.top).lineTo(box.right, box.top).lineTo(box.right, box.bottom).lineTo(box.left, box.bottom).close();\n                    background.append(path);\n                }\n                for (var i = backgroundImage.length; --i >= 0;) {\n                    drawOneBackground(background, box, backgroundImage[i], backgroundRepeat[i % backgroundRepeat.length], backgroundPosition[i % backgroundPosition.length], backgroundOrigin[i % backgroundOrigin.length], backgroundSize[i % backgroundSize.length]);\n                }\n            }\n            function drawOneBackground(group, box, background, backgroundRepeat, backgroundPosition, backgroundOrigin, backgroundSize) {\n                if (!background || background == 'none') {\n                    return;\n                }\n                if (background.type == 'url') {\n                    if (/^url\\(\\\"data:image\\/svg/i.test(background.url)) {\n                        return;\n                    }\n                    var img = IMAGE_CACHE[background.url];\n                    if (img && img.width > 0 && img.height > 0) {\n                        drawBackgroundImage(group, box, img.width, img.height, function (group, rect) {\n                            group.append(new Image$1(background.url, rect));\n                        });\n                    }\n                } else if (background.type == 'linear') {\n                    drawBackgroundImage(group, box, box.width, box.height, gradientRenderer(background));\n                } else {\n                    return;\n                }\n                function drawBackgroundImage(group, box, img_width, img_height, renderBG) {\n                    var aspect_ratio = img_width / img_height, f;\n                    var orgBox = box;\n                    if (backgroundOrigin == 'content-box') {\n                        orgBox = innerBox(orgBox, 'border-*-width', element);\n                        orgBox = innerBox(orgBox, 'padding-*', element);\n                    } else if (backgroundOrigin == 'padding-box') {\n                        orgBox = innerBox(orgBox, 'border-*-width', element);\n                    }\n                    if (!/^\\s*auto(\\s+auto)?\\s*$/.test(backgroundSize)) {\n                        if (backgroundSize == 'contain') {\n                            f = Math.min(orgBox.width / img_width, orgBox.height / img_height);\n                            img_width *= f;\n                            img_height *= f;\n                        } else if (backgroundSize == 'cover') {\n                            f = Math.max(orgBox.width / img_width, orgBox.height / img_height);\n                            img_width *= f;\n                            img_height *= f;\n                        } else {\n                            var size = backgroundSize.split(/\\s+/g);\n                            if (/%$/.test(size[0])) {\n                                img_width = orgBox.width * parseFloat(size[0]) / 100;\n                            } else {\n                                img_width = parseFloat(size[0]);\n                            }\n                            if (size.length == 1 || size[1] == 'auto') {\n                                img_height = img_width / aspect_ratio;\n                            } else if (/%$/.test(size[1])) {\n                                img_height = orgBox.height * parseFloat(size[1]) / 100;\n                            } else {\n                                img_height = parseFloat(size[1]);\n                            }\n                        }\n                    }\n                    var pos = String(backgroundPosition);\n                    switch (pos) {\n                    case 'bottom':\n                        pos = '50% 100%';\n                        break;\n                    case 'top':\n                        pos = '50% 0';\n                        break;\n                    case 'left':\n                        pos = '0 50%';\n                        break;\n                    case 'right':\n                        pos = '100% 50%';\n                        break;\n                    case 'center':\n                        pos = '50% 50%';\n                        break;\n                    }\n                    pos = pos.split(/\\s+/);\n                    if (pos.length == 1) {\n                        pos[1] = '50%';\n                    }\n                    if (/%$/.test(pos[0])) {\n                        pos[0] = parseFloat(pos[0]) / 100 * (orgBox.width - img_width);\n                    } else {\n                        pos[0] = parseFloat(pos[0]);\n                    }\n                    if (/%$/.test(pos[1])) {\n                        pos[1] = parseFloat(pos[1]) / 100 * (orgBox.height - img_height);\n                    } else {\n                        pos[1] = parseFloat(pos[1]);\n                    }\n                    var rect = new Rect([\n                        orgBox.left + pos[0],\n                        orgBox.top + pos[1]\n                    ], [\n                        img_width,\n                        img_height\n                    ]);\n                    function rewX() {\n                        while (rect.origin.x > box.left) {\n                            rect.origin.x -= img_width;\n                        }\n                    }\n                    function rewY() {\n                        while (rect.origin.y > box.top) {\n                            rect.origin.y -= img_height;\n                        }\n                    }\n                    function repeatX() {\n                        while (rect.origin.x < box.right) {\n                            renderBG(group, rect.clone());\n                            rect.origin.x += img_width;\n                        }\n                    }\n                    if (backgroundRepeat == 'no-repeat') {\n                        renderBG(group, rect);\n                    } else if (backgroundRepeat == 'repeat-x') {\n                        rewX();\n                        repeatX();\n                    } else if (backgroundRepeat == 'repeat-y') {\n                        rewY();\n                        while (rect.origin.y < box.bottom) {\n                            renderBG(group, rect.clone());\n                            rect.origin.y += img_height;\n                        }\n                    } else if (backgroundRepeat == 'repeat') {\n                        rewX();\n                        rewY();\n                        var origin = rect.origin.clone();\n                        while (rect.origin.y < box.bottom) {\n                            rect.origin.x = origin.x;\n                            repeatX();\n                            rect.origin.y += img_height;\n                        }\n                    }\n                }\n            }\n            function drawBullet() {\n                var listStyleType = getPropertyValue(style, 'list-style-type');\n                if (listStyleType == 'none') {\n                    return;\n                }\n                var listStylePosition = getPropertyValue(style, 'list-style-position');\n                function _drawBullet(f) {\n                    saveStyle(element, function () {\n                        element.style.position = 'relative';\n                        var bullet = element.ownerDocument.createElement(KENDO_PSEUDO_ELEMENT);\n                        bullet.style.position = 'absolute';\n                        bullet.style.boxSizing = 'border-box';\n                        if (listStylePosition == 'outside') {\n                            bullet.style.width = '6em';\n                            bullet.style.left = '-6.8em';\n                            bullet.style.textAlign = 'right';\n                        } else {\n                            bullet.style.left = '0px';\n                        }\n                        f(bullet);\n                        element.insertBefore(bullet, element.firstChild);\n                        renderElement(bullet, group);\n                        element.removeChild(bullet);\n                    });\n                }\n                function elementIndex(f) {\n                    var a = element.parentNode.children;\n                    var k = element.getAttribute('kendo-split-index');\n                    if (k != null) {\n                        return f(k | 0, a.length);\n                    }\n                    for (var i = 0; i < a.length; ++i) {\n                        if (a[i] === element) {\n                            return f(i, a.length);\n                        }\n                    }\n                }\n                switch (listStyleType) {\n                case 'circle':\n                case 'disc':\n                case 'square':\n                    _drawBullet(function (bullet) {\n                        bullet.style.fontSize = '60%';\n                        bullet.style.lineHeight = '200%';\n                        bullet.style.paddingRight = '0.5em';\n                        bullet.style.fontFamily = 'DejaVu Serif';\n                        bullet.innerHTML = {\n                            'disc': '\\u25CF',\n                            'circle': '\\u25EF',\n                            'square': '\\u25A0'\n                        }[listStyleType];\n                    });\n                    break;\n                case 'decimal':\n                case 'decimal-leading-zero':\n                    _drawBullet(function (bullet) {\n                        elementIndex(function (idx) {\n                            ++idx;\n                            if (listStyleType == 'decimal-leading-zero' && idx < 10) {\n                                idx = '0' + idx;\n                            }\n                            bullet.innerHTML = idx + '.';\n                        });\n                    });\n                    break;\n                case 'lower-roman':\n                case 'upper-roman':\n                    _drawBullet(function (bullet) {\n                        elementIndex(function (idx) {\n                            idx = arabicToRoman(idx + 1);\n                            if (listStyleType == 'upper-roman') {\n                                idx = idx.toUpperCase();\n                            }\n                            bullet.innerHTML = idx + '.';\n                        });\n                    });\n                    break;\n                case 'lower-latin':\n                case 'lower-alpha':\n                case 'upper-latin':\n                case 'upper-alpha':\n                    _drawBullet(function (bullet) {\n                        elementIndex(function (idx) {\n                            idx = alphaNumeral(idx);\n                            if (/^upper/i.test(listStyleType)) {\n                                idx = idx.toUpperCase();\n                            }\n                            bullet.innerHTML = idx + '.';\n                        });\n                    });\n                    break;\n                }\n            }\n            function drawOneBox(box, isFirst, isLast) {\n                if (box.width === 0 || box.height === 0) {\n                    return;\n                }\n                drawBackground(box);\n                var shouldDrawLeft = left.width > 0 && (isFirst && dir == 'ltr' || isLast && dir == 'rtl');\n                var shouldDrawRight = right.width > 0 && (isLast && dir == 'ltr' || isFirst && dir == 'rtl');\n                if (top.width === 0 && left.width === 0 && right.width === 0 && bottom.width === 0) {\n                    return;\n                }\n                if (top.color == right.color && top.color == bottom.color && top.color == left.color) {\n                    if (top.width == right.width && top.width == bottom.width && top.width == left.width) {\n                        if (shouldDrawLeft && shouldDrawRight) {\n                            box = innerBox(box, top.width / 2);\n                            var path = elementRoundBox(element, box, top.width / 2);\n                            path.options.stroke = {\n                                color: top.color,\n                                width: top.width\n                            };\n                            group.append(path);\n                            return;\n                        }\n                    }\n                }\n                if (rTL0.x === 0 && rTR0.x === 0 && rBR0.x === 0 && rBL0.x === 0) {\n                    if (top.width < 2 && left.width < 2 && right.width < 2 && bottom.width < 2) {\n                        if (top.width > 0) {\n                            group.append(new Path({\n                                stroke: {\n                                    width: top.width,\n                                    color: top.color\n                                }\n                            }).moveTo(box.left, box.top + top.width / 2).lineTo(box.right, box.top + top.width / 2));\n                        }\n                        if (bottom.width > 0) {\n                            group.append(new Path({\n                                stroke: {\n                                    width: bottom.width,\n                                    color: bottom.color\n                                }\n                            }).moveTo(box.left, box.bottom - bottom.width / 2).lineTo(box.right, box.bottom - bottom.width / 2));\n                        }\n                        if (shouldDrawLeft) {\n                            group.append(new Path({\n                                stroke: {\n                                    width: left.width,\n                                    color: left.color\n                                }\n                            }).moveTo(box.left + left.width / 2, box.top).lineTo(box.left + left.width / 2, box.bottom));\n                        }\n                        if (shouldDrawRight) {\n                            group.append(new Path({\n                                stroke: {\n                                    width: right.width,\n                                    color: right.color\n                                }\n                            }).moveTo(box.right - right.width / 2, box.top).lineTo(box.right - right.width / 2, box.bottom));\n                        }\n                        return;\n                    }\n                }\n                var tmp = adjustBorderRadiusForBox(box, rTL0, rTR0, rBR0, rBL0);\n                var rTL = tmp.tl;\n                var rTR = tmp.tr;\n                var rBR = tmp.br;\n                var rBL = tmp.bl;\n                drawEdge(top.color, box.width, top.width, left.width, right.width, rTL, rTR, [\n                    1,\n                    0,\n                    0,\n                    1,\n                    box.left,\n                    box.top\n                ]);\n                drawEdge(bottom.color, box.width, bottom.width, right.width, left.width, rBR, rBL, [\n                    -1,\n                    0,\n                    0,\n                    -1,\n                    box.right,\n                    box.bottom\n                ]);\n                function inv(p) {\n                    return {\n                        x: p.y,\n                        y: p.x\n                    };\n                }\n                drawEdge(left.color, box.height, left.width, bottom.width, top.width, inv(rBL), inv(rTL), [\n                    0,\n                    -1,\n                    1,\n                    0,\n                    box.left,\n                    box.bottom\n                ]);\n                drawEdge(right.color, box.height, right.width, top.width, bottom.width, inv(rTR), inv(rBR), [\n                    0,\n                    1,\n                    -1,\n                    0,\n                    box.right,\n                    box.top\n                ]);\n            }\n        }\n        function gradientRenderer(gradient) {\n            return function (group, rect) {\n                var width = rect.width(), height = rect.height();\n                switch (gradient.type) {\n                case 'linear':\n                    var angle = gradient.angle != null ? gradient.angle : Math.PI;\n                    switch (gradient.to) {\n                    case 'top':\n                        angle = 0;\n                        break;\n                    case 'left':\n                        angle = -Math.PI / 2;\n                        break;\n                    case 'bottom':\n                        angle = Math.PI;\n                        break;\n                    case 'right':\n                        angle = Math.PI / 2;\n                        break;\n                    case 'top left':\n                    case 'left top':\n                        angle = -Math.atan2(height, width);\n                        break;\n                    case 'top right':\n                    case 'right top':\n                        angle = Math.atan2(height, width);\n                        break;\n                    case 'bottom left':\n                    case 'left bottom':\n                        angle = Math.PI + Math.atan2(height, width);\n                        break;\n                    case 'bottom right':\n                    case 'right bottom':\n                        angle = Math.PI - Math.atan2(height, width);\n                        break;\n                    }\n                    if (gradient.reverse) {\n                        angle -= Math.PI;\n                    }\n                    angle %= 2 * Math.PI;\n                    if (angle < 0) {\n                        angle += 2 * Math.PI;\n                    }\n                    var pxlen = Math.abs(width * Math.sin(angle)) + Math.abs(height * Math.cos(angle));\n                    var scaledAngle = Math.atan(width * Math.tan(angle) / height);\n                    var sin = Math.sin(scaledAngle), cos = Math.cos(scaledAngle);\n                    var len = Math.abs(sin) + Math.abs(cos);\n                    var x = len / 2 * sin;\n                    var y = len / 2 * cos;\n                    if (angle > Math.PI / 2 && angle <= 3 * Math.PI / 2) {\n                        x = -x;\n                        y = -y;\n                    }\n                    var implicit = [], right = 0;\n                    var stops = gradient.stops.map(function (s, i) {\n                        var offset = s.percent;\n                        if (offset) {\n                            offset = parseFloat(offset) / 100;\n                        } else if (s.length) {\n                            offset = parseFloat(s.length) / pxlen;\n                        } else if (i === 0) {\n                            offset = 0;\n                        } else if (i == gradient.stops.length - 1) {\n                            offset = 1;\n                        }\n                        var stop = {\n                            color: s.color.toCssRgba(),\n                            offset: offset\n                        };\n                        if (offset != null) {\n                            right = offset;\n                            implicit.forEach(function (s, i) {\n                                var stop = s.stop;\n                                stop.offset = s.left + (right - s.left) * (i + 1) / (implicit.length + 1);\n                            });\n                            implicit = [];\n                        } else {\n                            implicit.push({\n                                left: right,\n                                stop: stop\n                            });\n                        }\n                        return stop;\n                    });\n                    var start = [\n                        0.5 - x,\n                        0.5 + y\n                    ];\n                    var end = [\n                        0.5 + x,\n                        0.5 - y\n                    ];\n                    group.append(Path.fromRect(rect).stroke(null).fill(new LinearGradient({\n                        start: start,\n                        end: end,\n                        stops: stops,\n                        userSpace: false\n                    })));\n                    break;\n                case 'radial':\n                    if (window.console && window.console.log) {\n                        window.console.log('Radial gradients are not yet supported in HTML renderer');\n                    }\n                    break;\n                }\n            };\n        }\n        function maybeRenderWidget(element, group) {\n            if (window.kendo && window.kendo.jQuery && element.getAttribute(window.kendo.attr('role'))) {\n                var widget = window.kendo.widgetInstance(window.kendo.jQuery(element));\n                if (widget && (widget.exportDOMVisual || widget.exportVisual)) {\n                    var visual;\n                    if (widget.exportDOMVisual) {\n                        visual = widget.exportDOMVisual();\n                    } else {\n                        visual = widget.exportVisual();\n                    }\n                    if (!visual) {\n                        return false;\n                    }\n                    var wrap$$1 = new Group();\n                    wrap$$1.children.push(visual);\n                    var bbox = element.getBoundingClientRect();\n                    wrap$$1.transform(transform().translate(bbox.left, bbox.top));\n                    group.append(wrap$$1);\n                    return true;\n                }\n            }\n        }\n        function renderImage(element, url, group) {\n            var box = getContentBox(element);\n            var rect = new Rect([\n                box.left,\n                box.top\n            ], [\n                box.width,\n                box.height\n            ]);\n            var image = new Image$1(url, rect);\n            setClipping(image, elementRoundBox(element, box, 'content'));\n            group.append(image);\n        }\n        function zIndexSort(a, b) {\n            var sa = getComputedStyle(a);\n            var sb = getComputedStyle(b);\n            var za = parseFloat(getPropertyValue(sa, 'z-index'));\n            var zb = parseFloat(getPropertyValue(sb, 'z-index'));\n            var pa = getPropertyValue(sa, 'position');\n            var pb = getPropertyValue(sb, 'position');\n            if (isNaN(za) && isNaN(zb)) {\n                if (/static|absolute/.test(pa) && /static|absolute/.test(pb)) {\n                    return 0;\n                }\n                if (pa == 'static') {\n                    return -1;\n                }\n                if (pb == 'static') {\n                    return 1;\n                }\n                return 0;\n            }\n            if (isNaN(za)) {\n                return zb === 0 ? 0 : zb > 0 ? -1 : 1;\n            }\n            if (isNaN(zb)) {\n                return za === 0 ? 0 : za > 0 ? 1 : -1;\n            }\n            return parseFloat(za) - parseFloat(zb);\n        }\n        function isFormField(element) {\n            return /^(?:textarea|select|input)$/i.test(element.tagName);\n        }\n        function getSelectedOption(element) {\n            if (element.selectedOptions && element.selectedOptions.length > 0) {\n                return element.selectedOptions[0];\n            }\n            return element.options[element.selectedIndex];\n        }\n        function renderCheckbox(element, group) {\n            var style = getComputedStyle(element);\n            var color = getPropertyValue(style, 'color');\n            var box = element.getBoundingClientRect();\n            if (element.type == 'checkbox') {\n                group.append(Path.fromRect(new Rect([\n                    box.left + 1,\n                    box.top + 1\n                ], [\n                    box.width - 2,\n                    box.height - 2\n                ])).stroke(color, 1));\n                if (element.checked) {\n                    group.append(new Path().stroke(color, 1.2).moveTo(box.left + 0.22 * box.width, box.top + 0.55 * box.height).lineTo(box.left + 0.45 * box.width, box.top + 0.75 * box.height).lineTo(box.left + 0.78 * box.width, box.top + 0.22 * box.width));\n                }\n            } else {\n                group.append(new Circle(new Circle$2([\n                    (box.left + box.right) / 2,\n                    (box.top + box.bottom) / 2\n                ], Math.min(box.width - 2, box.height - 2) / 2)).stroke(color, 1));\n                if (element.checked) {\n                    group.append(new Circle(new Circle$2([\n                        (box.left + box.right) / 2,\n                        (box.top + box.bottom) / 2\n                    ], Math.min(box.width - 8, box.height - 8) / 2)).fill(color).stroke(null));\n                }\n            }\n        }\n        function renderFormField(element, group) {\n            var tag = element.tagName.toLowerCase();\n            if (tag == 'input' && (element.type == 'checkbox' || element.type == 'radio')) {\n                return renderCheckbox(element, group);\n            }\n            var p = element.parentNode;\n            var doc = element.ownerDocument;\n            var el = doc.createElement(KENDO_PSEUDO_ELEMENT);\n            var option;\n            el.style.cssText = getCssText(getComputedStyle(element));\n            if (tag == 'input') {\n                el.style.whiteSpace = 'pre';\n            }\n            if (tag == 'select' || tag == 'textarea') {\n                el.style.overflow = 'auto';\n            }\n            if (tag == 'select') {\n                if (element.multiple) {\n                    for (var i = 0; i < element.options.length; ++i) {\n                        option = doc.createElement(KENDO_PSEUDO_ELEMENT);\n                        option.style.cssText = getCssText(getComputedStyle(element.options[i]));\n                        option.style.display = 'block';\n                        option.textContent = element.options[i].textContent;\n                        el.appendChild(option);\n                    }\n                } else {\n                    option = getSelectedOption(element);\n                    if (option) {\n                        el.textContent = option.textContent;\n                    }\n                }\n            } else {\n                el.textContent = element.value;\n            }\n            p.insertBefore(el, element);\n            el.scrollLeft = element.scrollLeft;\n            el.scrollTop = element.scrollTop;\n            element.style.display = 'none';\n            renderContents(el, group);\n            element.style.display = '';\n            p.removeChild(el);\n        }\n        function renderContents(element, group) {\n            if (nodeInfo._stackingContext.element === element) {\n                nodeInfo._stackingContext.group = group;\n            }\n            switch (element.tagName.toLowerCase()) {\n            case 'img':\n                renderImage(element, element.src, group);\n                break;\n            case 'canvas':\n                try {\n                    renderImage(element, element.toDataURL('image/png'), group);\n                } catch (ex) {\n                }\n                break;\n            case 'textarea':\n            case 'input':\n            case 'select':\n                renderFormField(element, group);\n                break;\n            default:\n                var children = [], floats = [], positioned = [];\n                for (var i = element.firstChild; i; i = i.nextSibling) {\n                    switch (i.nodeType) {\n                    case 3:\n                        if (/\\S/.test(i.data)) {\n                            renderText(element, i, group);\n                        }\n                        break;\n                    case 1:\n                        var style = getComputedStyle(i);\n                        var floating = getPropertyValue(style, 'float');\n                        var position = getPropertyValue(style, 'position');\n                        if (position != 'static') {\n                            positioned.push(i);\n                        } else if (floating != 'none') {\n                            floats.push(i);\n                        } else {\n                            children.push(i);\n                        }\n                        break;\n                    }\n                }\n                mergeSort(children, zIndexSort).forEach(function (el) {\n                    renderElement(el, group);\n                });\n                mergeSort(floats, zIndexSort).forEach(function (el) {\n                    renderElement(el, group);\n                });\n                mergeSort(positioned, zIndexSort).forEach(function (el) {\n                    renderElement(el, group);\n                });\n            }\n        }\n        function renderText(element, node, group) {\n            if (emptyClipbox()) {\n                return;\n            }\n            var style = getComputedStyle(element);\n            if (parseFloat(getPropertyValue(style, 'text-indent')) < -500) {\n                return;\n            }\n            var text = node.data;\n            var start = 0;\n            var end = text.search(/\\S\\s*$/) + 1;\n            if (!end) {\n                return;\n            }\n            var fontSize = getPropertyValue(style, 'font-size');\n            var lineHeight = getPropertyValue(style, 'line-height');\n            var font = [\n                getPropertyValue(style, 'font-style'),\n                getPropertyValue(style, 'font-variant'),\n                getPropertyValue(style, 'font-weight'),\n                fontSize,\n                getPropertyValue(style, 'font-family')\n            ].join(' ');\n            fontSize = parseFloat(fontSize);\n            lineHeight = parseFloat(lineHeight);\n            if (fontSize === 0) {\n                return;\n            }\n            var color = getPropertyValue(style, 'color');\n            var range = element.ownerDocument.createRange();\n            var align$$1 = getPropertyValue(style, 'text-align');\n            var isJustified = align$$1 == 'justify';\n            var columnCount = getPropertyValue(style, 'column-count', 1);\n            var whiteSpace = getPropertyValue(style, 'white-space');\n            var textOverflow, saveTextOverflow;\n            if (browser.msie) {\n                textOverflow = style.textOverflow;\n                if (textOverflow == 'ellipsis') {\n                    saveTextOverflow = element.style.textOverflow;\n                    element.style.textOverflow = 'clip';\n                }\n            }\n            var estimateLineLength = element.getBoundingClientRect().width / fontSize * 5;\n            if (estimateLineLength === 0) {\n                estimateLineLength = 500;\n            }\n            var prevLineBottom = null;\n            var underline = nodeInfo['underline'];\n            var lineThrough = nodeInfo['line-through'];\n            var overline = nodeInfo['overline'];\n            var hasDecoration = underline || lineThrough || overline;\n            while (!doChunk()) {\n            }\n            if (browser.msie && textOverflow == 'ellipsis') {\n                element.style.textOverflow = saveTextOverflow;\n            }\n            if (hasDecoration) {\n                range.selectNode(node);\n                slice$1(range.getClientRects()).forEach(decorate);\n            }\n            return;\n            function actuallyGetRangeBoundingRect(range) {\n                if (browser.msie || browser.chrome) {\n                    var rectangles = range.getClientRects(), box = {\n                            top: Infinity,\n                            right: -Infinity,\n                            bottom: -Infinity,\n                            left: Infinity\n                        };\n                    for (var i = 0; i < rectangles.length; ++i) {\n                        var b = rectangles[i];\n                        if (b.width <= 1 || b.bottom === prevLineBottom) {\n                            continue;\n                        }\n                        box.left = Math.min(b.left, box.left);\n                        box.top = Math.min(b.top, box.top);\n                        box.right = Math.max(b.right, box.right);\n                        box.bottom = Math.max(b.bottom, box.bottom);\n                    }\n                    box.width = box.right - box.left;\n                    box.height = box.bottom - box.top;\n                    return box;\n                }\n                return range.getBoundingClientRect();\n            }\n            function doChunk() {\n                var origStart = start;\n                var box, pos = text.substr(start).search(/\\S/);\n                start += pos;\n                if (pos < 0 || start >= end) {\n                    return true;\n                }\n                range.setStart(node, start);\n                range.setEnd(node, start + 1);\n                box = actuallyGetRangeBoundingRect(range);\n                var found = false;\n                if (isJustified || columnCount > 1) {\n                    pos = text.substr(start).search(/\\s/);\n                    if (pos >= 0) {\n                        range.setEnd(node, start + pos);\n                        var r = actuallyGetRangeBoundingRect(range);\n                        if (r.bottom == box.bottom) {\n                            box = r;\n                            found = true;\n                            start += pos;\n                        }\n                    }\n                }\n                if (!found) {\n                    pos = function findEOL(min, eol, max) {\n                        range.setEnd(node, eol);\n                        var r = actuallyGetRangeBoundingRect(range);\n                        if (r.bottom != box.bottom && min < eol) {\n                            return findEOL(min, min + eol >> 1, eol);\n                        } else if (r.right != box.right) {\n                            box = r;\n                            if (eol < max) {\n                                return findEOL(eol, eol + max >> 1, max);\n                            } else {\n                                return eol;\n                            }\n                        } else {\n                            return eol;\n                        }\n                    }(start, Math.min(end, start + estimateLineLength), end);\n                    if (pos == start) {\n                        return true;\n                    }\n                    start = pos;\n                    pos = range.toString().search(/\\s+$/);\n                    if (pos === 0) {\n                        return false;\n                    }\n                    if (pos > 0) {\n                        range.setEnd(node, range.startOffset + pos);\n                        box = actuallyGetRangeBoundingRect(range);\n                    }\n                }\n                if (browser.msie) {\n                    box = range.getClientRects()[0];\n                }\n                var str = range.toString();\n                if (!/^(?:pre|pre-wrap)$/i.test(whiteSpace)) {\n                    str = str.replace(/\\s+/g, ' ');\n                } else if (/\\t/.test(str)) {\n                    var cc = 0;\n                    for (pos = origStart; pos < range.startOffset; ++pos) {\n                        var code = text.charCodeAt(pos);\n                        if (code == 9) {\n                            cc += 8 - cc % 8;\n                        } else if (code == 10 || code == 13) {\n                            cc = 0;\n                        } else {\n                            cc++;\n                        }\n                    }\n                    while ((pos = str.search('\\t')) >= 0) {\n                        var indent = '        '.substr(0, 8 - (cc + pos) % 8);\n                        str = str.substr(0, pos) + indent + str.substr(pos + 1);\n                    }\n                }\n                if (!found) {\n                    prevLineBottom = box.bottom;\n                }\n                drawText(str, box);\n            }\n            function drawText(str, box) {\n                if (browser.msie && !isNaN(lineHeight)) {\n                    var height = getFontHeight(font);\n                    var top = (box.top + box.bottom - height) / 2;\n                    box = {\n                        top: top,\n                        right: box.right,\n                        bottom: top + height,\n                        left: box.left,\n                        height: height,\n                        width: box.right - box.left\n                    };\n                }\n                var text = new TextRect(str, new Rect([\n                    box.left,\n                    box.top\n                ], [\n                    box.width,\n                    box.height\n                ]), {\n                    font: font,\n                    fill: { color: color }\n                });\n                group.append(text);\n            }\n            function decorate(box) {\n                line(underline, box.bottom);\n                line(lineThrough, box.bottom - box.height / 2.7);\n                line(overline, box.top);\n                function line(color, ypos) {\n                    if (color) {\n                        var width = fontSize / 12;\n                        var path = new Path({\n                            stroke: {\n                                width: width,\n                                color: color\n                            }\n                        });\n                        ypos -= width;\n                        path.moveTo(box.left, ypos).lineTo(box.right, ypos);\n                        group.append(path);\n                    }\n                }\n            }\n        }\n        function groupInStackingContext(element, group, zIndex) {\n            var main;\n            if (zIndex != 'auto') {\n                main = nodeInfo._stackingContext.group;\n                zIndex = parseFloat(zIndex);\n            } else {\n                main = group;\n                zIndex = 0;\n            }\n            var a = main.children;\n            for (var i = 0; i < a.length; ++i) {\n                if (a[i]._dom_zIndex != null && a[i]._dom_zIndex > zIndex) {\n                    break;\n                }\n            }\n            var tmp = new Group();\n            main.insert(i, tmp);\n            tmp._dom_zIndex = zIndex;\n            if (main !== group) {\n                if (nodeInfo._clipbox) {\n                    var m = nodeInfo._matrix.invert();\n                    var r = nodeInfo._clipbox.transformCopy(m);\n                    setClipping(tmp, Path.fromRect(r));\n                }\n            }\n            return tmp;\n        }\n        function renderElement(element, container) {\n            var style = getComputedStyle(element);\n            updateCounters(style);\n            if (/^(style|script|link|meta|iframe|svg|col|colgroup)$/i.test(element.tagName)) {\n                return;\n            }\n            if (nodeInfo._clipbox == null) {\n                return;\n            }\n            var opacity = parseFloat(getPropertyValue(style, 'opacity'));\n            var visibility = getPropertyValue(style, 'visibility');\n            var display = getPropertyValue(style, 'display');\n            if (opacity === 0 || visibility == 'hidden' || display == 'none') {\n                return;\n            }\n            var tr = getTransform(style);\n            var group;\n            var zIndex = getPropertyValue(style, 'z-index');\n            if ((tr || opacity < 1) && zIndex == 'auto') {\n                zIndex = 0;\n            }\n            group = groupInStackingContext(element, container, zIndex);\n            if (opacity < 1) {\n                group.opacity(opacity * group.opacity());\n            }\n            pushNodeInfo(element, style, group);\n            if (!tr) {\n                _renderWithPseudoElements(element, group);\n            } else {\n                saveStyle(element, function () {\n                    pleaseSetPropertyValue(element.style, 'transform', 'none', 'important');\n                    pleaseSetPropertyValue(element.style, 'transition', 'none', 'important');\n                    if (getPropertyValue(style, 'position') == 'static') {\n                        pleaseSetPropertyValue(element.style, 'position', 'relative', 'important');\n                    }\n                    var bbox = element.getBoundingClientRect();\n                    var x = bbox.left + tr.origin[0];\n                    var y = bbox.top + tr.origin[1];\n                    var m = [\n                        1,\n                        0,\n                        0,\n                        1,\n                        -x,\n                        -y\n                    ];\n                    m = mmul(m, tr.matrix);\n                    m = mmul(m, [\n                        1,\n                        0,\n                        0,\n                        1,\n                        x,\n                        y\n                    ]);\n                    m = setTransform(group, m);\n                    nodeInfo._matrix = nodeInfo._matrix.multiplyCopy(m);\n                    _renderWithPseudoElements(element, group);\n                });\n            }\n            popNodeInfo();\n        }\n        function mmul(a, b) {\n            var a1 = a[0], b1 = a[1], c1 = a[2], d1 = a[3], e1 = a[4], f1 = a[5];\n            var a2 = b[0], b2 = b[1], c2 = b[2], d2 = b[3], e2 = b[4], f2 = b[5];\n            return [\n                a1 * a2 + b1 * c2,\n                a1 * b2 + b1 * d2,\n                c1 * a2 + d1 * c2,\n                c1 * b2 + d1 * d2,\n                e1 * a2 + f1 * c2 + e2,\n                e1 * b2 + f1 * d2 + f2\n            ];\n        }\n        var drawing = {\n            svg: svg,\n            canvas: canvas,\n            util: util,\n            PathParser: PathParser,\n            Surface: Surface,\n            BaseNode: BaseNode,\n            SurfaceFactory: SurfaceFactory,\n            OptionsStore: OptionsStore,\n            exportImage: exportImage,\n            exportSVG: exportSVG,\n            QuadNode: QuadNode,\n            ShapesQuadTree: ShapesQuadTree,\n            ObserversMixin: ObserversMixin,\n            Element: Element$1,\n            Circle: Circle,\n            Arc: Arc,\n            Path: Path,\n            MultiPath: MultiPath,\n            Text: Text,\n            Image: Image$1,\n            Group: Group,\n            Layout: Layout,\n            Rect: Rect$2,\n            align: align,\n            vAlign: vAlign,\n            stack: stack,\n            vStack: vStack,\n            wrap: wrap,\n            vWrap: vWrap,\n            fit: fit,\n            LinearGradient: LinearGradient,\n            RadialGradient: RadialGradient,\n            GradientStop: GradientStop,\n            Gradient: Gradient,\n            Animation: Animation,\n            AnimationFactory: AnimationFactory,\n            drawDOM: drawDOM\n        };\n        kendo.deepExtend(kendo, {\n            drawing: drawing,\n            geometry: geometry\n        });\n        kendo.drawing.Segment = kendo.geometry.Segment;\n        kendo.dataviz.drawing = kendo.drawing;\n        kendo.dataviz.geometry = kendo.geometry;\n        kendo.drawing.util.measureText = kendo.util.measureText;\n        kendo.drawing.util.objectKey = kendo.util.objectKey;\n        kendo.drawing.Color = kendo.Color;\n        kendo.util.encodeBase64 = kendo.drawing.util.encodeBase64;\n    }(window.kendo.jQuery));\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.popup', ['kendo.core'], f);\n}(function () {\n    var __meta__ = {\n        id: 'popup',\n        name: 'Pop-up',\n        category: 'framework',\n        depends: ['core'],\n        advanced: true\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, ui = kendo.ui, Widget = ui.Widget, Class = kendo.Class, support = kendo.support, getOffset = kendo.getOffset, outerWidth = kendo._outerWidth, outerHeight = kendo._outerHeight, OPEN = 'open', CLOSE = 'close', DEACTIVATE = 'deactivate', ACTIVATE = 'activate', CENTER = 'center', LEFT = 'left', RIGHT = 'right', TOP = 'top', BOTTOM = 'bottom', ABSOLUTE = 'absolute', HIDDEN = 'hidden', BODY = 'body', LOCATION = 'location', POSITION = 'position', VISIBLE = 'visible', EFFECTS = 'effects', ACTIVE = 'k-state-active', ACTIVEBORDER = 'k-state-border', ACTIVEBORDERREGEXP = /k-state-border-(\\w+)/, ACTIVECHILDREN = '.k-picker-wrap, .k-dropdown-wrap, .k-link', MOUSEDOWN = 'down', DOCUMENT_ELEMENT = $(document.documentElement), proxy = $.proxy, WINDOW = $(window), SCROLL = 'scroll', cssPrefix = support.transitions.css, TRANSFORM = cssPrefix + 'transform', extend = $.extend, NS = '.kendoPopup', styles = [\n                'font-size',\n                'font-family',\n                'font-stretch',\n                'font-style',\n                'font-weight',\n                'line-height'\n            ];\n        function contains(container, target) {\n            if (!container || !target) {\n                return false;\n            }\n            return container === target || $.contains(container, target);\n        }\n        var Popup = Widget.extend({\n            init: function (element, options) {\n                var that = this, parentPopup;\n                options = options || {};\n                if (options.isRtl) {\n                    options.origin = options.origin || BOTTOM + ' ' + RIGHT;\n                    options.position = options.position || TOP + ' ' + RIGHT;\n                }\n                Widget.fn.init.call(that, element, options);\n                element = that.element;\n                options = that.options;\n                that.collisions = options.collision ? options.collision.split(' ') : [];\n                that.downEvent = kendo.applyEventMap(MOUSEDOWN, kendo.guid());\n                if (that.collisions.length === 1) {\n                    that.collisions.push(that.collisions[0]);\n                }\n                parentPopup = $(that.options.anchor).closest('.k-popup,.k-group').filter(':not([class^=km-])');\n                options.appendTo = $($(options.appendTo)[0] || parentPopup[0] || document.body);\n                that.element.hide().addClass('k-popup k-group k-reset').toggleClass('k-rtl', !!options.isRtl).css({ position: ABSOLUTE }).appendTo(options.appendTo).on('mouseenter' + NS, function () {\n                    that._hovered = true;\n                }).on('mouseleave' + NS, function () {\n                    that._hovered = false;\n                });\n                that.wrapper = $();\n                if (options.animation === false) {\n                    options.animation = {\n                        open: { effects: {} },\n                        close: {\n                            hide: true,\n                            effects: {}\n                        }\n                    };\n                }\n                extend(options.animation.open, {\n                    complete: function () {\n                        that.wrapper.css({ overflow: VISIBLE });\n                        that._activated = true;\n                        that._trigger(ACTIVATE);\n                    }\n                });\n                extend(options.animation.close, {\n                    complete: function () {\n                        that._animationClose();\n                    }\n                });\n                that._mousedownProxy = function (e) {\n                    that._mousedown(e);\n                };\n                if (support.mobileOS.android) {\n                    that._resizeProxy = function (e) {\n                        setTimeout(function () {\n                            that._resize(e);\n                        }, 600);\n                    };\n                } else {\n                    that._resizeProxy = function (e) {\n                        that._resize(e);\n                    };\n                }\n                if (options.toggleTarget) {\n                    $(options.toggleTarget).on(options.toggleEvent + NS, $.proxy(that.toggle, that));\n                }\n            },\n            events: [\n                OPEN,\n                ACTIVATE,\n                CLOSE,\n                DEACTIVATE\n            ],\n            options: {\n                name: 'Popup',\n                toggleEvent: 'click',\n                origin: BOTTOM + ' ' + LEFT,\n                position: TOP + ' ' + LEFT,\n                anchor: BODY,\n                appendTo: null,\n                collision: 'flip fit',\n                viewport: window,\n                copyAnchorStyles: true,\n                autosize: false,\n                modal: false,\n                adjustSize: {\n                    width: 0,\n                    height: 0\n                },\n                animation: {\n                    open: {\n                        effects: 'slideIn:down',\n                        transition: true,\n                        duration: 200\n                    },\n                    close: {\n                        duration: 100,\n                        hide: true\n                    }\n                }\n            },\n            _animationClose: function () {\n                var that = this;\n                var location = that.wrapper.data(LOCATION);\n                that.wrapper.hide();\n                if (location) {\n                    that.wrapper.css(location);\n                }\n                if (that.options.anchor != BODY) {\n                    that._hideDirClass();\n                }\n                that._closing = false;\n                that._trigger(DEACTIVATE);\n            },\n            destroy: function () {\n                var that = this, options = that.options, element = that.element.off(NS), parent;\n                Widget.fn.destroy.call(that);\n                if (options.toggleTarget) {\n                    $(options.toggleTarget).off(NS);\n                }\n                if (!options.modal) {\n                    DOCUMENT_ELEMENT.unbind(that.downEvent, that._mousedownProxy);\n                    that._toggleResize(false);\n                }\n                kendo.destroy(that.element.children());\n                element.removeData();\n                if (options.appendTo[0] === document.body) {\n                    parent = element.parent('.k-animation-container');\n                    if (parent[0]) {\n                        parent.remove();\n                    } else {\n                        element.remove();\n                    }\n                }\n            },\n            open: function (x, y) {\n                var that = this, fixed = {\n                        isFixed: !isNaN(parseInt(y, 10)),\n                        x: x,\n                        y: y\n                    }, element = that.element, options = that.options, animation, wrapper, anchor = $(options.anchor), mobile = element[0] && element.hasClass('km-widget');\n                if (!that.visible()) {\n                    if (options.copyAnchorStyles) {\n                        if (mobile && styles[0] == 'font-size') {\n                            styles.shift();\n                        }\n                        element.css(kendo.getComputedStyles(anchor[0], styles));\n                    }\n                    if (element.data('animating') || that._trigger(OPEN)) {\n                        return;\n                    }\n                    that._activated = false;\n                    if (!options.modal) {\n                        DOCUMENT_ELEMENT.unbind(that.downEvent, that._mousedownProxy).bind(that.downEvent, that._mousedownProxy);\n                        that._toggleResize(false);\n                        that._toggleResize(true);\n                    }\n                    that.wrapper = wrapper = kendo.wrap(element, options.autosize).css({\n                        overflow: HIDDEN,\n                        display: 'block',\n                        position: ABSOLUTE\n                    });\n                    if (support.mobileOS.android) {\n                        wrapper.css(TRANSFORM, 'translatez(0)');\n                    }\n                    wrapper.css(POSITION);\n                    if ($(options.appendTo)[0] == document.body) {\n                        wrapper.css(TOP, '-10000px');\n                    }\n                    that.flipped = that._position(fixed);\n                    animation = that._openAnimation();\n                    if (options.anchor != BODY) {\n                        that._showDirClass(animation);\n                    }\n                    element.data(EFFECTS, animation.effects).kendoStop(true).kendoAnimate(animation);\n                }\n            },\n            _location: function (isFixed) {\n                var that = this, element = that.element, options = that.options, wrapper, anchor = $(options.anchor), mobile = element[0] && element.hasClass('km-widget');\n                if (options.copyAnchorStyles) {\n                    if (mobile && styles[0] == 'font-size') {\n                        styles.shift();\n                    }\n                    element.css(kendo.getComputedStyles(anchor[0], styles));\n                }\n                that.wrapper = wrapper = kendo.wrap(element, options.autosize).css({\n                    overflow: HIDDEN,\n                    display: 'block',\n                    position: ABSOLUTE\n                });\n                if (support.mobileOS.android) {\n                    wrapper.css(TRANSFORM, 'translatez(0)');\n                }\n                wrapper.css(POSITION);\n                if ($(options.appendTo)[0] == document.body) {\n                    wrapper.css(TOP, '-10000px');\n                }\n                that._position(isFixed || {});\n                var offset = wrapper.offset();\n                return {\n                    width: kendo._outerWidth(wrapper),\n                    height: kendo._outerHeight(wrapper),\n                    left: offset.left,\n                    top: offset.top\n                };\n            },\n            _openAnimation: function () {\n                var animation = extend(true, {}, this.options.animation.open);\n                animation.effects = kendo.parseEffects(animation.effects, this.flipped);\n                return animation;\n            },\n            _hideDirClass: function () {\n                var anchor = $(this.options.anchor);\n                var direction = ((anchor.attr('class') || '').match(ACTIVEBORDERREGEXP) || [\n                    '',\n                    'down'\n                ])[1];\n                var dirClass = ACTIVEBORDER + '-' + direction;\n                anchor.removeClass(dirClass).children(ACTIVECHILDREN).removeClass(ACTIVE).removeClass(dirClass);\n                this.element.removeClass(ACTIVEBORDER + '-' + kendo.directions[direction].reverse);\n            },\n            _showDirClass: function (animation) {\n                var direction = animation.effects.slideIn ? animation.effects.slideIn.direction : 'down';\n                var dirClass = ACTIVEBORDER + '-' + direction;\n                $(this.options.anchor).addClass(dirClass).children(ACTIVECHILDREN).addClass(ACTIVE).addClass(dirClass);\n                this.element.addClass(ACTIVEBORDER + '-' + kendo.directions[direction].reverse);\n            },\n            position: function () {\n                if (this.visible()) {\n                    this.flipped = this._position();\n                }\n            },\n            toggle: function () {\n                var that = this;\n                that[that.visible() ? CLOSE : OPEN]();\n            },\n            visible: function () {\n                return this.element.is(':' + VISIBLE);\n            },\n            close: function (skipEffects) {\n                var that = this, options = that.options, wrap, animation, openEffects, closeEffects;\n                if (that.visible()) {\n                    wrap = that.wrapper[0] ? that.wrapper : kendo.wrap(that.element).hide();\n                    that._toggleResize(false);\n                    if (that._closing || that._trigger(CLOSE)) {\n                        that._toggleResize(true);\n                        return;\n                    }\n                    that.element.find('.k-popup').each(function () {\n                        var that = $(this), popup = that.data('kendoPopup');\n                        if (popup) {\n                            popup.close(skipEffects);\n                        }\n                    });\n                    DOCUMENT_ELEMENT.unbind(that.downEvent, that._mousedownProxy);\n                    if (skipEffects) {\n                        animation = {\n                            hide: true,\n                            effects: {}\n                        };\n                    } else {\n                        animation = extend(true, {}, options.animation.close);\n                        openEffects = that.element.data(EFFECTS);\n                        closeEffects = animation.effects;\n                        if (!closeEffects && !kendo.size(closeEffects) && openEffects && kendo.size(openEffects)) {\n                            animation.effects = openEffects;\n                            animation.reverse = true;\n                        }\n                        that._closing = true;\n                    }\n                    that.element.kendoStop(true);\n                    wrap.css({ overflow: HIDDEN });\n                    that.element.kendoAnimate(animation);\n                    if (skipEffects) {\n                        that._animationClose();\n                    }\n                }\n            },\n            _trigger: function (ev) {\n                return this.trigger(ev, { type: ev });\n            },\n            _resize: function (e) {\n                var that = this;\n                if (support.resize.indexOf(e.type) !== -1) {\n                    clearTimeout(that._resizeTimeout);\n                    that._resizeTimeout = setTimeout(function () {\n                        that._position();\n                        that._resizeTimeout = null;\n                    }, 50);\n                } else {\n                    if (!that._hovered || that._activated && that.element.hasClass('k-list-container')) {\n                        that.close();\n                    }\n                }\n            },\n            _toggleResize: function (toggle) {\n                var method = toggle ? 'on' : 'off';\n                var eventNames = support.resize;\n                if (!(support.mobileOS.ios || support.mobileOS.android)) {\n                    eventNames += ' ' + SCROLL;\n                }\n                this._scrollableParents()[method](SCROLL, this._resizeProxy);\n                WINDOW[method](eventNames, this._resizeProxy);\n            },\n            _mousedown: function (e) {\n                var that = this, container = that.element[0], options = that.options, anchor = $(options.anchor)[0], toggleTarget = options.toggleTarget, target = kendo.eventTarget(e), popup = $(target).closest('.k-popup'), mobile = popup.parent().parent('.km-shim').length;\n                popup = popup[0];\n                if (!mobile && popup && popup !== that.element[0]) {\n                    return;\n                }\n                if ($(e.target).closest('a').data('rel') === 'popover') {\n                    return;\n                }\n                if (!contains(container, target) && !contains(anchor, target) && !(toggleTarget && contains($(toggleTarget)[0], target))) {\n                    that.close();\n                }\n            },\n            _fit: function (position, size, viewPortSize) {\n                var output = 0;\n                if (position + size > viewPortSize) {\n                    output = viewPortSize - (position + size);\n                }\n                if (position < 0) {\n                    output = -position;\n                }\n                return output;\n            },\n            _flip: function (offset, size, anchorSize, viewPortSize, origin, position, boxSize) {\n                var output = 0;\n                boxSize = boxSize || size;\n                if (position !== origin && position !== CENTER && origin !== CENTER) {\n                    if (offset + boxSize > viewPortSize) {\n                        output += -(anchorSize + size);\n                    }\n                    if (offset + output < 0) {\n                        output += anchorSize + size;\n                    }\n                }\n                return output;\n            },\n            _scrollableParents: function () {\n                return $(this.options.anchor).parentsUntil('body').filter(function (index, element) {\n                    return kendo.isScrollable(element);\n                });\n            },\n            _position: function (fixed) {\n                var that = this, element = that.element, wrapper = that.wrapper, options = that.options, viewport = $(options.viewport), zoomLevel = support.zoomLevel(), isWindow = !!(viewport[0] == window && window.innerWidth && zoomLevel <= 1.02), anchor = $(options.anchor), origins = options.origin.toLowerCase().split(' '), positions = options.position.toLowerCase().split(' '), collisions = that.collisions, siblingContainer, parents, parentZIndex, zIndex = 10002, idx = 0, docEl = document.documentElement, length, viewportOffset, viewportWidth, viewportHeight;\n                if (options.viewport === window) {\n                    viewportOffset = {\n                        top: window.pageYOffset || document.documentElement.scrollTop || 0,\n                        left: window.pageXOffset || document.documentElement.scrollLeft || 0\n                    };\n                } else {\n                    viewportOffset = viewport.offset();\n                }\n                if (isWindow) {\n                    viewportWidth = window.innerWidth;\n                    viewportHeight = window.innerHeight;\n                } else {\n                    viewportWidth = viewport.width();\n                    viewportHeight = viewport.height();\n                }\n                if (isWindow && docEl.scrollHeight - docEl.clientHeight > 0) {\n                    var sign = options.isRtl ? -1 : 1;\n                    viewportWidth -= sign * kendo.support.scrollbar();\n                }\n                siblingContainer = anchor.parents().filter(wrapper.siblings());\n                if (siblingContainer[0]) {\n                    parentZIndex = Math.max(Number(siblingContainer.css('zIndex')), 0);\n                    if (parentZIndex) {\n                        zIndex = parentZIndex + 10;\n                    } else {\n                        parents = anchor.parentsUntil(siblingContainer);\n                        for (length = parents.length; idx < length; idx++) {\n                            parentZIndex = Number($(parents[idx]).css('zIndex'));\n                            if (parentZIndex && zIndex < parentZIndex) {\n                                zIndex = parentZIndex + 10;\n                            }\n                        }\n                    }\n                }\n                wrapper.css('zIndex', zIndex);\n                if (fixed && fixed.isFixed) {\n                    wrapper.css({\n                        left: fixed.x,\n                        top: fixed.y\n                    });\n                } else {\n                    wrapper.css(that._align(origins, positions));\n                }\n                var pos = getOffset(wrapper, POSITION, anchor[0] === wrapper.offsetParent()[0]), offset = getOffset(wrapper), anchorParent = anchor.offsetParent().parent('.k-animation-container,.k-popup,.k-group');\n                if (anchorParent.length) {\n                    pos = getOffset(wrapper, POSITION, true);\n                    offset = getOffset(wrapper);\n                }\n                offset.top -= viewportOffset.top;\n                offset.left -= viewportOffset.left;\n                if (!that.wrapper.data(LOCATION)) {\n                    wrapper.data(LOCATION, extend({}, pos));\n                }\n                var offsets = extend({}, offset), location = extend({}, pos), adjustSize = options.adjustSize;\n                if (collisions[0] === 'fit') {\n                    location.top += that._fit(offsets.top, outerHeight(wrapper) + adjustSize.height, viewportHeight / zoomLevel);\n                }\n                if (collisions[1] === 'fit') {\n                    location.left += that._fit(offsets.left, outerWidth(wrapper) + adjustSize.width, viewportWidth / zoomLevel);\n                }\n                var flipPos = extend({}, location);\n                var elementHeight = outerHeight(element);\n                var wrapperHeight = outerHeight(wrapper);\n                if (!wrapper.height() && elementHeight) {\n                    wrapperHeight = wrapperHeight + elementHeight;\n                }\n                if (collisions[0] === 'flip') {\n                    location.top += that._flip(offsets.top, elementHeight, outerHeight(anchor), viewportHeight / zoomLevel, origins[0], positions[0], wrapperHeight);\n                }\n                if (collisions[1] === 'flip') {\n                    location.left += that._flip(offsets.left, outerWidth(element), outerWidth(anchor), viewportWidth / zoomLevel, origins[1], positions[1], outerWidth(wrapper));\n                }\n                element.css(POSITION, ABSOLUTE);\n                wrapper.css(location);\n                return location.left != flipPos.left || location.top != flipPos.top;\n            },\n            _align: function (origin, position) {\n                var that = this, element = that.wrapper, anchor = $(that.options.anchor), verticalOrigin = origin[0], horizontalOrigin = origin[1], verticalPosition = position[0], horizontalPosition = position[1], anchorOffset = getOffset(anchor), appendTo = $(that.options.appendTo), appendToOffset, width = outerWidth(element), height = outerHeight(element), anchorWidth = outerWidth(anchor), anchorHeight = outerHeight(anchor), top = anchorOffset.top, left = anchorOffset.left, round = Math.round;\n                if (appendTo[0] != document.body) {\n                    appendToOffset = getOffset(appendTo);\n                    top -= appendToOffset.top;\n                    left -= appendToOffset.left;\n                }\n                if (verticalOrigin === BOTTOM) {\n                    top += anchorHeight;\n                }\n                if (verticalOrigin === CENTER) {\n                    top += round(anchorHeight / 2);\n                }\n                if (verticalPosition === BOTTOM) {\n                    top -= height;\n                }\n                if (verticalPosition === CENTER) {\n                    top -= round(height / 2);\n                }\n                if (horizontalOrigin === RIGHT) {\n                    left += anchorWidth;\n                }\n                if (horizontalOrigin === CENTER) {\n                    left += round(anchorWidth / 2);\n                }\n                if (horizontalPosition === RIGHT) {\n                    left -= width;\n                }\n                if (horizontalPosition === CENTER) {\n                    left -= round(width / 2);\n                }\n                return {\n                    top: top,\n                    left: left\n                };\n            }\n        });\n        ui.plugin(Popup);\n        var tabKeyTrapNS = 'kendoTabKeyTrap';\n        var focusableNodesSelector = 'a[href], area[href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), button:not([disabled]), iframe, object, embed, [tabindex], *[contenteditable]';\n        var TabKeyTrap = Class.extend({\n            init: function (element) {\n                this.element = $(element);\n                this.element.autoApplyNS(tabKeyTrapNS);\n            },\n            trap: function () {\n                this.element.on('keydown', proxy(this._keepInTrap, this));\n            },\n            removeTrap: function () {\n                this.element.kendoDestroy(tabKeyTrapNS);\n            },\n            destroy: function () {\n                this.element.kendoDestroy(tabKeyTrapNS);\n                this.element = undefined;\n            },\n            shouldTrap: function () {\n                return true;\n            },\n            _keepInTrap: function (e) {\n                if (e.which !== 9 || !this.shouldTrap()) {\n                    return;\n                }\n                var target = e.target;\n                var elements = this.element.find(focusableNodesSelector).filter(':visible[tabindex!=-1]');\n                var focusableItems = elements.sort(function (prevEl, nextEl) {\n                    return prevEl.tabIndex - nextEl.tabIndex;\n                });\n                var focusableItemsCount = focusableItems.length;\n                var lastIndex = focusableItemsCount - 1;\n                var focusedItemIndex = focusableItems.index(target);\n                if (e.shiftKey) {\n                    if (focusedItemIndex === 0) {\n                        focusableItems.get(lastIndex).focus();\n                    } else {\n                        focusableItems.get(focusedItemIndex - 1).focus();\n                    }\n                } else {\n                    if (focusedItemIndex === lastIndex) {\n                        focusableItems.get(0).focus();\n                    } else {\n                        focusableItems.get(focusedItemIndex + 1).focus();\n                    }\n                }\n                e.preventDefault();\n            }\n        });\n        ui.Popup.TabKeyTrap = TabKeyTrap;\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('drawing/surface-tooltip', [\n        'kendo.popup',\n        'drawing/kendo-drawing'\n    ], f);\n}(function () {\n    (function ($) {\n        var NS = '.kendo';\n        var kendo = window.kendo;\n        var deepExtend = kendo.deepExtend;\n        var utils = kendo.drawing.util;\n        var defined = utils.defined;\n        var limitValue = utils.limitValue;\n        var eventCoordinates = utils.eventCoordinates;\n        var outerWidth = kendo._outerWidth;\n        var outerHeight = kendo._outerHeight;\n        var proxy = $.proxy;\n        var TOOLTIP_TEMPLATE = '<div class=\"k-tooltip\">' + '<div class=\"k-tooltip-content\"></div>' + '</div>';\n        var TOOLTIP_CLOSE_TEMPLATE = '<div class=\"k-tooltip-button\"><a href=\"\\\\#\" class=\"k-icon k-i-close\">close</a></div>';\n        var SurfaceTooltip = kendo.Class.extend({\n            init: function (surface, options) {\n                this.element = $(TOOLTIP_TEMPLATE);\n                this.content = this.element.children('.k-tooltip-content');\n                options = options || {};\n                this.options = deepExtend({}, this.options, this._tooltipOptions(options));\n                this.popupOptions = {\n                    appendTo: options.appendTo,\n                    animation: options.animation,\n                    copyAnchorStyles: false,\n                    collision: 'fit fit'\n                };\n                this._openPopupHandler = $.proxy(this._openPopup, this);\n                this.surface = surface;\n                this._bindEvents();\n            },\n            options: {\n                position: 'top',\n                showOn: 'mouseenter',\n                offset: 7,\n                autoHide: true,\n                hideDelay: 0,\n                showAfter: 100\n            },\n            _bindEvents: function () {\n                this._showHandler = proxy(this._showEvent, this);\n                this._surfaceLeaveHandler = proxy(this._surfaceLeave, this);\n                this._mouseleaveHandler = proxy(this._mouseleave, this);\n                this._mousemoveHandler = proxy(this._mousemove, this);\n                this.surface.bind('click', this._showHandler);\n                this.surface.bind('mouseenter', this._showHandler);\n                this.surface.bind('mouseleave', this._mouseleaveHandler);\n                this.surface.bind('mousemove', this._mousemoveHandler);\n                this.surface.element.on('mouseleave' + NS, this._surfaceLeaveHandler);\n                this.element.on('click' + NS, '.k-tooltip-button', proxy(this._hideClick, this));\n            },\n            getPopup: function () {\n                if (!this.popup) {\n                    this.popup = new kendo.ui.Popup(this.element, this.popupOptions);\n                }\n                return this.popup;\n            },\n            destroy: function () {\n                var popup = this.popup;\n                this.surface.unbind('click', this._showHandler);\n                this.surface.unbind('mouseenter', this._showHandler);\n                this.surface.unbind('mouseleave', this._mouseleaveHandler);\n                this.surface.unbind('mousemove', this._mousemoveHandler);\n                this.surface.element.off('mouseleave' + NS, this._surfaceLeaveHandler);\n                this.element.off('click' + NS);\n                if (popup) {\n                    popup.destroy();\n                    delete this.popup;\n                }\n                delete this.popupOptions;\n                clearTimeout(this._timeout);\n                delete this.element;\n                delete this.content;\n                delete this.surface;\n            },\n            _tooltipOptions: function (options) {\n                options = options || {};\n                return {\n                    position: options.position,\n                    showOn: options.showOn,\n                    offset: options.offset,\n                    autoHide: options.autoHide,\n                    width: options.width,\n                    height: options.height,\n                    content: options.content,\n                    shared: options.shared,\n                    hideDelay: options.hideDelay,\n                    showAfter: options.showAfter\n                };\n            },\n            _tooltipShape: function (shape) {\n                while (shape && !shape.options.tooltip) {\n                    shape = shape.parent;\n                }\n                return shape;\n            },\n            _updateContent: function (target, shape, options) {\n                var content = options.content;\n                if (kendo.isFunction(content)) {\n                    content = content({\n                        element: shape,\n                        target: target\n                    });\n                }\n                if (content) {\n                    this.content.html(content);\n                    return true;\n                }\n            },\n            _position: function (shape, options, elementSize, event) {\n                var position = options.position;\n                var tooltipOffset = options.offset || 0;\n                var surface = this.surface;\n                var offset = surface._instance._elementOffset();\n                var size = surface.getSize();\n                var surfaceOffset = surface._instance._offset;\n                var bbox = shape.bbox();\n                var width = elementSize.width;\n                var height = elementSize.height;\n                var left = 0, top = 0;\n                bbox.origin.translate(offset.left, offset.top);\n                if (surfaceOffset) {\n                    bbox.origin.translate(-surfaceOffset.x, -surfaceOffset.y);\n                }\n                if (position == 'cursor' && event) {\n                    var coord = eventCoordinates(event);\n                    left = coord.x - width / 2;\n                    top = coord.y - height - tooltipOffset;\n                } else if (position == 'left') {\n                    left = bbox.origin.x - width - tooltipOffset;\n                    top = bbox.center().y - height / 2;\n                } else if (position == 'right') {\n                    left = bbox.bottomRight().x + tooltipOffset;\n                    top = bbox.center().y - height / 2;\n                } else if (position == 'bottom') {\n                    left = bbox.center().x - width / 2;\n                    top = bbox.bottomRight().y + tooltipOffset;\n                } else {\n                    left = bbox.center().x - width / 2;\n                    top = bbox.origin.y - height - tooltipOffset;\n                }\n                return {\n                    left: limitValue(left, offset.left, offset.left + size.width),\n                    top: limitValue(top, offset.top, offset.top + size.height)\n                };\n            },\n            show: function (shape, options) {\n                this._show(shape, shape, deepExtend({}, this.options, this._tooltipOptions(shape.options.tooltip), options));\n            },\n            hide: function () {\n                var popup = this.popup;\n                var current = this._current;\n                delete this._current;\n                clearTimeout(this._showTimeout);\n                if (popup && popup.visible() && current && !this.surface.trigger('tooltipClose', {\n                        element: current.shape,\n                        target: current.target,\n                        popup: popup\n                    })) {\n                    popup.close();\n                }\n            },\n            _hideClick: function (e) {\n                e.preventDefault();\n                this.hide();\n            },\n            _show: function (target, shape, options, event, delay) {\n                var current = this._current;\n                clearTimeout(this._timeout);\n                if (current && (current.shape === shape && options.shared || current.target === target)) {\n                    return;\n                }\n                clearTimeout(this._showTimeout);\n                var popup = this.getPopup();\n                if (!this.surface.trigger('tooltipOpen', {\n                        element: shape,\n                        target: target,\n                        popup: popup\n                    }) && this._updateContent(target, shape, options)) {\n                    this._autoHide(options);\n                    var elementSize = this._measure(options);\n                    if (popup.visible()) {\n                        popup.close(true);\n                    }\n                    this._current = {\n                        options: options,\n                        elementSize: elementSize,\n                        shape: shape,\n                        target: target,\n                        position: this._position(options.shared ? shape : target, options, elementSize, event)\n                    };\n                    if (delay) {\n                        this._showTimeout = setTimeout(this._openPopupHandler, options.showAfter || 0);\n                    } else {\n                        this._openPopup();\n                    }\n                }\n            },\n            _openPopup: function () {\n                var current = this._current;\n                var position = current.position;\n                this.getPopup().open(position.left, position.top);\n            },\n            _autoHide: function (options) {\n                if (options.autoHide && this._closeButton) {\n                    this.element.removeClass('k-tooltip-closable');\n                    this._closeButton.remove();\n                    delete this._closeButton;\n                }\n                if (!options.autoHide && !this._closeButton) {\n                    this.element.addClass('k-tooltip-closable');\n                    this._closeButton = $(TOOLTIP_CLOSE_TEMPLATE).prependTo(this.element);\n                }\n            },\n            _showEvent: function (e) {\n                var shape = this._tooltipShape(e.element);\n                if (shape) {\n                    var options = deepExtend({}, this.options, this._tooltipOptions(shape.options.tooltip));\n                    if (options && options.showOn == e.type) {\n                        this._show(e.element, shape, options, e.originalEvent, true);\n                    }\n                }\n            },\n            _measure: function (options) {\n                var popup = this.getPopup();\n                var width, height;\n                this.element.css({\n                    width: 'auto',\n                    height: 'auto'\n                });\n                var visible = popup.visible();\n                if (!visible) {\n                    popup.wrapper.show();\n                }\n                this.element.css({\n                    width: defined(options.width) ? options.width : 'auto',\n                    height: defined(options.height) ? options.height : 'auto'\n                });\n                width = outerWidth(this.element);\n                height = outerHeight(this.element);\n                if (!visible) {\n                    popup.wrapper.hide();\n                }\n                return {\n                    width: width,\n                    height: height\n                };\n            },\n            _mouseleave: function (e) {\n                if (this.popup && !this._popupRelatedTarget(e.originalEvent)) {\n                    var tooltip = this;\n                    var current = tooltip._current;\n                    if (current && current.options.autoHide) {\n                        tooltip._timeout = setTimeout(function () {\n                            clearTimeout(tooltip._showTimeout);\n                            tooltip.hide();\n                        }, current.options.hideDelay || 0);\n                    }\n                }\n            },\n            _mousemove: function (e) {\n                var current = this._current;\n                if (current && e.element) {\n                    var options = current.options;\n                    if (options.position == 'cursor') {\n                        var position = this._position(e.element, options, current.elementSize, e.originalEvent);\n                        current.position = position;\n                        this.getPopup().wrapper.css({\n                            left: position.left,\n                            top: position.top\n                        });\n                    }\n                }\n            },\n            _surfaceLeave: function (e) {\n                if (this.popup && !this._popupRelatedTarget(e)) {\n                    clearTimeout(this._showTimeout);\n                    this.hide();\n                }\n            },\n            _popupRelatedTarget: function (e) {\n                return e.relatedTarget && $(e.relatedTarget).closest(this.popup.wrapper).length;\n            }\n        });\n        kendo.drawing.SurfaceTooltip = SurfaceTooltip;\n    }(window.kendo.jQuery));\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('drawing/surface', [\n        'drawing/kendo-drawing',\n        'drawing/surface-tooltip'\n    ], f);\n}(function () {\n    (function ($) {\n        var kendo = window.kendo;\n        var draw = kendo.drawing;\n        var DrawingSurface = draw.Surface;\n        var Widget = kendo.ui.Widget;\n        var deepExtend = kendo.deepExtend;\n        var proxy = $.proxy;\n        kendo.support.svg = DrawingSurface.support.svg;\n        kendo.support.canvas = DrawingSurface.support.canvas;\n        var Surface = Widget.extend({\n            init: function (element, options) {\n                this.options = deepExtend({}, this.options, options);\n                Widget.fn.init.call(this, element, this.options);\n                this._instance = DrawingSurface.create(this.element[0], options);\n                if (this._instance.translate) {\n                    this.translate = translate;\n                }\n                this._triggerInstanceHandler = proxy(this._triggerInstanceEvent, this);\n                this._bindHandler('click');\n                this._bindHandler('mouseenter');\n                this._bindHandler('mouseleave');\n                this._bindHandler('mousemove');\n                this._enableTracking();\n            },\n            options: {\n                name: 'Surface',\n                tooltip: {}\n            },\n            events: [\n                'click',\n                'mouseenter',\n                'mouseleave',\n                'mousemove',\n                'resize',\n                'tooltipOpen',\n                'tooltipClose'\n            ],\n            _triggerInstanceEvent: function (e) {\n                this.trigger(e.type, e);\n            },\n            _bindHandler: function (event) {\n                this._instance.bind(event, this._triggerInstanceHandler);\n            },\n            draw: function (element) {\n                this._instance.draw(element);\n            },\n            clear: function () {\n                if (this._instance) {\n                    this._instance.clear();\n                }\n                this.hideTooltip();\n            },\n            destroy: function () {\n                if (this._instance) {\n                    this._instance.destroy();\n                    delete this._instance;\n                }\n                if (this._tooltip) {\n                    this._tooltip.destroy();\n                    delete this._tooltip;\n                }\n                Widget.fn.destroy.call(this);\n            },\n            exportVisual: function () {\n                return this._instance.exportVisual();\n            },\n            eventTarget: function (e) {\n                return this._instance.eventTarget(e);\n            },\n            showTooltip: function (shape, options) {\n                if (this._tooltip) {\n                    this._tooltip.show(shape, options);\n                }\n            },\n            hideTooltip: function () {\n                if (this._tooltip) {\n                    this._tooltip.hide();\n                }\n            },\n            suspendTracking: function () {\n                this._instance.suspendTracking();\n                this.hideTooltip();\n            },\n            resumeTracking: function () {\n                this._instance.resumeTracking();\n            },\n            getSize: function () {\n                return {\n                    width: this.element.width(),\n                    height: this.element.height()\n                };\n            },\n            setSize: function (size) {\n                this.element.css({\n                    width: size.width,\n                    height: size.height\n                });\n                this._size = size;\n                this._instance.currentSize(size);\n                this._resize();\n            },\n            _resize: function () {\n                this._instance.currentSize(this._size);\n                this._instance._resize();\n            },\n            _enableTracking: function () {\n                if (kendo.ui.Popup) {\n                    this._tooltip = new draw.SurfaceTooltip(this, this.options.tooltip || {});\n                }\n            }\n        });\n        kendo.ui.plugin(Surface);\n        Surface.create = function (element, options) {\n            return new Surface(element, options);\n        };\n        kendo.drawing.Surface = Surface;\n        function translate(offset) {\n            this._instance.translate(offset);\n        }\n    }(window.kendo.jQuery));\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('drawing/html', ['drawing/kendo-drawing'], f);\n}(function () {\n    (function ($) {\n        var kendo = window.kendo;\n        var drawing = kendo.drawing;\n        var drawDOM = drawing.drawDOM;\n        drawing.drawDOM = function (element, options) {\n            return drawDOM($(element)[0], options);\n        };\n        drawing.drawDOM.drawText = drawDOM.drawText;\n        drawing.drawDOM.getFontFaces = drawDOM.getFontFaces;\n    }(window.kendo.jQuery));\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.drawing', [\n        'drawing/util',\n        'drawing/kendo-drawing',\n        'drawing/surface-tooltip',\n        'drawing/surface',\n        'drawing/html'\n    ], f);\n}(function () {\n    var __meta__ = {\n        id: 'drawing',\n        name: 'Drawing API',\n        category: 'framework',\n        description: 'The Kendo UI low-level drawing API',\n        depends: [\n            'core',\n            'color',\n            'popup'\n        ]\n    };\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.validator', ['kendo.core'], f);\n}(function () {\n    var __meta__ = {\n        id: 'validator',\n        name: 'Validator',\n        category: 'web',\n        description: 'The Validator offers an easy way to do a client-side form validation.',\n        depends: ['core']\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, Widget = kendo.ui.Widget, NS = '.kendoValidator', INVALIDMSG = 'k-invalid-msg', invalidMsgRegExp = new RegExp(INVALIDMSG, 'i'), INVALIDINPUT = 'k-invalid', VALIDINPUT = 'k-valid', emailRegExp = /^[a-zA-Z0-9.!#$%&'*+\\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/i, urlRegExp = /^(https?|ftp):\\/\\/(((([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(%[\\da-f]{2})|[!\\$&'\\(\\)\\*\\+,;=]|:)*@)?(((\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])\\.(\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])\\.(\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])\\.(\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5]))|((([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))\\.)+(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))\\.?)(:\\d*)?)(\\/((([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(%[\\da-f]{2})|[!\\$&'\\(\\)\\*\\+,;=]|:|@)+(\\/(([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(%[\\da-f]{2})|[!\\$&'\\(\\)\\*\\+,;=]|:|@)*)*)?)?(\\?((([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(%[\\da-f]{2})|[!\\$&'\\(\\)\\*\\+,;=]|:|@)|[\\uE000-\\uF8FF]|\\/|\\?)*)?(\\#((([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(%[\\da-f]{2})|[!\\$&'\\(\\)\\*\\+,;=]|:|@)|\\/|\\?)*)?$/i, INPUTSELECTOR = ':input:not(:button,[type=submit],[type=reset],[disabled],[readonly])', CHECKBOXSELECTOR = ':checkbox:not([disabled],[readonly])', NUMBERINPUTSELECTOR = '[type=number],[type=range]', BLUR = 'blur', NAME = 'name', FORM = 'form', NOVALIDATE = 'novalidate', VALIDATE = 'validate', CHANGE = 'change', VALIDATE_INPUT = 'validateInput', proxy = $.proxy, patternMatcher = function (value, pattern) {\n                if (typeof pattern === 'string') {\n                    pattern = new RegExp('^(?:' + pattern + ')$');\n                }\n                return pattern.test(value);\n            }, matcher = function (input, selector, pattern) {\n                var value = input.val();\n                if (input.filter(selector).length && value !== '') {\n                    return patternMatcher(value, pattern);\n                }\n                return true;\n            }, hasAttribute = function (input, name) {\n                if (input.length) {\n                    return input[0].attributes[name] != null;\n                }\n                return false;\n            };\n        if (!kendo.ui.validator) {\n            kendo.ui.validator = {\n                rules: {},\n                messages: {}\n            };\n        }\n        function resolveRules(element) {\n            var resolvers = kendo.ui.validator.ruleResolvers || {}, rules = {}, name;\n            for (name in resolvers) {\n                $.extend(true, rules, resolvers[name].resolve(element));\n            }\n            return rules;\n        }\n        function decode(value) {\n            return value.replace(/&amp/g, '&amp;').replace(/&quot;/g, '\"').replace(/&#39;/g, '\\'').replace(/&lt;/g, '<').replace(/&gt;/g, '>');\n        }\n        function numberOfDecimalDigits(value) {\n            value = (value + '').split('.');\n            if (value.length > 1) {\n                return value[1].length;\n            }\n            return 0;\n        }\n        function parseHtml(text) {\n            if ($.parseHTML) {\n                return $($.parseHTML(text));\n            }\n            return $(text);\n        }\n        function searchForMessageContainer(elements, fieldName) {\n            var containers = $(), element, attr;\n            for (var idx = 0, length = elements.length; idx < length; idx++) {\n                element = elements[idx];\n                if (invalidMsgRegExp.test(element.className)) {\n                    attr = element.getAttribute(kendo.attr('for'));\n                    if (attr === fieldName) {\n                        containers = containers.add(element);\n                    }\n                }\n            }\n            return containers;\n        }\n        var Validator = Widget.extend({\n            init: function (element, options) {\n                var that = this, resolved = resolveRules(element), validateAttributeSelector = '[' + kendo.attr('validate') + '!=false]';\n                options = options || {};\n                options.rules = $.extend({}, kendo.ui.validator.rules, resolved.rules, options.rules);\n                options.messages = $.extend({}, kendo.ui.validator.messages, resolved.messages, options.messages);\n                Widget.fn.init.call(that, element, options);\n                that._errorTemplate = kendo.template(that.options.errorTemplate);\n                if (that.element.is(FORM)) {\n                    that.element.attr(NOVALIDATE, NOVALIDATE);\n                }\n                that._inputSelector = INPUTSELECTOR + validateAttributeSelector;\n                that._checkboxSelector = CHECKBOXSELECTOR + validateAttributeSelector;\n                that._errors = {};\n                that._attachEvents();\n                that._isValidated = false;\n            },\n            events: [\n                VALIDATE,\n                CHANGE,\n                VALIDATE_INPUT\n            ],\n            options: {\n                name: 'Validator',\n                errorTemplate: '<span class=\"k-widget k-tooltip k-tooltip-validation\">' + '<span class=\"k-icon k-i-warning\"> </span> #=message#</span>',\n                messages: {\n                    required: '{0} is required',\n                    pattern: '{0} is not valid',\n                    min: '{0} should be greater than or equal to {1}',\n                    max: '{0} should be smaller than or equal to {1}',\n                    step: '{0} is not valid',\n                    email: '{0} is not valid email',\n                    url: '{0} is not valid URL',\n                    date: '{0} is not valid date',\n                    dateCompare: 'End date should be greater than or equal to the start date'\n                },\n                rules: {\n                    required: function (input) {\n                        var checkbox = input.filter('[type=checkbox]').length && !input.is(':checked'), value = input.val();\n                        return !(hasAttribute(input, 'required') && (!value || value === '' || value.length === 0 || checkbox));\n                    },\n                    pattern: function (input) {\n                        if (input.filter('[type=text],[type=email],[type=url],[type=tel],[type=search],[type=password]').filter('[pattern]').length && input.val() !== '') {\n                            return patternMatcher(input.val(), input.attr('pattern'));\n                        }\n                        return true;\n                    },\n                    min: function (input) {\n                        if (input.filter(NUMBERINPUTSELECTOR + ',[' + kendo.attr('type') + '=number]').filter('[min]').length && input.val() !== '') {\n                            var min = parseFloat(input.attr('min')) || 0, val = kendo.parseFloat(input.val());\n                            return min <= val;\n                        }\n                        return true;\n                    },\n                    max: function (input) {\n                        if (input.filter(NUMBERINPUTSELECTOR + ',[' + kendo.attr('type') + '=number]').filter('[max]').length && input.val() !== '') {\n                            var max = parseFloat(input.attr('max')) || 0, val = kendo.parseFloat(input.val());\n                            return max >= val;\n                        }\n                        return true;\n                    },\n                    step: function (input) {\n                        if (input.filter(NUMBERINPUTSELECTOR + ',[' + kendo.attr('type') + '=number]').filter('[step]').length && input.val() !== '') {\n                            var min = parseFloat(input.attr('min')) || 0, step = parseFloat(input.attr('step')) || 1, val = parseFloat(input.val()), decimals = numberOfDecimalDigits(step), raise;\n                            if (decimals) {\n                                raise = Math.pow(10, decimals);\n                                return Math.floor((val - min) * raise) % (step * raise) / Math.pow(100, decimals) === 0;\n                            }\n                            return (val - min) % step === 0;\n                        }\n                        return true;\n                    },\n                    email: function (input) {\n                        return matcher(input, '[type=email],[' + kendo.attr('type') + '=email]', emailRegExp);\n                    },\n                    url: function (input) {\n                        return matcher(input, '[type=url],[' + kendo.attr('type') + '=url]', urlRegExp);\n                    },\n                    date: function (input) {\n                        if (input.filter('[type^=date],[' + kendo.attr('type') + '=date]').length && input.val() !== '') {\n                            return kendo.parseDate(input.val(), input.attr(kendo.attr('format'))) !== null;\n                        }\n                        return true;\n                    }\n                },\n                validateOnBlur: true\n            },\n            destroy: function () {\n                Widget.fn.destroy.call(this);\n                this.element.off(NS);\n            },\n            value: function () {\n                if (!this._isValidated) {\n                    return false;\n                }\n                return this.errors().length === 0;\n            },\n            _submit: function (e) {\n                if (!this.validate()) {\n                    e.stopPropagation();\n                    e.stopImmediatePropagation();\n                    e.preventDefault();\n                    return false;\n                }\n                return true;\n            },\n            _checkElement: function (element) {\n                var state = this.value();\n                this.validateInput(element);\n                if (this.value() !== state) {\n                    this.trigger(CHANGE);\n                }\n            },\n            _attachEvents: function () {\n                var that = this;\n                if (that.element.is(FORM)) {\n                    that.element.on('submit' + NS, proxy(that._submit, that));\n                }\n                if (that.options.validateOnBlur) {\n                    if (!that.element.is(INPUTSELECTOR)) {\n                        that.element.on(BLUR + NS, that._inputSelector, function () {\n                            that._checkElement($(this));\n                        });\n                        that.element.on('click' + NS, that._checkboxSelector, function () {\n                            that._checkElement($(this));\n                        });\n                    } else {\n                        that.element.on(BLUR + NS, function () {\n                            that._checkElement(that.element);\n                        });\n                        if (that.element.is(CHECKBOXSELECTOR)) {\n                            that.element.on('click' + NS, function () {\n                                that._checkElement(that.element);\n                            });\n                        }\n                    }\n                }\n            },\n            validate: function () {\n                var inputs;\n                var idx;\n                var result = false;\n                var length;\n                var isValid = this.value();\n                this._errors = {};\n                if (!this.element.is(INPUTSELECTOR)) {\n                    var invalid = false;\n                    inputs = this.element.find(this._inputSelector);\n                    for (idx = 0, length = inputs.length; idx < length; idx++) {\n                        if (!this.validateInput(inputs.eq(idx))) {\n                            invalid = true;\n                        }\n                    }\n                    result = !invalid;\n                } else {\n                    result = this.validateInput(this.element);\n                }\n                this.trigger(VALIDATE, { valid: result });\n                if (isValid !== result) {\n                    this.trigger(CHANGE);\n                }\n                return result;\n            },\n            validateInput: function (input) {\n                input = $(input);\n                this._isValidated = true;\n                var that = this, template = that._errorTemplate, result = that._checkValidity(input), valid = result.valid, className = '.' + INVALIDMSG, fieldName = input.attr(NAME) || '', lbl = that._findMessageContainer(fieldName).add(input.next(className).filter(function () {\n                        var element = $(this);\n                        if (element.filter('[' + kendo.attr('for') + ']').length) {\n                            return element.attr(kendo.attr('for')) === fieldName;\n                        }\n                        return true;\n                    })).hide(), messageText, wasValid = !input.attr('aria-invalid');\n                input.removeAttr('aria-invalid');\n                if (!valid) {\n                    messageText = that._extractMessage(input, result.key);\n                    that._errors[fieldName] = messageText;\n                    var messageLabel = parseHtml(template({ message: decode(messageText) }));\n                    var lblId = lbl.attr('id');\n                    that._decorateMessageContainer(messageLabel, fieldName);\n                    if (lblId) {\n                        messageLabel.attr('id', lblId);\n                    }\n                    if (!lbl.replaceWith(messageLabel).length) {\n                        messageLabel.insertAfter(input);\n                    }\n                    messageLabel.show();\n                    input.attr('aria-invalid', true);\n                } else {\n                    delete that._errors[fieldName];\n                }\n                if (wasValid !== valid) {\n                    this.trigger(VALIDATE_INPUT, {\n                        valid: valid,\n                        input: input\n                    });\n                }\n                input.toggleClass(INVALIDINPUT, !valid);\n                input.toggleClass(VALIDINPUT, valid);\n                return valid;\n            },\n            hideMessages: function () {\n                var that = this, className = '.' + INVALIDMSG, element = that.element;\n                if (!element.is(INPUTSELECTOR)) {\n                    element.find(className).hide();\n                } else {\n                    element.next(className).hide();\n                }\n            },\n            _findMessageContainer: function (fieldName) {\n                var locators = kendo.ui.validator.messageLocators, name, containers = $();\n                for (var idx = 0, length = this.element.length; idx < length; idx++) {\n                    containers = containers.add(searchForMessageContainer(this.element[idx].getElementsByTagName('*'), fieldName));\n                }\n                for (name in locators) {\n                    containers = containers.add(locators[name].locate(this.element, fieldName));\n                }\n                return containers;\n            },\n            _decorateMessageContainer: function (container, fieldName) {\n                var locators = kendo.ui.validator.messageLocators, name;\n                container.addClass(INVALIDMSG).attr(kendo.attr('for'), fieldName || '');\n                for (name in locators) {\n                    locators[name].decorate(container, fieldName);\n                }\n                container.attr('role', 'alert');\n            },\n            _extractMessage: function (input, ruleKey) {\n                var that = this, customMessage = that.options.messages[ruleKey], fieldName = input.attr(NAME);\n                customMessage = kendo.isFunction(customMessage) ? customMessage(input) : customMessage;\n                return kendo.format(input.attr(kendo.attr(ruleKey + '-msg')) || input.attr('validationMessage') || input.attr('title') || customMessage || '', fieldName, input.attr(ruleKey) || input.attr(kendo.attr(ruleKey)));\n            },\n            _checkValidity: function (input) {\n                var rules = this.options.rules, rule;\n                for (rule in rules) {\n                    if (!rules[rule].call(this, input)) {\n                        return {\n                            valid: false,\n                            key: rule\n                        };\n                    }\n                }\n                return { valid: true };\n            },\n            errors: function () {\n                var results = [], errors = this._errors, error;\n                for (error in errors) {\n                    results.push(errors[error]);\n                }\n                return results;\n            }\n        });\n        kendo.ui.plugin(Validator);\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.userevents', ['kendo.core'], f);\n}(function () {\n    var __meta__ = {\n        id: 'userevents',\n        name: 'User Events',\n        category: 'framework',\n        depends: ['core'],\n        hidden: true\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, support = kendo.support, Class = kendo.Class, Observable = kendo.Observable, now = $.now, extend = $.extend, OS = support.mobileOS, invalidZeroEvents = OS && OS.android, DEFAULT_MIN_HOLD = 800, DEFAULT_THRESHOLD = support.browser.msie ? 5 : 0, PRESS = 'press', HOLD = 'hold', SELECT = 'select', START = 'start', MOVE = 'move', END = 'end', CANCEL = 'cancel', TAP = 'tap', RELEASE = 'release', GESTURESTART = 'gesturestart', GESTURECHANGE = 'gesturechange', GESTUREEND = 'gestureend', GESTURETAP = 'gesturetap';\n        var THRESHOLD = {\n            'api': 0,\n            'touch': 0,\n            'mouse': 9,\n            'pointer': 9\n        };\n        var ENABLE_GLOBAL_SURFACE = !support.touch || support.mouseAndTouchPresent;\n        function touchDelta(touch1, touch2) {\n            var x1 = touch1.x.location, y1 = touch1.y.location, x2 = touch2.x.location, y2 = touch2.y.location, dx = x1 - x2, dy = y1 - y2;\n            return {\n                center: {\n                    x: (x1 + x2) / 2,\n                    y: (y1 + y2) / 2\n                },\n                distance: Math.sqrt(dx * dx + dy * dy)\n            };\n        }\n        function getTouches(e) {\n            var touches = [], originalEvent = e.originalEvent, currentTarget = e.currentTarget, idx = 0, length, changedTouches, touch;\n            if (e.api) {\n                touches.push({\n                    id: 2,\n                    event: e,\n                    target: e.target,\n                    currentTarget: e.target,\n                    location: e,\n                    type: 'api'\n                });\n            } else if (e.type.match(/touch/)) {\n                changedTouches = originalEvent ? originalEvent.changedTouches : [];\n                for (length = changedTouches.length; idx < length; idx++) {\n                    touch = changedTouches[idx];\n                    touches.push({\n                        location: touch,\n                        event: e,\n                        target: touch.target,\n                        currentTarget: currentTarget,\n                        id: touch.identifier,\n                        type: 'touch'\n                    });\n                }\n            } else if (support.pointers || support.msPointers) {\n                touches.push({\n                    location: originalEvent,\n                    event: e,\n                    target: e.target,\n                    currentTarget: currentTarget,\n                    id: originalEvent.pointerId,\n                    type: 'pointer'\n                });\n            } else {\n                touches.push({\n                    id: 1,\n                    event: e,\n                    target: e.target,\n                    currentTarget: currentTarget,\n                    location: e,\n                    type: 'mouse'\n                });\n            }\n            return touches;\n        }\n        var TouchAxis = Class.extend({\n            init: function (axis, location) {\n                var that = this;\n                that.axis = axis;\n                that._updateLocationData(location);\n                that.startLocation = that.location;\n                that.velocity = that.delta = 0;\n                that.timeStamp = now();\n            },\n            move: function (location) {\n                var that = this, offset = location['page' + that.axis], timeStamp = now(), timeDelta = timeStamp - that.timeStamp || 1;\n                if (!offset && invalidZeroEvents) {\n                    return;\n                }\n                that.delta = offset - that.location;\n                that._updateLocationData(location);\n                that.initialDelta = offset - that.startLocation;\n                that.velocity = that.delta / timeDelta;\n                that.timeStamp = timeStamp;\n            },\n            _updateLocationData: function (location) {\n                var that = this, axis = that.axis;\n                that.location = location['page' + axis];\n                that.client = location['client' + axis];\n                that.screen = location['screen' + axis];\n            }\n        });\n        var Touch = Class.extend({\n            init: function (userEvents, target, touchInfo) {\n                extend(this, {\n                    x: new TouchAxis('X', touchInfo.location),\n                    y: new TouchAxis('Y', touchInfo.location),\n                    type: touchInfo.type,\n                    useClickAsTap: userEvents.useClickAsTap,\n                    threshold: userEvents.threshold || THRESHOLD[touchInfo.type],\n                    userEvents: userEvents,\n                    target: target,\n                    currentTarget: touchInfo.currentTarget,\n                    initialTouch: touchInfo.target,\n                    id: touchInfo.id,\n                    pressEvent: touchInfo,\n                    _moved: false,\n                    _finished: false\n                });\n            },\n            press: function () {\n                this._holdTimeout = setTimeout($.proxy(this, '_hold'), this.userEvents.minHold);\n                this._trigger(PRESS, this.pressEvent);\n            },\n            _hold: function () {\n                this._trigger(HOLD, this.pressEvent);\n            },\n            move: function (touchInfo) {\n                var that = this;\n                if (that._finished) {\n                    return;\n                }\n                that.x.move(touchInfo.location);\n                that.y.move(touchInfo.location);\n                if (!that._moved) {\n                    if (that._withinIgnoreThreshold()) {\n                        return;\n                    }\n                    if (!UserEvents.current || UserEvents.current === that.userEvents) {\n                        that._start(touchInfo);\n                    } else {\n                        return that.dispose();\n                    }\n                }\n                if (!that._finished) {\n                    that._trigger(MOVE, touchInfo);\n                }\n            },\n            end: function (touchInfo) {\n                this.endTime = now();\n                if (this._finished) {\n                    return;\n                }\n                this._finished = true;\n                this._trigger(RELEASE, touchInfo);\n                if (this._moved) {\n                    this._trigger(END, touchInfo);\n                } else {\n                    if (!this.useClickAsTap) {\n                        this._trigger(TAP, touchInfo);\n                    }\n                }\n                clearTimeout(this._holdTimeout);\n                this.dispose();\n            },\n            dispose: function () {\n                var userEvents = this.userEvents, activeTouches = userEvents.touches;\n                this._finished = true;\n                this.pressEvent = null;\n                clearTimeout(this._holdTimeout);\n                activeTouches.splice($.inArray(this, activeTouches), 1);\n            },\n            skip: function () {\n                this.dispose();\n            },\n            cancel: function () {\n                this.dispose();\n            },\n            isMoved: function () {\n                return this._moved;\n            },\n            _start: function (touchInfo) {\n                clearTimeout(this._holdTimeout);\n                this.startTime = now();\n                this._moved = true;\n                this._trigger(START, touchInfo);\n            },\n            _trigger: function (name, touchInfo) {\n                var that = this, jQueryEvent = touchInfo.event, data = {\n                        touch: that,\n                        x: that.x,\n                        y: that.y,\n                        target: that.target,\n                        event: jQueryEvent\n                    };\n                if (that.userEvents.notify(name, data)) {\n                    jQueryEvent.preventDefault();\n                }\n            },\n            _withinIgnoreThreshold: function () {\n                var xDelta = this.x.initialDelta, yDelta = this.y.initialDelta;\n                return Math.sqrt(xDelta * xDelta + yDelta * yDelta) <= this.threshold;\n            }\n        });\n        function withEachUpEvent(callback) {\n            var downEvents = kendo.eventMap.up.split(' '), idx = 0, length = downEvents.length;\n            for (; idx < length; idx++) {\n                callback(downEvents[idx]);\n            }\n        }\n        var UserEvents = Observable.extend({\n            init: function (element, options) {\n                var that = this, filter, ns = kendo.guid();\n                options = options || {};\n                filter = that.filter = options.filter;\n                that.threshold = options.threshold || DEFAULT_THRESHOLD;\n                that.minHold = options.minHold || DEFAULT_MIN_HOLD;\n                that.touches = [];\n                that._maxTouches = options.multiTouch ? 2 : 1;\n                that.allowSelection = options.allowSelection;\n                that.captureUpIfMoved = options.captureUpIfMoved;\n                that.useClickAsTap = !options.fastTap && !support.delayedClick();\n                that.eventNS = ns;\n                element = $(element).handler(that);\n                Observable.fn.init.call(that);\n                extend(that, {\n                    element: element,\n                    surface: options.global && ENABLE_GLOBAL_SURFACE ? $(element[0].ownerDocument.documentElement) : $(options.surface || element),\n                    stopPropagation: options.stopPropagation,\n                    pressed: false\n                });\n                that.surface.handler(that).on(kendo.applyEventMap('move', ns), '_move').on(kendo.applyEventMap('up cancel', ns), '_end');\n                element.on(kendo.applyEventMap('down', ns), filter, '_start');\n                if (that.useClickAsTap) {\n                    element.on(kendo.applyEventMap('click', ns), filter, '_click');\n                }\n                if (support.pointers || support.msPointers) {\n                    if (support.browser.version < 11) {\n                        element.css('-ms-touch-action', 'pinch-zoom double-tap-zoom');\n                    } else {\n                        element.css('touch-action', options.touchAction || 'none');\n                    }\n                }\n                if (options.preventDragEvent) {\n                    element.on(kendo.applyEventMap('dragstart', ns), kendo.preventDefault);\n                }\n                element.on(kendo.applyEventMap('mousedown', ns), filter, { root: element }, '_select');\n                if (that.captureUpIfMoved && support.eventCapture) {\n                    var surfaceElement = that.surface[0], preventIfMovingProxy = $.proxy(that.preventIfMoving, that);\n                    withEachUpEvent(function (eventName) {\n                        surfaceElement.addEventListener(eventName, preventIfMovingProxy, true);\n                    });\n                }\n                that.bind([\n                    PRESS,\n                    HOLD,\n                    TAP,\n                    START,\n                    MOVE,\n                    END,\n                    RELEASE,\n                    CANCEL,\n                    GESTURESTART,\n                    GESTURECHANGE,\n                    GESTUREEND,\n                    GESTURETAP,\n                    SELECT\n                ], options);\n            },\n            preventIfMoving: function (e) {\n                if (this._isMoved()) {\n                    e.preventDefault();\n                }\n            },\n            destroy: function () {\n                var that = this;\n                if (that._destroyed) {\n                    return;\n                }\n                that._destroyed = true;\n                if (that.captureUpIfMoved && support.eventCapture) {\n                    var surfaceElement = that.surface[0];\n                    withEachUpEvent(function (eventName) {\n                        surfaceElement.removeEventListener(eventName, that.preventIfMoving);\n                    });\n                }\n                that.element.kendoDestroy(that.eventNS);\n                that.surface.kendoDestroy(that.eventNS);\n                that.element.removeData('handler');\n                that.surface.removeData('handler');\n                that._disposeAll();\n                that.unbind();\n                delete that.surface;\n                delete that.element;\n                delete that.currentTarget;\n            },\n            capture: function () {\n                UserEvents.current = this;\n            },\n            cancel: function () {\n                this._disposeAll();\n                this.trigger(CANCEL);\n            },\n            notify: function (eventName, data) {\n                var that = this, touches = that.touches;\n                if (this._isMultiTouch()) {\n                    switch (eventName) {\n                    case MOVE:\n                        eventName = GESTURECHANGE;\n                        break;\n                    case END:\n                        eventName = GESTUREEND;\n                        break;\n                    case TAP:\n                        eventName = GESTURETAP;\n                        break;\n                    }\n                    extend(data, { touches: touches }, touchDelta(touches[0], touches[1]));\n                }\n                return this.trigger(eventName, extend(data, { type: eventName }));\n            },\n            press: function (x, y, target) {\n                this._apiCall('_start', x, y, target);\n            },\n            move: function (x, y) {\n                this._apiCall('_move', x, y);\n            },\n            end: function (x, y) {\n                this._apiCall('_end', x, y);\n            },\n            _isMultiTouch: function () {\n                return this.touches.length > 1;\n            },\n            _maxTouchesReached: function () {\n                return this.touches.length >= this._maxTouches;\n            },\n            _disposeAll: function () {\n                var touches = this.touches;\n                while (touches.length > 0) {\n                    touches.pop().dispose();\n                }\n            },\n            _isMoved: function () {\n                return $.grep(this.touches, function (touch) {\n                    return touch.isMoved();\n                }).length;\n            },\n            _select: function (e) {\n                if (!this.allowSelection || this.trigger(SELECT, { event: e })) {\n                    e.preventDefault();\n                }\n            },\n            _start: function (e) {\n                var that = this, idx = 0, filter = that.filter, target, touches = getTouches(e), length = touches.length, touch, which = e.which;\n                if (which && which > 1 || that._maxTouchesReached()) {\n                    return;\n                }\n                UserEvents.current = null;\n                that.currentTarget = e.currentTarget;\n                if (that.stopPropagation) {\n                    e.stopPropagation();\n                }\n                for (; idx < length; idx++) {\n                    if (that._maxTouchesReached()) {\n                        break;\n                    }\n                    touch = touches[idx];\n                    if (filter) {\n                        target = $(touch.currentTarget);\n                    } else {\n                        target = that.element;\n                    }\n                    if (!target.length) {\n                        continue;\n                    }\n                    touch = new Touch(that, target, touch);\n                    that.touches.push(touch);\n                    touch.press();\n                    if (that._isMultiTouch()) {\n                        that.notify('gesturestart', {});\n                    }\n                }\n            },\n            _move: function (e) {\n                this._eachTouch('move', e);\n            },\n            _end: function (e) {\n                this._eachTouch('end', e);\n            },\n            _click: function (e) {\n                var data = {\n                    touch: {\n                        initialTouch: e.target,\n                        target: $(e.currentTarget),\n                        endTime: now(),\n                        x: {\n                            location: e.pageX,\n                            client: e.clientX\n                        },\n                        y: {\n                            location: e.pageY,\n                            client: e.clientY\n                        }\n                    },\n                    x: e.pageX,\n                    y: e.pageY,\n                    target: $(e.currentTarget),\n                    event: e,\n                    type: 'tap'\n                };\n                if (this.trigger('tap', data)) {\n                    e.preventDefault();\n                }\n            },\n            _eachTouch: function (methodName, e) {\n                var that = this, dict = {}, touches = getTouches(e), activeTouches = that.touches, idx, touch, touchInfo, matchingTouch;\n                for (idx = 0; idx < activeTouches.length; idx++) {\n                    touch = activeTouches[idx];\n                    dict[touch.id] = touch;\n                }\n                for (idx = 0; idx < touches.length; idx++) {\n                    touchInfo = touches[idx];\n                    matchingTouch = dict[touchInfo.id];\n                    if (matchingTouch) {\n                        matchingTouch[methodName](touchInfo);\n                    }\n                }\n            },\n            _apiCall: function (type, x, y, target) {\n                this[type]({\n                    api: true,\n                    pageX: x,\n                    pageY: y,\n                    clientX: x,\n                    clientY: y,\n                    target: $(target || this.element)[0],\n                    stopPropagation: $.noop,\n                    preventDefault: $.noop\n                });\n            }\n        });\n        UserEvents.defaultThreshold = function (value) {\n            DEFAULT_THRESHOLD = value;\n        };\n        UserEvents.minHold = function (value) {\n            DEFAULT_MIN_HOLD = value;\n        };\n        kendo.getTouches = getTouches;\n        kendo.touchDelta = touchDelta;\n        kendo.UserEvents = UserEvents;\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.draganddrop', [\n        'kendo.core',\n        'kendo.userevents'\n    ], f);\n}(function () {\n    var __meta__ = {\n        id: 'draganddrop',\n        name: 'Drag & drop',\n        category: 'framework',\n        description: 'Drag & drop functionality for any DOM element.',\n        depends: [\n            'core',\n            'userevents'\n        ]\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, support = kendo.support, document = window.document, $window = $(window), Class = kendo.Class, Widget = kendo.ui.Widget, Observable = kendo.Observable, UserEvents = kendo.UserEvents, proxy = $.proxy, extend = $.extend, getOffset = kendo.getOffset, draggables = {}, dropTargets = {}, dropAreas = {}, lastDropTarget, elementUnderCursor = kendo.elementUnderCursor, KEYUP = 'keyup', CHANGE = 'change', DRAGSTART = 'dragstart', HOLD = 'hold', DRAG = 'drag', DRAGEND = 'dragend', DRAGCANCEL = 'dragcancel', HINTDESTROYED = 'hintDestroyed', DRAGENTER = 'dragenter', DRAGLEAVE = 'dragleave', DROP = 'drop';\n        function contains(parent, child) {\n            try {\n                return $.contains(parent, child) || parent == child;\n            } catch (e) {\n                return false;\n            }\n        }\n        function numericCssPropery(element, property) {\n            return parseInt(element.css(property), 10) || 0;\n        }\n        function within(value, range) {\n            return Math.min(Math.max(value, range.min), range.max);\n        }\n        function containerBoundaries(container, element) {\n            var offset = getOffset(container), outerWidth = kendo._outerWidth, outerHeight = kendo._outerHeight, minX = offset.left + numericCssPropery(container, 'borderLeftWidth') + numericCssPropery(container, 'paddingLeft'), minY = offset.top + numericCssPropery(container, 'borderTopWidth') + numericCssPropery(container, 'paddingTop'), maxX = minX + container.width() - outerWidth(element, true), maxY = minY + container.height() - outerHeight(element, true);\n            return {\n                x: {\n                    min: minX,\n                    max: maxX\n                },\n                y: {\n                    min: minY,\n                    max: maxY\n                }\n            };\n        }\n        function checkTarget(target, targets, areas) {\n            var theTarget, theFilter, i = 0, targetLen = targets && targets.length, areaLen = areas && areas.length;\n            while (target && target.parentNode) {\n                for (i = 0; i < targetLen; i++) {\n                    theTarget = targets[i];\n                    if (theTarget.element[0] === target) {\n                        return {\n                            target: theTarget,\n                            targetElement: target\n                        };\n                    }\n                }\n                for (i = 0; i < areaLen; i++) {\n                    theFilter = areas[i];\n                    if ($.contains(theFilter.element[0], target) && support.matchesSelector.call(target, theFilter.options.filter)) {\n                        return {\n                            target: theFilter,\n                            targetElement: target\n                        };\n                    }\n                }\n                target = target.parentNode;\n            }\n            return undefined;\n        }\n        var TapCapture = Observable.extend({\n            init: function (element, options) {\n                var that = this, domElement = element[0];\n                that.capture = false;\n                if (domElement.addEventListener) {\n                    $.each(kendo.eventMap.down.split(' '), function () {\n                        domElement.addEventListener(this, proxy(that._press, that), true);\n                    });\n                    $.each(kendo.eventMap.up.split(' '), function () {\n                        domElement.addEventListener(this, proxy(that._release, that), true);\n                    });\n                } else {\n                    $.each(kendo.eventMap.down.split(' '), function () {\n                        domElement.attachEvent(this, proxy(that._press, that));\n                    });\n                    $.each(kendo.eventMap.up.split(' '), function () {\n                        domElement.attachEvent(this, proxy(that._release, that));\n                    });\n                }\n                Observable.fn.init.call(that);\n                that.bind([\n                    'press',\n                    'release'\n                ], options || {});\n            },\n            captureNext: function () {\n                this.capture = true;\n            },\n            cancelCapture: function () {\n                this.capture = false;\n            },\n            _press: function (e) {\n                var that = this;\n                that.trigger('press');\n                if (that.capture) {\n                    e.preventDefault();\n                }\n            },\n            _release: function (e) {\n                var that = this;\n                that.trigger('release');\n                if (that.capture) {\n                    e.preventDefault();\n                    that.cancelCapture();\n                }\n            }\n        });\n        var PaneDimension = Observable.extend({\n            init: function (options) {\n                var that = this;\n                Observable.fn.init.call(that);\n                that.forcedEnabled = false;\n                $.extend(that, options);\n                that.scale = 1;\n                if (that.horizontal) {\n                    that.measure = 'offsetWidth';\n                    that.scrollSize = 'scrollWidth';\n                    that.axis = 'x';\n                } else {\n                    that.measure = 'offsetHeight';\n                    that.scrollSize = 'scrollHeight';\n                    that.axis = 'y';\n                }\n            },\n            makeVirtual: function () {\n                $.extend(this, {\n                    virtual: true,\n                    forcedEnabled: true,\n                    _virtualMin: 0,\n                    _virtualMax: 0\n                });\n            },\n            virtualSize: function (min, max) {\n                if (this._virtualMin !== min || this._virtualMax !== max) {\n                    this._virtualMin = min;\n                    this._virtualMax = max;\n                    this.update();\n                }\n            },\n            outOfBounds: function (offset) {\n                return offset > this.max || offset < this.min;\n            },\n            forceEnabled: function () {\n                this.forcedEnabled = true;\n            },\n            getSize: function () {\n                return this.container[0][this.measure];\n            },\n            getTotal: function () {\n                return this.element[0][this.scrollSize];\n            },\n            rescale: function (scale) {\n                this.scale = scale;\n            },\n            update: function (silent) {\n                var that = this, total = that.virtual ? that._virtualMax : that.getTotal(), scaledTotal = total * that.scale, size = that.getSize();\n                if (total === 0 && !that.forcedEnabled) {\n                    return;\n                }\n                that.max = that.virtual ? -that._virtualMin : 0;\n                that.size = size;\n                that.total = scaledTotal;\n                that.min = Math.min(that.max, size - scaledTotal);\n                that.minScale = size / total;\n                that.centerOffset = (scaledTotal - size) / 2;\n                that.enabled = that.forcedEnabled || scaledTotal > size;\n                if (!silent) {\n                    that.trigger(CHANGE, that);\n                }\n            }\n        });\n        var PaneDimensions = Observable.extend({\n            init: function (options) {\n                var that = this;\n                Observable.fn.init.call(that);\n                that.x = new PaneDimension(extend({ horizontal: true }, options));\n                that.y = new PaneDimension(extend({ horizontal: false }, options));\n                that.container = options.container;\n                that.forcedMinScale = options.minScale;\n                that.maxScale = options.maxScale || 100;\n                that.bind(CHANGE, options);\n            },\n            rescale: function (newScale) {\n                this.x.rescale(newScale);\n                this.y.rescale(newScale);\n                this.refresh();\n            },\n            centerCoordinates: function () {\n                return {\n                    x: Math.min(0, -this.x.centerOffset),\n                    y: Math.min(0, -this.y.centerOffset)\n                };\n            },\n            refresh: function () {\n                var that = this;\n                that.x.update();\n                that.y.update();\n                that.enabled = that.x.enabled || that.y.enabled;\n                that.minScale = that.forcedMinScale || Math.min(that.x.minScale, that.y.minScale);\n                that.fitScale = Math.max(that.x.minScale, that.y.minScale);\n                that.trigger(CHANGE);\n            }\n        });\n        var PaneAxis = Observable.extend({\n            init: function (options) {\n                var that = this;\n                extend(that, options);\n                Observable.fn.init.call(that);\n            },\n            outOfBounds: function () {\n                return this.dimension.outOfBounds(this.movable[this.axis]);\n            },\n            dragMove: function (delta) {\n                var that = this, dimension = that.dimension, axis = that.axis, movable = that.movable, position = movable[axis] + delta;\n                if (!dimension.enabled) {\n                    return;\n                }\n                if (position < dimension.min && delta < 0 || position > dimension.max && delta > 0) {\n                    delta *= that.resistance;\n                }\n                movable.translateAxis(axis, delta);\n                that.trigger(CHANGE, that);\n            }\n        });\n        var Pane = Class.extend({\n            init: function (options) {\n                var that = this, x, y, resistance, movable;\n                extend(that, { elastic: true }, options);\n                resistance = that.elastic ? 0.5 : 0;\n                movable = that.movable;\n                that.x = x = new PaneAxis({\n                    axis: 'x',\n                    dimension: that.dimensions.x,\n                    resistance: resistance,\n                    movable: movable\n                });\n                that.y = y = new PaneAxis({\n                    axis: 'y',\n                    dimension: that.dimensions.y,\n                    resistance: resistance,\n                    movable: movable\n                });\n                that.userEvents.bind([\n                    'press',\n                    'move',\n                    'end',\n                    'gesturestart',\n                    'gesturechange'\n                ], {\n                    gesturestart: function (e) {\n                        that.gesture = e;\n                        that.offset = that.dimensions.container.offset();\n                    },\n                    press: function (e) {\n                        if ($(e.event.target).closest('a').is('[data-navigate-on-press=true]')) {\n                            e.sender.cancel();\n                        }\n                    },\n                    gesturechange: function (e) {\n                        var previousGesture = that.gesture, previousCenter = previousGesture.center, center = e.center, scaleDelta = e.distance / previousGesture.distance, minScale = that.dimensions.minScale, maxScale = that.dimensions.maxScale, coordinates;\n                        if (movable.scale <= minScale && scaleDelta < 1) {\n                            scaleDelta += (1 - scaleDelta) * 0.8;\n                        }\n                        if (movable.scale * scaleDelta >= maxScale) {\n                            scaleDelta = maxScale / movable.scale;\n                        }\n                        var offsetX = movable.x + that.offset.left, offsetY = movable.y + that.offset.top;\n                        coordinates = {\n                            x: (offsetX - previousCenter.x) * scaleDelta + center.x - offsetX,\n                            y: (offsetY - previousCenter.y) * scaleDelta + center.y - offsetY\n                        };\n                        movable.scaleWith(scaleDelta);\n                        x.dragMove(coordinates.x);\n                        y.dragMove(coordinates.y);\n                        that.dimensions.rescale(movable.scale);\n                        that.gesture = e;\n                        e.preventDefault();\n                    },\n                    move: function (e) {\n                        if (e.event.target.tagName.match(/textarea|input/i)) {\n                            return;\n                        }\n                        if (x.dimension.enabled || y.dimension.enabled) {\n                            x.dragMove(e.x.delta);\n                            y.dragMove(e.y.delta);\n                            e.preventDefault();\n                        } else {\n                            e.touch.skip();\n                        }\n                    },\n                    end: function (e) {\n                        e.preventDefault();\n                    }\n                });\n            }\n        });\n        var TRANSFORM_STYLE = support.transitions.prefix + 'Transform', translate;\n        if (support.hasHW3D) {\n            translate = function (x, y, scale) {\n                return 'translate3d(' + x + 'px,' + y + 'px,0) scale(' + scale + ')';\n            };\n        } else {\n            translate = function (x, y, scale) {\n                return 'translate(' + x + 'px,' + y + 'px) scale(' + scale + ')';\n            };\n        }\n        var Movable = Observable.extend({\n            init: function (element) {\n                var that = this;\n                Observable.fn.init.call(that);\n                that.element = $(element);\n                that.element[0].style.webkitTransformOrigin = 'left top';\n                that.x = 0;\n                that.y = 0;\n                that.scale = 1;\n                that._saveCoordinates(translate(that.x, that.y, that.scale));\n            },\n            translateAxis: function (axis, by) {\n                this[axis] += by;\n                this.refresh();\n            },\n            scaleTo: function (scale) {\n                this.scale = scale;\n                this.refresh();\n            },\n            scaleWith: function (scaleDelta) {\n                this.scale *= scaleDelta;\n                this.refresh();\n            },\n            translate: function (coordinates) {\n                this.x += coordinates.x;\n                this.y += coordinates.y;\n                this.refresh();\n            },\n            moveAxis: function (axis, value) {\n                this[axis] = value;\n                this.refresh();\n            },\n            moveTo: function (coordinates) {\n                extend(this, coordinates);\n                this.refresh();\n            },\n            refresh: function () {\n                var that = this, x = that.x, y = that.y, newCoordinates;\n                if (that.round) {\n                    x = Math.round(x);\n                    y = Math.round(y);\n                }\n                newCoordinates = translate(x, y, that.scale);\n                if (newCoordinates != that.coordinates) {\n                    if (kendo.support.browser.msie && kendo.support.browser.version < 10) {\n                        that.element[0].style.position = 'absolute';\n                        that.element[0].style.left = that.x + 'px';\n                        that.element[0].style.top = that.y + 'px';\n                    } else {\n                        that.element[0].style[TRANSFORM_STYLE] = newCoordinates;\n                    }\n                    that._saveCoordinates(newCoordinates);\n                    that.trigger(CHANGE);\n                }\n            },\n            _saveCoordinates: function (coordinates) {\n                this.coordinates = coordinates;\n            }\n        });\n        function destroyDroppable(collection, widget) {\n            var groupName = widget.options.group, droppables = collection[groupName], i;\n            Widget.fn.destroy.call(widget);\n            if (droppables.length > 1) {\n                for (i = 0; i < droppables.length; i++) {\n                    if (droppables[i] == widget) {\n                        droppables.splice(i, 1);\n                        break;\n                    }\n                }\n            } else {\n                droppables.length = 0;\n                delete collection[groupName];\n            }\n        }\n        var DropTarget = Widget.extend({\n            init: function (element, options) {\n                var that = this;\n                Widget.fn.init.call(that, element, options);\n                var group = that.options.group;\n                if (!(group in dropTargets)) {\n                    dropTargets[group] = [that];\n                } else {\n                    dropTargets[group].push(that);\n                }\n            },\n            events: [\n                DRAGENTER,\n                DRAGLEAVE,\n                DROP\n            ],\n            options: {\n                name: 'DropTarget',\n                group: 'default'\n            },\n            destroy: function () {\n                destroyDroppable(dropTargets, this);\n            },\n            _trigger: function (eventName, e) {\n                var that = this, draggable = draggables[that.options.group];\n                if (draggable) {\n                    return that.trigger(eventName, extend({}, e.event, {\n                        draggable: draggable,\n                        dropTarget: e.dropTarget\n                    }));\n                }\n            },\n            _over: function (e) {\n                this._trigger(DRAGENTER, e);\n            },\n            _out: function (e) {\n                this._trigger(DRAGLEAVE, e);\n            },\n            _drop: function (e) {\n                var that = this, draggable = draggables[that.options.group];\n                if (draggable) {\n                    draggable.dropped = !that._trigger(DROP, e);\n                }\n            }\n        });\n        DropTarget.destroyGroup = function (groupName) {\n            var group = dropTargets[groupName] || dropAreas[groupName], i;\n            if (group) {\n                for (i = 0; i < group.length; i++) {\n                    Widget.fn.destroy.call(group[i]);\n                }\n                group.length = 0;\n                delete dropTargets[groupName];\n                delete dropAreas[groupName];\n            }\n        };\n        DropTarget._cache = dropTargets;\n        var DropTargetArea = DropTarget.extend({\n            init: function (element, options) {\n                var that = this;\n                Widget.fn.init.call(that, element, options);\n                var group = that.options.group;\n                if (!(group in dropAreas)) {\n                    dropAreas[group] = [that];\n                } else {\n                    dropAreas[group].push(that);\n                }\n            },\n            destroy: function () {\n                destroyDroppable(dropAreas, this);\n            },\n            options: {\n                name: 'DropTargetArea',\n                group: 'default',\n                filter: null\n            }\n        });\n        var Draggable = Widget.extend({\n            init: function (element, options) {\n                var that = this;\n                Widget.fn.init.call(that, element, options);\n                that._activated = false;\n                that.userEvents = new UserEvents(that.element, {\n                    global: true,\n                    allowSelection: true,\n                    filter: that.options.filter,\n                    threshold: that.options.distance,\n                    start: proxy(that._start, that),\n                    hold: proxy(that._hold, that),\n                    move: proxy(that._drag, that),\n                    end: proxy(that._end, that),\n                    cancel: proxy(that._cancel, that),\n                    select: proxy(that._select, that)\n                });\n                that._afterEndHandler = proxy(that._afterEnd, that);\n                that._captureEscape = proxy(that._captureEscape, that);\n            },\n            events: [\n                HOLD,\n                DRAGSTART,\n                DRAG,\n                DRAGEND,\n                DRAGCANCEL,\n                HINTDESTROYED\n            ],\n            options: {\n                name: 'Draggable',\n                distance: kendo.support.touch ? 0 : 5,\n                group: 'default',\n                cursorOffset: null,\n                axis: null,\n                container: null,\n                filter: null,\n                ignore: null,\n                holdToDrag: false,\n                autoScroll: false,\n                dropped: false\n            },\n            cancelHold: function () {\n                this._activated = false;\n            },\n            _captureEscape: function (e) {\n                var that = this;\n                if (e.keyCode === kendo.keys.ESC) {\n                    that._trigger(DRAGCANCEL, { event: e });\n                    that.userEvents.cancel();\n                }\n            },\n            _updateHint: function (e) {\n                var that = this, coordinates, options = that.options, boundaries = that.boundaries, axis = options.axis, cursorOffset = that.options.cursorOffset;\n                if (cursorOffset) {\n                    coordinates = {\n                        left: e.x.location + cursorOffset.left,\n                        top: e.y.location + cursorOffset.top\n                    };\n                } else {\n                    that.hintOffset.left += e.x.delta;\n                    that.hintOffset.top += e.y.delta;\n                    coordinates = $.extend({}, that.hintOffset);\n                }\n                if (boundaries) {\n                    coordinates.top = within(coordinates.top, boundaries.y);\n                    coordinates.left = within(coordinates.left, boundaries.x);\n                }\n                if (axis === 'x') {\n                    delete coordinates.top;\n                } else if (axis === 'y') {\n                    delete coordinates.left;\n                }\n                that.hint.css(coordinates);\n            },\n            _shouldIgnoreTarget: function (target) {\n                var ignoreSelector = this.options.ignore;\n                return ignoreSelector && $(target).is(ignoreSelector);\n            },\n            _select: function (e) {\n                if (!this._shouldIgnoreTarget(e.event.target)) {\n                    e.preventDefault();\n                }\n            },\n            _start: function (e) {\n                var that = this, options = that.options, container = options.container, hint = options.hint;\n                if (this._shouldIgnoreTarget(e.touch.initialTouch) || options.holdToDrag && !that._activated) {\n                    that.userEvents.cancel();\n                    return;\n                }\n                that.currentTarget = e.target;\n                that.currentTargetOffset = getOffset(that.currentTarget);\n                if (hint) {\n                    if (that.hint) {\n                        that.hint.stop(true, true).remove();\n                    }\n                    that.hint = kendo.isFunction(hint) ? $(hint.call(that, that.currentTarget)) : hint;\n                    var offset = getOffset(that.currentTarget);\n                    that.hintOffset = offset;\n                    that.hint.css({\n                        position: 'absolute',\n                        zIndex: 20000,\n                        left: offset.left,\n                        top: offset.top\n                    }).appendTo(document.body);\n                    that.angular('compile', function () {\n                        that.hint.removeAttr('ng-repeat');\n                        var scopeTarget = $(e.target);\n                        while (!scopeTarget.data('$$kendoScope') && scopeTarget.length) {\n                            scopeTarget = scopeTarget.parent();\n                        }\n                        return {\n                            elements: that.hint.get(),\n                            scopeFrom: scopeTarget.data('$$kendoScope')\n                        };\n                    });\n                }\n                draggables[options.group] = that;\n                that.dropped = false;\n                if (container) {\n                    that.boundaries = containerBoundaries(container, that.hint);\n                }\n                $(document).on(KEYUP, that._captureEscape);\n                if (that._trigger(DRAGSTART, e)) {\n                    that.userEvents.cancel();\n                    that._afterEnd();\n                }\n                that.userEvents.capture();\n            },\n            _hold: function (e) {\n                this.currentTarget = e.target;\n                if (this._trigger(HOLD, e)) {\n                    this.userEvents.cancel();\n                } else {\n                    this._activated = true;\n                }\n            },\n            _drag: function (e) {\n                e.preventDefault();\n                var cursorElement = this._elementUnderCursor(e);\n                if (this.options.autoScroll && this._cursorElement !== cursorElement) {\n                    this._scrollableParent = findScrollableParent(cursorElement);\n                    this._cursorElement = cursorElement;\n                }\n                this._lastEvent = e;\n                this._processMovement(e, cursorElement);\n                if (this.options.autoScroll) {\n                    if (this._scrollableParent[0]) {\n                        var velocity = autoScrollVelocity(e.x.location, e.y.location, scrollableViewPort(this._scrollableParent));\n                        this._scrollCompenstation = $.extend({}, this.hintOffset);\n                        this._scrollVelocity = velocity;\n                        if (velocity.y === 0 && velocity.x === 0) {\n                            clearInterval(this._scrollInterval);\n                            this._scrollInterval = null;\n                        } else if (!this._scrollInterval) {\n                            this._scrollInterval = setInterval($.proxy(this, '_autoScroll'), 50);\n                        }\n                    }\n                }\n                if (this.hint) {\n                    this._updateHint(e);\n                }\n            },\n            _processMovement: function (e, cursorElement) {\n                this._withDropTarget(cursorElement, function (target, targetElement) {\n                    if (!target) {\n                        if (lastDropTarget) {\n                            lastDropTarget._trigger(DRAGLEAVE, extend(e, { dropTarget: $(lastDropTarget.targetElement) }));\n                            lastDropTarget = null;\n                        }\n                        return;\n                    }\n                    if (lastDropTarget) {\n                        if (targetElement === lastDropTarget.targetElement) {\n                            return;\n                        }\n                        lastDropTarget._trigger(DRAGLEAVE, extend(e, { dropTarget: $(lastDropTarget.targetElement) }));\n                    }\n                    target._trigger(DRAGENTER, extend(e, { dropTarget: $(targetElement) }));\n                    lastDropTarget = extend(target, { targetElement: targetElement });\n                });\n                this._trigger(DRAG, extend(e, {\n                    dropTarget: lastDropTarget,\n                    elementUnderCursor: cursorElement\n                }));\n            },\n            _autoScroll: function () {\n                var parent = this._scrollableParent[0], velocity = this._scrollVelocity, compensation = this._scrollCompenstation;\n                if (!parent) {\n                    return;\n                }\n                var cursorElement = this._elementUnderCursor(this._lastEvent);\n                this._processMovement(this._lastEvent, cursorElement);\n                var yIsScrollable, xIsScrollable;\n                var isRootNode = parent === scrollableRoot()[0];\n                if (isRootNode) {\n                    yIsScrollable = document.body.scrollHeight > $window.height();\n                    xIsScrollable = document.body.scrollWidth > $window.width();\n                } else {\n                    yIsScrollable = parent.offsetHeight <= parent.scrollHeight;\n                    xIsScrollable = parent.offsetWidth <= parent.scrollWidth;\n                }\n                var yDelta = parent.scrollTop + velocity.y;\n                var yInBounds = yIsScrollable && yDelta > 0 && yDelta < parent.scrollHeight;\n                var xDelta = parent.scrollLeft + velocity.x;\n                var xInBounds = xIsScrollable && xDelta > 0 && xDelta < parent.scrollWidth;\n                if (yInBounds) {\n                    parent.scrollTop += velocity.y;\n                }\n                if (xInBounds) {\n                    parent.scrollLeft += velocity.x;\n                }\n                if (this.hint && isRootNode && (xInBounds || yInBounds)) {\n                    if (yInBounds) {\n                        compensation.top += velocity.y;\n                    }\n                    if (xInBounds) {\n                        compensation.left += velocity.x;\n                    }\n                    this.hint.css(compensation);\n                }\n            },\n            _end: function (e) {\n                this._withDropTarget(this._elementUnderCursor(e), function (target, targetElement) {\n                    if (target) {\n                        target._drop(extend({}, e, { dropTarget: $(targetElement) }));\n                        lastDropTarget = null;\n                    }\n                });\n                this._cancel(this._trigger(DRAGEND, e));\n            },\n            _cancel: function (isDefaultPrevented) {\n                var that = this;\n                that._scrollableParent = null;\n                this._cursorElement = null;\n                clearInterval(this._scrollInterval);\n                that._activated = false;\n                if (that.hint && !that.dropped) {\n                    setTimeout(function () {\n                        that.hint.stop(true, true);\n                        if (isDefaultPrevented) {\n                            that._afterEndHandler();\n                        } else {\n                            that.hint.animate(that.currentTargetOffset, 'fast', that._afterEndHandler);\n                        }\n                    }, 0);\n                } else {\n                    that._afterEnd();\n                }\n            },\n            _trigger: function (eventName, e) {\n                var that = this;\n                return that.trigger(eventName, extend({}, e.event, {\n                    x: e.x,\n                    y: e.y,\n                    currentTarget: that.currentTarget,\n                    initialTarget: e.touch ? e.touch.initialTouch : null,\n                    dropTarget: e.dropTarget,\n                    elementUnderCursor: e.elementUnderCursor\n                }));\n            },\n            _elementUnderCursor: function (e) {\n                var target = elementUnderCursor(e), hint = this.hint;\n                if (hint && contains(hint[0], target)) {\n                    hint.hide();\n                    target = elementUnderCursor(e);\n                    if (!target) {\n                        target = elementUnderCursor(e);\n                    }\n                    hint.show();\n                }\n                return target;\n            },\n            _withDropTarget: function (element, callback) {\n                var result, group = this.options.group, targets = dropTargets[group], areas = dropAreas[group];\n                if (targets && targets.length || areas && areas.length) {\n                    result = checkTarget(element, targets, areas);\n                    if (result) {\n                        callback(result.target, result.targetElement);\n                    } else {\n                        callback();\n                    }\n                }\n            },\n            destroy: function () {\n                var that = this;\n                Widget.fn.destroy.call(that);\n                that._afterEnd();\n                that.userEvents.destroy();\n                this._scrollableParent = null;\n                this._cursorElement = null;\n                clearInterval(this._scrollInterval);\n                that.currentTarget = null;\n            },\n            _afterEnd: function () {\n                var that = this;\n                if (that.hint) {\n                    that.hint.remove();\n                }\n                delete draggables[that.options.group];\n                that.trigger('destroy');\n                that.trigger(HINTDESTROYED);\n                $(document).off(KEYUP, that._captureEscape);\n            }\n        });\n        kendo.ui.plugin(DropTarget);\n        kendo.ui.plugin(DropTargetArea);\n        kendo.ui.plugin(Draggable);\n        kendo.TapCapture = TapCapture;\n        kendo.containerBoundaries = containerBoundaries;\n        extend(kendo.ui, {\n            Pane: Pane,\n            PaneDimensions: PaneDimensions,\n            Movable: Movable\n        });\n        function scrollableViewPort(element) {\n            var root = scrollableRoot()[0], offset, top, left;\n            if (element[0] === root) {\n                top = root.scrollTop;\n                left = root.scrollLeft;\n                return {\n                    top: top,\n                    left: left,\n                    bottom: top + $window.height(),\n                    right: left + $window.width()\n                };\n            } else {\n                offset = element.offset();\n                offset.bottom = offset.top + element.height();\n                offset.right = offset.left + element.width();\n                return offset;\n            }\n        }\n        function scrollableRoot() {\n            return $(kendo.support.browser.chrome ? document.body : document.documentElement);\n        }\n        function findScrollableParent(element) {\n            var root = scrollableRoot();\n            if (!element || element === document.body || element === document.documentElement) {\n                return root;\n            }\n            var parent = $(element)[0];\n            while (parent && !kendo.isScrollable(parent) && parent !== document.body) {\n                parent = parent.parentNode;\n            }\n            if (parent === document.body) {\n                return root;\n            }\n            return $(parent);\n        }\n        function autoScrollVelocity(mouseX, mouseY, rect) {\n            var velocity = {\n                x: 0,\n                y: 0\n            };\n            var AUTO_SCROLL_AREA = 50;\n            if (mouseX - rect.left < AUTO_SCROLL_AREA) {\n                velocity.x = -(AUTO_SCROLL_AREA - (mouseX - rect.left));\n            } else if (rect.right - mouseX < AUTO_SCROLL_AREA) {\n                velocity.x = AUTO_SCROLL_AREA - (rect.right - mouseX);\n            }\n            if (mouseY - rect.top < AUTO_SCROLL_AREA) {\n                velocity.y = -(AUTO_SCROLL_AREA - (mouseY - rect.top));\n            } else if (rect.bottom - mouseY < AUTO_SCROLL_AREA) {\n                velocity.y = AUTO_SCROLL_AREA - (rect.bottom - mouseY);\n            }\n            return velocity;\n        }\n        kendo.ui.Draggable.utils = {\n            autoScrollVelocity: autoScrollVelocity,\n            scrollableViewPort: scrollableViewPort,\n            findScrollableParent: findScrollableParent\n        };\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.mobile.scroller', [\n        'kendo.fx',\n        'kendo.draganddrop'\n    ], f);\n}(function () {\n    var __meta__ = {\n        id: 'mobile.scroller',\n        name: 'Scroller',\n        category: 'mobile',\n        description: 'The Kendo Mobile Scroller widget enables touch friendly kinetic scrolling for the contents of a given DOM element.',\n        depends: [\n            'fx',\n            'draganddrop'\n        ]\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, mobile = kendo.mobile, fx = kendo.effects, ui = mobile.ui, proxy = $.proxy, extend = $.extend, Widget = ui.Widget, Class = kendo.Class, Movable = kendo.ui.Movable, Pane = kendo.ui.Pane, PaneDimensions = kendo.ui.PaneDimensions, Transition = fx.Transition, Animation = fx.Animation, abs = Math.abs, SNAPBACK_DURATION = 500, SCROLLBAR_OPACITY = 0.7, FRICTION = 0.96, VELOCITY_MULTIPLIER = 10, MAX_VELOCITY = 55, OUT_OF_BOUNDS_FRICTION = 0.5, ANIMATED_SCROLLER_PRECISION = 5, RELEASECLASS = 'km-scroller-release', REFRESHCLASS = 'km-scroller-refresh', PULL = 'pull', CHANGE = 'change', RESIZE = 'resize', SCROLL = 'scroll', MOUSE_WHEEL_ID = 2;\n        var ZoomSnapBack = Animation.extend({\n            init: function (options) {\n                var that = this;\n                Animation.fn.init.call(that);\n                extend(that, options);\n                that.userEvents.bind('gestureend', proxy(that.start, that));\n                that.tapCapture.bind('press', proxy(that.cancel, that));\n            },\n            enabled: function () {\n                return this.movable.scale < this.dimensions.minScale;\n            },\n            done: function () {\n                return this.dimensions.minScale - this.movable.scale < 0.01;\n            },\n            tick: function () {\n                var movable = this.movable;\n                movable.scaleWith(1.1);\n                this.dimensions.rescale(movable.scale);\n            },\n            onEnd: function () {\n                var movable = this.movable;\n                movable.scaleTo(this.dimensions.minScale);\n                this.dimensions.rescale(movable.scale);\n            }\n        });\n        var DragInertia = Animation.extend({\n            init: function (options) {\n                var that = this;\n                Animation.fn.init.call(that);\n                extend(that, options, {\n                    transition: new Transition({\n                        axis: options.axis,\n                        movable: options.movable,\n                        onEnd: function () {\n                            that._end();\n                        }\n                    })\n                });\n                that.tapCapture.bind('press', function () {\n                    that.cancel();\n                });\n                that.userEvents.bind('end', proxy(that.start, that));\n                that.userEvents.bind('gestureend', proxy(that.start, that));\n                that.userEvents.bind('tap', proxy(that.onEnd, that));\n            },\n            onCancel: function () {\n                this.transition.cancel();\n            },\n            freeze: function (location) {\n                var that = this;\n                that.cancel();\n                that._moveTo(location);\n            },\n            onEnd: function () {\n                var that = this;\n                if (that.paneAxis.outOfBounds()) {\n                    that._snapBack();\n                } else {\n                    that._end();\n                }\n            },\n            done: function () {\n                return abs(this.velocity) < 1;\n            },\n            start: function (e) {\n                var that = this, velocity;\n                if (!that.dimension.enabled) {\n                    return;\n                }\n                if (that.paneAxis.outOfBounds()) {\n                    that._snapBack();\n                } else {\n                    velocity = e.touch.id === MOUSE_WHEEL_ID ? 0 : e.touch[that.axis].velocity;\n                    that.velocity = Math.max(Math.min(velocity * that.velocityMultiplier, MAX_VELOCITY), -MAX_VELOCITY);\n                    that.tapCapture.captureNext();\n                    Animation.fn.start.call(that);\n                }\n            },\n            tick: function () {\n                var that = this, dimension = that.dimension, friction = that.paneAxis.outOfBounds() ? OUT_OF_BOUNDS_FRICTION : that.friction, delta = that.velocity *= friction, location = that.movable[that.axis] + delta;\n                if (!that.elastic && dimension.outOfBounds(location)) {\n                    location = Math.max(Math.min(location, dimension.max), dimension.min);\n                    that.velocity = 0;\n                }\n                that.movable.moveAxis(that.axis, location);\n            },\n            _end: function () {\n                this.tapCapture.cancelCapture();\n                this.end();\n            },\n            _snapBack: function () {\n                var that = this, dimension = that.dimension, snapBack = that.movable[that.axis] > dimension.max ? dimension.max : dimension.min;\n                that._moveTo(snapBack);\n            },\n            _moveTo: function (location) {\n                this.transition.moveTo({\n                    location: location,\n                    duration: SNAPBACK_DURATION,\n                    ease: Transition.easeOutExpo\n                });\n            }\n        });\n        var AnimatedScroller = Animation.extend({\n            init: function (options) {\n                var that = this;\n                kendo.effects.Animation.fn.init.call(this);\n                extend(that, options, {\n                    origin: {},\n                    destination: {},\n                    offset: {}\n                });\n            },\n            tick: function () {\n                this._updateCoordinates();\n                this.moveTo(this.origin);\n            },\n            done: function () {\n                return abs(this.offset.y) < ANIMATED_SCROLLER_PRECISION && abs(this.offset.x) < ANIMATED_SCROLLER_PRECISION;\n            },\n            onEnd: function () {\n                this.moveTo(this.destination);\n                if (this.callback) {\n                    this.callback.call();\n                }\n            },\n            setCoordinates: function (from, to) {\n                this.offset = {};\n                this.origin = from;\n                this.destination = to;\n            },\n            setCallback: function (callback) {\n                if (callback && kendo.isFunction(callback)) {\n                    this.callback = callback;\n                } else {\n                    callback = undefined;\n                }\n            },\n            _updateCoordinates: function () {\n                this.offset = {\n                    x: (this.destination.x - this.origin.x) / 4,\n                    y: (this.destination.y - this.origin.y) / 4\n                };\n                this.origin = {\n                    y: this.origin.y + this.offset.y,\n                    x: this.origin.x + this.offset.x\n                };\n            }\n        });\n        var ScrollBar = Class.extend({\n            init: function (options) {\n                var that = this, horizontal = options.axis === 'x', element = $('<div class=\"km-touch-scrollbar km-' + (horizontal ? 'horizontal' : 'vertical') + '-scrollbar\" />');\n                extend(that, options, {\n                    element: element,\n                    elementSize: 0,\n                    movable: new Movable(element),\n                    scrollMovable: options.movable,\n                    alwaysVisible: options.alwaysVisible,\n                    size: horizontal ? 'width' : 'height'\n                });\n                that.scrollMovable.bind(CHANGE, proxy(that.refresh, that));\n                that.container.append(element);\n                if (options.alwaysVisible) {\n                    that.show();\n                }\n            },\n            refresh: function () {\n                var that = this, axis = that.axis, dimension = that.dimension, paneSize = dimension.size, scrollMovable = that.scrollMovable, sizeRatio = paneSize / dimension.total, position = Math.round(-scrollMovable[axis] * sizeRatio), size = Math.round(paneSize * sizeRatio);\n                if (sizeRatio >= 1) {\n                    this.element.css('display', 'none');\n                } else {\n                    this.element.css('display', '');\n                }\n                if (position + size > paneSize) {\n                    size = paneSize - position;\n                } else if (position < 0) {\n                    size += position;\n                    position = 0;\n                }\n                if (that.elementSize != size) {\n                    that.element.css(that.size, size + 'px');\n                    that.elementSize = size;\n                }\n                that.movable.moveAxis(axis, position);\n            },\n            show: function () {\n                this.element.css({\n                    opacity: SCROLLBAR_OPACITY,\n                    visibility: 'visible'\n                });\n            },\n            hide: function () {\n                if (!this.alwaysVisible) {\n                    this.element.css({ opacity: 0 });\n                }\n            }\n        });\n        var Scroller = Widget.extend({\n            init: function (element, options) {\n                var that = this;\n                Widget.fn.init.call(that, element, options);\n                element = that.element;\n                that._native = that.options.useNative && kendo.support.hasNativeScrolling;\n                if (that._native) {\n                    element.addClass('km-native-scroller').prepend('<div class=\"km-scroll-header\"/>');\n                    extend(that, {\n                        scrollElement: element,\n                        fixedContainer: element.children().first()\n                    });\n                    return;\n                }\n                element.css('overflow', 'hidden').addClass('km-scroll-wrapper').wrapInner('<div class=\"km-scroll-container\"/>').prepend('<div class=\"km-scroll-header\"/>');\n                var inner = element.children().eq(1), tapCapture = new kendo.TapCapture(element), movable = new Movable(inner), dimensions = new PaneDimensions({\n                        element: inner,\n                        container: element,\n                        forcedEnabled: that.options.zoom\n                    }), avoidScrolling = this.options.avoidScrolling, userEvents = new kendo.UserEvents(element, {\n                        touchAction: 'pan-y',\n                        fastTap: true,\n                        allowSelection: true,\n                        preventDragEvent: true,\n                        captureUpIfMoved: true,\n                        multiTouch: that.options.zoom,\n                        start: function (e) {\n                            dimensions.refresh();\n                            var velocityX = abs(e.x.velocity), velocityY = abs(e.y.velocity), horizontalSwipe = velocityX * 2 >= velocityY, originatedFromFixedContainer = $.contains(that.fixedContainer[0], e.event.target), verticalSwipe = velocityY * 2 >= velocityX;\n                            if (!originatedFromFixedContainer && !avoidScrolling(e) && that.enabled && (dimensions.x.enabled && horizontalSwipe || dimensions.y.enabled && verticalSwipe)) {\n                                userEvents.capture();\n                            } else {\n                                userEvents.cancel();\n                            }\n                        }\n                    }), pane = new Pane({\n                        movable: movable,\n                        dimensions: dimensions,\n                        userEvents: userEvents,\n                        elastic: that.options.elastic\n                    }), zoomSnapBack = new ZoomSnapBack({\n                        movable: movable,\n                        dimensions: dimensions,\n                        userEvents: userEvents,\n                        tapCapture: tapCapture\n                    }), animatedScroller = new AnimatedScroller({\n                        moveTo: function (coordinates) {\n                            that.scrollTo(coordinates.x, coordinates.y);\n                        }\n                    });\n                movable.bind(CHANGE, function () {\n                    that.scrollTop = -movable.y;\n                    that.scrollLeft = -movable.x;\n                    that.trigger(SCROLL, {\n                        scrollTop: that.scrollTop,\n                        scrollLeft: that.scrollLeft\n                    });\n                });\n                if (that.options.mousewheelScrolling) {\n                    element.on('DOMMouseScroll mousewheel', proxy(this, '_wheelScroll'));\n                }\n                extend(that, {\n                    movable: movable,\n                    dimensions: dimensions,\n                    zoomSnapBack: zoomSnapBack,\n                    animatedScroller: animatedScroller,\n                    userEvents: userEvents,\n                    pane: pane,\n                    tapCapture: tapCapture,\n                    pulled: false,\n                    enabled: true,\n                    scrollElement: inner,\n                    scrollTop: 0,\n                    scrollLeft: 0,\n                    fixedContainer: element.children().first()\n                });\n                that._initAxis('x');\n                that._initAxis('y');\n                that._wheelEnd = function () {\n                    that._wheel = false;\n                    that.userEvents.end(0, that._wheelY);\n                };\n                dimensions.refresh();\n                if (that.options.pullToRefresh) {\n                    that._initPullToRefresh();\n                }\n            },\n            _wheelScroll: function (e) {\n                if (!this._wheel) {\n                    this._wheel = true;\n                    this._wheelY = 0;\n                    this.userEvents.press(0, this._wheelY);\n                }\n                clearTimeout(this._wheelTimeout);\n                this._wheelTimeout = setTimeout(this._wheelEnd, 50);\n                var delta = kendo.wheelDeltaY(e);\n                if (delta) {\n                    this._wheelY += delta;\n                    this.userEvents.move(0, this._wheelY);\n                }\n                e.preventDefault();\n            },\n            makeVirtual: function () {\n                this.dimensions.y.makeVirtual();\n            },\n            virtualSize: function (min, max) {\n                this.dimensions.y.virtualSize(min, max);\n            },\n            height: function () {\n                return this.dimensions.y.size;\n            },\n            scrollHeight: function () {\n                return this.scrollElement[0].scrollHeight;\n            },\n            scrollWidth: function () {\n                return this.scrollElement[0].scrollWidth;\n            },\n            options: {\n                name: 'Scroller',\n                zoom: false,\n                pullOffset: 140,\n                visibleScrollHints: false,\n                elastic: true,\n                useNative: false,\n                mousewheelScrolling: true,\n                avoidScrolling: function () {\n                    return false;\n                },\n                pullToRefresh: false,\n                messages: {\n                    pullTemplate: 'Pull to refresh',\n                    releaseTemplate: 'Release to refresh',\n                    refreshTemplate: 'Refreshing'\n                }\n            },\n            events: [\n                PULL,\n                SCROLL,\n                RESIZE\n            ],\n            _resize: function () {\n                if (!this._native) {\n                    this.contentResized();\n                }\n            },\n            setOptions: function (options) {\n                var that = this;\n                Widget.fn.setOptions.call(that, options);\n                if (options.pullToRefresh) {\n                    that._initPullToRefresh();\n                }\n            },\n            reset: function () {\n                if (this._native) {\n                    this.scrollElement.scrollTop(0);\n                } else {\n                    this.movable.moveTo({\n                        x: 0,\n                        y: 0\n                    });\n                    this._scale(1);\n                }\n            },\n            contentResized: function () {\n                this.dimensions.refresh();\n                if (this.pane.x.outOfBounds()) {\n                    this.movable.moveAxis('x', this.dimensions.x.min);\n                }\n                if (this.pane.y.outOfBounds()) {\n                    this.movable.moveAxis('y', this.dimensions.y.min);\n                }\n            },\n            zoomOut: function () {\n                var dimensions = this.dimensions;\n                dimensions.refresh();\n                this._scale(dimensions.fitScale);\n                this.movable.moveTo(dimensions.centerCoordinates());\n            },\n            enable: function () {\n                this.enabled = true;\n            },\n            disable: function () {\n                this.enabled = false;\n            },\n            scrollTo: function (x, y) {\n                if (this._native) {\n                    this.scrollElement.scrollLeft(abs(x));\n                    this.scrollElement.scrollTop(abs(y));\n                } else {\n                    this.dimensions.refresh();\n                    this.movable.moveTo({\n                        x: x,\n                        y: y\n                    });\n                }\n            },\n            animatedScrollTo: function (x, y, callback) {\n                var from, to;\n                if (this._native) {\n                    this.scrollTo(x, y);\n                } else {\n                    from = {\n                        x: this.movable.x,\n                        y: this.movable.y\n                    };\n                    to = {\n                        x: x,\n                        y: y\n                    };\n                    this.animatedScroller.setCoordinates(from, to);\n                    this.animatedScroller.setCallback(callback);\n                    this.animatedScroller.start();\n                }\n            },\n            pullHandled: function () {\n                var that = this;\n                that.refreshHint.removeClass(REFRESHCLASS);\n                that.hintContainer.html(that.pullTemplate({}));\n                that.yinertia.onEnd();\n                that.xinertia.onEnd();\n                that.userEvents.cancel();\n            },\n            destroy: function () {\n                Widget.fn.destroy.call(this);\n                if (this.userEvents) {\n                    this.userEvents.destroy();\n                }\n            },\n            _scale: function (scale) {\n                this.dimensions.rescale(scale);\n                this.movable.scaleTo(scale);\n            },\n            _initPullToRefresh: function () {\n                var that = this;\n                that.dimensions.y.forceEnabled();\n                that.pullTemplate = kendo.template(that.options.messages.pullTemplate);\n                that.releaseTemplate = kendo.template(that.options.messages.releaseTemplate);\n                that.refreshTemplate = kendo.template(that.options.messages.refreshTemplate);\n                that.scrollElement.prepend('<span class=\"km-scroller-pull\"><span class=\"km-icon\"></span><span class=\"km-loading-left\"></span><span class=\"km-loading-right\"></span><span class=\"km-template\">' + that.pullTemplate({}) + '</span></span>');\n                that.refreshHint = that.scrollElement.children().first();\n                that.hintContainer = that.refreshHint.children('.km-template');\n                that.pane.y.bind('change', proxy(that._paneChange, that));\n                that.userEvents.bind('end', proxy(that._dragEnd, that));\n            },\n            _dragEnd: function () {\n                var that = this;\n                if (!that.pulled) {\n                    return;\n                }\n                that.pulled = false;\n                that.refreshHint.removeClass(RELEASECLASS).addClass(REFRESHCLASS);\n                that.hintContainer.html(that.refreshTemplate({}));\n                that.yinertia.freeze(that.options.pullOffset / 2);\n                that.trigger('pull');\n            },\n            _paneChange: function () {\n                var that = this;\n                if (that.movable.y / OUT_OF_BOUNDS_FRICTION > that.options.pullOffset) {\n                    if (!that.pulled) {\n                        that.pulled = true;\n                        that.refreshHint.removeClass(REFRESHCLASS).addClass(RELEASECLASS);\n                        that.hintContainer.html(that.releaseTemplate({}));\n                    }\n                } else if (that.pulled) {\n                    that.pulled = false;\n                    that.refreshHint.removeClass(RELEASECLASS);\n                    that.hintContainer.html(that.pullTemplate({}));\n                }\n            },\n            _initAxis: function (axis) {\n                var that = this, movable = that.movable, dimension = that.dimensions[axis], tapCapture = that.tapCapture, paneAxis = that.pane[axis], scrollBar = new ScrollBar({\n                        axis: axis,\n                        movable: movable,\n                        dimension: dimension,\n                        container: that.element,\n                        alwaysVisible: that.options.visibleScrollHints\n                    });\n                dimension.bind(CHANGE, function () {\n                    scrollBar.refresh();\n                });\n                paneAxis.bind(CHANGE, function () {\n                    scrollBar.show();\n                });\n                that[axis + 'inertia'] = new DragInertia({\n                    axis: axis,\n                    paneAxis: paneAxis,\n                    movable: movable,\n                    tapCapture: tapCapture,\n                    userEvents: that.userEvents,\n                    dimension: dimension,\n                    elastic: that.options.elastic,\n                    friction: that.options.friction || FRICTION,\n                    velocityMultiplier: that.options.velocityMultiplier || VELOCITY_MULTIPLIER,\n                    end: function () {\n                        scrollBar.hide();\n                        that.trigger('scrollEnd', {\n                            axis: axis,\n                            scrollTop: that.scrollTop,\n                            scrollLeft: that.scrollLeft\n                        });\n                    }\n                });\n            }\n        });\n        ui.plugin(Scroller);\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.groupable', [\n        'kendo.core',\n        'kendo.draganddrop'\n    ], f);\n}(function () {\n    var __meta__ = {\n        id: 'groupable',\n        name: 'Groupable',\n        category: 'framework',\n        depends: [\n            'core',\n            'draganddrop'\n        ],\n        advanced: true\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, Widget = kendo.ui.Widget, outerWidth = kendo._outerWidth, proxy = $.proxy, isRtl = false, NS = '.kendoGroupable', CHANGE = 'change', indicatorTmpl = kendo.template('<div class=\"k-group-indicator\" data-#=data.ns#field=\"${data.field}\" data-#=data.ns#title=\"${data.title || \"\"}\" data-#=data.ns#dir=\"${data.dir || \"asc\"}\">' + '<a href=\"\\\\#\" class=\"k-link\">' + '<span class=\"k-icon k-i-sort-${(data.dir || \"asc\") == \"asc\" ? \"asc-sm\" : \"desc-sm\"}\" title=\"(sorted ${(data.dir || \"asc\") == \"asc\" ? \"ascending\": \"descending\"})\"></span>' + '${data.title ? data.title: data.field}' + '</a>' + '<a class=\"k-button k-button-icon k-bare\">' + '<span class=\"k-icon k-i-close\"></span>' + '</a>' + '</div>', { useWithBlock: false }), hint = function (target) {\n                var title = target.attr(kendo.attr('title'));\n                if (title) {\n                    title = kendo.htmlEncode(title);\n                }\n                return $('<div class=\"k-header k-drag-clue\" />').css({\n                    width: target.width(),\n                    paddingLeft: target.css('paddingLeft'),\n                    paddingRight: target.css('paddingRight'),\n                    lineHeight: target.height() + 'px',\n                    paddingTop: target.css('paddingTop'),\n                    paddingBottom: target.css('paddingBottom')\n                }).html(title || target.attr(kendo.attr('field'))).prepend('<span class=\"k-icon k-drag-status k-i-cancel\" />');\n            }, dropCue = $('<div class=\"k-grouping-dropclue\"/>');\n        function dropCueOffsetTop(element) {\n            return element.position().top + 3;\n        }\n        var Groupable = Widget.extend({\n            init: function (element, options) {\n                var that = this, group = kendo.guid(), intializePositions = proxy(that._intializePositions, that), draggable, horizontalCuePosition, dropCuePositions = that._dropCuePositions = [];\n                Widget.fn.init.call(that, element, options);\n                isRtl = kendo.support.isRtl(element);\n                horizontalCuePosition = isRtl ? 'right' : 'left';\n                that.draggable = draggable = that.options.draggable || new kendo.ui.Draggable(that.element, {\n                    filter: that.options.draggableElements,\n                    hint: hint,\n                    group: group\n                });\n                that.groupContainer = $(that.options.groupContainer, that.element).kendoDropTarget({\n                    group: draggable.options.group,\n                    dragenter: function (e) {\n                        if (that._canDrag(e.draggable.currentTarget)) {\n                            e.draggable.hint.find('.k-drag-status').removeClass('k-i-cancel').addClass('k-i-plus');\n                            dropCue.css('top', dropCueOffsetTop(that.groupContainer)).css(horizontalCuePosition, 0).appendTo(that.groupContainer);\n                        }\n                    },\n                    dragleave: function (e) {\n                        e.draggable.hint.find('.k-drag-status').removeClass('k-i-plus').addClass('k-i-cancel');\n                        dropCue.remove();\n                    },\n                    drop: function (e) {\n                        var targetElement = e.draggable.currentTarget, field = targetElement.attr(kendo.attr('field')), title = targetElement.attr(kendo.attr('title')), sourceIndicator = that.indicator(field), dropCuePositions = that._dropCuePositions, lastCuePosition = dropCuePositions[dropCuePositions.length - 1], position;\n                        if (!targetElement.hasClass('k-group-indicator') && !that._canDrag(targetElement)) {\n                            return;\n                        }\n                        if (lastCuePosition) {\n                            position = that._dropCuePosition(kendo.getOffset(dropCue).left + parseInt(lastCuePosition.element.css('marginLeft'), 10) * (isRtl ? -1 : 1) + parseInt(lastCuePosition.element.css('marginRight'), 10));\n                            if (position && that._canDrop($(sourceIndicator), position.element, position.left)) {\n                                if (position.before) {\n                                    position.element.before(sourceIndicator || that.buildIndicator(field, title));\n                                } else {\n                                    position.element.after(sourceIndicator || that.buildIndicator(field, title));\n                                }\n                                that._change();\n                            }\n                        } else {\n                            that.groupContainer.append(that.buildIndicator(field, title));\n                            that._change();\n                        }\n                    }\n                }).kendoDraggable({\n                    filter: 'div.k-group-indicator',\n                    hint: hint,\n                    group: draggable.options.group,\n                    dragcancel: proxy(that._dragCancel, that),\n                    dragstart: function (e) {\n                        var element = e.currentTarget, marginLeft = parseInt(element.css('marginLeft'), 10), elementPosition = element.position(), left = isRtl ? elementPosition.left - marginLeft : elementPosition.left + outerWidth(element);\n                        intializePositions();\n                        dropCue.css({\n                            top: dropCueOffsetTop(that.groupContainer),\n                            left: left\n                        }).appendTo(that.groupContainer);\n                        this.hint.find('.k-drag-status').removeClass('k-i-cancel').addClass('k-i-plus');\n                    },\n                    dragend: function () {\n                        that._dragEnd(this);\n                    },\n                    drag: proxy(that._drag, that)\n                }).on('click' + NS, '.k-button', function (e) {\n                    e.preventDefault();\n                    that._removeIndicator($(this).parent());\n                }).on('click' + NS, '.k-link', function (e) {\n                    var current = $(this).parent(), newIndicator = that.buildIndicator(current.attr(kendo.attr('field')), current.attr(kendo.attr('title')), current.attr(kendo.attr('dir')) == 'asc' ? 'desc' : 'asc');\n                    current.before(newIndicator).remove();\n                    that._change();\n                    e.preventDefault();\n                });\n                draggable.bind([\n                    'dragend',\n                    'dragcancel',\n                    'dragstart',\n                    'drag'\n                ], {\n                    dragend: function () {\n                        that._dragEnd(this);\n                    },\n                    dragcancel: proxy(that._dragCancel, that),\n                    dragstart: function (e) {\n                        var element, marginRight, left;\n                        if (!that.options.allowDrag && !that._canDrag(e.currentTarget)) {\n                            e.preventDefault();\n                            return;\n                        }\n                        intializePositions();\n                        if (dropCuePositions.length) {\n                            element = dropCuePositions[dropCuePositions.length - 1].element;\n                            marginRight = parseInt(element.css('marginRight'), 10);\n                            left = element.position().left + outerWidth(element) + marginRight;\n                        } else {\n                            left = 0;\n                        }\n                    },\n                    drag: proxy(that._drag, that)\n                });\n                that.dataSource = that.options.dataSource;\n                if (that.dataSource && that._refreshHandler) {\n                    that.dataSource.unbind(CHANGE, that._refreshHandler);\n                } else {\n                    that._refreshHandler = proxy(that.refresh, that);\n                }\n                if (that.dataSource) {\n                    that.dataSource.bind('change', that._refreshHandler);\n                    that.refresh();\n                }\n            },\n            refresh: function () {\n                var that = this, dataSource = that.dataSource;\n                if (that.groupContainer) {\n                    that.groupContainer.empty().append($.map(dataSource.group() || [], function (item) {\n                        var fieldName = item.field;\n                        var attr = kendo.attr('field');\n                        var element = that.element.find(that.options.filter).filter(function () {\n                            return $(this).attr(attr) === fieldName;\n                        });\n                        return that.buildIndicator(item.field, element.attr(kendo.attr('title')), item.dir);\n                    }).join(''));\n                }\n                that._invalidateGroupContainer();\n            },\n            destroy: function () {\n                var that = this;\n                Widget.fn.destroy.call(that);\n                that.groupContainer.off(NS);\n                if (that.groupContainer.data('kendoDropTarget')) {\n                    that.groupContainer.data('kendoDropTarget').destroy();\n                }\n                if (that.groupContainer.data('kendoDraggable')) {\n                    that.groupContainer.data('kendoDraggable').destroy();\n                }\n                if (!that.options.draggable) {\n                    that.draggable.destroy();\n                }\n                if (that.dataSource && that._refreshHandler) {\n                    that.dataSource.unbind('change', that._refreshHandler);\n                    that._refreshHandler = null;\n                }\n                that.groupContainer = that.element = that.draggable = null;\n            },\n            events: ['change'],\n            options: {\n                name: 'Groupable',\n                filter: 'th',\n                draggableElements: 'th',\n                messages: { empty: 'Drag a column header and drop it here to group by that column' }\n            },\n            indicator: function (field) {\n                var indicators = $('.k-group-indicator', this.groupContainer);\n                return $.grep(indicators, function (item) {\n                    return $(item).attr(kendo.attr('field')) === field;\n                })[0];\n            },\n            buildIndicator: function (field, title, dir) {\n                return indicatorTmpl({\n                    field: field.replace(/\"/g, '\\''),\n                    dir: dir,\n                    title: title,\n                    ns: kendo.ns\n                });\n            },\n            descriptors: function () {\n                var that = this, indicators = $('.k-group-indicator', that.groupContainer), aggregates, names, field, idx, length;\n                aggregates = that.element.find(that.options.filter).map(function () {\n                    var cell = $(this), aggregate = cell.attr(kendo.attr('aggregates')), member = cell.attr(kendo.attr('field'));\n                    if (aggregate && aggregate !== '') {\n                        names = aggregate.split(',');\n                        aggregate = [];\n                        for (idx = 0, length = names.length; idx < length; idx++) {\n                            aggregate.push({\n                                field: member,\n                                aggregate: names[idx]\n                            });\n                        }\n                    }\n                    return aggregate;\n                }).toArray();\n                return $.map(indicators, function (item) {\n                    item = $(item);\n                    field = item.attr(kendo.attr('field'));\n                    return {\n                        field: field,\n                        dir: item.attr(kendo.attr('dir')),\n                        aggregates: aggregates || []\n                    };\n                });\n            },\n            _removeIndicator: function (indicator) {\n                var that = this;\n                indicator.remove();\n                that._invalidateGroupContainer();\n                that._change();\n            },\n            _change: function () {\n                var that = this;\n                if (that.dataSource) {\n                    var descriptors = that.descriptors();\n                    if (that.trigger('change', { groups: descriptors })) {\n                        that.refresh();\n                        return;\n                    }\n                    that.dataSource.group(descriptors);\n                }\n            },\n            _dropCuePosition: function (position) {\n                var dropCuePositions = this._dropCuePositions;\n                if (!dropCue.is(':visible') || dropCuePositions.length === 0) {\n                    return;\n                }\n                position = Math.ceil(position);\n                var lastCuePosition = dropCuePositions[dropCuePositions.length - 1], left = lastCuePosition.left, right = lastCuePosition.right, marginLeft = parseInt(lastCuePosition.element.css('marginLeft'), 10), marginRight = parseInt(lastCuePosition.element.css('marginRight'), 10);\n                if (position >= right && !isRtl || position < left && isRtl) {\n                    position = {\n                        left: lastCuePosition.element.position().left + (!isRtl ? outerWidth(lastCuePosition.element) + marginRight : -marginLeft),\n                        element: lastCuePosition.element,\n                        before: false\n                    };\n                } else {\n                    position = $.grep(dropCuePositions, function (item) {\n                        return item.left <= position && position <= item.right || isRtl && position > item.right;\n                    })[0];\n                    if (position) {\n                        position = {\n                            left: isRtl ? position.element.position().left + outerWidth(position.element) + marginRight : position.element.position().left - marginLeft,\n                            element: position.element,\n                            before: true\n                        };\n                    }\n                }\n                return position;\n            },\n            _drag: function (event) {\n                var position = this._dropCuePosition(event.x.location);\n                if (position) {\n                    dropCue.css({\n                        left: position.left,\n                        right: 'auto'\n                    });\n                }\n            },\n            _canDrag: function (element) {\n                var field = element.attr(kendo.attr('field'));\n                return element.attr(kendo.attr('groupable')) != 'false' && field && (element.hasClass('k-group-indicator') || !this.indicator(field));\n            },\n            _canDrop: function (source, target, position) {\n                var next = source.next(), result = source[0] !== target[0] && (!next[0] || target[0] !== next[0] || (!isRtl && position > next.position().left || isRtl && position < next.position().left));\n                return result;\n            },\n            _dragEnd: function (draggable) {\n                var that = this, field = draggable.currentTarget.attr(kendo.attr('field')), sourceIndicator = that.indicator(field);\n                if (draggable !== that.options.draggable && !draggable.dropped && sourceIndicator) {\n                    that._removeIndicator($(sourceIndicator));\n                }\n                that._dragCancel();\n            },\n            _dragCancel: function () {\n                dropCue.remove();\n                this._dropCuePositions = [];\n            },\n            _intializePositions: function () {\n                var that = this, indicators = $('.k-group-indicator', that.groupContainer), left;\n                that._dropCuePositions = $.map(indicators, function (item) {\n                    item = $(item);\n                    left = kendo.getOffset(item).left;\n                    return {\n                        left: parseInt(left, 10),\n                        right: parseInt(left + outerWidth(item), 10),\n                        element: item\n                    };\n                });\n            },\n            _invalidateGroupContainer: function () {\n                var groupContainer = this.groupContainer;\n                if (groupContainer && groupContainer.is(':empty')) {\n                    groupContainer.html(this.options.messages.empty);\n                }\n            }\n        });\n        kendo.ui.plugin(Groupable);\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.reorderable', [\n        'kendo.core',\n        'kendo.draganddrop'\n    ], f);\n}(function () {\n    var __meta__ = {\n        id: 'reorderable',\n        name: 'Reorderable',\n        category: 'framework',\n        depends: [\n            'core',\n            'draganddrop'\n        ],\n        advanced: true\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, outerWidth = kendo._outerWidth, outerHeight = kendo._outerHeight, getOffset = kendo.getOffset, Widget = kendo.ui.Widget, CHANGE = 'change', KREORDERABLE = 'k-reorderable';\n        function toggleHintClass(hint, denied) {\n            hint = $(hint);\n            if (denied) {\n                hint.find('.k-drag-status').removeClass('k-i-plus').addClass('k-i-cancel');\n            } else {\n                hint.find('.k-drag-status').removeClass('k-i-cancel').addClass('k-i-plus');\n            }\n        }\n        var Reorderable = Widget.extend({\n            init: function (element, options) {\n                var that = this, draggable, group = kendo.guid() + '-reorderable';\n                Widget.fn.init.call(that, element, options);\n                element = that.element.addClass(KREORDERABLE);\n                options = that.options;\n                that.draggable = draggable = options.draggable || new kendo.ui.Draggable(element, {\n                    group: group,\n                    autoScroll: true,\n                    filter: options.filter,\n                    hint: options.hint\n                });\n                that.reorderDropCue = $('<div class=\"k-reorder-cue\"><div class=\"k-icon k-i-arrow-60-down\"></div><div class=\"k-icon k-i-arrow-60-up\"></div></div>');\n                element.find(draggable.options.filter).kendoDropTarget({\n                    group: draggable.options.group,\n                    dragenter: function (e) {\n                        if (!that._draggable) {\n                            return;\n                        }\n                        var dropTarget = this.element, offset;\n                        var denied = !that._dropTargetAllowed(dropTarget) || that._isLastDraggable();\n                        toggleHintClass(e.draggable.hint, denied);\n                        if (!denied) {\n                            offset = getOffset(dropTarget);\n                            var left = offset.left;\n                            if (options.inSameContainer && !options.inSameContainer({\n                                    source: dropTarget,\n                                    target: that._draggable,\n                                    sourceIndex: that._index(dropTarget),\n                                    targetIndex: that._index(that._draggable)\n                                })) {\n                                that._dropTarget = dropTarget;\n                            } else {\n                                if (that._index(dropTarget) > that._index(that._draggable)) {\n                                    left += outerWidth(dropTarget);\n                                }\n                            }\n                            that.reorderDropCue.css({\n                                height: outerHeight(dropTarget),\n                                top: offset.top,\n                                left: left\n                            }).appendTo(document.body);\n                        }\n                    },\n                    dragleave: function (e) {\n                        toggleHintClass(e.draggable.hint, true);\n                        that.reorderDropCue.remove();\n                        that._dropTarget = null;\n                    },\n                    drop: function () {\n                        that._dropTarget = null;\n                        if (!that._draggable) {\n                            return;\n                        }\n                        var dropTarget = this.element;\n                        var draggable = that._draggable;\n                        if (that._dropTargetAllowed(dropTarget) && !that._isLastDraggable()) {\n                            that.trigger(CHANGE, {\n                                element: that._draggable,\n                                target: dropTarget,\n                                oldIndex: that._index(draggable),\n                                newIndex: that._index(dropTarget),\n                                position: getOffset(that.reorderDropCue).left > getOffset(dropTarget).left ? 'after' : 'before'\n                            });\n                        }\n                    }\n                });\n                draggable.bind([\n                    'dragcancel',\n                    'dragend',\n                    'dragstart',\n                    'drag'\n                ], {\n                    dragcancel: function () {\n                        that.reorderDropCue.remove();\n                        that._draggable = null;\n                        that._elements = null;\n                    },\n                    dragend: function () {\n                        that.reorderDropCue.remove();\n                        that._draggable = null;\n                        that._elements = null;\n                    },\n                    dragstart: function (e) {\n                        that._draggable = e.currentTarget;\n                        that._elements = that.element.find(that.draggable.options.filter);\n                    },\n                    drag: function (e) {\n                        if (!that._dropTarget || this.hint.find('.k-drag-status').hasClass('k-i-cancel')) {\n                            return;\n                        }\n                        var dropStartOffset = getOffset(that._dropTarget).left;\n                        var width = outerWidth(that._dropTarget);\n                        if (e.pageX > dropStartOffset + width / 2) {\n                            that.reorderDropCue.css({ left: dropStartOffset + width });\n                        } else {\n                            that.reorderDropCue.css({ left: dropStartOffset });\n                        }\n                    }\n                });\n            },\n            options: {\n                name: 'Reorderable',\n                filter: '*'\n            },\n            events: [CHANGE],\n            _isLastDraggable: function () {\n                var inSameContainer = this.options.inSameContainer, draggable = this._draggable[0], elements = this._elements.get(), found = false, item;\n                if (!inSameContainer) {\n                    return false;\n                }\n                while (!found && elements.length > 0) {\n                    item = elements.pop();\n                    found = draggable !== item && inSameContainer({\n                        source: draggable,\n                        target: item,\n                        sourceIndex: this._index(draggable),\n                        targetIndex: this._index(item)\n                    });\n                }\n                return !found;\n            },\n            _dropTargetAllowed: function (dropTarget) {\n                var inSameContainer = this.options.inSameContainer, dragOverContainers = this.options.dragOverContainers, draggable = this._draggable;\n                if (draggable[0] === dropTarget[0]) {\n                    return false;\n                }\n                if (!inSameContainer || !dragOverContainers) {\n                    return true;\n                }\n                if (inSameContainer({\n                        source: draggable,\n                        target: dropTarget,\n                        sourceIndex: this._index(draggable),\n                        targetIndex: this._index(dropTarget)\n                    })) {\n                    return true;\n                }\n                return dragOverContainers(this._index(draggable), this._index(dropTarget));\n            },\n            _index: function (element) {\n                return this._elements.index(element);\n            },\n            destroy: function () {\n                var that = this;\n                Widget.fn.destroy.call(that);\n                that.element.find(that.draggable.options.filter).each(function () {\n                    var item = $(this);\n                    if (item.data('kendoDropTarget')) {\n                        item.data('kendoDropTarget').destroy();\n                    }\n                });\n                if (that.draggable) {\n                    that.draggable.destroy();\n                    that.draggable.element = that.draggable = null;\n                }\n                that.elements = that.reorderDropCue = that._elements = that._draggable = null;\n            }\n        });\n        kendo.ui.plugin(Reorderable);\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.resizable', [\n        'kendo.core',\n        'kendo.draganddrop'\n    ], f);\n}(function () {\n    var __meta__ = {\n        id: 'resizable',\n        name: 'Resizable',\n        category: 'framework',\n        depends: [\n            'core',\n            'draganddrop'\n        ],\n        advanced: true\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, ui = kendo.ui, Widget = ui.Widget, proxy = $.proxy, isFunction = kendo.isFunction, extend = $.extend, HORIZONTAL = 'horizontal', VERTICAL = 'vertical', START = 'start', RESIZE = 'resize', RESIZEEND = 'resizeend';\n        var Resizable = Widget.extend({\n            init: function (element, options) {\n                var that = this;\n                Widget.fn.init.call(that, element, options);\n                that.orientation = that.options.orientation.toLowerCase() != VERTICAL ? HORIZONTAL : VERTICAL;\n                that._positionMouse = that.orientation == HORIZONTAL ? 'x' : 'y';\n                that._position = that.orientation == HORIZONTAL ? 'left' : 'top';\n                that._sizingDom = that.orientation == HORIZONTAL ? 'outerWidth' : 'outerHeight';\n                that.draggable = new ui.Draggable(options.draggableElement || element, {\n                    distance: 1,\n                    filter: options.handle,\n                    drag: proxy(that._resize, that),\n                    dragcancel: proxy(that._cancel, that),\n                    dragstart: proxy(that._start, that),\n                    dragend: proxy(that._stop, that)\n                });\n                that.userEvents = that.draggable.userEvents;\n            },\n            events: [\n                RESIZE,\n                RESIZEEND,\n                START\n            ],\n            options: {\n                name: 'Resizable',\n                orientation: HORIZONTAL\n            },\n            resize: function () {\n            },\n            _max: function (e) {\n                var that = this, hintSize = that.hint ? that.hint[that._sizingDom]() : 0, size = that.options.max;\n                return isFunction(size) ? size(e) : size !== undefined ? that._initialElementPosition + size - hintSize : size;\n            },\n            _min: function (e) {\n                var that = this, size = that.options.min;\n                return isFunction(size) ? size(e) : size !== undefined ? that._initialElementPosition + size : size;\n            },\n            _start: function (e) {\n                var that = this, hint = that.options.hint, el = $(e.currentTarget);\n                that._initialElementPosition = el.position()[that._position];\n                that._initialMousePosition = e[that._positionMouse].startLocation;\n                if (hint) {\n                    that.hint = isFunction(hint) ? $(hint(el)) : hint;\n                    that.hint.css({ position: 'absolute' }).css(that._position, that._initialElementPosition).appendTo(that.element);\n                }\n                that.trigger(START, e);\n                that._maxPosition = that._max(e);\n                that._minPosition = that._min(e);\n                $(document.body).css('cursor', el.css('cursor'));\n            },\n            _resize: function (e) {\n                var that = this, maxPosition = that._maxPosition, minPosition = that._minPosition, currentPosition = that._initialElementPosition + (e[that._positionMouse].location - that._initialMousePosition), position;\n                position = minPosition !== undefined ? Math.max(minPosition, currentPosition) : currentPosition;\n                that.position = position = maxPosition !== undefined ? Math.min(maxPosition, position) : position;\n                if (that.hint) {\n                    that.hint.toggleClass(that.options.invalidClass || '', position == maxPosition || position == minPosition).css(that._position, position);\n                }\n                that.resizing = true;\n                that.trigger(RESIZE, extend(e, { position: position }));\n            },\n            _stop: function (e) {\n                var that = this;\n                if (that.hint) {\n                    that.hint.remove();\n                }\n                that.resizing = false;\n                that.trigger(RESIZEEND, extend(e, { position: that.position }));\n                $(document.body).css('cursor', '');\n            },\n            _cancel: function (e) {\n                var that = this;\n                if (that.hint) {\n                    that.position = undefined;\n                    that.hint.css(that._position, that._initialElementPosition);\n                    that._stop(e);\n                }\n            },\n            destroy: function () {\n                var that = this;\n                Widget.fn.destroy.call(that);\n                if (that.draggable) {\n                    that.draggable.destroy();\n                }\n            },\n            press: function (target) {\n                if (!target) {\n                    return;\n                }\n                var position = target.position(), that = this;\n                that.userEvents.press(position.left, position.top, target[0]);\n                that.targetPosition = position;\n                that.target = target;\n            },\n            move: function (delta) {\n                var that = this, orientation = that._position, position = that.targetPosition, current = that.position;\n                if (current === undefined) {\n                    current = position[orientation];\n                }\n                position[orientation] = current + delta;\n                that.userEvents.move(position.left, position.top);\n            },\n            end: function () {\n                this.userEvents.end();\n                this.target = this.position = undefined;\n            }\n        });\n        kendo.ui.plugin(Resizable);\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.sortable', ['kendo.draganddrop'], f);\n}(function () {\n    var __meta__ = {\n        id: 'sortable',\n        name: 'Sortable',\n        category: 'framework',\n        depends: ['draganddrop']\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, Widget = kendo.ui.Widget, outerWidth = kendo._outerWidth, outerHeight = kendo._outerHeight, START = 'start', BEFORE_MOVE = 'beforeMove', MOVE = 'move', END = 'end', CHANGE = 'change', CANCEL = 'cancel', ACTION_SORT = 'sort', ACTION_REMOVE = 'remove', ACTION_RECEIVE = 'receive', DEFAULT_FILTER = '>*', MISSING_INDEX = -1;\n        function containsOrEqualTo(parent, child) {\n            try {\n                return $.contains(parent, child) || parent == child;\n            } catch (e) {\n                return false;\n            }\n        }\n        function defaultHint(element) {\n            return element.clone();\n        }\n        function defaultPlaceholder(element) {\n            return element.clone().removeAttr('id').css('visibility', 'hidden');\n        }\n        var Sortable = Widget.extend({\n            init: function (element, options) {\n                var that = this;\n                Widget.fn.init.call(that, element, options);\n                if (!that.options.placeholder) {\n                    that.options.placeholder = defaultPlaceholder;\n                }\n                if (!that.options.hint) {\n                    that.options.hint = defaultHint;\n                }\n                that.draggable = that._createDraggable();\n            },\n            events: [\n                START,\n                BEFORE_MOVE,\n                MOVE,\n                END,\n                CHANGE,\n                CANCEL\n            ],\n            options: {\n                name: 'Sortable',\n                hint: null,\n                placeholder: null,\n                filter: DEFAULT_FILTER,\n                holdToDrag: false,\n                disabled: null,\n                container: null,\n                connectWith: null,\n                handler: null,\n                cursorOffset: null,\n                axis: null,\n                ignore: null,\n                autoScroll: false,\n                cursor: 'auto',\n                moveOnDragEnter: false\n            },\n            destroy: function () {\n                this.draggable.destroy();\n                Widget.fn.destroy.call(this);\n            },\n            _createDraggable: function () {\n                var that = this, element = that.element, options = that.options;\n                return new kendo.ui.Draggable(element, {\n                    filter: options.filter,\n                    hint: kendo.isFunction(options.hint) ? options.hint : $(options.hint),\n                    holdToDrag: options.holdToDrag,\n                    container: options.container ? $(options.container) : null,\n                    cursorOffset: options.cursorOffset,\n                    axis: options.axis,\n                    ignore: options.ignore,\n                    autoScroll: options.autoScroll,\n                    dragstart: $.proxy(that._dragstart, that),\n                    dragcancel: $.proxy(that._dragcancel, that),\n                    drag: $.proxy(that._drag, that),\n                    dragend: $.proxy(that._dragend, that)\n                });\n            },\n            _dragstart: function (e) {\n                var draggedElement = this.draggedElement = e.currentTarget, disabled = this.options.disabled, handler = this.options.handler, _placeholder = this.options.placeholder, placeholder = this.placeholder = kendo.isFunction(_placeholder) ? $(_placeholder.call(this, draggedElement)) : $(_placeholder);\n                if (disabled && draggedElement.is(disabled)) {\n                    e.preventDefault();\n                } else if (handler && !$(e.initialTarget).is(handler)) {\n                    e.preventDefault();\n                } else {\n                    if (this.trigger(START, {\n                            item: draggedElement,\n                            draggableEvent: e\n                        })) {\n                        e.preventDefault();\n                    } else {\n                        draggedElement.css('display', 'none');\n                        draggedElement.before(placeholder);\n                        this._setCursor();\n                    }\n                }\n            },\n            _dragcancel: function () {\n                this._cancel();\n                this.trigger(CANCEL, { item: this.draggedElement });\n                this._resetCursor();\n            },\n            _drag: function (e) {\n                var draggedElement = this.draggedElement, target = this._findTarget(e), targetCenter, cursorOffset = {\n                        left: e.x.location,\n                        top: e.y.location\n                    }, offsetDelta, axisDelta = {\n                        x: e.x.delta,\n                        y: e.y.delta\n                    }, direction, sibling, getSibling, axis = this.options.axis, moveOnDragEnter = this.options.moveOnDragEnter, eventData = {\n                        item: draggedElement,\n                        list: this,\n                        draggableEvent: e\n                    };\n                if (axis === 'x' || axis === 'y') {\n                    this._movementByAxis(axis, cursorOffset, axisDelta[axis], eventData);\n                    return;\n                }\n                if (target) {\n                    targetCenter = this._getElementCenter(target.element);\n                    offsetDelta = {\n                        left: Math.round(cursorOffset.left - targetCenter.left),\n                        top: Math.round(cursorOffset.top - targetCenter.top)\n                    };\n                    $.extend(eventData, { target: target.element });\n                    if (target.appendToBottom) {\n                        this._movePlaceholder(target, null, eventData);\n                        return;\n                    }\n                    if (target.appendAfterHidden) {\n                        this._movePlaceholder(target, 'next', eventData);\n                    }\n                    if (this._isFloating(target.element)) {\n                        if (axisDelta.x < 0 && moveOnDragEnter || !moveOnDragEnter && offsetDelta.left < 0) {\n                            direction = 'prev';\n                        } else if (axisDelta.x > 0 && moveOnDragEnter || !moveOnDragEnter && offsetDelta.left > 0) {\n                            direction = 'next';\n                        }\n                    } else {\n                        if (axisDelta.y < 0 && moveOnDragEnter || !moveOnDragEnter && offsetDelta.top < 0) {\n                            direction = 'prev';\n                        } else if (axisDelta.y > 0 && moveOnDragEnter || !moveOnDragEnter && offsetDelta.top > 0) {\n                            direction = 'next';\n                        }\n                    }\n                    if (direction) {\n                        getSibling = direction === 'prev' ? jQuery.fn.prev : jQuery.fn.next;\n                        sibling = getSibling.call(target.element);\n                        while (sibling.length && !sibling.is(':visible')) {\n                            sibling = getSibling.call(sibling);\n                        }\n                        if (sibling[0] != this.placeholder[0]) {\n                            this._movePlaceholder(target, direction, eventData);\n                        }\n                    }\n                }\n            },\n            _dragend: function (e) {\n                var placeholder = this.placeholder, draggedElement = this.draggedElement, draggedIndex = this.indexOf(draggedElement), placeholderIndex = this.indexOf(placeholder), connectWith = this.options.connectWith, connectedList, isDefaultPrevented, eventData, connectedListEventData;\n                this._resetCursor();\n                eventData = {\n                    action: ACTION_SORT,\n                    item: draggedElement,\n                    oldIndex: draggedIndex,\n                    newIndex: placeholderIndex,\n                    draggableEvent: e\n                };\n                if (placeholderIndex >= 0) {\n                    isDefaultPrevented = this.trigger(END, eventData);\n                } else {\n                    connectedList = placeholder.parents(connectWith).getKendoSortable();\n                    eventData.action = ACTION_REMOVE;\n                    connectedListEventData = $.extend({}, eventData, {\n                        action: ACTION_RECEIVE,\n                        oldIndex: MISSING_INDEX,\n                        newIndex: connectedList.indexOf(placeholder)\n                    });\n                    isDefaultPrevented = !(!this.trigger(END, eventData) && !connectedList.trigger(END, connectedListEventData));\n                }\n                if (isDefaultPrevented || placeholderIndex === draggedIndex) {\n                    this._cancel();\n                    return;\n                }\n                placeholder.replaceWith(draggedElement);\n                draggedElement.show();\n                this.draggable.dropped = true;\n                eventData = {\n                    action: this.indexOf(draggedElement) != MISSING_INDEX ? ACTION_SORT : ACTION_REMOVE,\n                    item: draggedElement,\n                    oldIndex: draggedIndex,\n                    newIndex: this.indexOf(draggedElement),\n                    draggableEvent: e\n                };\n                this.trigger(CHANGE, eventData);\n                if (connectedList) {\n                    connectedListEventData = $.extend({}, eventData, {\n                        action: ACTION_RECEIVE,\n                        oldIndex: MISSING_INDEX,\n                        newIndex: connectedList.indexOf(draggedElement)\n                    });\n                    connectedList.trigger(CHANGE, connectedListEventData);\n                }\n            },\n            _findTarget: function (e) {\n                var element = this._findElementUnderCursor(e), items, connectWith = this.options.connectWith, node;\n                if ($.contains(this.element[0], element)) {\n                    items = this.items();\n                    node = items.filter(element)[0] || items.has(element)[0];\n                    return node ? {\n                        element: $(node),\n                        sortable: this\n                    } : null;\n                } else if (this.element[0] == element && this._isEmpty()) {\n                    return {\n                        element: this.element,\n                        sortable: this,\n                        appendToBottom: true\n                    };\n                } else if (this.element[0] == element && this._isLastHidden()) {\n                    node = this.items().eq(0);\n                    return {\n                        element: node,\n                        sortable: this,\n                        appendAfterHidden: true\n                    };\n                } else if (connectWith) {\n                    return this._searchConnectedTargets(element, e);\n                }\n            },\n            _findElementUnderCursor: function (e) {\n                var elementUnderCursor = kendo.elementUnderCursor(e), draggable = e.sender;\n                if (containsOrEqualTo(draggable.hint[0], elementUnderCursor)) {\n                    draggable.hint.hide();\n                    elementUnderCursor = kendo.elementUnderCursor(e);\n                    if (!elementUnderCursor) {\n                        elementUnderCursor = kendo.elementUnderCursor(e);\n                    }\n                    draggable.hint.show();\n                }\n                return elementUnderCursor;\n            },\n            _searchConnectedTargets: function (element, e) {\n                var connected = $(this.options.connectWith), sortableInstance, items, node;\n                for (var i = 0; i < connected.length; i++) {\n                    sortableInstance = connected.eq(i).getKendoSortable();\n                    if ($.contains(connected[i], element)) {\n                        if (sortableInstance) {\n                            items = sortableInstance.items();\n                            node = items.filter(element)[0] || items.has(element)[0];\n                            if (node) {\n                                sortableInstance.placeholder = this.placeholder;\n                                return {\n                                    element: $(node),\n                                    sortable: sortableInstance\n                                };\n                            } else {\n                                return null;\n                            }\n                        }\n                    } else if (connected[i] == element) {\n                        if (sortableInstance && sortableInstance._isEmpty()) {\n                            return {\n                                element: connected.eq(i),\n                                sortable: sortableInstance,\n                                appendToBottom: true\n                            };\n                        } else if (this._isCursorAfterLast(sortableInstance, e)) {\n                            node = sortableInstance.items().last();\n                            return {\n                                element: node,\n                                sortable: sortableInstance\n                            };\n                        }\n                    }\n                }\n            },\n            _isCursorAfterLast: function (sortable, e) {\n                var lastItem = sortable.items().last(), cursorOffset = {\n                        left: e.x.location,\n                        top: e.y.location\n                    }, lastItemOffset, delta;\n                lastItemOffset = kendo.getOffset(lastItem);\n                lastItemOffset.top += outerHeight(lastItem);\n                lastItemOffset.left += outerWidth(lastItem);\n                if (this._isFloating(lastItem)) {\n                    delta = lastItemOffset.left - cursorOffset.left;\n                } else {\n                    delta = lastItemOffset.top - cursorOffset.top;\n                }\n                return delta < 0 ? true : false;\n            },\n            _movementByAxis: function (axis, cursorOffset, delta, eventData) {\n                var cursorPosition = axis === 'x' ? cursorOffset.left : cursorOffset.top, target = delta < 0 ? this.placeholder.prev() : this.placeholder.next(), targetCenter;\n                if (target.length && !target.is(':visible')) {\n                    target = delta < 0 ? target.prev() : target.next();\n                }\n                $.extend(eventData, { target: target });\n                targetCenter = this._getElementCenter(target);\n                if (targetCenter) {\n                    targetCenter = axis === 'x' ? targetCenter.left : targetCenter.top;\n                }\n                if (target.length && delta < 0 && cursorPosition - targetCenter < 0) {\n                    this._movePlaceholder({\n                        element: target,\n                        sortable: this\n                    }, 'prev', eventData);\n                } else if (target.length && delta > 0 && cursorPosition - targetCenter > 0) {\n                    this._movePlaceholder({\n                        element: target,\n                        sortable: this\n                    }, 'next', eventData);\n                }\n            },\n            _movePlaceholder: function (target, direction, eventData) {\n                var placeholder = this.placeholder;\n                if (!target.sortable.trigger(BEFORE_MOVE, eventData)) {\n                    if (!direction) {\n                        target.element.append(placeholder);\n                    } else if (direction === 'prev') {\n                        target.element.before(placeholder);\n                    } else if (direction === 'next') {\n                        target.element.after(placeholder);\n                    }\n                    target.sortable.trigger(MOVE, eventData);\n                }\n            },\n            _setCursor: function () {\n                var cursor = this.options.cursor, body;\n                if (cursor && cursor !== 'auto') {\n                    body = $(document.body);\n                    this._originalCursorType = body.css('cursor');\n                    body.css({ 'cursor': cursor });\n                    if (!this._cursorStylesheet) {\n                        this._cursorStylesheet = $('<style>* { cursor: ' + cursor + ' !important; }</style>');\n                    }\n                    this._cursorStylesheet.appendTo(body);\n                }\n            },\n            _resetCursor: function () {\n                if (this._originalCursorType) {\n                    $(document.body).css('cursor', this._originalCursorType);\n                    this._originalCursorType = null;\n                    this._cursorStylesheet.remove();\n                }\n            },\n            _getElementCenter: function (element) {\n                var center = element.length ? kendo.getOffset(element) : null;\n                if (center) {\n                    center.top += outerHeight(element) / 2;\n                    center.left += outerWidth(element) / 2;\n                }\n                return center;\n            },\n            _isFloating: function (item) {\n                return /left|right/.test(item.css('float')) || /inline|table-cell/.test(item.css('display'));\n            },\n            _cancel: function () {\n                this.draggedElement.show();\n                this.placeholder.remove();\n            },\n            _items: function () {\n                var filter = this.options.filter, items;\n                if (filter) {\n                    items = this.element.find(filter);\n                } else {\n                    items = this.element.children();\n                }\n                return items;\n            },\n            indexOf: function (element) {\n                var items = this._items(), placeholder = this.placeholder, draggedElement = this.draggedElement;\n                if (placeholder && element[0] == placeholder[0]) {\n                    return items.not(draggedElement).index(element);\n                } else {\n                    return items.not(placeholder).index(element);\n                }\n            },\n            items: function () {\n                var placeholder = this.placeholder, items = this._items();\n                if (placeholder) {\n                    items = items.not(placeholder);\n                }\n                return items;\n            },\n            _isEmpty: function () {\n                return !this.items().length;\n            },\n            _isLastHidden: function () {\n                return this.items().length === 1 && this.items().is(':hidden');\n            }\n        });\n        kendo.ui.plugin(Sortable);\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.selectable', [\n        'kendo.core',\n        'kendo.userevents'\n    ], f);\n}(function () {\n    var __meta__ = {\n        id: 'selectable',\n        name: 'Selectable',\n        category: 'framework',\n        depends: [\n            'core',\n            'userevents'\n        ],\n        advanced: true\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, Widget = kendo.ui.Widget, proxy = $.proxy, abs = Math.abs, ARIASELECTED = 'aria-selected', SELECTED = 'k-state-selected', ACTIVE = 'k-state-selecting', SELECTABLE = 'k-selectable', CHANGE = 'change', NS = '.kendoSelectable', UNSELECTING = 'k-state-unselecting', INPUTSELECTOR = 'input,a,textarea,.k-multiselect-wrap,select,button,.k-button>span,.k-button>img,span.k-icon.k-i-arrow-60-down,span.k-icon.k-i-arrow-60-up', msie = kendo.support.browser.msie, supportEventDelegation = false;\n        (function ($) {\n            (function () {\n                $('<div class=\"parent\"><span /></div>').on('click', '>*', function () {\n                    supportEventDelegation = true;\n                }).find('span').click().end().off();\n            }());\n        }($));\n        var Selectable = Widget.extend({\n            init: function (element, options) {\n                var that = this, multiple;\n                Widget.fn.init.call(that, element, options);\n                that._marquee = $('<div class=\\'k-marquee\\'><div class=\\'k-marquee-color\\'></div></div>');\n                that._lastActive = null;\n                that.element.addClass(SELECTABLE);\n                that.relatedTarget = that.options.relatedTarget;\n                multiple = that.options.multiple;\n                if (this.options.aria && multiple) {\n                    that.element.attr('aria-multiselectable', true);\n                }\n                that.userEvents = new kendo.UserEvents(that.element, {\n                    global: true,\n                    allowSelection: true,\n                    filter: (!supportEventDelegation ? '.' + SELECTABLE + ' ' : '') + that.options.filter,\n                    tap: proxy(that._tap, that)\n                });\n                if (multiple) {\n                    that.userEvents.bind('start', proxy(that._start, that)).bind('move', proxy(that._move, that)).bind('end', proxy(that._end, that)).bind('select', proxy(that._select, that));\n                }\n            },\n            events: [CHANGE],\n            options: {\n                name: 'Selectable',\n                filter: '>*',\n                multiple: false,\n                relatedTarget: $.noop\n            },\n            _isElement: function (target) {\n                var elements = this.element;\n                var idx, length = elements.length, result = false;\n                target = target[0];\n                for (idx = 0; idx < length; idx++) {\n                    if (elements[idx] === target) {\n                        result = true;\n                        break;\n                    }\n                }\n                return result;\n            },\n            _tap: function (e) {\n                var target = $(e.target), that = this, ctrlKey = e.event.ctrlKey || e.event.metaKey, multiple = that.options.multiple, shiftKey = multiple && e.event.shiftKey, selected, whichCode = e.event.which, buttonCode = e.event.button;\n                if (!that._isElement(target.closest('.' + SELECTABLE)) || whichCode && whichCode == 3 || buttonCode && buttonCode == 2) {\n                    return;\n                }\n                if (!this._allowSelection(e.event.target)) {\n                    return;\n                }\n                selected = target.hasClass(SELECTED);\n                if (!multiple || !ctrlKey) {\n                    that.clear();\n                }\n                target = target.add(that.relatedTarget(target));\n                if (shiftKey) {\n                    that.selectRange(that._firstSelectee(), target);\n                } else {\n                    if (selected && ctrlKey) {\n                        that._unselect(target);\n                        that._notify(CHANGE);\n                    } else {\n                        that.value(target);\n                    }\n                    that._lastActive = that._downTarget = target;\n                }\n            },\n            _start: function (e) {\n                var that = this, target = $(e.target), selected = target.hasClass(SELECTED), currentElement, ctrlKey = e.event.ctrlKey || e.event.metaKey;\n                if (!this._allowSelection(e.event.target)) {\n                    return;\n                }\n                that._downTarget = target;\n                if (!that._isElement(target.closest('.' + SELECTABLE))) {\n                    that.userEvents.cancel();\n                    return;\n                }\n                if (that.options.useAllItems) {\n                    that._items = that.element.find(that.options.filter);\n                } else {\n                    currentElement = target.closest(that.element);\n                    that._items = currentElement.find(that.options.filter);\n                }\n                e.sender.capture();\n                that._marquee.appendTo(document.body).css({\n                    left: e.x.client + 1,\n                    top: e.y.client + 1,\n                    width: 0,\n                    height: 0\n                });\n                if (!ctrlKey) {\n                    that.clear();\n                }\n                target = target.add(that.relatedTarget(target));\n                if (selected) {\n                    that._selectElement(target, true);\n                    if (ctrlKey) {\n                        target.addClass(UNSELECTING);\n                    }\n                }\n            },\n            _move: function (e) {\n                var that = this, position = {\n                        left: e.x.startLocation > e.x.location ? e.x.location : e.x.startLocation,\n                        top: e.y.startLocation > e.y.location ? e.y.location : e.y.startLocation,\n                        width: abs(e.x.initialDelta),\n                        height: abs(e.y.initialDelta)\n                    };\n                that._marquee.css(position);\n                that._invalidateSelectables(position, e.event.ctrlKey || e.event.metaKey);\n                e.preventDefault();\n            },\n            _end: function () {\n                var that = this;\n                that._marquee.remove();\n                that._unselect(that.element.find(that.options.filter + '.' + UNSELECTING)).removeClass(UNSELECTING);\n                var target = that.element.find(that.options.filter + '.' + ACTIVE);\n                target = target.add(that.relatedTarget(target));\n                that.value(target);\n                that._lastActive = that._downTarget;\n                that._items = null;\n            },\n            _invalidateSelectables: function (position, ctrlKey) {\n                var idx, length, target = this._downTarget[0], items = this._items, related, toSelect;\n                for (idx = 0, length = items.length; idx < length; idx++) {\n                    toSelect = items.eq(idx);\n                    related = toSelect.add(this.relatedTarget(toSelect));\n                    if (collision(toSelect, position)) {\n                        if (toSelect.hasClass(SELECTED)) {\n                            if (ctrlKey && target !== toSelect[0]) {\n                                related.removeClass(SELECTED).addClass(UNSELECTING);\n                            }\n                        } else if (!toSelect.hasClass(ACTIVE) && !toSelect.hasClass(UNSELECTING)) {\n                            related.addClass(ACTIVE);\n                        }\n                    } else {\n                        if (toSelect.hasClass(ACTIVE)) {\n                            related.removeClass(ACTIVE);\n                        } else if (ctrlKey && toSelect.hasClass(UNSELECTING)) {\n                            related.removeClass(UNSELECTING).addClass(SELECTED);\n                        }\n                    }\n                }\n            },\n            value: function (val) {\n                var that = this, selectElement = proxy(that._selectElement, that);\n                if (val) {\n                    val.each(function () {\n                        selectElement(this);\n                    });\n                    that._notify(CHANGE);\n                    return;\n                }\n                return that.element.find(that.options.filter + '.' + SELECTED);\n            },\n            _firstSelectee: function () {\n                var that = this, selected;\n                if (that._lastActive !== null) {\n                    return that._lastActive;\n                }\n                selected = that.value();\n                return selected.length > 0 ? selected[0] : that.element.find(that.options.filter)[0];\n            },\n            _selectElement: function (element, preventNotify) {\n                var toSelect = $(element), isPrevented = !preventNotify && this._notify('select', { element: element });\n                toSelect.removeClass(ACTIVE);\n                if (!isPrevented) {\n                    toSelect.addClass(SELECTED);\n                    if (this.options.aria) {\n                        toSelect.attr(ARIASELECTED, true);\n                    }\n                }\n            },\n            _notify: function (name, args) {\n                args = args || {};\n                return this.trigger(name, args);\n            },\n            _unselect: function (element) {\n                element.removeClass(SELECTED);\n                if (this.options.aria) {\n                    element.attr(ARIASELECTED, false);\n                }\n                return element;\n            },\n            _select: function (e) {\n                if (this._allowSelection(e.event.target)) {\n                    if (!msie || msie && !$(kendo._activeElement()).is(INPUTSELECTOR)) {\n                        e.preventDefault();\n                    }\n                }\n            },\n            _allowSelection: function (target) {\n                if ($(target).is(INPUTSELECTOR)) {\n                    this.userEvents.cancel();\n                    this._downTarget = null;\n                    return false;\n                }\n                return true;\n            },\n            resetTouchEvents: function () {\n                this.userEvents.cancel();\n            },\n            clear: function () {\n                var items = this.element.find(this.options.filter + '.' + SELECTED);\n                this._unselect(items);\n            },\n            selectRange: function (start, end) {\n                var that = this, idx, tmp, items;\n                that.clear();\n                if (that.element.length > 1) {\n                    items = that.options.continuousItems();\n                }\n                if (!items || !items.length) {\n                    items = that.element.find(that.options.filter);\n                }\n                start = $.inArray($(start)[0], items);\n                end = $.inArray($(end)[0], items);\n                if (start > end) {\n                    tmp = start;\n                    start = end;\n                    end = tmp;\n                }\n                if (!that.options.useAllItems) {\n                    end += that.element.length - 1;\n                }\n                for (idx = start; idx <= end; idx++) {\n                    that._selectElement(items[idx]);\n                }\n                that._notify(CHANGE);\n            },\n            destroy: function () {\n                var that = this;\n                Widget.fn.destroy.call(that);\n                that.element.off(NS);\n                that.userEvents.destroy();\n                that._marquee = that._lastActive = that.element = that.userEvents = null;\n            }\n        });\n        Selectable.parseOptions = function (selectable) {\n            var asLowerString = typeof selectable === 'string' && selectable.toLowerCase();\n            return {\n                multiple: asLowerString && asLowerString.indexOf('multiple') > -1,\n                cell: asLowerString && asLowerString.indexOf('cell') > -1\n            };\n        };\n        function collision(element, position) {\n            if (!element.is(':visible')) {\n                return false;\n            }\n            var elementPosition = kendo.getOffset(element), right = position.left + position.width, bottom = position.top + position.height;\n            elementPosition.right = elementPosition.left + kendo._outerWidth(element);\n            elementPosition.bottom = elementPosition.top + kendo._outerHeight(element);\n            return !(elementPosition.left > right || elementPosition.right < position.left || elementPosition.top > bottom || elementPosition.bottom < position.top);\n        }\n        kendo.ui.plugin(Selectable);\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.button', ['kendo.core'], f);\n}(function () {\n    var __meta__ = {\n        id: 'button',\n        name: 'Button',\n        category: 'web',\n        description: 'The Button widget displays styled buttons.',\n        depends: ['core']\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, Widget = kendo.ui.Widget, proxy = $.proxy, keys = kendo.keys, CLICK = 'click', KBUTTON = 'k-button', KBUTTONICON = 'k-button-icon', KBUTTONICONTEXT = 'k-button-icontext', NS = '.kendoButton', DISABLED = 'disabled', DISABLEDSTATE = 'k-state-disabled', FOCUSEDSTATE = 'k-state-focused', SELECTEDSTATE = 'k-state-selected';\n        var Button = Widget.extend({\n            init: function (element, options) {\n                var that = this;\n                Widget.fn.init.call(that, element, options);\n                element = that.wrapper = that.element;\n                options = that.options;\n                element.addClass(KBUTTON).attr('role', 'button');\n                options.enable = options.enable && !element.attr(DISABLED);\n                that.enable(options.enable);\n                that._tabindex();\n                that._graphics();\n                element.on(CLICK + NS, proxy(that._click, that)).on('focus' + NS, proxy(that._focus, that)).on('blur' + NS, proxy(that._blur, that)).on('keydown' + NS, proxy(that._keydown, that)).on('keyup' + NS, proxy(that._keyup, that));\n                kendo.notify(that);\n            },\n            destroy: function () {\n                var that = this;\n                that.wrapper.off(NS);\n                Widget.fn.destroy.call(that);\n            },\n            events: [CLICK],\n            options: {\n                name: 'Button',\n                icon: '',\n                spriteCssClass: '',\n                imageUrl: '',\n                enable: true\n            },\n            _isNativeButton: function () {\n                return this.element.prop('tagName').toLowerCase() == 'button';\n            },\n            _click: function (e) {\n                if (this.options.enable) {\n                    if (this.trigger(CLICK, { event: e })) {\n                        e.preventDefault();\n                    }\n                }\n            },\n            _focus: function () {\n                if (this.options.enable) {\n                    this.element.addClass(FOCUSEDSTATE);\n                }\n            },\n            _blur: function () {\n                this.element.removeClass(FOCUSEDSTATE);\n            },\n            _keydown: function (e) {\n                var that = this;\n                if (!that._isNativeButton()) {\n                    if (e.keyCode == keys.ENTER || e.keyCode == keys.SPACEBAR) {\n                        if (e.keyCode == keys.SPACEBAR) {\n                            e.preventDefault();\n                            if (that.options.enable) {\n                                that.element.addClass(SELECTEDSTATE);\n                            }\n                        }\n                        that._click(e);\n                    }\n                }\n            },\n            _keyup: function () {\n                this.element.removeClass(SELECTEDSTATE);\n            },\n            _graphics: function () {\n                var that = this, element = that.element, options = that.options, icon = options.icon, spriteCssClass = options.spriteCssClass, imageUrl = options.imageUrl, span, img, isEmpty;\n                if (spriteCssClass || imageUrl || icon) {\n                    isEmpty = true;\n                    element.contents().filter(function () {\n                        return !$(this).hasClass('k-sprite') && !$(this).hasClass('k-icon') && !$(this).hasClass('k-image');\n                    }).each(function (idx, el) {\n                        if (el.nodeType == 1 || el.nodeType == 3 && $.trim(el.nodeValue).length > 0) {\n                            isEmpty = false;\n                        }\n                    });\n                    if (isEmpty) {\n                        element.addClass(KBUTTONICON);\n                    } else {\n                        element.addClass(KBUTTONICONTEXT);\n                    }\n                }\n                if (icon) {\n                    span = element.children('span.k-icon').first();\n                    if (!span[0]) {\n                        span = $('<span class=\"k-icon\"></span>').prependTo(element);\n                    }\n                    span.addClass('k-i-' + icon);\n                } else if (spriteCssClass) {\n                    span = element.children('span.k-sprite').first();\n                    if (!span[0]) {\n                        span = $('<span class=\"k-sprite\"></span>').prependTo(element);\n                    }\n                    span.addClass(spriteCssClass);\n                } else if (imageUrl) {\n                    img = element.children('img.k-image').first();\n                    if (!img[0]) {\n                        img = $('<img alt=\"icon\" class=\"k-image\" />').prependTo(element);\n                    }\n                    img.attr('src', imageUrl);\n                }\n            },\n            enable: function (enable) {\n                var that = this, element = that.element;\n                if (enable === undefined) {\n                    enable = true;\n                }\n                enable = !!enable;\n                that.options.enable = enable;\n                element.toggleClass(DISABLEDSTATE, !enable).attr('aria-disabled', !enable).attr(DISABLED, !enable);\n                try {\n                    element.blur();\n                } catch (err) {\n                }\n            }\n        });\n        kendo.ui.plugin(Button);\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.pager', ['kendo.data'], f);\n}(function () {\n    var __meta__ = {\n        id: 'pager',\n        name: 'Pager',\n        category: 'framework',\n        depends: ['data'],\n        advanced: true\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, ui = kendo.ui, Widget = ui.Widget, proxy = $.proxy, FIRST = '.k-i-seek-w', LAST = '.k-i-seek-e', PREV = '.k-i-arrow-w', NEXT = '.k-i-arrow-e', CHANGE = 'change', NS = '.kendoPager', CLICK = 'click', KEYDOWN = 'keydown', DISABLED = 'disabled', MOUSEDOWN = 'down', DOCUMENT_ELEMENT = $(document.documentElement), iconTemplate = kendo.template('<a href=\"\\\\#\" aria-label=\"#=text#\" title=\"#=text#\" class=\"k-link k-pager-nav #= wrapClassName #\"><span class=\"k-icon #= className #\"></span></a>');\n        function button(template, idx, text, numeric, title) {\n            return template({\n                idx: idx,\n                text: text,\n                ns: kendo.ns,\n                numeric: numeric,\n                title: title || ''\n            });\n        }\n        function icon(className, text, wrapClassName) {\n            return iconTemplate({\n                className: className.substring(1),\n                text: text,\n                wrapClassName: wrapClassName || ''\n            });\n        }\n        function update(element, selector, page, disabled) {\n            element.find(selector).parent().attr(kendo.attr('page'), page).attr('tabindex', -1).toggleClass('k-state-disabled', disabled);\n        }\n        function first(element, page) {\n            update(element, FIRST, 1, page <= 1);\n        }\n        function prev(element, page) {\n            update(element, PREV, Math.max(1, page - 1), page <= 1);\n        }\n        function next(element, page, totalPages) {\n            update(element, NEXT, Math.min(totalPages, page + 1), page >= totalPages);\n        }\n        function last(element, page, totalPages) {\n            update(element, LAST, totalPages, page >= totalPages);\n        }\n        var Pager = Widget.extend({\n            init: function (element, options) {\n                var that = this, page, totalPages;\n                Widget.fn.init.call(that, element, options);\n                options = that.options;\n                that.dataSource = kendo.data.DataSource.create(options.dataSource);\n                that.linkTemplate = kendo.template(that.options.linkTemplate);\n                that.selectTemplate = kendo.template(that.options.selectTemplate);\n                that.currentPageTemplate = kendo.template(that.options.currentPageTemplate);\n                page = that.page();\n                totalPages = that.totalPages();\n                that._refreshHandler = proxy(that.refresh, that);\n                that.dataSource.bind(CHANGE, that._refreshHandler);\n                that.downEvent = kendo.applyEventMap(MOUSEDOWN, kendo.guid());\n                if (options.previousNext) {\n                    if (!that.element.find(FIRST).length) {\n                        that.element.append(icon(FIRST, options.messages.first, 'k-pager-first'));\n                        first(that.element, page, totalPages);\n                    }\n                    if (!that.element.find(PREV).length) {\n                        that.element.append(icon(PREV, options.messages.previous));\n                        prev(that.element, page, totalPages);\n                    }\n                }\n                if (options.numeric) {\n                    that.list = that.element.find('.k-pager-numbers');\n                    if (!that.list.length) {\n                        that.list = $('<ul class=\"k-pager-numbers k-reset\" />').appendTo(that.element);\n                    }\n                }\n                if (options.input) {\n                    if (!that.element.find('.k-pager-input').length) {\n                        that.element.append('<span class=\"k-pager-input k-label\">' + options.messages.page + '<input class=\"k-textbox\">' + kendo.format(options.messages.of, totalPages) + '</span>');\n                    }\n                    that.element.on(KEYDOWN + NS, '.k-pager-input input', proxy(that._keydown, that));\n                }\n                if (options.previousNext) {\n                    if (!that.element.find(NEXT).length) {\n                        that.element.append(icon(NEXT, options.messages.next));\n                        next(that.element, page, totalPages);\n                    }\n                    if (!that.element.find(LAST).length) {\n                        that.element.append(icon(LAST, options.messages.last, 'k-pager-last'));\n                        last(that.element, page, totalPages);\n                    }\n                }\n                if (options.pageSizes) {\n                    if (!that.element.find('.k-pager-sizes').length) {\n                        var pageSizes = options.pageSizes.length ? options.pageSizes : [\n                            'all',\n                            5,\n                            10,\n                            20\n                        ];\n                        var pageItems = $.map(pageSizes, function (size) {\n                            if (size.toLowerCase && size.toLowerCase() === 'all') {\n                                return '<option value=\\'all\\'>' + options.messages.allPages + '</option>';\n                            }\n                            return '<option>' + size + '</option>';\n                        });\n                        $('<span class=\"k-pager-sizes k-label\"><select/>' + options.messages.itemsPerPage + '</span>').appendTo(that.element).find('select').html(pageItems.join('')).end().appendTo(that.element);\n                    }\n                    that.element.find('.k-pager-sizes select').val(that.pageSize());\n                    if (kendo.ui.DropDownList) {\n                        that.element.find('.k-pager-sizes select').show().kendoDropDownList();\n                    }\n                    that.element.on(CHANGE + NS, '.k-pager-sizes select', proxy(that._change, that));\n                }\n                if (options.refresh) {\n                    if (!that.element.find('.k-pager-refresh').length) {\n                        that.element.append('<a href=\"#\" class=\"k-pager-refresh k-link\" title=\"' + options.messages.refresh + '\" aria-label=\"' + options.messages.refresh + '\"><span class=\"k-icon k-i-reload\"></span></a>');\n                    }\n                    that.element.on(CLICK + NS, '.k-pager-refresh', proxy(that._refreshClick, that));\n                }\n                if (options.info) {\n                    if (!that.element.find('.k-pager-info').length) {\n                        that.element.append('<span class=\"k-pager-info k-label\" />');\n                    }\n                }\n                that.element.on(CLICK + NS, 'a', proxy(that._click, that)).addClass('k-pager-wrap k-widget k-floatwrap');\n                that.element.on(CLICK + NS, '.k-current-page', proxy(that._toggleActive, that));\n                if (options.autoBind) {\n                    that.refresh();\n                }\n                kendo.notify(that);\n            },\n            destroy: function () {\n                var that = this;\n                Widget.fn.destroy.call(that);\n                that.element.off(NS);\n                that.dataSource.unbind(CHANGE, that._refreshHandler);\n                that._refreshHandler = null;\n                kendo.destroy(that.element);\n                that.element = that.list = null;\n            },\n            events: [CHANGE],\n            options: {\n                name: 'Pager',\n                selectTemplate: '<li><span class=\"k-state-selected\">#=text#</span></li>',\n                currentPageTemplate: '<li class=\"k-current-page\"><span class=\"k-link k-pager-nav\">#=text#</span></li>',\n                linkTemplate: '<li><a tabindex=\"-1\" href=\"\\\\#\" class=\"k-link\" data-#=ns#page=\"#=idx#\" #if (title !== \"\") {# title=\"#=title#\" #}#>#=text#</a></li>',\n                buttonCount: 10,\n                autoBind: true,\n                numeric: true,\n                info: true,\n                input: false,\n                previousNext: true,\n                pageSizes: false,\n                refresh: false,\n                messages: {\n                    allPages: 'All',\n                    display: '{0} - {1} of {2} items',\n                    empty: 'No items to display',\n                    page: 'Page',\n                    of: 'of {0}',\n                    itemsPerPage: 'items per page',\n                    first: 'Go to the first page',\n                    previous: 'Go to the previous page',\n                    next: 'Go to the next page',\n                    last: 'Go to the last page',\n                    refresh: 'Refresh',\n                    morePages: 'More pages'\n                }\n            },\n            setDataSource: function (dataSource) {\n                var that = this;\n                that.dataSource.unbind(CHANGE, that._refreshHandler);\n                that.dataSource = that.options.dataSource = dataSource;\n                dataSource.bind(CHANGE, that._refreshHandler);\n                if (that.options.autoBind) {\n                    dataSource.fetch();\n                }\n            },\n            refresh: function (e) {\n                var that = this, idx, end, start = 1, reminder, page = that.page(), html = '', options = that.options, pageSize = that.pageSize(), total = that.dataSource.total(), totalPages = that.totalPages(), linkTemplate = that.linkTemplate, buttonCount = options.buttonCount;\n                DOCUMENT_ELEMENT.unbind(that.downEvent, $.proxy(that._hideList, that));\n                if (e && e.action == 'itemchange') {\n                    return;\n                }\n                if (options.numeric) {\n                    if (page > buttonCount) {\n                        reminder = page % buttonCount;\n                        start = reminder === 0 ? page - buttonCount + 1 : page - reminder + 1;\n                    }\n                    end = Math.min(start + buttonCount - 1, totalPages);\n                    if (start > 1) {\n                        html += button(linkTemplate, start - 1, '...', false, options.messages.morePages);\n                    }\n                    for (idx = start; idx <= end; idx++) {\n                        html += button(idx == page ? that.selectTemplate : linkTemplate, idx, idx, true);\n                    }\n                    if (end < totalPages) {\n                        html += button(linkTemplate, idx, '...', false, options.messages.morePages);\n                    }\n                    if (html === '') {\n                        html = that.selectTemplate({ text: 0 });\n                    }\n                    html = this.currentPageTemplate({ text: page }) + html;\n                    that.list.removeClass('k-state-expanded').html(html);\n                }\n                if (options.info) {\n                    if (total > 0) {\n                        html = kendo.format(options.messages.display, Math.min((page - 1) * pageSize + 1, total), Math.min(page * pageSize, total), total);\n                    } else {\n                        html = options.messages.empty;\n                    }\n                    that.element.find('.k-pager-info').html(html);\n                }\n                if (options.input) {\n                    that.element.find('.k-pager-input').html(that.options.messages.page + '<input class=\"k-textbox\" aria-label=\"' + page + '\">' + kendo.format(options.messages.of, totalPages)).find('input').val(page).attr(DISABLED, total < 1).toggleClass('k-state-disabled', total < 1);\n                }\n                if (options.previousNext) {\n                    first(that.element, page, totalPages);\n                    prev(that.element, page, totalPages);\n                    next(that.element, page, totalPages);\n                    last(that.element, page, totalPages);\n                }\n                if (options.pageSizes) {\n                    var hasAll = that.element.find('.k-pager-sizes option[value=\\'all\\']').length > 0;\n                    var selectAll = hasAll && pageSize === this.dataSource.total();\n                    var text = pageSize;\n                    if (selectAll) {\n                        pageSize = 'all';\n                        text = options.messages.allPages;\n                    }\n                    that.element.find('.k-pager-sizes select').val(pageSize).attr('aria-label', pageSize).filter('[' + kendo.attr('role') + '=dropdownlist]').kendoDropDownList('value', pageSize).kendoDropDownList('text', text);\n                }\n            },\n            _keydown: function (e) {\n                if (e.keyCode === kendo.keys.ENTER) {\n                    var input = this.element.find('.k-pager-input').find('input'), page = parseInt(input.val(), 10);\n                    if (isNaN(page) || page < 1 || page > this.totalPages()) {\n                        page = this.page();\n                    }\n                    input.val(page);\n                    this.page(page);\n                }\n            },\n            _refreshClick: function (e) {\n                e.preventDefault();\n                this.dataSource.read();\n            },\n            _change: function (e) {\n                var value = e.currentTarget.value;\n                var pageSize = parseInt(value, 10);\n                var dataSource = this.dataSource;\n                if (!isNaN(pageSize)) {\n                    dataSource.pageSize(pageSize);\n                } else if ((value + '').toLowerCase() == 'all') {\n                    dataSource.pageSize(dataSource.total());\n                }\n            },\n            _toggleActive: function () {\n                var that = this;\n                if (that.list.hasClass('k-state-expanded')) {\n                    DOCUMENT_ELEMENT.unbind(that.downEvent, $.proxy(that._hideList, that));\n                } else {\n                    DOCUMENT_ELEMENT.bind(that.downEvent, $.proxy(that._hideList, that));\n                }\n                that.list.toggleClass('k-state-expanded');\n            },\n            _hideList: function (e) {\n                var that = this, target = kendo.eventTarget(e);\n                if (!$.contains(that.list[0], target)) {\n                    DOCUMENT_ELEMENT.unbind(that.downEvent, $.proxy(that._hideList, that));\n                    that.list.removeClass('k-state-expanded');\n                }\n            },\n            _click: function (e) {\n                var target = $(e.currentTarget);\n                e.preventDefault();\n                if (!target.is('.k-state-disabled')) {\n                    this.page(target.attr(kendo.attr('page')));\n                }\n            },\n            totalPages: function () {\n                return Math.ceil((this.dataSource.total() || 0) / (this.pageSize() || 1));\n            },\n            pageSize: function () {\n                return this.dataSource.pageSize() || this.dataSource.total();\n            },\n            page: function (page) {\n                if (page !== undefined) {\n                    if (this.trigger('pageChange', { index: page })) {\n                        return;\n                    }\n                    this.dataSource.page(page);\n                    this.trigger(CHANGE, { index: page });\n                } else {\n                    if (this.dataSource.total() > 0) {\n                        return this.dataSource.page();\n                    } else {\n                        return 0;\n                    }\n                }\n            }\n        });\n        ui.plugin(Pager);\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.notification', [\n        'kendo.core',\n        'kendo.popup'\n    ], f);\n}(function () {\n    var __meta__ = {\n        id: 'notification',\n        name: 'Notification',\n        category: 'web',\n        description: 'The Notification widget displays user alerts.',\n        depends: [\n            'core',\n            'popup'\n        ],\n        features: [{\n                id: 'notification-fx',\n                name: 'Animation',\n                description: 'Support for animation',\n                depends: ['fx']\n            }]\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, Widget = kendo.ui.Widget, proxy = $.proxy, extend = $.extend, setTimeout = window.setTimeout, CLICK = 'click', SHOW = 'show', HIDE = 'hide', KNOTIFICATION = 'k-notification', KICLOSE = '.k-notification-wrap .k-i-close', KHIDING = 'k-hiding', INFO = 'info', SUCCESS = 'success', WARNING = 'warning', ERROR = 'error', TOP = 'top', LEFT = 'left', BOTTOM = 'bottom', RIGHT = 'right', UP = 'up', NS = '.kendoNotification', WRAPPER = '<div class=\"k-widget k-notification\"></div>', TEMPLATE = '<div class=\"k-notification-wrap\">' + '<span class=\"k-icon k-i-#=typeIcon#\" title=\"#=typeIcon#\"></span>' + '#=content#' + '<span class=\"k-icon k-i-close\" title=\"Hide\"></span>' + '</div>', SAFE_TEMPLATE = TEMPLATE.replace('#=content#', '#:content#');\n        var Notification = Widget.extend({\n            init: function (element, options) {\n                var that = this;\n                Widget.fn.init.call(that, element, options);\n                options = that.options;\n                if (!options.appendTo || !$(options.appendTo).is(element)) {\n                    that.element.hide();\n                }\n                that._compileTemplates(options.templates);\n                that._guid = '_' + kendo.guid();\n                that._isRtl = kendo.support.isRtl(element);\n                that._compileStacking(options.stacking, options.position.top, options.position.left);\n                kendo.notify(that);\n            },\n            events: [\n                SHOW,\n                HIDE\n            ],\n            options: {\n                name: 'Notification',\n                position: {\n                    pinned: true,\n                    top: null,\n                    left: null,\n                    bottom: 20,\n                    right: 20\n                },\n                stacking: 'default',\n                hideOnClick: true,\n                button: false,\n                allowHideAfter: 0,\n                autoHideAfter: 5000,\n                appendTo: null,\n                width: null,\n                height: null,\n                templates: [],\n                animation: {\n                    open: {\n                        effects: 'fade:in',\n                        duration: 300\n                    },\n                    close: {\n                        effects: 'fade:out',\n                        duration: 600,\n                        hide: true\n                    }\n                }\n            },\n            _compileTemplates: function (templates) {\n                var that = this;\n                var kendoTemplate = kendo.template;\n                that._compiled = {};\n                $.each(templates, function (key, value) {\n                    that._compiled[value.type] = kendoTemplate(value.template || $('#' + value.templateId).html());\n                });\n                that._defaultCompiled = kendoTemplate(TEMPLATE);\n                that._safeCompiled = kendoTemplate(SAFE_TEMPLATE);\n            },\n            _getCompiled: function (type, safe) {\n                var defaultCompiled = safe ? this._safeCompiled : this._defaultCompiled;\n                return type ? this._compiled[type] || defaultCompiled : defaultCompiled;\n            },\n            _compileStacking: function (stacking, top, left) {\n                var that = this, paddings = {\n                        paddingTop: 0,\n                        paddingRight: 0,\n                        paddingBottom: 0,\n                        paddingLeft: 0\n                    }, horizontalAlignment = left !== null ? LEFT : RIGHT, origin, position;\n                switch (stacking) {\n                case 'down':\n                    origin = BOTTOM + ' ' + horizontalAlignment;\n                    position = TOP + ' ' + horizontalAlignment;\n                    delete paddings.paddingBottom;\n                    break;\n                case RIGHT:\n                    origin = TOP + ' ' + RIGHT;\n                    position = TOP + ' ' + LEFT;\n                    delete paddings.paddingRight;\n                    break;\n                case LEFT:\n                    origin = TOP + ' ' + LEFT;\n                    position = TOP + ' ' + RIGHT;\n                    delete paddings.paddingLeft;\n                    break;\n                case UP:\n                    origin = TOP + ' ' + horizontalAlignment;\n                    position = BOTTOM + ' ' + horizontalAlignment;\n                    delete paddings.paddingTop;\n                    break;\n                default:\n                    if (top !== null) {\n                        origin = BOTTOM + ' ' + horizontalAlignment;\n                        position = TOP + ' ' + horizontalAlignment;\n                        delete paddings.paddingBottom;\n                    } else {\n                        origin = TOP + ' ' + horizontalAlignment;\n                        position = BOTTOM + ' ' + horizontalAlignment;\n                        delete paddings.paddingTop;\n                    }\n                    break;\n                }\n                that._popupOrigin = origin;\n                that._popupPosition = position;\n                that._popupPaddings = paddings;\n            },\n            _attachPopupEvents: function (options, popup) {\n                var that = this, allowHideAfter = options.allowHideAfter, attachDelay = !isNaN(allowHideAfter) && allowHideAfter > 0, closeIcon;\n                function attachClick(target) {\n                    target.on(CLICK + NS, function () {\n                        that._hidePopup(popup);\n                    });\n                }\n                if (options.hideOnClick) {\n                    popup.bind('activate', function () {\n                        if (attachDelay) {\n                            setTimeout(function () {\n                                attachClick(popup.element);\n                            }, allowHideAfter);\n                        } else {\n                            attachClick(popup.element);\n                        }\n                    });\n                } else if (options.button) {\n                    closeIcon = popup.element.find(KICLOSE);\n                    if (attachDelay) {\n                        setTimeout(function () {\n                            attachClick(closeIcon);\n                        }, allowHideAfter);\n                    } else {\n                        attachClick(closeIcon);\n                    }\n                }\n            },\n            _showPopup: function (wrapper, options) {\n                var that = this, autoHideAfter = options.autoHideAfter, x = options.position.left, y = options.position.top, popup, openPopup;\n                openPopup = $('.' + that._guid + ':not(.' + KHIDING + ')').last();\n                popup = new kendo.ui.Popup(wrapper, {\n                    anchor: openPopup[0] ? openPopup : document.body,\n                    origin: that._popupOrigin,\n                    position: that._popupPosition,\n                    animation: options.animation,\n                    modal: true,\n                    collision: '',\n                    isRtl: that._isRtl,\n                    close: function () {\n                        that._triggerHide(this.element);\n                    },\n                    deactivate: function (e) {\n                        e.sender.element.off(NS);\n                        e.sender.element.find(KICLOSE).off(NS);\n                        e.sender.destroy();\n                    }\n                });\n                that._attachPopupEvents(options, popup);\n                if (openPopup[0]) {\n                    popup.open();\n                } else {\n                    if (x === null) {\n                        x = $(window).width() - wrapper.width() - options.position.right;\n                    }\n                    if (y === null) {\n                        y = $(window).height() - wrapper.height() - options.position.bottom;\n                    }\n                    popup.open(x, y);\n                }\n                popup.wrapper.addClass(that._guid).css(extend({\n                    margin: 0,\n                    zIndex: 10050\n                }, that._popupPaddings));\n                if (options.position.pinned) {\n                    popup.wrapper.css('position', 'fixed');\n                    if (openPopup[0]) {\n                        that._togglePin(popup.wrapper, true);\n                    }\n                } else if (!openPopup[0]) {\n                    that._togglePin(popup.wrapper, false);\n                }\n                if (autoHideAfter > 0) {\n                    setTimeout(function () {\n                        that._hidePopup(popup);\n                    }, autoHideAfter);\n                }\n            },\n            _hidePopup: function (popup) {\n                popup.wrapper.addClass(KHIDING);\n                popup.close();\n            },\n            _togglePin: function (wrapper, pin) {\n                var win = $(window), sign = pin ? -1 : 1;\n                wrapper.css({\n                    top: parseInt(wrapper.css(TOP), 10) + sign * win.scrollTop(),\n                    left: parseInt(wrapper.css(LEFT), 10) + sign * win.scrollLeft()\n                });\n            },\n            _attachStaticEvents: function (options, wrapper) {\n                var that = this, allowHideAfter = options.allowHideAfter, attachDelay = !isNaN(allowHideAfter) && allowHideAfter > 0;\n                function attachClick(target) {\n                    target.on(CLICK + NS, proxy(that._hideStatic, that, wrapper));\n                }\n                if (options.hideOnClick) {\n                    if (attachDelay) {\n                        setTimeout(function () {\n                            attachClick(wrapper);\n                        }, allowHideAfter);\n                    } else {\n                        attachClick(wrapper);\n                    }\n                } else if (options.button) {\n                    if (attachDelay) {\n                        setTimeout(function () {\n                            attachClick(wrapper.find(KICLOSE));\n                        }, allowHideAfter);\n                    } else {\n                        attachClick(wrapper.find(KICLOSE));\n                    }\n                }\n            },\n            _showStatic: function (wrapper, options) {\n                var that = this, autoHideAfter = options.autoHideAfter, animation = options.animation, insertionMethod = options.stacking == UP || options.stacking == LEFT ? 'prependTo' : 'appendTo';\n                wrapper.addClass(that._guid)[insertionMethod](options.appendTo).hide().kendoAnimate(animation.open || false);\n                that._attachStaticEvents(options, wrapper);\n                if (autoHideAfter > 0) {\n                    setTimeout(function () {\n                        that._hideStatic(wrapper);\n                    }, autoHideAfter);\n                }\n            },\n            _hideStatic: function (wrapper) {\n                wrapper.kendoAnimate(extend(this.options.animation.close || false, {\n                    complete: function () {\n                        wrapper.off(NS).find(KICLOSE).off(NS);\n                        wrapper.remove();\n                    }\n                }));\n                this._triggerHide(wrapper);\n            },\n            _triggerHide: function (element) {\n                this.trigger(HIDE, { element: element });\n                this.angular('cleanup', function () {\n                    return { elements: element };\n                });\n            },\n            show: function (content, type, safe) {\n                var that = this, options = that.options, wrapper = $(WRAPPER), args, defaultArgs;\n                if (!type) {\n                    type = INFO;\n                }\n                if (content !== null && content !== undefined && content !== '') {\n                    if (kendo.isFunction(content)) {\n                        content = content();\n                    }\n                    defaultArgs = {\n                        typeIcon: type,\n                        content: ''\n                    };\n                    if ($.isPlainObject(content)) {\n                        args = extend(defaultArgs, content);\n                    } else {\n                        args = extend(defaultArgs, { content: content });\n                    }\n                    wrapper.addClass(KNOTIFICATION + '-' + type).toggleClass(KNOTIFICATION + '-button', options.button).attr('data-role', 'alert').css({\n                        width: options.width,\n                        height: options.height\n                    }).append(that._getCompiled(type, safe)(args));\n                    that.angular('compile', function () {\n                        return {\n                            elements: wrapper,\n                            data: [{ dataItem: args }]\n                        };\n                    });\n                    if ($(options.appendTo)[0]) {\n                        that._showStatic(wrapper, options);\n                    } else {\n                        that._showPopup(wrapper, options);\n                    }\n                    that.trigger(SHOW, { element: wrapper });\n                }\n                return that;\n            },\n            showText: function (content, type) {\n                this.show(content, type, true);\n            },\n            info: function (content) {\n                return this.show(content, INFO);\n            },\n            success: function (content) {\n                return this.show(content, SUCCESS);\n            },\n            warning: function (content) {\n                return this.show(content, WARNING);\n            },\n            error: function (content) {\n                return this.show(content, ERROR);\n            },\n            hide: function () {\n                var that = this, openedNotifications = that.getNotifications();\n                if (that.options.appendTo) {\n                    openedNotifications.each(function (idx, element) {\n                        that._hideStatic($(element));\n                    });\n                } else {\n                    openedNotifications.each(function (idx, element) {\n                        var popup = $(element).data('kendoPopup');\n                        if (popup) {\n                            that._hidePopup(popup);\n                        }\n                    });\n                }\n                return that;\n            },\n            getNotifications: function () {\n                var that = this, guidElements = $('.' + that._guid + ':not(.' + KHIDING + ')');\n                if (that.options.appendTo) {\n                    return guidElements;\n                } else {\n                    return guidElements.children('.' + KNOTIFICATION);\n                }\n            },\n            setOptions: function (newOptions) {\n                var that = this, options;\n                Widget.fn.setOptions.call(that, newOptions);\n                options = that.options;\n                if (newOptions.templates !== undefined) {\n                    that._compileTemplates(options.templates);\n                }\n                if (newOptions.stacking !== undefined || newOptions.position !== undefined) {\n                    that._compileStacking(options.stacking, options.position.top, options.position.left);\n                }\n            },\n            destroy: function () {\n                Widget.fn.destroy.call(this);\n                this.getNotifications().off(NS).find(KICLOSE).off(NS);\n            }\n        });\n        kendo.ui.plugin(Notification);\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.tooltip', [\n        'kendo.core',\n        'kendo.popup'\n    ], f);\n}(function () {\n    var __meta__ = {\n        id: 'tooltip',\n        name: 'Tooltip',\n        category: 'web',\n        description: 'The Tooltip widget displays a popup hint for a given html element.',\n        depends: [\n            'core',\n            'popup'\n        ],\n        features: [{\n                id: 'tooltip-fx',\n                name: 'Animation',\n                description: 'Support for animation',\n                depends: ['fx']\n            }]\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, Widget = kendo.ui.Widget, Popup = kendo.ui.Popup, isFunction = kendo.isFunction, isPlainObject = $.isPlainObject, extend = $.extend, proxy = $.proxy, DOCUMENT = $(document), isLocalUrl = kendo.isLocalUrl, ARIAIDSUFFIX = '_tt_active', DESCRIBEDBY = 'aria-describedby', SHOW = 'show', HIDE = 'hide', ERROR = 'error', CONTENTLOAD = 'contentLoad', REQUESTSTART = 'requestStart', KCONTENTFRAME = 'k-content-frame', TEMPLATE = '<div role=\"tooltip\" class=\"k-widget k-tooltip#if (!autoHide) {# k-tooltip-closable#}#\">#if (!autoHide) {# <div class=\"k-tooltip-button\"><a href=\"\\\\#\" class=\"k-icon k-i-close\" title=\"Close\"></a></div> #}#' + '<div class=\"k-tooltip-content\"></div>' + '#if (callout){ #<div class=\"k-callout k-callout-#=dir#\"></div>#}#' + '</div>', IFRAMETEMPLATE = kendo.template('<iframe frameborder=\\'0\\' class=\\'' + KCONTENTFRAME + '\\' ' + 'src=\\'#= content.url #\\'>' + 'This page requires frames in order to show content' + '</iframe>'), NS = '.kendoTooltip', POSITIONS = {\n                bottom: {\n                    origin: 'bottom center',\n                    position: 'top center'\n                },\n                top: {\n                    origin: 'top center',\n                    position: 'bottom center'\n                },\n                left: {\n                    origin: 'center left',\n                    position: 'center right',\n                    collision: 'fit flip'\n                },\n                right: {\n                    origin: 'center right',\n                    position: 'center left',\n                    collision: 'fit flip'\n                },\n                center: {\n                    position: 'center center',\n                    origin: 'center center'\n                }\n            }, REVERSE = {\n                'top': 'bottom',\n                'bottom': 'top',\n                'left': 'right',\n                'right': 'left',\n                'center': 'center'\n            }, DIRCLASSES = {\n                bottom: 'n',\n                top: 's',\n                left: 'e',\n                right: 'w',\n                center: 'n'\n            }, DIMENSIONS = {\n                'horizontal': {\n                    offset: 'top',\n                    size: 'outerHeight'\n                },\n                'vertical': {\n                    offset: 'left',\n                    size: 'outerWidth'\n                }\n            }, DEFAULTCONTENT = function (e) {\n                return e.target.data(kendo.ns + 'title');\n            };\n        function restoreTitle(element) {\n            while (element.length) {\n                restoreTitleAttributeForElement(element);\n                element = element.parent();\n            }\n        }\n        function restoreTitleAttributeForElement(element) {\n            var title = element.data(kendo.ns + 'title');\n            if (title) {\n                element.attr('title', title);\n                element.removeData(kendo.ns + 'title');\n            }\n        }\n        function saveTitleAttributeForElement(element) {\n            var title = element.attr('title');\n            if (title) {\n                element.data(kendo.ns + 'title', title);\n                element.attr('title', '');\n            }\n        }\n        function saveTitleAttributes(element) {\n            while (element.length && !element.is('body')) {\n                saveTitleAttributeForElement(element);\n                element = element.parent();\n            }\n        }\n        var Tooltip = Widget.extend({\n            init: function (element, options) {\n                var that = this, axis;\n                Widget.fn.init.call(that, element, options);\n                axis = that.options.position.match(/left|right/) ? 'horizontal' : 'vertical';\n                that.dimensions = DIMENSIONS[axis];\n                that._documentKeyDownHandler = proxy(that._documentKeyDown, that);\n                that.element.on(that.options.showOn + NS, that.options.filter, proxy(that._showOn, that)).on('mouseenter' + NS, that.options.filter, proxy(that._mouseenter, that));\n                if (this.options.autoHide) {\n                    that.element.on('mouseleave' + NS, that.options.filter, proxy(that._mouseleave, that));\n                }\n            },\n            options: {\n                name: 'Tooltip',\n                filter: '',\n                content: DEFAULTCONTENT,\n                showAfter: 100,\n                callout: true,\n                position: 'bottom',\n                showOn: 'mouseenter',\n                autoHide: true,\n                width: null,\n                height: null,\n                animation: {\n                    open: {\n                        effects: 'fade:in',\n                        duration: 0\n                    },\n                    close: {\n                        effects: 'fade:out',\n                        duration: 40,\n                        hide: true\n                    }\n                }\n            },\n            events: [\n                SHOW,\n                HIDE,\n                CONTENTLOAD,\n                ERROR,\n                REQUESTSTART\n            ],\n            _mouseenter: function (e) {\n                saveTitleAttributes($(e.currentTarget));\n            },\n            _showOn: function (e) {\n                var that = this;\n                var currentTarget = $(e.currentTarget);\n                if (that.options.showOn && that.options.showOn.match(/click|focus/)) {\n                    that._show(currentTarget);\n                } else {\n                    clearTimeout(that.timeout);\n                    that.timeout = setTimeout(function () {\n                        that._show(currentTarget);\n                    }, that.options.showAfter);\n                }\n            },\n            _appendContent: function (target) {\n                var that = this, contentOptions = that.options.content, element = that.content, showIframe = that.options.iframe, iframe;\n                if (isPlainObject(contentOptions) && contentOptions.url) {\n                    if (!('iframe' in that.options)) {\n                        showIframe = !isLocalUrl(contentOptions.url);\n                    }\n                    that.trigger(REQUESTSTART, {\n                        options: contentOptions,\n                        target: target\n                    });\n                    if (!showIframe) {\n                        element.empty();\n                        kendo.ui.progress(element, true);\n                        that._ajaxRequest(contentOptions);\n                    } else {\n                        element.hide();\n                        iframe = element.find('.' + KCONTENTFRAME)[0];\n                        if (iframe) {\n                            iframe.src = contentOptions.url || iframe.src;\n                        } else {\n                            element.html(IFRAMETEMPLATE({ content: contentOptions }));\n                        }\n                        element.find('.' + KCONTENTFRAME).off('load' + NS).on('load' + NS, function () {\n                            that.trigger(CONTENTLOAD);\n                            element.show();\n                        });\n                    }\n                } else if (contentOptions && isFunction(contentOptions)) {\n                    contentOptions = contentOptions({\n                        sender: this,\n                        target: target\n                    });\n                    element.html(contentOptions || '');\n                } else {\n                    element.html(contentOptions);\n                }\n                that.angular('compile', function () {\n                    return { elements: element };\n                });\n            },\n            _ajaxRequest: function (options) {\n                var that = this;\n                jQuery.ajax(extend({\n                    type: 'GET',\n                    dataType: 'html',\n                    cache: false,\n                    error: function (xhr, status) {\n                        kendo.ui.progress(that.content, false);\n                        that.trigger(ERROR, {\n                            status: status,\n                            xhr: xhr\n                        });\n                    },\n                    success: proxy(function (data) {\n                        kendo.ui.progress(that.content, false);\n                        that.content.html(data);\n                        that.trigger(CONTENTLOAD);\n                    }, that)\n                }, options));\n            },\n            _documentKeyDown: function (e) {\n                if (e.keyCode === kendo.keys.ESC) {\n                    this.hide();\n                }\n            },\n            refresh: function () {\n                var that = this, popup = that.popup;\n                if (popup && popup.options.anchor) {\n                    that._appendContent(popup.options.anchor);\n                }\n            },\n            hide: function () {\n                if (this.popup) {\n                    this.popup.close();\n                }\n            },\n            show: function (target) {\n                target = target || this.element;\n                saveTitleAttributes(target);\n                this._show(target);\n            },\n            _show: function (target) {\n                var that = this, current = that.target();\n                if (!that.popup) {\n                    that._initPopup();\n                }\n                if (current && current[0] != target[0]) {\n                    that.popup.close();\n                    that.popup.element.kendoStop(true, true);\n                }\n                if (!current || current[0] != target[0]) {\n                    that._appendContent(target);\n                    that.popup.options.anchor = target;\n                }\n                that.popup.one('deactivate', function () {\n                    restoreTitle(target);\n                    target.removeAttr(DESCRIBEDBY);\n                    this.element.removeAttr('id').attr('aria-hidden', true);\n                    DOCUMENT.off('keydown' + NS, that._documentKeyDownHandler);\n                });\n                that.popup.open();\n            },\n            _initPopup: function () {\n                var that = this, options = that.options, wrapper = $(kendo.template(TEMPLATE)({\n                        callout: options.callout && options.position !== 'center',\n                        dir: DIRCLASSES[options.position],\n                        autoHide: options.autoHide\n                    }));\n                that.popup = new Popup(wrapper, extend({\n                    activate: function () {\n                        var anchor = this.options.anchor, ariaId = anchor[0].id || that.element[0].id;\n                        if (ariaId) {\n                            anchor.attr(DESCRIBEDBY, ariaId + ARIAIDSUFFIX);\n                            this.element.attr('id', ariaId + ARIAIDSUFFIX);\n                        }\n                        if (options.callout) {\n                            that._positionCallout();\n                        }\n                        this.element.removeAttr('aria-hidden');\n                        DOCUMENT.on('keydown' + NS, that._documentKeyDownHandler);\n                        that.trigger(SHOW);\n                    },\n                    close: function () {\n                        that.trigger(HIDE);\n                    },\n                    copyAnchorStyles: false,\n                    animation: options.animation\n                }, POSITIONS[options.position]));\n                wrapper.css({\n                    width: options.width,\n                    height: options.height\n                });\n                that.content = wrapper.find('.k-tooltip-content');\n                that.arrow = wrapper.find('.k-callout');\n                if (options.autoHide) {\n                    wrapper.on('mouseleave' + NS, proxy(that._mouseleave, that));\n                } else {\n                    wrapper.on('click' + NS, '.k-tooltip-button', proxy(that._closeButtonClick, that));\n                }\n            },\n            _closeButtonClick: function (e) {\n                e.preventDefault();\n                this.hide();\n            },\n            _mouseleave: function (e) {\n                if (this.popup) {\n                    var element = $(e.currentTarget), offset = element.offset(), pageX = e.pageX, pageY = e.pageY;\n                    offset.right = offset.left + kendo._outerWidth(element);\n                    offset.bottom = offset.top + kendo._outerHeight(element);\n                    if (pageX > offset.left && pageX < offset.right && pageY > offset.top && pageY < offset.bottom) {\n                        return;\n                    }\n                    this.popup.close();\n                } else {\n                    restoreTitle($(e.currentTarget));\n                }\n                clearTimeout(this.timeout);\n            },\n            _positionCallout: function () {\n                var that = this, position = that.options.position, dimensions = that.dimensions, offset = dimensions.offset, popup = that.popup, anchor = popup.options.anchor, anchorOffset = $(anchor).offset(), arrowBorder = parseInt(that.arrow.css('border-top-width'), 10), elementOffset = $(popup.element).offset(), cssClass = DIRCLASSES[popup.flipped ? REVERSE[position] : position], offsetAmount = anchorOffset[offset] - elementOffset[offset] + $(anchor)[dimensions.size]() / 2 - arrowBorder;\n                that.arrow.removeClass('k-callout-n k-callout-s k-callout-w k-callout-e').addClass('k-callout-' + cssClass).css(offset, offsetAmount);\n            },\n            target: function () {\n                if (this.popup) {\n                    return this.popup.options.anchor;\n                }\n                return null;\n            },\n            destroy: function () {\n                var popup = this.popup;\n                if (popup) {\n                    popup.element.off(NS);\n                    popup.destroy();\n                }\n                clearTimeout(this.timeout);\n                this.element.off(NS);\n                DOCUMENT.off('keydown' + NS, this._documentKeyDownHandler);\n                Widget.fn.destroy.call(this);\n            }\n        });\n        kendo.ui.plugin(Tooltip);\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.list', [\n        'kendo.data',\n        'kendo.popup'\n    ], f);\n}(function () {\n    var __meta__ = {\n        id: 'list',\n        name: 'List',\n        category: 'framework',\n        depends: [\n            'data',\n            'popup'\n        ],\n        hidden: true\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, ui = kendo.ui, outerWidth = kendo._outerWidth, outerHeight = kendo._outerHeight, Widget = ui.Widget, keys = kendo.keys, support = kendo.support, htmlEncode = kendo.htmlEncode, activeElement = kendo._activeElement, ObservableArray = kendo.data.ObservableArray, ID = 'id', CHANGE = 'change', FOCUSED = 'k-state-focused', HOVER = 'k-state-hover', LOADING = 'k-i-loading', HIDDENCLASS = 'k-hidden', GROUPHEADER = '.k-group-header', LABELIDPART = '_label', OPEN = 'open', CLOSE = 'close', CASCADE = 'cascade', SELECT = 'select', SELECTED = 'selected', REQUESTSTART = 'requestStart', REQUESTEND = 'requestEnd', WIDTH = 'width', extend = $.extend, proxy = $.proxy, isArray = $.isArray, browser = support.browser, isIE = browser.msie, isIE8 = isIE && browser.version < 9, quotRegExp = /\"/g, alternativeNames = {\n                'ComboBox': 'DropDownList',\n                'DropDownList': 'ComboBox'\n            };\n        var List = kendo.ui.DataBoundWidget.extend({\n            init: function (element, options) {\n                var that = this, ns = that.ns, id;\n                Widget.fn.init.call(that, element, options);\n                element = that.element;\n                options = that.options;\n                that._isSelect = element.is(SELECT);\n                if (that._isSelect && that.element[0].length) {\n                    if (!options.dataSource) {\n                        options.dataTextField = options.dataTextField || 'text';\n                        options.dataValueField = options.dataValueField || 'value';\n                    }\n                }\n                that.ul = $('<ul unselectable=\"on\" class=\"k-list k-reset\"/>').attr({\n                    tabIndex: -1,\n                    'aria-hidden': true\n                });\n                that.list = $('<div class=\\'k-list-container\\'/>').append(that.ul).on('mousedown' + ns, proxy(that._listMousedown, that));\n                id = element.attr(ID);\n                if (id) {\n                    that.list.attr(ID, id + '-list');\n                    that.ul.attr(ID, id + '_listbox');\n                }\n                that._header();\n                that._noData();\n                that._footer();\n                that._accessors();\n                that._initValue();\n            },\n            options: {\n                valuePrimitive: false,\n                footerTemplate: '',\n                headerTemplate: '',\n                noDataTemplate: 'No data found.'\n            },\n            setOptions: function (options) {\n                Widget.fn.setOptions.call(this, options);\n                if (options && options.enable !== undefined) {\n                    options.enabled = options.enable;\n                }\n                this._header();\n                this._noData();\n                this._footer();\n                this._renderFooter();\n                this._renderNoData();\n            },\n            focus: function () {\n                this._focused.focus();\n            },\n            readonly: function (readonly) {\n                this._editable({\n                    readonly: readonly === undefined ? true : readonly,\n                    disable: false\n                });\n            },\n            enable: function (enable) {\n                this._editable({\n                    readonly: false,\n                    disable: !(enable = enable === undefined ? true : enable)\n                });\n            },\n            _listOptions: function (options) {\n                var that = this;\n                var currentOptions = that.options;\n                var virtual = currentOptions.virtual;\n                var listBoundHandler = proxy(that._listBound, that);\n                virtual = typeof virtual === 'object' ? virtual : {};\n                options = $.extend({\n                    autoBind: false,\n                    selectable: true,\n                    dataSource: that.dataSource,\n                    click: proxy(that._click, that),\n                    change: proxy(that._listChange, that),\n                    activate: proxy(that._activateItem, that),\n                    deactivate: proxy(that._deactivateItem, that),\n                    dataBinding: function () {\n                        that.trigger('dataBinding');\n                    },\n                    dataBound: listBoundHandler,\n                    height: currentOptions.height,\n                    dataValueField: currentOptions.dataValueField,\n                    dataTextField: currentOptions.dataTextField,\n                    groupTemplate: currentOptions.groupTemplate,\n                    fixedGroupTemplate: currentOptions.fixedGroupTemplate,\n                    template: currentOptions.template\n                }, options, virtual);\n                if (!options.template) {\n                    options.template = '#:' + kendo.expr(options.dataTextField, 'data') + '#';\n                }\n                if (currentOptions.$angular) {\n                    options.$angular = currentOptions.$angular;\n                }\n                return options;\n            },\n            _initList: function () {\n                var that = this;\n                var listOptions = that._listOptions({ selectedItemChange: proxy(that._listChange, that) });\n                if (!that.options.virtual) {\n                    that.listView = new kendo.ui.StaticList(that.ul, listOptions);\n                } else {\n                    that.listView = new kendo.ui.VirtualList(that.ul, listOptions);\n                }\n                that.listView.bind('listBound', proxy(that._listBound, that));\n                that._setListValue();\n            },\n            _setListValue: function (value) {\n                value = value || this.options.value;\n                if (value !== undefined) {\n                    this.listView.value(value).done(proxy(this._updateSelectionState, this));\n                }\n            },\n            _updateSelectionState: $.noop,\n            _listMousedown: function (e) {\n                if (!this.filterInput || this.filterInput[0] !== e.target) {\n                    e.preventDefault();\n                }\n            },\n            _isFilterEnabled: function () {\n                var filter = this.options.filter;\n                return filter && filter !== 'none';\n            },\n            _hideClear: function () {\n                var that = this;\n                if (that._clear) {\n                    this._clear.addClass(HIDDENCLASS);\n                }\n            },\n            _showClear: function () {\n                var that = this;\n                if (that._clear) {\n                    this._clear.removeClass(HIDDENCLASS);\n                }\n            },\n            _clearValue: function () {\n                this._clearText();\n                this._accessor('');\n                this.listView.value([]);\n                if (this._isFilterEnabled() && !this.options.enforceMinLength) {\n                    this._filter({\n                        word: '',\n                        open: false\n                    });\n                }\n                this._change();\n            },\n            _clearText: function () {\n                this.text('');\n            },\n            _clearFilter: function () {\n                if (!this.options.virtual) {\n                    this.listView.bound(false);\n                }\n                this._filterSource();\n            },\n            _filterSource: function (filter, force) {\n                var that = this;\n                var options = that.options;\n                var dataSource = that.dataSource;\n                var expression = extend({}, dataSource.filter() || {});\n                var resetPageSettings = filter || expression.filters && expression.filters.length && !filter;\n                var removed = removeFiltersForField(expression, options.dataTextField);\n                if ((filter || removed) && that.trigger('filtering', { filter: filter })) {\n                    return;\n                }\n                var newExpression = {\n                    filters: [],\n                    logic: 'and'\n                };\n                if (isValidFilterExpr(filter)) {\n                    newExpression.filters.push(filter);\n                }\n                if (isValidFilterExpr(expression)) {\n                    if (newExpression.logic === expression.logic) {\n                        newExpression.filters = newExpression.filters.concat(expression.filters);\n                    } else {\n                        newExpression.filters.push(expression);\n                    }\n                }\n                if (that._cascading) {\n                    this.listView.setDSFilter(newExpression);\n                }\n                var dataSourceState = extend({}, {\n                    page: resetPageSettings ? 1 : dataSource.page(),\n                    pageSize: resetPageSettings ? dataSource.options.pageSize : dataSource.pageSize(),\n                    sort: dataSource.sort(),\n                    filter: dataSource.filter(),\n                    group: dataSource.group(),\n                    aggregate: dataSource.aggregate()\n                }, { filter: newExpression });\n                dataSource[force ? 'read' : 'query'](dataSource._mergeState(dataSourceState));\n            },\n            _angularElement: function (element, action) {\n                if (!element) {\n                    return;\n                }\n                this.angular(action, function () {\n                    return { elements: element };\n                });\n            },\n            _noData: function () {\n                var noData = $(this.noData);\n                var template = this.options.noDataTemplate;\n                this.angular('cleanup', function () {\n                    return { elements: noData };\n                });\n                kendo.destroy(noData);\n                noData.remove();\n                if (!template) {\n                    this.noData = null;\n                    return;\n                }\n                this.noData = $('<div class=\"k-nodata\" style=\"display:none\"><div></div></div>').appendTo(this.list);\n                this.noDataTemplate = typeof template !== 'function' ? kendo.template(template) : template;\n            },\n            _renderNoData: function () {\n                var noData = this.noData;\n                if (!noData) {\n                    return;\n                }\n                this._angularElement(noData, 'cleanup');\n                noData.children(':first').html(this.noDataTemplate({ instance: this }));\n                this._angularElement(noData, 'compile');\n            },\n            _toggleNoData: function (show) {\n                $(this.noData).toggle(show);\n            },\n            _toggleHeader: function (show) {\n                var groupHeader = this.listView.content.prev(GROUPHEADER);\n                groupHeader.toggle(show);\n            },\n            _footer: function () {\n                var footer = $(this.footer);\n                var template = this.options.footerTemplate;\n                this._angularElement(footer, 'cleanup');\n                kendo.destroy(footer);\n                footer.remove();\n                if (!template) {\n                    this.footer = null;\n                    return;\n                }\n                this.footer = $('<div class=\"k-footer\"></div>').appendTo(this.list);\n                this.footerTemplate = typeof template !== 'function' ? kendo.template(template) : template;\n            },\n            _renderFooter: function () {\n                var footer = this.footer;\n                if (!footer) {\n                    return;\n                }\n                this._angularElement(footer, 'cleanup');\n                footer.html(this.footerTemplate({ instance: this }));\n                this._angularElement(footer, 'compile');\n            },\n            _header: function () {\n                var header = $(this.header);\n                var template = this.options.headerTemplate;\n                this._angularElement(header, 'cleanup');\n                kendo.destroy(header);\n                header.remove();\n                if (!template) {\n                    this.header = null;\n                    return;\n                }\n                var headerTemplate = typeof template !== 'function' ? kendo.template(template) : template;\n                header = $(headerTemplate({}));\n                this.header = header[0] ? header : null;\n                this.list.prepend(header);\n                this._angularElement(this.header, 'compile');\n            },\n            _allowOpening: function () {\n                return this.options.noDataTemplate || this.dataSource.flatView().length;\n            },\n            _initValue: function () {\n                var that = this, value = that.options.value;\n                if (value !== null) {\n                    that.element.val(value);\n                } else {\n                    value = that._accessor();\n                    that.options.value = value;\n                }\n                that._old = value;\n            },\n            _ignoreCase: function () {\n                var that = this, model = that.dataSource.reader.model, field;\n                if (model && model.fields) {\n                    field = model.fields[that.options.dataTextField];\n                    if (field && field.type && field.type !== 'string') {\n                        that.options.ignoreCase = false;\n                    }\n                }\n            },\n            _focus: function (candidate) {\n                return this.listView.focus(candidate);\n            },\n            _filter: function (options) {\n                var that = this;\n                var widgetOptions = that.options;\n                var ignoreCase = widgetOptions.ignoreCase;\n                var field = widgetOptions.dataTextField;\n                var expression = {\n                    value: ignoreCase ? options.word.toLowerCase() : options.word,\n                    field: field,\n                    operator: widgetOptions.filter,\n                    ignoreCase: ignoreCase\n                };\n                that._open = options.open;\n                that._filterSource(expression);\n            },\n            search: function (word) {\n                var options = this.options;\n                word = typeof word === 'string' ? word : this._inputValue();\n                clearTimeout(this._typingTimeout);\n                if (!options.enforceMinLength && !word.length || word.length >= options.minLength) {\n                    this._state = 'filter';\n                    if (!this._isFilterEnabled()) {\n                        this._searchByWord(word);\n                    } else {\n                        this._filter({\n                            word: word,\n                            open: true\n                        });\n                    }\n                }\n            },\n            current: function (candidate) {\n                return this._focus(candidate);\n            },\n            items: function () {\n                return this.ul[0].children;\n            },\n            destroy: function () {\n                var that = this;\n                var ns = that.ns;\n                Widget.fn.destroy.call(that);\n                that._unbindDataSource();\n                that.listView.destroy();\n                that.list.off(ns);\n                that.popup.destroy();\n                if (that._form) {\n                    that._form.off('reset', that._resetHandler);\n                }\n            },\n            dataItem: function (index) {\n                var that = this;\n                if (index === undefined) {\n                    return that.listView.selectedDataItems()[0];\n                }\n                if (typeof index !== 'number') {\n                    if (that.options.virtual) {\n                        return that.dataSource.getByUid($(index).data('uid'));\n                    }\n                    index = $(that.items()).index(index);\n                }\n                return that.dataSource.flatView()[index];\n            },\n            _activateItem: function () {\n                var current = this.listView.focus();\n                if (current) {\n                    this._focused.add(this.filterInput).attr('aria-activedescendant', current.attr('id'));\n                }\n            },\n            _deactivateItem: function () {\n                this._focused.add(this.filterInput).removeAttr('aria-activedescendant');\n            },\n            _accessors: function () {\n                var that = this;\n                var element = that.element;\n                var options = that.options;\n                var getter = kendo.getter;\n                var textField = element.attr(kendo.attr('text-field'));\n                var valueField = element.attr(kendo.attr('value-field'));\n                if (!options.dataTextField && textField) {\n                    options.dataTextField = textField;\n                }\n                if (!options.dataValueField && valueField) {\n                    options.dataValueField = valueField;\n                }\n                that._text = getter(options.dataTextField);\n                that._value = getter(options.dataValueField);\n            },\n            _aria: function (id) {\n                var that = this, options = that.options, element = that._focused.add(that.filterInput);\n                if (options.suggest !== undefined) {\n                    element.attr('aria-autocomplete', options.suggest ? 'both' : 'list');\n                }\n                id = id ? id + ' ' + that.ul[0].id : that.ul[0].id;\n                element.attr('aria-owns', id);\n                that.ul.attr('aria-live', !that._isFilterEnabled() ? 'off' : 'polite');\n                that._ariaLabel();\n            },\n            _ariaLabel: function () {\n                var that = this;\n                var focusedElm = that._focused;\n                var inputElm = that.element;\n                var inputId = inputElm.attr('id');\n                var labelElm = $('label[for=\\'' + inputId + '\\']');\n                var ariaLabel = inputElm.attr('aria-label');\n                var ariaLabelledBy = inputElm.attr('aria-labelledby');\n                if (focusedElm === inputElm) {\n                    return;\n                }\n                if (ariaLabel) {\n                    focusedElm.attr('aria-label', ariaLabel);\n                } else if (ariaLabelledBy) {\n                    focusedElm.attr('aria-labelledby', ariaLabelledBy);\n                } else if (labelElm.length) {\n                    var labelId = labelElm.attr('id') || that._generateLabelId(labelElm, inputId);\n                    focusedElm.attr('aria-labelledby', labelId);\n                }\n            },\n            _generateLabelId: function (label, inputId) {\n                var labelId = inputId + LABELIDPART;\n                label.attr('id', labelId);\n                return labelId;\n            },\n            _blur: function () {\n                var that = this;\n                that._change();\n                that.close();\n            },\n            _change: function () {\n                var that = this;\n                var index = that.selectedIndex;\n                var optionValue = that.options.value;\n                var value = that.value();\n                var trigger;\n                if (that._isSelect && !that.listView.bound() && optionValue) {\n                    value = optionValue;\n                }\n                if (value !== unifyType(that._old, typeof value)) {\n                    trigger = true;\n                } else if (index !== undefined && index !== that._oldIndex) {\n                    trigger = true;\n                }\n                if (trigger) {\n                    that._old = value;\n                    that._oldIndex = index;\n                    if (!that._typing) {\n                        that.element.trigger(CHANGE);\n                    }\n                    that.trigger(CHANGE);\n                }\n                that.typing = false;\n            },\n            _data: function () {\n                return this.dataSource.view();\n            },\n            _enable: function () {\n                var that = this, options = that.options, disabled = that.element.is('[disabled]');\n                if (options.enable !== undefined) {\n                    options.enabled = options.enable;\n                }\n                if (!options.enabled || disabled) {\n                    that.enable(false);\n                } else {\n                    that.readonly(that.element.is('[readonly]'));\n                }\n            },\n            _dataValue: function (dataItem) {\n                var value = this._value(dataItem);\n                if (value === undefined) {\n                    value = this._text(dataItem);\n                }\n                return value;\n            },\n            _offsetHeight: function () {\n                var offsetHeight = 0;\n                var siblings = this.listView.content.prevAll(':visible');\n                siblings.each(function () {\n                    var element = $(this);\n                    offsetHeight += outerHeight(element, true);\n                });\n                return offsetHeight;\n            },\n            _height: function (length) {\n                var that = this;\n                var list = that.list;\n                var height = that.options.height;\n                var visible = that.popup.visible();\n                var offsetTop;\n                var popups;\n                var footerHeight;\n                if (length || that.options.noDataTemplate) {\n                    popups = list.add(list.parent('.k-animation-container')).show();\n                    if (!list.is(':visible')) {\n                        popups.hide();\n                        return;\n                    }\n                    height = that.listView.content[0].scrollHeight > height ? height : 'auto';\n                    popups.height(height);\n                    if (height !== 'auto') {\n                        offsetTop = that._offsetHeight();\n                        footerHeight = outerHeight($(that.footer)) || 0;\n                        height = height - offsetTop - footerHeight;\n                    }\n                    that.listView.content.height(height);\n                    if (!visible) {\n                        popups.hide();\n                    }\n                }\n                return height;\n            },\n            _adjustListWidth: function () {\n                var list = this.list, width = list[0].style.width, wrapper = this.wrapper, computedStyle, computedWidth;\n                if (!list.data(WIDTH) && width) {\n                    return;\n                }\n                computedStyle = window.getComputedStyle ? window.getComputedStyle(wrapper[0], null) : 0;\n                computedWidth = parseFloat(computedStyle && computedStyle.width) || outerWidth(wrapper);\n                if (computedStyle && browser.msie) {\n                    computedWidth += parseFloat(computedStyle.paddingLeft) + parseFloat(computedStyle.paddingRight) + parseFloat(computedStyle.borderLeftWidth) + parseFloat(computedStyle.borderRightWidth);\n                }\n                if (list.css('box-sizing') !== 'border-box') {\n                    width = computedWidth - (outerWidth(list) - list.width());\n                } else {\n                    width = computedWidth;\n                }\n                list.css({\n                    fontFamily: wrapper.css('font-family'),\n                    width: this.options.autoWidth ? 'auto' : width,\n                    minWidth: width\n                }).data(WIDTH, width);\n                return true;\n            },\n            _openHandler: function (e) {\n                this._adjustListWidth();\n                if (this.trigger(OPEN)) {\n                    e.preventDefault();\n                } else {\n                    this._focused.attr('aria-expanded', true);\n                    this.ul.attr('aria-hidden', false);\n                }\n            },\n            _closeHandler: function (e) {\n                if (this.trigger(CLOSE)) {\n                    e.preventDefault();\n                } else {\n                    this._focused.attr('aria-expanded', false);\n                    this.ul.attr('aria-hidden', true);\n                }\n            },\n            _focusItem: function () {\n                var listView = this.listView;\n                var noFocusedItem = !listView.focus();\n                var index = last(listView.select());\n                if (index === undefined && this.options.highlightFirst && noFocusedItem) {\n                    index = 0;\n                }\n                if (index !== undefined) {\n                    listView.focus(index);\n                } else if (noFocusedItem) {\n                    listView.scrollToIndex(0);\n                }\n            },\n            _calculateGroupPadding: function (height) {\n                var li = this.ul.children('.k-first:first');\n                var groupHeader = this.listView.content.prev(GROUPHEADER);\n                var padding = 0;\n                if (groupHeader[0] && groupHeader[0].style.display !== 'none') {\n                    if (height !== 'auto') {\n                        padding = kendo.support.scrollbar();\n                    }\n                    padding += parseFloat(li.css('border-right-width'), 10) + parseFloat(li.children('.k-group').css('padding-right'), 10);\n                    groupHeader.css('padding-right', padding);\n                }\n            },\n            _calculatePopupHeight: function (force) {\n                var height = this._height(this.dataSource.flatView().length || force);\n                this._calculateGroupPadding(height);\n            },\n            _resizePopup: function (force) {\n                if (this.options.virtual) {\n                    return;\n                }\n                if (!this.popup.element.is(':visible')) {\n                    this.popup.one('open', function (force) {\n                        return proxy(function () {\n                            this._calculatePopupHeight(force);\n                        }, this);\n                    }.call(this, force));\n                } else {\n                    this._calculatePopupHeight(force);\n                }\n            },\n            _popup: function () {\n                var that = this;\n                that.popup = new ui.Popup(that.list, extend({}, that.options.popup, {\n                    anchor: that.wrapper,\n                    open: proxy(that._openHandler, that),\n                    close: proxy(that._closeHandler, that),\n                    animation: that.options.animation,\n                    isRtl: support.isRtl(that.wrapper),\n                    autosize: that.options.autoWidth\n                }));\n            },\n            _makeUnselectable: function () {\n                if (isIE8) {\n                    this.list.find('*').not('.k-textbox').attr('unselectable', 'on');\n                }\n            },\n            _toggleHover: function (e) {\n                $(e.currentTarget).toggleClass(HOVER, e.type === 'mouseenter');\n            },\n            _toggle: function (open, preventFocus) {\n                var that = this;\n                var touchEnabled = support.mobileOS && (support.touch || support.MSPointers || support.pointers);\n                open = open !== undefined ? open : !that.popup.visible();\n                if (!preventFocus && !touchEnabled && that._focused[0] !== activeElement()) {\n                    that._prevent = true;\n                    that._focused.focus();\n                    that._prevent = false;\n                }\n                that[open ? OPEN : CLOSE]();\n            },\n            _triggerCascade: function () {\n                var that = this;\n                if (!that._cascadeTriggered || that._old !== that.value() || that._oldIndex !== that.selectedIndex) {\n                    that._cascadeTriggered = true;\n                    that.trigger(CASCADE, { userTriggered: that._userTriggered });\n                }\n            },\n            _triggerChange: function () {\n                if (this._valueBeforeCascade !== this.value()) {\n                    this.trigger(CHANGE);\n                }\n            },\n            _unbindDataSource: function () {\n                var that = this;\n                that.dataSource.unbind(REQUESTSTART, that._requestStartHandler).unbind(REQUESTEND, that._requestEndHandler).unbind('error', that._errorHandler);\n            },\n            requireValueMapper: function (options, value) {\n                var hasValue = (options.value instanceof Array ? options.value.length : options.value) || (value instanceof Array ? value.length : value);\n                if (hasValue && options.virtual && typeof options.virtual.valueMapper !== 'function') {\n                    throw new Error('ValueMapper is not provided while the value is being set. See http://docs.telerik.com/kendo-ui/controls/editors/combobox/virtualization#the-valuemapper-function');\n                }\n            }\n        });\n        function unifyType(value, type) {\n            if (value !== undefined && value !== '' && value !== null) {\n                if (type === 'boolean') {\n                    value = Boolean(value);\n                } else if (type === 'number') {\n                    value = Number(value);\n                } else if (type === 'string') {\n                    value = value.toString();\n                }\n            }\n            return value;\n        }\n        extend(List, {\n            inArray: function (node, parentNode) {\n                var idx, length, siblings = parentNode.children;\n                if (!node || node.parentNode !== parentNode) {\n                    return -1;\n                }\n                for (idx = 0, length = siblings.length; idx < length; idx++) {\n                    if (node === siblings[idx]) {\n                        return idx;\n                    }\n                }\n                return -1;\n            },\n            unifyType: unifyType\n        });\n        kendo.ui.List = List;\n        ui.Select = List.extend({\n            init: function (element, options) {\n                List.fn.init.call(this, element, options);\n                this._initial = this.element.val();\n            },\n            setDataSource: function (dataSource) {\n                var that = this;\n                var parent;\n                that.options.dataSource = dataSource;\n                that._dataSource();\n                if (that.listView.bound()) {\n                    that._initialIndex = null;\n                }\n                that.listView.setDataSource(that.dataSource);\n                if (that.options.autoBind) {\n                    that.dataSource.fetch();\n                }\n                parent = that._parentWidget();\n                if (parent) {\n                    that._cascadeSelect(parent);\n                }\n            },\n            close: function () {\n                this.popup.close();\n            },\n            select: function (candidate) {\n                var that = this;\n                if (candidate === undefined) {\n                    return that.selectedIndex;\n                } else {\n                    return that._select(candidate).done(function () {\n                        that._old = that._accessor();\n                        that._oldIndex = that.selectedIndex;\n                    });\n                }\n            },\n            _accessor: function (value, idx) {\n                return this[this._isSelect ? '_accessorSelect' : '_accessorInput'](value, idx);\n            },\n            _accessorInput: function (value) {\n                var element = this.element[0];\n                if (value === undefined) {\n                    return element.value;\n                } else {\n                    if (value === null) {\n                        value = '';\n                    }\n                    element.value = value;\n                }\n            },\n            _accessorSelect: function (value, idx) {\n                var element = this.element[0];\n                var hasValue;\n                if (value === undefined) {\n                    return getSelectedOption(element).value || '';\n                }\n                getSelectedOption(element).selected = false;\n                if (idx === undefined) {\n                    idx = -1;\n                }\n                hasValue = value !== null && value !== '';\n                if (hasValue && idx == -1) {\n                    this._custom(value);\n                } else {\n                    if (value) {\n                        element.value = value;\n                    } else {\n                        element.selectedIndex = idx;\n                    }\n                }\n            },\n            _custom: function (value) {\n                var that = this;\n                var element = that.element;\n                var custom = that._customOption;\n                if (!custom) {\n                    custom = $('<option/>');\n                    that._customOption = custom;\n                    element.append(custom);\n                }\n                custom.text(value);\n                custom[0].selected = true;\n            },\n            _hideBusy: function () {\n                var that = this;\n                clearTimeout(that._busy);\n                that._arrowIcon.removeClass(LOADING);\n                that._focused.attr('aria-busy', false);\n                that._busy = null;\n                that._showClear();\n            },\n            _showBusy: function (e) {\n                var that = this;\n                if (e.isDefaultPrevented()) {\n                    return;\n                }\n                that._request = true;\n                if (that._busy) {\n                    return;\n                }\n                that._busy = setTimeout(function () {\n                    if (that._arrowIcon) {\n                        that._focused.attr('aria-busy', true);\n                        that._arrowIcon.addClass(LOADING);\n                        that._hideClear();\n                    }\n                }, 100);\n            },\n            _requestEnd: function () {\n                this._request = false;\n                this._hideBusy();\n            },\n            _dataSource: function () {\n                var that = this, element = that.element, options = that.options, dataSource = options.dataSource || {}, idx;\n                dataSource = $.isArray(dataSource) ? { data: dataSource } : dataSource;\n                if (that._isSelect) {\n                    idx = element[0].selectedIndex;\n                    if (idx > -1) {\n                        options.index = idx;\n                    }\n                    dataSource.select = element;\n                    dataSource.fields = [\n                        { field: options.dataTextField },\n                        { field: options.dataValueField }\n                    ];\n                }\n                if (that.dataSource) {\n                    that._unbindDataSource();\n                } else {\n                    that._requestStartHandler = proxy(that._showBusy, that);\n                    that._requestEndHandler = proxy(that._requestEnd, that);\n                    that._errorHandler = proxy(that._hideBusy, that);\n                }\n                that.dataSource = kendo.data.DataSource.create(dataSource).bind(REQUESTSTART, that._requestStartHandler).bind(REQUESTEND, that._requestEndHandler).bind('error', that._errorHandler);\n            },\n            _firstItem: function () {\n                this.listView.focusFirst();\n            },\n            _lastItem: function () {\n                this.listView.focusLast();\n            },\n            _nextItem: function () {\n                this.listView.focusNext();\n            },\n            _prevItem: function () {\n                this.listView.focusPrev();\n            },\n            _move: function (e) {\n                var that = this;\n                var listView = that.listView;\n                var key = e.keyCode;\n                var down = key === keys.DOWN;\n                var dataItem;\n                var pressed;\n                var current;\n                if (key === keys.UP || down) {\n                    if (e.altKey) {\n                        that.toggle(down);\n                    } else {\n                        if (!listView.bound()) {\n                            if (!that._fetch) {\n                                that.dataSource.one(CHANGE, function () {\n                                    that._fetch = false;\n                                    that._move(e);\n                                });\n                                that._fetch = true;\n                                that._filterSource();\n                            }\n                            e.preventDefault();\n                            return true;\n                        }\n                        current = that._focus();\n                        if (!that._fetch && (!current || current.hasClass('k-state-selected'))) {\n                            if (down) {\n                                that._nextItem();\n                                if (!that._focus()) {\n                                    that._lastItem();\n                                }\n                            } else {\n                                that._prevItem();\n                                if (!that._focus()) {\n                                    that._firstItem();\n                                }\n                            }\n                        }\n                        dataItem = listView.dataItemByIndex(listView.getElementIndex(that._focus()));\n                        if (that.trigger(SELECT, {\n                                dataItem: dataItem,\n                                item: that._focus()\n                            })) {\n                            that._focus(current);\n                            return;\n                        }\n                        that._select(that._focus(), true).done(function () {\n                            if (!that.popup.visible()) {\n                                that._blur();\n                            }\n                        });\n                    }\n                    e.preventDefault();\n                    pressed = true;\n                } else if (key === keys.ENTER || key === keys.TAB) {\n                    if (that.popup.visible()) {\n                        e.preventDefault();\n                    }\n                    current = that._focus();\n                    dataItem = that.dataItem();\n                    if (!that.popup.visible() && (!dataItem || that.text() !== that._text(dataItem))) {\n                        current = null;\n                    }\n                    var activeFilter = that.filterInput && that.filterInput[0] === activeElement();\n                    if (current) {\n                        dataItem = listView.dataItemByIndex(listView.getElementIndex(current));\n                        var shouldTrigger = true;\n                        if (dataItem) {\n                            shouldTrigger = that._value(dataItem) !== List.unifyType(that.value(), typeof that._value(dataItem));\n                        }\n                        if (shouldTrigger && that.trigger(SELECT, {\n                                dataItem: dataItem,\n                                item: current\n                            })) {\n                            return;\n                        }\n                        that._select(current);\n                    } else if (that.input) {\n                        that._accessor(that.input.val());\n                        that.listView.value(that.input.val());\n                    }\n                    if (that._focusElement) {\n                        that._focusElement(that.wrapper);\n                    }\n                    if (activeFilter && key === keys.TAB) {\n                        that.wrapper.focusout();\n                    } else {\n                        that._blur();\n                    }\n                    that.close();\n                    pressed = true;\n                } else if (key === keys.ESC) {\n                    if (that.popup.visible()) {\n                        e.preventDefault();\n                    }\n                    that.close();\n                    pressed = true;\n                } else if (that.popup.visible() && (key === keys.PAGEDOWN || key === keys.PAGEUP)) {\n                    e.preventDefault();\n                    var direction = key === keys.PAGEDOWN ? 1 : -1;\n                    listView.scrollWith(direction * listView.screenHeight());\n                    pressed = true;\n                }\n                return pressed;\n            },\n            _fetchData: function () {\n                var that = this;\n                var hasItems = !!that.dataSource.view().length;\n                if (that._request || that.options.cascadeFrom) {\n                    return;\n                }\n                if (!that.listView.bound() && !that._fetch && !hasItems) {\n                    that._fetch = true;\n                    that.dataSource.fetch().done(function () {\n                        that._fetch = false;\n                    });\n                }\n            },\n            _options: function (data, optionLabel, value) {\n                var that = this, element = that.element, htmlElement = element[0], length = data.length, options = '', option, dataItem, dataText, dataValue, idx = 0;\n                if (optionLabel) {\n                    options = optionLabel;\n                }\n                for (; idx < length; idx++) {\n                    option = '<option';\n                    dataItem = data[idx];\n                    dataText = that._text(dataItem);\n                    dataValue = that._value(dataItem);\n                    if (dataValue !== undefined) {\n                        dataValue += '';\n                        if (dataValue.indexOf('\"') !== -1) {\n                            dataValue = dataValue.replace(quotRegExp, '&quot;');\n                        }\n                        option += ' value=\"' + dataValue + '\"';\n                    }\n                    option += '>';\n                    if (dataText !== undefined) {\n                        option += htmlEncode(dataText);\n                    }\n                    option += '</option>';\n                    options += option;\n                }\n                element.html(options);\n                if (value !== undefined) {\n                    htmlElement.value = value;\n                    if (htmlElement.value && !value) {\n                        htmlElement.selectedIndex = -1;\n                    }\n                }\n                if (htmlElement.selectedIndex !== -1) {\n                    option = getSelectedOption(htmlElement);\n                    if (option) {\n                        option.setAttribute(SELECTED, SELECTED);\n                    }\n                }\n            },\n            _reset: function () {\n                var that = this, element = that.element, formId = element.attr('form'), form = formId ? $('#' + formId) : element.closest('form');\n                if (form[0]) {\n                    that._resetHandler = function () {\n                        setTimeout(function () {\n                            that.value(that._initial);\n                        });\n                    };\n                    that._form = form.on('reset', that._resetHandler);\n                }\n            },\n            _parentWidget: function () {\n                var name = this.options.name;\n                if (!this.options.cascadeFrom) {\n                    return;\n                }\n                var parentElement = $('#' + this.options.cascadeFrom);\n                var parent = parentElement.data('kendo' + name);\n                if (!parent) {\n                    parent = parentElement.data('kendo' + alternativeNames[name]);\n                }\n                return parent;\n            },\n            _cascade: function () {\n                var that = this;\n                var options = that.options;\n                var cascade = options.cascadeFrom;\n                var parent;\n                if (cascade) {\n                    parent = that._parentWidget();\n                    if (!parent) {\n                        return;\n                    }\n                    that._cascadeHandlerProxy = proxy(that._cascadeHandler, that);\n                    that._cascadeFilterRequests = [];\n                    options.autoBind = false;\n                    parent.bind('set', function () {\n                        that.one('set', function (e) {\n                            that._selectedValue = e.value;\n                        });\n                    });\n                    parent.first(CASCADE, that._cascadeHandlerProxy);\n                    if (parent.listView.bound()) {\n                        that._toggleCascadeOnFocus();\n                        that._cascadeSelect(parent);\n                    } else {\n                        parent.one('dataBound', function () {\n                            that._toggleCascadeOnFocus();\n                        });\n                        if (!parent.value()) {\n                            that.enable(false);\n                        }\n                    }\n                }\n            },\n            _toggleCascadeOnFocus: function () {\n                var that = this;\n                var parent = that._parentWidget();\n                var focusout = isIE ? 'blur' : 'focusout';\n                parent._focused.add(parent.filterInput).bind('focus', function () {\n                    parent.unbind(CASCADE, that._cascadeHandlerProxy);\n                    parent.first(CHANGE, that._cascadeHandlerProxy);\n                });\n                parent._focused.add(parent.filterInput).bind(focusout, function () {\n                    parent.unbind(CHANGE, that._cascadeHandlerProxy);\n                    parent.first(CASCADE, that._cascadeHandlerProxy);\n                });\n            },\n            _cascadeHandler: function (e) {\n                var parent = this._parentWidget();\n                var valueBeforeCascade = this.value();\n                this._userTriggered = e.userTriggered;\n                if (this.listView.bound()) {\n                    this._clearSelection(parent, true);\n                }\n                this._cascadeSelect(parent, valueBeforeCascade);\n            },\n            _cascadeChange: function (parent) {\n                var that = this;\n                var value = that._accessor() || that._selectedValue;\n                if (!that._cascadeFilterRequests.length) {\n                    that._selectedValue = null;\n                }\n                if (that._userTriggered) {\n                    that._clearSelection(parent, true);\n                } else if (value) {\n                    if (value !== that.listView.value()[0]) {\n                        that.value(value);\n                    }\n                    if (!that.dataSource.view()[0] || that.selectedIndex === -1) {\n                        that._clearSelection(parent, true);\n                    }\n                } else if (that.dataSource.flatView().length) {\n                    that.select(that.options.index);\n                }\n                that.enable();\n                that._triggerCascade();\n                that._triggerChange();\n                that._userTriggered = false;\n            },\n            _cascadeSelect: function (parent, valueBeforeCascade) {\n                var that = this;\n                var dataItem = parent.dataItem();\n                var filterValue = dataItem ? parent._value(dataItem) : null;\n                var valueField = that.options.cascadeFromField || parent.options.dataValueField;\n                var expressions;\n                that._valueBeforeCascade = valueBeforeCascade !== undefined ? valueBeforeCascade : that.value();\n                if (filterValue || filterValue === 0) {\n                    expressions = that.dataSource.filter() || {};\n                    removeFiltersForField(expressions, valueField);\n                    var handler = function () {\n                        var currentHandler = that._cascadeFilterRequests.shift();\n                        if (currentHandler) {\n                            that.unbind('dataBound', currentHandler);\n                        }\n                        currentHandler = that._cascadeFilterRequests[0];\n                        if (currentHandler) {\n                            that.first('dataBound', currentHandler);\n                        }\n                        that._cascadeChange(parent);\n                    };\n                    that._cascadeFilterRequests.push(handler);\n                    if (that._cascadeFilterRequests.length === 1) {\n                        that.first('dataBound', handler);\n                    }\n                    that._cascading = true;\n                    that._filterSource({\n                        field: valueField,\n                        operator: 'eq',\n                        value: filterValue\n                    });\n                    that._cascading = false;\n                } else {\n                    that.enable(false);\n                    that._clearSelection(parent);\n                    that._triggerCascade();\n                    that._triggerChange();\n                    that._userTriggered = false;\n                }\n            }\n        });\n        var STATIC_LIST_NS = '.StaticList';\n        var StaticList = kendo.ui.DataBoundWidget.extend({\n            init: function (element, options) {\n                Widget.fn.init.call(this, element, options);\n                this.element.attr('role', 'listbox').on('click' + STATIC_LIST_NS, 'li', proxy(this._click, this)).on('mouseenter' + STATIC_LIST_NS, 'li', function () {\n                    $(this).addClass(HOVER);\n                }).on('mouseleave' + STATIC_LIST_NS, 'li', function () {\n                    $(this).removeClass(HOVER);\n                });\n                this.content = this.element.wrap('<div class=\\'k-list-scroller\\' unselectable=\\'on\\'></div>').parent();\n                this.header = this.content.before('<div class=\"k-group-header\" style=\"display:none\"></div>').prev();\n                this.bound(false);\n                this._optionID = kendo.guid();\n                this._selectedIndices = [];\n                this._view = [];\n                this._dataItems = [];\n                this._values = [];\n                var value = this.options.value;\n                if (value) {\n                    this._values = $.isArray(value) ? value.slice(0) : [value];\n                }\n                this._getter();\n                this._templates();\n                this.setDataSource(this.options.dataSource);\n                this._onScroll = proxy(function () {\n                    var that = this;\n                    clearTimeout(that._scrollId);\n                    that._scrollId = setTimeout(function () {\n                        that._renderHeader();\n                    }, 50);\n                }, this);\n            },\n            options: {\n                name: 'StaticList',\n                dataValueField: null,\n                valuePrimitive: false,\n                selectable: true,\n                template: null,\n                groupTemplate: null,\n                fixedGroupTemplate: null\n            },\n            events: [\n                'click',\n                CHANGE,\n                'activate',\n                'deactivate',\n                'dataBinding',\n                'dataBound',\n                'selectedItemChange'\n            ],\n            setDataSource: function (source) {\n                var that = this;\n                var dataSource = source || {};\n                var value;\n                dataSource = $.isArray(dataSource) ? { data: dataSource } : dataSource;\n                dataSource = kendo.data.DataSource.create(dataSource);\n                if (that.dataSource) {\n                    that.dataSource.unbind(CHANGE, that._refreshHandler);\n                    value = that.value();\n                    that.value([]);\n                    that.bound(false);\n                    that.value(value);\n                } else {\n                    that._refreshHandler = proxy(that.refresh, that);\n                }\n                that.setDSFilter(dataSource.filter());\n                that.dataSource = dataSource.bind(CHANGE, that._refreshHandler);\n                that._fixedHeader();\n            },\n            skip: function () {\n                return this.dataSource.skip();\n            },\n            setOptions: function (options) {\n                Widget.fn.setOptions.call(this, options);\n                this._getter();\n                this._templates();\n                this._render();\n            },\n            destroy: function () {\n                this.element.off(STATIC_LIST_NS);\n                if (this._refreshHandler) {\n                    this.dataSource.unbind(CHANGE, this._refreshHandler);\n                }\n                clearTimeout(this._scrollId);\n                Widget.fn.destroy.call(this);\n            },\n            dataItemByIndex: function (index) {\n                return this.dataSource.flatView()[index];\n            },\n            screenHeight: function () {\n                return this.content[0].clientHeight;\n            },\n            scrollToIndex: function (index) {\n                var item = this.element[0].children[index];\n                if (item) {\n                    this.scroll(item);\n                }\n            },\n            scrollWith: function (value) {\n                this.content.scrollTop(this.content.scrollTop() + value);\n            },\n            scroll: function (item) {\n                if (!item) {\n                    return;\n                }\n                if (item[0]) {\n                    item = item[0];\n                }\n                var content = this.content[0], itemOffsetTop = item.offsetTop, itemOffsetHeight = item.offsetHeight, contentScrollTop = content.scrollTop, contentOffsetHeight = content.clientHeight, bottomDistance = itemOffsetTop + itemOffsetHeight;\n                if (contentScrollTop > itemOffsetTop) {\n                    contentScrollTop = itemOffsetTop;\n                } else if (bottomDistance > contentScrollTop + contentOffsetHeight) {\n                    contentScrollTop = bottomDistance - contentOffsetHeight;\n                }\n                content.scrollTop = contentScrollTop;\n            },\n            selectedDataItems: function (dataItems) {\n                if (dataItems === undefined) {\n                    return this._dataItems.slice();\n                }\n                this._dataItems = dataItems;\n                this._values = this._getValues(dataItems);\n            },\n            _getValues: function (dataItems) {\n                var getter = this._valueGetter;\n                return $.map(dataItems, function (dataItem) {\n                    return getter(dataItem);\n                });\n            },\n            focusNext: function () {\n                var current = this.focus();\n                if (!current) {\n                    current = 0;\n                } else {\n                    current = current.next();\n                }\n                this.focus(current);\n            },\n            focusPrev: function () {\n                var current = this.focus();\n                if (!current) {\n                    current = this.element[0].children.length - 1;\n                } else {\n                    current = current.prev();\n                }\n                this.focus(current);\n            },\n            focusFirst: function () {\n                this.focus(this.element[0].children[0]);\n            },\n            focusLast: function () {\n                this.focus(last(this.element[0].children));\n            },\n            focus: function (candidate) {\n                var that = this;\n                var id = that._optionID;\n                var hasCandidate;\n                if (candidate === undefined) {\n                    return that._current;\n                }\n                candidate = last(that._get(candidate));\n                candidate = $(this.element[0].children[candidate]);\n                if (that._current) {\n                    that._current.removeClass(FOCUSED).removeAttr('aria-selected').removeAttr(ID);\n                    that.trigger('deactivate');\n                }\n                hasCandidate = !!candidate[0];\n                if (hasCandidate) {\n                    candidate.addClass(FOCUSED);\n                    that.scroll(candidate);\n                    candidate.attr('id', id);\n                }\n                that._current = hasCandidate ? candidate : null;\n                that.trigger('activate');\n            },\n            focusIndex: function () {\n                return this.focus() ? this.focus().index() : undefined;\n            },\n            skipUpdate: function (skipUpdate) {\n                this._skipUpdate = skipUpdate;\n            },\n            select: function (indices) {\n                var that = this;\n                var selectable = that.options.selectable;\n                var singleSelection = selectable !== 'multiple' && selectable !== false;\n                var selectedIndices = that._selectedIndices;\n                var added = [];\n                var removed = [];\n                var result;\n                if (indices === undefined) {\n                    return selectedIndices.slice();\n                }\n                indices = that._get(indices);\n                if (indices.length === 1 && indices[0] === -1) {\n                    indices = [];\n                }\n                var deferred = $.Deferred().resolve();\n                var filtered = that.isFiltered();\n                if (filtered && !singleSelection && that._deselectFiltered(indices)) {\n                    return deferred;\n                }\n                if (singleSelection && !filtered && $.inArray(last(indices), selectedIndices) !== -1) {\n                    if (that._dataItems.length && that._view.length) {\n                        that._dataItems = [that._view[selectedIndices[0]].item];\n                    }\n                    return deferred;\n                }\n                result = that._deselect(indices);\n                removed = result.removed;\n                indices = result.indices;\n                if (indices.length) {\n                    if (singleSelection) {\n                        indices = [last(indices)];\n                    }\n                    added = that._select(indices);\n                }\n                if (added.length || removed.length) {\n                    that._valueComparer = null;\n                    that.trigger(CHANGE, {\n                        added: added,\n                        removed: removed\n                    });\n                }\n                return deferred;\n            },\n            removeAt: function (position) {\n                this._selectedIndices.splice(position, 1);\n                this._values.splice(position, 1);\n                this._valueComparer = null;\n                return {\n                    position: position,\n                    dataItem: this._dataItems.splice(position, 1)[0]\n                };\n            },\n            setValue: function (value) {\n                value = $.isArray(value) || value instanceof ObservableArray ? value.slice(0) : [value];\n                this._values = value;\n                this._valueComparer = null;\n            },\n            value: function (value) {\n                var that = this;\n                var deferred = that._valueDeferred;\n                var indices;\n                if (value === undefined) {\n                    return that._values.slice();\n                }\n                that.setValue(value);\n                if (!deferred || deferred.state() === 'resolved') {\n                    that._valueDeferred = deferred = $.Deferred();\n                }\n                if (that.bound()) {\n                    indices = that._valueIndices(that._values);\n                    if (that.options.selectable === 'multiple') {\n                        that.select(-1);\n                    }\n                    that.select(indices);\n                    deferred.resolve();\n                }\n                that._skipUpdate = false;\n                return deferred;\n            },\n            items: function () {\n                return this.element.children('.k-item');\n            },\n            _click: function (e) {\n                if (!e.isDefaultPrevented()) {\n                    if (!this.trigger('click', { item: $(e.currentTarget) })) {\n                        this.select(e.currentTarget);\n                    }\n                }\n            },\n            _valueExpr: function (type, values) {\n                var that = this;\n                var idx = 0;\n                var body;\n                var comparer;\n                var normalized = [];\n                if (!that._valueComparer || that._valueType !== type) {\n                    that._valueType = type;\n                    for (; idx < values.length; idx++) {\n                        normalized.push(unifyType(values[idx], type));\n                    }\n                    body = 'for (var idx = 0; idx < ' + normalized.length + '; idx++) {' + ' if (current === values[idx]) {' + '   return idx;' + ' }' + '} ' + 'return -1;';\n                    comparer = new Function('current', 'values', body);\n                    that._valueComparer = function (current) {\n                        return comparer(current, normalized);\n                    };\n                }\n                return that._valueComparer;\n            },\n            _dataItemPosition: function (dataItem, values) {\n                var value = this._valueGetter(dataItem);\n                var valueExpr = this._valueExpr(typeof value, values);\n                return valueExpr(value);\n            },\n            _getter: function () {\n                this._valueGetter = kendo.getter(this.options.dataValueField);\n            },\n            _deselect: function (indices) {\n                var that = this;\n                var children = that.element[0].children;\n                var selectable = that.options.selectable;\n                var selectedIndices = that._selectedIndices;\n                var dataItems = that._dataItems;\n                var values = that._values;\n                var removed = [];\n                var i = 0;\n                var j;\n                var index, selectedIndex;\n                var removedIndices = 0;\n                indices = indices.slice();\n                if (selectable === true || !indices.length) {\n                    for (; i < selectedIndices.length; i++) {\n                        $(children[selectedIndices[i]]).removeClass('k-state-selected');\n                        removed.push({\n                            position: i,\n                            dataItem: dataItems[i]\n                        });\n                    }\n                    that._values = [];\n                    that._dataItems = [];\n                    that._selectedIndices = [];\n                } else if (selectable === 'multiple') {\n                    for (; i < indices.length; i++) {\n                        index = indices[i];\n                        if (!$(children[index]).hasClass('k-state-selected')) {\n                            continue;\n                        }\n                        for (j = 0; j < selectedIndices.length; j++) {\n                            selectedIndex = selectedIndices[j];\n                            if (selectedIndex === index) {\n                                $(children[selectedIndex]).removeClass('k-state-selected');\n                                removed.push({\n                                    position: j + removedIndices,\n                                    dataItem: dataItems.splice(j, 1)[0]\n                                });\n                                selectedIndices.splice(j, 1);\n                                indices.splice(i, 1);\n                                values.splice(j, 1);\n                                removedIndices += 1;\n                                i -= 1;\n                                j -= 1;\n                                break;\n                            }\n                        }\n                    }\n                }\n                return {\n                    indices: indices,\n                    removed: removed\n                };\n            },\n            _deselectFiltered: function (indices) {\n                var children = this.element[0].children;\n                var dataItem, index, position;\n                var removed = [];\n                var idx = 0;\n                for (; idx < indices.length; idx++) {\n                    index = indices[idx];\n                    dataItem = this._view[index].item;\n                    position = this._dataItemPosition(dataItem, this._values);\n                    if (position > -1) {\n                        removed.push(this.removeAt(position));\n                        $(children[index]).removeClass('k-state-selected');\n                    }\n                }\n                if (removed.length) {\n                    this.trigger(CHANGE, {\n                        added: [],\n                        removed: removed\n                    });\n                    return true;\n                }\n                return false;\n            },\n            _select: function (indices) {\n                var that = this;\n                var children = that.element[0].children;\n                var data = that._view;\n                var dataItem, index;\n                var added = [];\n                var idx = 0;\n                if (last(indices) !== -1) {\n                    that.focus(indices);\n                }\n                for (; idx < indices.length; idx++) {\n                    index = indices[idx];\n                    dataItem = data[index];\n                    if (index === -1 || !dataItem) {\n                        continue;\n                    }\n                    dataItem = dataItem.item;\n                    that._selectedIndices.push(index);\n                    that._dataItems.push(dataItem);\n                    that._values.push(that._valueGetter(dataItem));\n                    $(children[index]).addClass('k-state-selected').attr('aria-selected', true);\n                    added.push({ dataItem: dataItem });\n                }\n                return added;\n            },\n            getElementIndex: function (element) {\n                return $(element).data('offset-index');\n            },\n            _get: function (candidate) {\n                if (typeof candidate === 'number') {\n                    candidate = [candidate];\n                } else if (!isArray(candidate)) {\n                    candidate = this.getElementIndex(candidate);\n                    candidate = [candidate !== undefined ? candidate : -1];\n                }\n                return candidate;\n            },\n            _template: function () {\n                var that = this;\n                var options = that.options;\n                var template = options.template;\n                if (!template) {\n                    template = kendo.template('<li tabindex=\"-1\" role=\"option\" unselectable=\"on\" class=\"k-item\">${' + kendo.expr(options.dataTextField, 'data') + '}</li>', { useWithBlock: false });\n                } else {\n                    template = kendo.template(template);\n                    template = function (data) {\n                        return '<li tabindex=\"-1\" role=\"option\" unselectable=\"on\" class=\"k-item\">' + template(data) + '</li>';\n                    };\n                }\n                return template;\n            },\n            _templates: function () {\n                var template;\n                var options = this.options;\n                var templates = {\n                    template: options.template,\n                    groupTemplate: options.groupTemplate,\n                    fixedGroupTemplate: options.fixedGroupTemplate\n                };\n                for (var key in templates) {\n                    template = templates[key];\n                    if (template && typeof template !== 'function') {\n                        templates[key] = kendo.template(template);\n                    }\n                }\n                this.templates = templates;\n            },\n            _normalizeIndices: function (indices) {\n                var newIndices = [];\n                var idx = 0;\n                for (; idx < indices.length; idx++) {\n                    if (indices[idx] !== undefined) {\n                        newIndices.push(indices[idx]);\n                    }\n                }\n                return newIndices;\n            },\n            _valueIndices: function (values, indices) {\n                var data = this._view;\n                var idx = 0;\n                var index;\n                indices = indices ? indices.slice() : [];\n                if (!values.length) {\n                    return [];\n                }\n                for (; idx < data.length; idx++) {\n                    index = this._dataItemPosition(data[idx].item, values);\n                    if (index !== -1) {\n                        indices[index] = idx;\n                    }\n                }\n                return this._normalizeIndices(indices);\n            },\n            _firstVisibleItem: function () {\n                var element = this.element[0];\n                var content = this.content[0];\n                var scrollTop = content.scrollTop;\n                var itemHeight = $(element.children[0]).height();\n                var itemIndex = Math.floor(scrollTop / itemHeight) || 0;\n                var item = element.children[itemIndex] || element.lastChild;\n                var forward = item.offsetTop < scrollTop;\n                while (item) {\n                    if (forward) {\n                        if (item.offsetTop + itemHeight > scrollTop || !item.nextSibling) {\n                            break;\n                        }\n                        item = item.nextSibling;\n                    } else {\n                        if (item.offsetTop <= scrollTop || !item.previousSibling) {\n                            break;\n                        }\n                        item = item.previousSibling;\n                    }\n                }\n                return this._view[$(item).data('offset-index')];\n            },\n            _fixedHeader: function () {\n                if (this.isGrouped() && this.templates.fixedGroupTemplate) {\n                    this.header.show();\n                    this.content.scroll(this._onScroll);\n                } else {\n                    this.header.hide();\n                    this.content.off('scroll', this._onScroll);\n                }\n            },\n            _renderHeader: function () {\n                var template = this.templates.fixedGroupTemplate;\n                if (!template) {\n                    return;\n                }\n                var visibleItem = this._firstVisibleItem();\n                if (visibleItem) {\n                    this.header.html(template(visibleItem.group));\n                }\n            },\n            _renderItem: function (context) {\n                var item = '<li tabindex=\"-1\" role=\"option\" unselectable=\"on\" class=\"k-item';\n                var dataItem = context.item;\n                var notFirstItem = context.index !== 0;\n                var selected = context.selected;\n                if (notFirstItem && context.newGroup) {\n                    item += ' k-first';\n                }\n                if (selected) {\n                    item += ' k-state-selected';\n                }\n                item += '\"' + (selected ? ' aria-selected=\"true\"' : '') + ' data-offset-index=\"' + context.index + '\">';\n                item += this.templates.template(dataItem);\n                if (notFirstItem && context.newGroup) {\n                    item += '<div class=\"k-group\">' + this.templates.groupTemplate(context.group) + '</div>';\n                }\n                return item + '</li>';\n            },\n            _render: function () {\n                var html = '';\n                var i = 0;\n                var idx = 0;\n                var context;\n                var dataContext = [];\n                var view = this.dataSource.view();\n                var values = this.value();\n                var group, newGroup, j;\n                var isGrouped = this.isGrouped();\n                if (isGrouped) {\n                    for (i = 0; i < view.length; i++) {\n                        group = view[i];\n                        newGroup = true;\n                        for (j = 0; j < group.items.length; j++) {\n                            context = {\n                                selected: this._selected(group.items[j], values),\n                                item: group.items[j],\n                                group: group.value,\n                                newGroup: newGroup,\n                                index: idx\n                            };\n                            dataContext[idx] = context;\n                            idx += 1;\n                            html += this._renderItem(context);\n                            newGroup = false;\n                        }\n                    }\n                } else {\n                    for (i = 0; i < view.length; i++) {\n                        context = {\n                            selected: this._selected(view[i], values),\n                            item: view[i],\n                            index: i\n                        };\n                        dataContext[i] = context;\n                        html += this._renderItem(context);\n                    }\n                }\n                this._view = dataContext;\n                this.element[0].innerHTML = html;\n                if (isGrouped && dataContext.length) {\n                    this._renderHeader();\n                }\n            },\n            _selected: function (dataItem, values) {\n                var select = !this.isFiltered() || this.options.selectable === 'multiple';\n                return select && this._dataItemPosition(dataItem, values) !== -1;\n            },\n            setDSFilter: function (filter) {\n                this._lastDSFilter = extend({}, filter);\n            },\n            isFiltered: function () {\n                if (!this._lastDSFilter) {\n                    this.setDSFilter(this.dataSource.filter());\n                }\n                return !kendo.data.Query.compareFilters(this.dataSource.filter(), this._lastDSFilter);\n            },\n            refresh: function (e) {\n                var that = this;\n                var action = e && e.action;\n                var skipUpdateOnBind = that.options.skipUpdateOnBind;\n                var isItemChange = action === 'itemchange';\n                var result;\n                that.trigger('dataBinding');\n                that._angularItems('cleanup');\n                that._fixedHeader();\n                that._render();\n                that.bound(true);\n                if (isItemChange || action === 'remove') {\n                    result = mapChangedItems(that._dataItems, e.items);\n                    if (result.changed.length) {\n                        if (isItemChange) {\n                            that.trigger('selectedItemChange', { items: result.changed });\n                        } else {\n                            that.value(that._getValues(result.unchanged));\n                        }\n                    }\n                } else if (that.isFiltered() || that._skipUpdate) {\n                    that.focus(0);\n                    if (that._skipUpdate) {\n                        that._skipUpdate = false;\n                        that._selectedIndices = that._valueIndices(that._values, that._selectedIndices);\n                    }\n                } else if (!skipUpdateOnBind && (!action || action === 'add')) {\n                    that.value(that._values);\n                }\n                if (that._valueDeferred) {\n                    that._valueDeferred.resolve();\n                }\n                that._angularItems('compile');\n                that.trigger('dataBound');\n            },\n            bound: function (bound) {\n                if (bound === undefined) {\n                    return this._bound;\n                }\n                this._bound = bound;\n            },\n            isGrouped: function () {\n                return (this.dataSource.group() || []).length;\n            }\n        });\n        ui.plugin(StaticList);\n        function last(list) {\n            return list[list.length - 1];\n        }\n        function getSelectedOption(select) {\n            var index = select.selectedIndex;\n            return index > -1 ? select.options[index] : {};\n        }\n        function mapChangedItems(selected, itemsToMatch) {\n            var itemsLength = itemsToMatch.length;\n            var selectedLength = selected.length;\n            var dataItem;\n            var found;\n            var i, j;\n            var changed = [];\n            var unchanged = [];\n            if (selectedLength) {\n                for (i = 0; i < selectedLength; i++) {\n                    dataItem = selected[i];\n                    found = false;\n                    for (j = 0; j < itemsLength; j++) {\n                        if (dataItem === itemsToMatch[j]) {\n                            found = true;\n                            changed.push({\n                                index: i,\n                                item: dataItem\n                            });\n                            break;\n                        }\n                    }\n                    if (!found) {\n                        unchanged.push(dataItem);\n                    }\n                }\n            }\n            return {\n                changed: changed,\n                unchanged: unchanged\n            };\n        }\n        function isValidFilterExpr(expression) {\n            if (!expression || $.isEmptyObject(expression)) {\n                return false;\n            }\n            if (expression.filters && !expression.filters.length) {\n                return false;\n            }\n            return true;\n        }\n        function removeFiltersForField(expression, field) {\n            var filters;\n            var found = false;\n            if (expression.filters) {\n                filters = $.grep(expression.filters, function (filter) {\n                    found = removeFiltersForField(filter, field);\n                    if (filter.filters) {\n                        return filter.filters.length;\n                    } else {\n                        return filter.field != field;\n                    }\n                });\n                if (!found && expression.filters.length !== filters.length) {\n                    found = true;\n                }\n                expression.filters = filters;\n            }\n            return found;\n        }\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.calendar', ['kendo.core'], f);\n}(function () {\n    var __meta__ = {\n        id: 'calendar',\n        name: 'Calendar',\n        category: 'web',\n        description: 'The Calendar widget renders a graphical calendar that supports navigation and selection.',\n        depends: ['core']\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, support = kendo.support, ui = kendo.ui, Widget = ui.Widget, keys = kendo.keys, parse = kendo.parseDate, adjustDST = kendo.date.adjustDST, getDate = kendo.date.getDate, weekInYear = kendo.date.weekInYear, extractFormat = kendo._extractFormat, template = kendo.template, getCulture = kendo.getCulture, transitions = kendo.support.transitions, transitionOrigin = transitions ? transitions.css + 'transform-origin' : '', cellTemplate = template('<td#=data.cssClass# role=\"gridcell\"><a tabindex=\"-1\" class=\"k-link\" href=\"\\\\#\" data-#=data.ns#value=\"#=data.dateString#\">#=data.value#</a></td>', { useWithBlock: false }), emptyCellTemplate = template('<td role=\"gridcell\">&nbsp;</td>', { useWithBlock: false }), weekNumberTemplate = template('<td class=\"k-alt\">#= data.weekNumber #</td>', { useWithBlock: false }), browser = kendo.support.browser, isIE8 = browser.msie && browser.version < 9, outerHeight = kendo._outerHeight, outerWidth = kendo._outerWidth, ns = '.kendoCalendar', CLICK = 'click' + ns, KEYDOWN_NS = 'keydown' + ns, ID = 'id', MIN = 'min', LEFT = 'left', SLIDE = 'slideIn', MONTH = 'month', CENTURY = 'century', CHANGE = 'change', NAVIGATE = 'navigate', VALUE = 'value', HOVER = 'k-state-hover', DISABLED = 'k-state-disabled', FOCUSED = 'k-state-focused', OTHERMONTH = 'k-other-month', OTHERMONTHCLASS = ' class=\"' + OTHERMONTH + '\"', TODAY = 'k-nav-today', CELLSELECTOR = 'td:has(.k-link)', BLUR = 'blur' + ns, FOCUS = 'focus', FOCUS_WITH_NS = FOCUS + ns, MOUSEENTER = support.touch ? 'touchstart' : 'mouseenter', MOUSEENTER_WITH_NS = support.touch ? 'touchstart' + ns : 'mouseenter' + ns, MOUSELEAVE = support.touch ? 'touchend' + ns + ' touchmove' + ns : 'mouseleave' + ns, MS_PER_MINUTE = 60000, MS_PER_DAY = 86400000, PREVARROW = '_prevArrow', NEXTARROW = '_nextArrow', ARIA_DISABLED = 'aria-disabled', ARIA_SELECTED = 'aria-selected', ARIA_LABEL = 'aria-label', proxy = $.proxy, extend = $.extend, DATE = Date, views = {\n                month: 0,\n                year: 1,\n                decade: 2,\n                century: 3\n            };\n        var Calendar = Widget.extend({\n            init: function (element, options) {\n                var that = this, value, id;\n                Widget.fn.init.call(that, element, options);\n                element = that.wrapper = that.element;\n                options = that.options;\n                options.url = window.unescape(options.url);\n                that.options.disableDates = getDisabledExpr(that.options.disableDates);\n                that._templates();\n                that._header();\n                that._footer(that.footer);\n                id = element.addClass('k-widget k-calendar ' + (options.weekNumber ? ' k-week-number' : '')).on(MOUSEENTER_WITH_NS + ' ' + MOUSELEAVE, CELLSELECTOR, mousetoggle).on(KEYDOWN_NS, 'table.k-content', proxy(that._move, that)).on(CLICK, CELLSELECTOR, function (e) {\n                    var link = e.currentTarget.firstChild, value = that._toDateObject(link);\n                    if (link.href.indexOf('#') != -1) {\n                        e.preventDefault();\n                    }\n                    if (that._view.name == 'month' && that.options.disableDates(value)) {\n                        return;\n                    }\n                    that._click($(link));\n                }).on('mouseup' + ns, 'table.k-content, .k-footer', function () {\n                    that._focusView(that.options.focusOnNav !== false);\n                }).attr(ID);\n                if (id) {\n                    that._cellID = id + '_cell_selected';\n                }\n                normalize(options);\n                value = parse(options.value, options.format, options.culture);\n                that._index = views[options.start];\n                that._current = new DATE(+restrictValue(value, options.min, options.max));\n                that._addClassProxy = function () {\n                    that._active = true;\n                    if (that._cell.hasClass(DISABLED)) {\n                        var todayString = that._view.toDateString(getToday());\n                        that._cell = that._cellByDate(todayString);\n                    }\n                    that._cell.addClass(FOCUSED);\n                };\n                that._removeClassProxy = function () {\n                    that._active = false;\n                    that._cell.removeClass(FOCUSED);\n                };\n                that.value(value);\n                kendo.notify(that);\n            },\n            options: {\n                name: 'Calendar',\n                value: null,\n                min: new DATE(1900, 0, 1),\n                max: new DATE(2099, 11, 31),\n                dates: [],\n                url: '',\n                culture: '',\n                footer: '',\n                format: '',\n                month: {},\n                weekNumber: false,\n                start: MONTH,\n                depth: MONTH,\n                animation: {\n                    horizontal: {\n                        effects: SLIDE,\n                        reverse: true,\n                        duration: 500,\n                        divisor: 2\n                    },\n                    vertical: {\n                        effects: 'zoomIn',\n                        duration: 400\n                    }\n                },\n                messages: { weekColumnHeader: '' }\n            },\n            events: [\n                CHANGE,\n                NAVIGATE\n            ],\n            setOptions: function (options) {\n                var that = this;\n                normalize(options);\n                options.disableDates = getDisabledExpr(options.disableDates);\n                Widget.fn.setOptions.call(that, options);\n                that._templates();\n                that._footer(that.footer);\n                that._index = views[that.options.start];\n                that.navigate();\n            },\n            destroy: function () {\n                var that = this, today = that._today;\n                that.element.off(ns);\n                that._title.off(ns);\n                that[PREVARROW].off(ns);\n                that[NEXTARROW].off(ns);\n                kendo.destroy(that._table);\n                if (today) {\n                    kendo.destroy(today.off(ns));\n                }\n                Widget.fn.destroy.call(that);\n            },\n            current: function () {\n                return this._current;\n            },\n            view: function () {\n                return this._view;\n            },\n            focus: function (table) {\n                table = table || this._table;\n                this._bindTable(table);\n                table.focus();\n            },\n            min: function (value) {\n                return this._option(MIN, value);\n            },\n            max: function (value) {\n                return this._option('max', value);\n            },\n            navigateToPast: function () {\n                this._navigate(PREVARROW, -1);\n            },\n            navigateToFuture: function () {\n                this._navigate(NEXTARROW, 1);\n            },\n            navigateUp: function () {\n                var that = this, index = that._index;\n                if (that._title.hasClass(DISABLED)) {\n                    return;\n                }\n                that.navigate(that._current, ++index);\n            },\n            navigateDown: function (value) {\n                var that = this, index = that._index, depth = that.options.depth;\n                if (!value) {\n                    return;\n                }\n                if (index === views[depth]) {\n                    if (!isEqualDate(that._value, that._current) || !isEqualDate(that._value, value)) {\n                        that.value(value);\n                        that.trigger(CHANGE);\n                    }\n                    return;\n                }\n                that.navigate(value, --index);\n            },\n            navigate: function (value, view) {\n                view = isNaN(view) ? views[view] : view;\n                var that = this, options = that.options, culture = options.culture, min = options.min, max = options.max, title = that._title, from = that._table, old = that._oldTable, selectedValue = that._value, currentValue = that._current, future = value && +value > +currentValue, vertical = view !== undefined && view !== that._index, to, currentView, compare, disabled;\n                if (!value) {\n                    value = currentValue;\n                }\n                that._current = value = new DATE(+restrictValue(value, min, max));\n                if (view === undefined) {\n                    view = that._index;\n                } else {\n                    that._index = view;\n                }\n                that._view = currentView = calendar.views[view];\n                compare = currentView.compare;\n                disabled = view === views[CENTURY];\n                title.toggleClass(DISABLED, disabled).attr(ARIA_DISABLED, disabled);\n                disabled = compare(value, min) < 1;\n                that[PREVARROW].toggleClass(DISABLED, disabled).attr(ARIA_DISABLED, disabled);\n                disabled = compare(value, max) > -1;\n                that[NEXTARROW].toggleClass(DISABLED, disabled).attr(ARIA_DISABLED, disabled);\n                if (from && old && old.data('animating')) {\n                    old.kendoStop(true, true);\n                    from.kendoStop(true, true);\n                }\n                that._oldTable = from;\n                if (!from || that._changeView) {\n                    title.html(currentView.title(value, min, max, culture));\n                    that._table = to = $(currentView.content(extend({\n                        min: min,\n                        max: max,\n                        date: value,\n                        url: options.url,\n                        dates: options.dates,\n                        format: options.format,\n                        culture: culture,\n                        disableDates: options.disableDates,\n                        isWeekColumnVisible: options.weekNumber,\n                        messages: options.messages\n                    }, that[currentView.name])));\n                    addClassToViewContainer(to, currentView.name);\n                    makeUnselectable(to);\n                    var replace = from && from.data('start') === to.data('start');\n                    that._animate({\n                        from: from,\n                        to: to,\n                        vertical: vertical,\n                        future: future,\n                        replace: replace\n                    });\n                    that.trigger(NAVIGATE);\n                    that._focus(value);\n                }\n                if (view === views[options.depth] && selectedValue && !that.options.disableDates(selectedValue)) {\n                    that._class('k-state-selected', selectedValue);\n                }\n                that._class(FOCUSED, value);\n                if (!from && that._cell) {\n                    that._cell.removeClass(FOCUSED);\n                }\n                that._changeView = true;\n            },\n            value: function (value) {\n                var that = this, view = that._view, options = that.options, old = that._view, min = options.min, max = options.max;\n                if (value === undefined) {\n                    return that._value;\n                }\n                if (value === null) {\n                    that._current = new Date(that._current.getFullYear(), that._current.getMonth(), that._current.getDate());\n                }\n                value = parse(value, options.format, options.culture);\n                if (value !== null) {\n                    value = new DATE(+value);\n                    if (!isInRange(value, min, max)) {\n                        value = null;\n                    }\n                }\n                if (value === null || !that.options.disableDates(value)) {\n                    that._value = value;\n                } else if (that._value === undefined) {\n                    that._value = null;\n                }\n                if (old && value === null && that._cell) {\n                    that._cell.removeClass('k-state-selected');\n                } else {\n                    that._changeView = !value || view && view.compare(value, that._current) !== 0;\n                    that.navigate(value);\n                }\n            },\n            _move: function (e) {\n                var that = this, options = that.options, key = e.keyCode, view = that._view, index = that._index, min = that.options.min, max = that.options.max, currentValue = new DATE(+that._current), isRtl = kendo.support.isRtl(that.wrapper), isDisabled = that.options.disableDates, value, prevent, method, temp;\n                if (e.target === that._table[0]) {\n                    that._active = true;\n                }\n                if (e.ctrlKey) {\n                    if (key == keys.RIGHT && !isRtl || key == keys.LEFT && isRtl) {\n                        that.navigateToFuture();\n                        prevent = true;\n                    } else if (key == keys.LEFT && !isRtl || key == keys.RIGHT && isRtl) {\n                        that.navigateToPast();\n                        prevent = true;\n                    } else if (key == keys.UP) {\n                        that.navigateUp();\n                        prevent = true;\n                    } else if (key == keys.DOWN) {\n                        that._click($(that._cell[0].firstChild));\n                        prevent = true;\n                    }\n                } else {\n                    if (key == keys.RIGHT && !isRtl || key == keys.LEFT && isRtl) {\n                        value = 1;\n                        prevent = true;\n                    } else if (key == keys.LEFT && !isRtl || key == keys.RIGHT && isRtl) {\n                        value = -1;\n                        prevent = true;\n                    } else if (key == keys.UP) {\n                        value = index === 0 ? -7 : -4;\n                        prevent = true;\n                    } else if (key == keys.DOWN) {\n                        value = index === 0 ? 7 : 4;\n                        prevent = true;\n                    } else if (key == keys.ENTER) {\n                        that._click($(that._cell[0].firstChild));\n                        prevent = true;\n                    } else if (key == keys.HOME || key == keys.END) {\n                        method = key == keys.HOME ? 'first' : 'last';\n                        temp = view[method](currentValue);\n                        currentValue = new DATE(temp.getFullYear(), temp.getMonth(), temp.getDate(), currentValue.getHours(), currentValue.getMinutes(), currentValue.getSeconds(), currentValue.getMilliseconds());\n                        prevent = true;\n                    } else if (key == keys.PAGEUP) {\n                        prevent = true;\n                        that.navigateToPast();\n                    } else if (key == keys.PAGEDOWN) {\n                        prevent = true;\n                        that.navigateToFuture();\n                    }\n                    if (value || method) {\n                        if (!method) {\n                            view.setDate(currentValue, value);\n                        }\n                        if (isDisabled(currentValue)) {\n                            currentValue = that._nextNavigatable(currentValue, value);\n                        }\n                        min = getDate(min);\n                        if (isInRange(currentValue, min, max)) {\n                            that._focus(restrictValue(currentValue, options.min, options.max));\n                        }\n                    }\n                }\n                if (prevent) {\n                    e.preventDefault();\n                }\n                return that._current;\n            },\n            _nextNavigatable: function (currentValue, value) {\n                var that = this, disabled = true, view = that._view, min = that.options.min, max = that.options.max, isDisabled = that.options.disableDates, navigatableDate = new Date(currentValue.getTime());\n                view.setDate(navigatableDate, -value);\n                while (disabled) {\n                    view.setDate(currentValue, value);\n                    if (!isInRange(currentValue, min, max)) {\n                        currentValue = navigatableDate;\n                        break;\n                    }\n                    disabled = isDisabled(currentValue);\n                }\n                return currentValue;\n            },\n            _animate: function (options) {\n                var that = this, from = options.from, to = options.to, active = that._active;\n                if (!from) {\n                    to.insertAfter(that.element[0].firstChild);\n                    that._bindTable(to);\n                } else if (from.parent().data('animating')) {\n                    from.off(ns);\n                    from.parent().kendoStop(true, true).remove();\n                    from.remove();\n                    to.insertAfter(that.element[0].firstChild);\n                    that._focusView(active);\n                } else if (!from.is(':visible') || that.options.animation === false || options.replace) {\n                    to.insertAfter(from);\n                    from.off(ns).remove();\n                    that._focusView(active);\n                } else {\n                    that[options.vertical ? '_vertical' : '_horizontal'](from, to, options.future);\n                }\n            },\n            _horizontal: function (from, to, future) {\n                var that = this, active = that._active, horizontal = that.options.animation.horizontal, effects = horizontal.effects, viewWidth = outerWidth(from);\n                if (effects && effects.indexOf(SLIDE) != -1) {\n                    from.add(to).css({ width: viewWidth });\n                    from.wrap('<div/>');\n                    that._focusView(active, from);\n                    from.parent().css({\n                        position: 'relative',\n                        width: viewWidth * 2,\n                        'float': LEFT,\n                        'margin-left': future ? 0 : -viewWidth\n                    });\n                    to[future ? 'insertAfter' : 'insertBefore'](from);\n                    extend(horizontal, {\n                        effects: SLIDE + ':' + (future ? 'right' : LEFT),\n                        complete: function () {\n                            from.off(ns).remove();\n                            that._oldTable = null;\n                            to.unwrap();\n                            that._focusView(active);\n                        }\n                    });\n                    from.parent().kendoStop(true, true).kendoAnimate(horizontal);\n                }\n            },\n            _vertical: function (from, to) {\n                var that = this, vertical = that.options.animation.vertical, effects = vertical.effects, active = that._active, cell, position;\n                if (effects && effects.indexOf('zoom') != -1) {\n                    to.css({\n                        position: 'absolute',\n                        top: outerHeight(from.prev()),\n                        left: 0\n                    }).insertBefore(from);\n                    if (transitionOrigin) {\n                        cell = that._cellByDate(that._view.toDateString(that._current));\n                        position = cell.position();\n                        position = position.left + parseInt(cell.width() / 2, 10) + 'px' + ' ' + (position.top + parseInt(cell.height() / 2, 10) + 'px');\n                        to.css(transitionOrigin, position);\n                    }\n                    from.kendoStop(true, true).kendoAnimate({\n                        effects: 'fadeOut',\n                        duration: 600,\n                        complete: function () {\n                            from.off(ns).remove();\n                            that._oldTable = null;\n                            to.css({\n                                position: 'static',\n                                top: 0,\n                                left: 0\n                            });\n                            that._focusView(active);\n                        }\n                    });\n                    to.kendoStop(true, true).kendoAnimate(vertical);\n                }\n            },\n            _cellByDate: function (value) {\n                return this._table.find('td:not(.' + OTHERMONTH + ')').filter(function () {\n                    return $(this.firstChild).attr(kendo.attr(VALUE)) === value;\n                });\n            },\n            _class: function (className, date) {\n                var that = this, id = that._cellID, cell = that._cell, value = that._view.toDateString(date), disabledDate;\n                if (cell) {\n                    cell.removeAttr(ARIA_SELECTED).removeAttr(ARIA_LABEL).removeAttr(ID);\n                }\n                if (date && that._view.name == 'month') {\n                    disabledDate = that.options.disableDates(date);\n                }\n                cell = that._table.find('td:not(.' + OTHERMONTH + ')').removeClass(className).filter(function () {\n                    return $(this.firstChild).attr(kendo.attr(VALUE)) === value;\n                }).attr(ARIA_SELECTED, true);\n                if (className === FOCUSED && !that._active && that.options.focusOnNav !== false || disabledDate) {\n                    className = '';\n                }\n                cell.addClass(className);\n                if (cell[0]) {\n                    that._cell = cell;\n                }\n                if (id) {\n                    cell.attr(ID, id);\n                    that._table.removeAttr('aria-activedescendant').attr('aria-activedescendant', id);\n                }\n            },\n            _bindTable: function (table) {\n                table.on(FOCUS_WITH_NS, this._addClassProxy).on(BLUR, this._removeClassProxy);\n            },\n            _click: function (link) {\n                var that = this, options = that.options, currentValue = new Date(+that._current), value = that._toDateObject(link);\n                adjustDST(value, 0);\n                if (that._view.name == 'month' && that.options.disableDates(value)) {\n                    value = that._value;\n                }\n                that._view.setDate(currentValue, value);\n                that.navigateDown(restrictValue(currentValue, options.min, options.max));\n            },\n            _focus: function (value) {\n                var that = this, view = that._view;\n                if (view.compare(value, that._current) !== 0) {\n                    that.navigate(value);\n                } else {\n                    that._current = value;\n                    that._class(FOCUSED, value);\n                }\n            },\n            _focusView: function (active, table) {\n                if (active) {\n                    this.focus(table);\n                }\n            },\n            _footer: function (template) {\n                var that = this, today = getToday(), element = that.element, footer = element.find('.k-footer');\n                if (!template) {\n                    that._toggle(false);\n                    footer.hide();\n                    return;\n                }\n                if (!footer[0]) {\n                    footer = $('<div class=\"k-footer\"><a href=\"#\" class=\"k-link k-nav-today\"></a></div>').appendTo(element);\n                }\n                that._today = footer.show().find('.k-link').html(template(today)).attr('title', kendo.toString(today, 'D', that.options.culture));\n                that._toggle();\n            },\n            _header: function () {\n                var that = this, element = that.element, links;\n                if (!element.find('.k-header')[0]) {\n                    element.html('<div class=\"k-header\">' + '<a href=\"#\" role=\"button\" class=\"k-link k-nav-prev\" ' + ARIA_LABEL + '=\"Previous\"><span class=\"k-icon k-i-arrow-60-left\"></span></a>' + '<a href=\"#\" role=\"button\" aria-live=\"assertive\" aria-atomic=\"true\" class=\"k-link k-nav-fast\"></a>' + '<a href=\"#\" role=\"button\" class=\"k-link k-nav-next\" ' + ARIA_LABEL + '=\"Next\"><span class=\"k-icon k-i-arrow-60-right\"></span></a>' + '</div>');\n                }\n                links = element.find('.k-link').on(MOUSEENTER_WITH_NS + ' ' + MOUSELEAVE + ' ' + FOCUS_WITH_NS + ' ' + BLUR, mousetoggle).click(false);\n                that._title = links.eq(1).on(CLICK, function () {\n                    that._active = that.options.focusOnNav !== false;\n                    that.navigateUp();\n                });\n                that[PREVARROW] = links.eq(0).on(CLICK, function () {\n                    that._active = that.options.focusOnNav !== false;\n                    that.navigateToPast();\n                });\n                that[NEXTARROW] = links.eq(2).on(CLICK, function () {\n                    that._active = that.options.focusOnNav !== false;\n                    that.navigateToFuture();\n                });\n            },\n            _navigate: function (arrow, modifier) {\n                var that = this, index = that._index + 1, currentValue = new DATE(+that._current);\n                arrow = that[arrow];\n                if (!arrow.hasClass(DISABLED)) {\n                    if (index > 3) {\n                        currentValue.setFullYear(currentValue.getFullYear() + 100 * modifier);\n                    } else {\n                        calendar.views[index].setDate(currentValue, modifier);\n                    }\n                    that.navigate(currentValue);\n                }\n            },\n            _option: function (option, value) {\n                var that = this, options = that.options, currentValue = that._value || that._current, isBigger;\n                if (value === undefined) {\n                    return options[option];\n                }\n                value = parse(value, options.format, options.culture);\n                if (!value) {\n                    return;\n                }\n                options[option] = new DATE(+value);\n                if (option === MIN) {\n                    isBigger = value > currentValue;\n                } else {\n                    isBigger = currentValue > value;\n                }\n                if (isBigger || isEqualMonth(currentValue, value)) {\n                    if (isBigger) {\n                        that._value = null;\n                    }\n                    that._changeView = true;\n                }\n                if (!that._changeView) {\n                    that._changeView = !!(options.month.content || options.month.empty);\n                }\n                that.navigate(that._value);\n                that._toggle();\n            },\n            _toggle: function (toggle) {\n                var that = this, options = that.options, isTodayDisabled = that.options.disableDates(getToday()), link = that._today;\n                if (toggle === undefined) {\n                    toggle = isInRange(getToday(), options.min, options.max);\n                }\n                if (link) {\n                    link.off(CLICK);\n                    if (toggle && !isTodayDisabled) {\n                        link.addClass(TODAY).removeClass(DISABLED).on(CLICK, proxy(that._todayClick, that));\n                    } else {\n                        link.removeClass(TODAY).addClass(DISABLED).on(CLICK, prevent);\n                    }\n                }\n            },\n            _todayClick: function (e) {\n                var that = this, depth = views[that.options.depth], disabled = that.options.disableDates, today = getToday();\n                e.preventDefault();\n                if (disabled(today)) {\n                    return;\n                }\n                if (that._view.compare(that._current, today) === 0 && that._index == depth) {\n                    that._changeView = false;\n                }\n                that._value = today;\n                that.navigate(today, depth);\n                that.trigger(CHANGE);\n            },\n            _toDateObject: function (link) {\n                var value = $(link).attr(kendo.attr(VALUE)).split('/');\n                value = new DATE(value[0], value[1], value[2]);\n                return value;\n            },\n            _templates: function () {\n                var that = this, options = that.options, footer = options.footer, month = options.month, content = month.content, weekNumber = month.weekNumber, empty = month.empty;\n                that.month = {\n                    content: template('<td#=data.cssClass# role=\"gridcell\"><a tabindex=\"-1\" class=\"k-link#=data.linkClass#\" href=\"#=data.url#\" ' + kendo.attr('value') + '=\"#=data.dateString#\" title=\"#=data.title#\">' + (content || '#=data.value#') + '</a></td>', { useWithBlock: !!content }),\n                    empty: template('<td role=\"gridcell\">' + (empty || '&nbsp;') + '</td>', { useWithBlock: !!empty }),\n                    weekNumber: template('<td class=\"k-alt\">' + (weekNumber || '#= data.weekNumber #') + '</td>', { useWithBlock: !!weekNumber })\n                };\n                that.footer = footer !== false ? template(footer || '#= kendo.toString(data,\"D\",\"' + options.culture + '\") #', { useWithBlock: false }) : null;\n            }\n        });\n        ui.plugin(Calendar);\n        var calendar = {\n            firstDayOfMonth: function (date) {\n                return new DATE(date.getFullYear(), date.getMonth(), 1);\n            },\n            firstVisibleDay: function (date, calendarInfo) {\n                calendarInfo = calendarInfo || kendo.culture().calendar;\n                var firstDay = calendarInfo.firstDay, firstVisibleDay = new DATE(date.getFullYear(), date.getMonth(), 0, date.getHours(), date.getMinutes(), date.getSeconds(), date.getMilliseconds());\n                while (firstVisibleDay.getDay() != firstDay) {\n                    calendar.setTime(firstVisibleDay, -1 * MS_PER_DAY);\n                }\n                return firstVisibleDay;\n            },\n            setTime: function (date, time) {\n                var tzOffsetBefore = date.getTimezoneOffset(), resultDATE = new DATE(date.getTime() + time), tzOffsetDiff = resultDATE.getTimezoneOffset() - tzOffsetBefore;\n                date.setTime(resultDATE.getTime() + tzOffsetDiff * MS_PER_MINUTE);\n            },\n            views: [\n                {\n                    name: MONTH,\n                    title: function (date, min, max, culture) {\n                        return getCalendarInfo(culture).months.names[date.getMonth()] + ' ' + date.getFullYear();\n                    },\n                    content: function (options) {\n                        var that = this, idx = 0, min = options.min, max = options.max, date = options.date, dates = options.dates, format = options.format, culture = options.culture, navigateUrl = options.url, isWeekColumnVisible = options.isWeekColumnVisible, hasUrl = navigateUrl && dates[0], currentCalendar = getCalendarInfo(culture), firstDayIdx = currentCalendar.firstDay, days = currentCalendar.days, names = shiftArray(days.names, firstDayIdx), shortNames = shiftArray(days.namesShort, firstDayIdx), start = calendar.firstVisibleDay(date, currentCalendar), firstDayOfMonth = that.first(date), lastDayOfMonth = that.last(date), toDateString = that.toDateString, today = new DATE(), html = '<table tabindex=\"0\" role=\"grid\" class=\"k-content\" cellspacing=\"0\" data-start=\"' + toDateString(start) + '\"><thead><tr role=\"row\">';\n                        if (isWeekColumnVisible) {\n                            html += '<th scope=\"col\" class=\"k-alt\">' + options.messages.weekColumnHeader + '</th>';\n                        }\n                        for (; idx < 7; idx++) {\n                            html += '<th scope=\"col\" title=\"' + names[idx] + '\">' + shortNames[idx] + '</th>';\n                        }\n                        today = new DATE(today.getFullYear(), today.getMonth(), today.getDate());\n                        adjustDST(today, 0);\n                        today = +today;\n                        return view({\n                            cells: 42,\n                            perRow: 7,\n                            html: html += '</tr></thead><tbody><tr role=\"row\">',\n                            start: start,\n                            isWeekColumnVisible: isWeekColumnVisible,\n                            weekNumber: options.weekNumber,\n                            min: new DATE(min.getFullYear(), min.getMonth(), min.getDate()),\n                            max: new DATE(max.getFullYear(), max.getMonth(), max.getDate()),\n                            content: options.content,\n                            empty: options.empty,\n                            setter: that.setDate,\n                            disableDates: options.disableDates,\n                            build: function (date, idx, disableDates) {\n                                var cssClass = [], day = date.getDay(), linkClass = '', url = '#';\n                                if (date < firstDayOfMonth || date > lastDayOfMonth) {\n                                    cssClass.push(OTHERMONTH);\n                                }\n                                if (disableDates(date)) {\n                                    cssClass.push(DISABLED);\n                                }\n                                if (+date === today) {\n                                    cssClass.push('k-today');\n                                }\n                                if (day === 0 || day === 6) {\n                                    cssClass.push('k-weekend');\n                                }\n                                if (hasUrl && inArray(+date, dates)) {\n                                    url = navigateUrl.replace('{0}', kendo.toString(date, format, culture));\n                                    linkClass = ' k-action-link';\n                                }\n                                return {\n                                    date: date,\n                                    dates: dates,\n                                    ns: kendo.ns,\n                                    title: kendo.toString(date, 'D', culture),\n                                    value: date.getDate(),\n                                    dateString: toDateString(date),\n                                    cssClass: cssClass[0] ? ' class=\"' + cssClass.join(' ') + '\"' : '',\n                                    linkClass: linkClass,\n                                    url: url\n                                };\n                            },\n                            weekNumberBuild: function (date) {\n                                return {\n                                    weekNumber: weekInYear(date, kendo.culture().calendar.firstDay),\n                                    currentDate: date\n                                };\n                            }\n                        });\n                    },\n                    first: function (date) {\n                        return calendar.firstDayOfMonth(date);\n                    },\n                    last: function (date) {\n                        var last = new DATE(date.getFullYear(), date.getMonth() + 1, 0), first = calendar.firstDayOfMonth(date), timeOffset = Math.abs(last.getTimezoneOffset() - first.getTimezoneOffset());\n                        if (timeOffset) {\n                            last.setHours(first.getHours() + timeOffset / 60);\n                        }\n                        return last;\n                    },\n                    compare: function (date1, date2) {\n                        var result, month1 = date1.getMonth(), year1 = date1.getFullYear(), month2 = date2.getMonth(), year2 = date2.getFullYear();\n                        if (year1 > year2) {\n                            result = 1;\n                        } else if (year1 < year2) {\n                            result = -1;\n                        } else {\n                            result = month1 == month2 ? 0 : month1 > month2 ? 1 : -1;\n                        }\n                        return result;\n                    },\n                    setDate: function (date, value) {\n                        var hours = date.getHours();\n                        if (value instanceof DATE) {\n                            date.setFullYear(value.getFullYear(), value.getMonth(), value.getDate());\n                        } else {\n                            calendar.setTime(date, value * MS_PER_DAY);\n                        }\n                        adjustDST(date, hours);\n                    },\n                    toDateString: function (date) {\n                        return date.getFullYear() + '/' + date.getMonth() + '/' + date.getDate();\n                    }\n                },\n                {\n                    name: 'year',\n                    title: function (date) {\n                        return date.getFullYear();\n                    },\n                    content: function (options) {\n                        var namesAbbr = getCalendarInfo(options.culture).months.namesAbbr, toDateString = this.toDateString, min = options.min, max = options.max;\n                        return view({\n                            min: new DATE(min.getFullYear(), min.getMonth(), 1),\n                            max: new DATE(max.getFullYear(), max.getMonth(), 1),\n                            start: new DATE(options.date.getFullYear(), 0, 1),\n                            setter: this.setDate,\n                            build: function (date) {\n                                return {\n                                    value: namesAbbr[date.getMonth()],\n                                    ns: kendo.ns,\n                                    dateString: toDateString(date),\n                                    cssClass: ''\n                                };\n                            }\n                        });\n                    },\n                    first: function (date) {\n                        return new DATE(date.getFullYear(), 0, date.getDate());\n                    },\n                    last: function (date) {\n                        return new DATE(date.getFullYear(), 11, date.getDate());\n                    },\n                    compare: function (date1, date2) {\n                        return compare(date1, date2);\n                    },\n                    setDate: function (date, value) {\n                        var month, hours = date.getHours();\n                        if (value instanceof DATE) {\n                            month = value.getMonth();\n                            date.setFullYear(value.getFullYear(), month, date.getDate());\n                            if (month !== date.getMonth()) {\n                                date.setDate(0);\n                            }\n                        } else {\n                            month = date.getMonth() + value;\n                            date.setMonth(month);\n                            if (month > 11) {\n                                month -= 12;\n                            }\n                            if (month > 0 && date.getMonth() != month) {\n                                date.setDate(0);\n                            }\n                        }\n                        adjustDST(date, hours);\n                    },\n                    toDateString: function (date) {\n                        return date.getFullYear() + '/' + date.getMonth() + '/1';\n                    }\n                },\n                {\n                    name: 'decade',\n                    title: function (date, min, max) {\n                        return title(date, min, max, 10);\n                    },\n                    content: function (options) {\n                        var year = options.date.getFullYear(), toDateString = this.toDateString;\n                        return view({\n                            start: new DATE(year - year % 10 - 1, 0, 1),\n                            min: new DATE(options.min.getFullYear(), 0, 1),\n                            max: new DATE(options.max.getFullYear(), 0, 1),\n                            setter: this.setDate,\n                            build: function (date, idx) {\n                                return {\n                                    value: date.getFullYear(),\n                                    ns: kendo.ns,\n                                    dateString: toDateString(date),\n                                    cssClass: idx === 0 || idx == 11 ? OTHERMONTHCLASS : ''\n                                };\n                            }\n                        });\n                    },\n                    first: function (date) {\n                        var year = date.getFullYear();\n                        return new DATE(year - year % 10, date.getMonth(), date.getDate());\n                    },\n                    last: function (date) {\n                        var year = date.getFullYear();\n                        return new DATE(year - year % 10 + 9, date.getMonth(), date.getDate());\n                    },\n                    compare: function (date1, date2) {\n                        return compare(date1, date2, 10);\n                    },\n                    setDate: function (date, value) {\n                        setDate(date, value, 1);\n                    },\n                    toDateString: function (date) {\n                        return date.getFullYear() + '/0/1';\n                    }\n                },\n                {\n                    name: CENTURY,\n                    title: function (date, min, max) {\n                        return title(date, min, max, 100);\n                    },\n                    content: function (options) {\n                        var year = options.date.getFullYear(), min = options.min.getFullYear(), max = options.max.getFullYear(), toDateString = this.toDateString, minYear = min, maxYear = max;\n                        minYear = minYear - minYear % 10;\n                        maxYear = maxYear - maxYear % 10;\n                        if (maxYear - minYear < 10) {\n                            maxYear = minYear + 9;\n                        }\n                        return view({\n                            start: new DATE(year - year % 100 - 10, 0, 1),\n                            min: new DATE(minYear, 0, 1),\n                            max: new DATE(maxYear, 0, 1),\n                            setter: this.setDate,\n                            build: function (date, idx) {\n                                var start = date.getFullYear(), end = start + 9;\n                                if (start < min) {\n                                    start = min;\n                                }\n                                if (end > max) {\n                                    end = max;\n                                }\n                                return {\n                                    ns: kendo.ns,\n                                    value: start + ' - ' + end,\n                                    dateString: toDateString(date),\n                                    cssClass: idx === 0 || idx == 11 ? OTHERMONTHCLASS : ''\n                                };\n                            }\n                        });\n                    },\n                    first: function (date) {\n                        var year = date.getFullYear();\n                        return new DATE(year - year % 100, date.getMonth(), date.getDate());\n                    },\n                    last: function (date) {\n                        var year = date.getFullYear();\n                        return new DATE(year - year % 100 + 99, date.getMonth(), date.getDate());\n                    },\n                    compare: function (date1, date2) {\n                        return compare(date1, date2, 100);\n                    },\n                    setDate: function (date, value) {\n                        setDate(date, value, 10);\n                    },\n                    toDateString: function (date) {\n                        var year = date.getFullYear();\n                        return year - year % 10 + '/0/1';\n                    }\n                }\n            ]\n        };\n        function title(date, min, max, modular) {\n            var start = date.getFullYear(), minYear = min.getFullYear(), maxYear = max.getFullYear(), end;\n            start = start - start % modular;\n            end = start + (modular - 1);\n            if (start < minYear) {\n                start = minYear;\n            }\n            if (end > maxYear) {\n                end = maxYear;\n            }\n            return start + '-' + end;\n        }\n        function view(options) {\n            var idx = 0, data, min = options.min, max = options.max, start = options.start, setter = options.setter, build = options.build, weekNumberBuild = options.weekNumberBuild, length = options.cells || 12, isWeekColumnVisible = options.isWeekColumnVisible, cellsPerRow = options.perRow || 4, weekNumber = options.weekNumber || weekNumberTemplate, content = options.content || cellTemplate, empty = options.empty || emptyCellTemplate, html = options.html || '<table tabindex=\"0\" role=\"grid\" class=\"k-content k-meta-view\" cellspacing=\"0\"><tbody><tr role=\"row\">';\n            if (isWeekColumnVisible) {\n                html += weekNumber(weekNumberBuild(start));\n            }\n            for (; idx < length; idx++) {\n                if (idx > 0 && idx % cellsPerRow === 0) {\n                    html += '</tr><tr role=\"row\">';\n                    if (isWeekColumnVisible) {\n                        html += weekNumber(weekNumberBuild(start));\n                    }\n                }\n                start = new DATE(start.getFullYear(), start.getMonth(), start.getDate(), 0, 0, 0);\n                adjustDST(start, 0);\n                data = build(start, idx, options.disableDates);\n                html += isInRange(start, min, max) ? content(data) : empty(data);\n                setter(start, 1);\n            }\n            return html + '</tr></tbody></table>';\n        }\n        function compare(date1, date2, modifier) {\n            var year1 = date1.getFullYear(), start = date2.getFullYear(), end = start, result = 0;\n            if (modifier) {\n                start = start - start % modifier;\n                end = start - start % modifier + modifier - 1;\n            }\n            if (year1 > end) {\n                result = 1;\n            } else if (year1 < start) {\n                result = -1;\n            }\n            return result;\n        }\n        function getToday() {\n            var today = new DATE();\n            return new DATE(today.getFullYear(), today.getMonth(), today.getDate());\n        }\n        function restrictValue(value, min, max) {\n            var today = getToday();\n            if (value) {\n                today = new DATE(+value);\n            }\n            if (min > today) {\n                today = new DATE(+min);\n            } else if (max < today) {\n                today = new DATE(+max);\n            }\n            return today;\n        }\n        function isInRange(date, min, max) {\n            return +date >= +min && +date <= +max;\n        }\n        function shiftArray(array, idx) {\n            return array.slice(idx).concat(array.slice(0, idx));\n        }\n        function setDate(date, value, multiplier) {\n            value = value instanceof DATE ? value.getFullYear() : date.getFullYear() + multiplier * value;\n            date.setFullYear(value);\n        }\n        function mousetoggle(e) {\n            var disabled = $(this).hasClass('k-state-disabled');\n            if (!disabled) {\n                $(this).toggleClass(HOVER, MOUSEENTER.indexOf(e.type) > -1 || e.type == FOCUS);\n            }\n        }\n        function prevent(e) {\n            e.preventDefault();\n        }\n        function getCalendarInfo(culture) {\n            return getCulture(culture).calendars.standard;\n        }\n        function normalize(options) {\n            var start = views[options.start], depth = views[options.depth], culture = getCulture(options.culture);\n            options.format = extractFormat(options.format || culture.calendars.standard.patterns.d);\n            if (isNaN(start)) {\n                start = 0;\n                options.start = MONTH;\n            }\n            if (depth === undefined || depth > start) {\n                options.depth = MONTH;\n            }\n            if (options.dates === null) {\n                options.dates = [];\n            }\n        }\n        function makeUnselectable(element) {\n            if (isIE8) {\n                element.find('*').attr('unselectable', 'on');\n            }\n        }\n        function addClassToViewContainer(element, currentView) {\n            element.addClass('k-' + currentView);\n        }\n        function inArray(date, dates) {\n            for (var i = 0, length = dates.length; i < length; i++) {\n                if (date === +dates[i]) {\n                    return true;\n                }\n            }\n            return false;\n        }\n        function isEqualDatePart(value1, value2) {\n            if (value1) {\n                return value1.getFullYear() === value2.getFullYear() && value1.getMonth() === value2.getMonth() && value1.getDate() === value2.getDate();\n            }\n            return false;\n        }\n        function isEqualMonth(value1, value2) {\n            if (value1) {\n                return value1.getFullYear() === value2.getFullYear() && value1.getMonth() === value2.getMonth();\n            }\n            return false;\n        }\n        function getDisabledExpr(option) {\n            if (kendo.isFunction(option)) {\n                return option;\n            }\n            if ($.isArray(option)) {\n                return createDisabledExpr(option);\n            }\n            return $.noop;\n        }\n        function convertDatesArray(dates) {\n            var result = [];\n            for (var i = 0; i < dates.length; i++) {\n                result.push(dates[i].setHours(0, 0, 0, 0));\n            }\n            return result;\n        }\n        function createDisabledExpr(dates) {\n            var body, callback, disabledDates = [], days = [\n                    'su',\n                    'mo',\n                    'tu',\n                    'we',\n                    'th',\n                    'fr',\n                    'sa'\n                ], searchExpression = 'if (found) {' + ' return true ' + '} else {' + 'return false' + '}';\n            if (dates[0] instanceof DATE) {\n                disabledDates = convertDatesArray(dates);\n                body = 'var found = date && $.inArray(date.setHours(0, 0, 0, 0),[' + disabledDates + ']) > -1;' + searchExpression;\n            } else {\n                for (var i = 0; i < dates.length; i++) {\n                    var day = dates[i].slice(0, 2).toLowerCase();\n                    var index = $.inArray(day, days);\n                    if (index > -1) {\n                        disabledDates.push(index);\n                    }\n                }\n                body = 'var found = date && $.inArray(date.getDay(),[' + disabledDates + ']) > -1;' + searchExpression;\n            }\n            callback = new Function('date', body);\n            return callback;\n        }\n        function isEqualDate(oldValue, newValue) {\n            if (oldValue instanceof Date && newValue instanceof Date) {\n                oldValue = oldValue.getTime();\n                newValue = newValue.getTime();\n            }\n            return oldValue === newValue;\n        }\n        calendar.isEqualDatePart = isEqualDatePart;\n        calendar.isEqualDate = isEqualDate;\n        calendar.makeUnselectable = makeUnselectable;\n        calendar.restrictValue = restrictValue;\n        calendar.isInRange = isInRange;\n        calendar.addClassToViewContainer = addClassToViewContainer;\n        calendar.normalize = normalize;\n        calendar.viewsEnum = views;\n        calendar.disabled = getDisabledExpr;\n        kendo.calendar = calendar;\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.datepicker', [\n        'kendo.calendar',\n        'kendo.popup'\n    ], f);\n}(function () {\n    var __meta__ = {\n        id: 'datepicker',\n        name: 'DatePicker',\n        category: 'web',\n        description: 'The DatePicker widget allows the user to select a date from a calendar or by direct input.',\n        depends: [\n            'calendar',\n            'popup'\n        ]\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, ui = kendo.ui, Widget = ui.Widget, parse = kendo.parseDate, keys = kendo.keys, template = kendo.template, activeElement = kendo._activeElement, DIV = '<div />', SPAN = '<span />', ns = '.kendoDatePicker', CLICK = 'click' + ns, OPEN = 'open', CLOSE = 'close', CHANGE = 'change', DISABLED = 'disabled', READONLY = 'readonly', DEFAULT = 'k-state-default', FOCUSED = 'k-state-focused', SELECTED = 'k-state-selected', STATEDISABLED = 'k-state-disabled', HOVER = 'k-state-hover', HOVEREVENTS = 'mouseenter' + ns + ' mouseleave' + ns, MOUSEDOWN = 'mousedown' + ns, ID = 'id', MIN = 'min', MAX = 'max', MONTH = 'month', ARIA_DISABLED = 'aria-disabled', ARIA_EXPANDED = 'aria-expanded', ARIA_HIDDEN = 'aria-hidden', calendar = kendo.calendar, isInRange = calendar.isInRange, restrictValue = calendar.restrictValue, isEqualDatePart = calendar.isEqualDatePart, extend = $.extend, proxy = $.proxy, DATE = Date;\n        function normalize(options) {\n            var parseFormats = options.parseFormats, format = options.format;\n            calendar.normalize(options);\n            parseFormats = $.isArray(parseFormats) ? parseFormats : [parseFormats];\n            if (!parseFormats.length) {\n                parseFormats.push('yyyy-MM-dd');\n            }\n            if ($.inArray(format, parseFormats) === -1) {\n                parseFormats.splice(0, 0, options.format);\n            }\n            options.parseFormats = parseFormats;\n        }\n        function preventDefault(e) {\n            e.preventDefault();\n        }\n        var DateView = function (options) {\n            var that = this, id, body = document.body, div = $(DIV).attr(ARIA_HIDDEN, 'true').addClass('k-calendar-container').appendTo(body);\n            that.options = options = options || {};\n            id = options.id;\n            if (id) {\n                id += '_dateview';\n                div.attr(ID, id);\n                that._dateViewID = id;\n            }\n            that.popup = new ui.Popup(div, extend(options.popup, options, {\n                name: 'Popup',\n                isRtl: kendo.support.isRtl(options.anchor)\n            }));\n            that.div = div;\n            that.value(options.value);\n        };\n        DateView.prototype = {\n            _calendar: function () {\n                var that = this;\n                var calendar = that.calendar;\n                var options = that.options;\n                var div;\n                if (!calendar) {\n                    div = $(DIV).attr(ID, kendo.guid()).appendTo(that.popup.element).on(MOUSEDOWN, preventDefault).on(CLICK, 'td:has(.k-link)', proxy(that._click, that));\n                    that.calendar = calendar = new ui.Calendar(div);\n                    that._setOptions(options);\n                    kendo.calendar.makeUnselectable(calendar.element);\n                    calendar.navigate(that._value || that._current, options.start);\n                    that.value(that._value);\n                }\n            },\n            _setOptions: function (options) {\n                this.calendar.setOptions({\n                    focusOnNav: false,\n                    change: options.change,\n                    culture: options.culture,\n                    dates: options.dates,\n                    depth: options.depth,\n                    footer: options.footer,\n                    format: options.format,\n                    max: options.max,\n                    min: options.min,\n                    month: options.month,\n                    weekNumber: options.weekNumber,\n                    start: options.start,\n                    disableDates: options.disableDates\n                });\n            },\n            setOptions: function (options) {\n                var old = this.options;\n                var disableDates = options.disableDates;\n                if (disableDates) {\n                    options.disableDates = calendar.disabled(disableDates);\n                }\n                this.options = extend(old, options, {\n                    change: old.change,\n                    close: old.close,\n                    open: old.open\n                });\n                if (this.calendar) {\n                    this._setOptions(this.options);\n                }\n            },\n            destroy: function () {\n                this.popup.destroy();\n            },\n            open: function () {\n                var that = this;\n                that._calendar();\n                that.popup.open();\n            },\n            close: function () {\n                this.popup.close();\n            },\n            min: function (value) {\n                this._option(MIN, value);\n            },\n            max: function (value) {\n                this._option(MAX, value);\n            },\n            toggle: function () {\n                var that = this;\n                that[that.popup.visible() ? CLOSE : OPEN]();\n            },\n            move: function (e) {\n                var that = this, key = e.keyCode, calendar = that.calendar, selectIsClicked = e.ctrlKey && key == keys.DOWN || key == keys.ENTER, handled = false;\n                if (e.altKey) {\n                    if (key == keys.DOWN) {\n                        that.open();\n                        e.preventDefault();\n                        handled = true;\n                    } else if (key == keys.UP) {\n                        that.close();\n                        e.preventDefault();\n                        handled = true;\n                    }\n                } else if (that.popup.visible()) {\n                    if (key == keys.ESC || selectIsClicked && calendar._cell.hasClass(SELECTED)) {\n                        that.close();\n                        e.preventDefault();\n                        return true;\n                    }\n                    that._current = calendar._move(e);\n                    handled = true;\n                }\n                return handled;\n            },\n            current: function (date) {\n                this._current = date;\n                this.calendar._focus(date);\n            },\n            value: function (value) {\n                var that = this, calendar = that.calendar, options = that.options, disabledDate = options.disableDates;\n                if (disabledDate && disabledDate(value)) {\n                    value = null;\n                }\n                that._value = value;\n                that._current = new DATE(+restrictValue(value, options.min, options.max));\n                if (calendar) {\n                    calendar.value(value);\n                }\n            },\n            _click: function (e) {\n                if (e.currentTarget.className.indexOf(SELECTED) !== -1) {\n                    this.close();\n                }\n            },\n            _option: function (option, value) {\n                var that = this;\n                var calendar = that.calendar;\n                that.options[option] = value;\n                if (calendar) {\n                    calendar[option](value);\n                }\n            }\n        };\n        DateView.normalize = normalize;\n        kendo.DateView = DateView;\n        var DatePicker = Widget.extend({\n            init: function (element, options) {\n                var that = this, disabled, div;\n                Widget.fn.init.call(that, element, options);\n                element = that.element;\n                options = that.options;\n                options.disableDates = kendo.calendar.disabled(options.disableDates);\n                options.min = parse(element.attr('min')) || parse(options.min);\n                options.max = parse(element.attr('max')) || parse(options.max);\n                normalize(options);\n                that._initialOptions = extend({}, options);\n                that._wrapper();\n                that.dateView = new DateView(extend({}, options, {\n                    id: element.attr(ID),\n                    anchor: that.wrapper,\n                    change: function () {\n                        that._change(this.value());\n                        that.close();\n                    },\n                    close: function (e) {\n                        if (that.trigger(CLOSE)) {\n                            e.preventDefault();\n                        } else {\n                            element.attr(ARIA_EXPANDED, false);\n                            div.attr(ARIA_HIDDEN, true);\n                        }\n                    },\n                    open: function (e) {\n                        var options = that.options, date;\n                        if (that.trigger(OPEN)) {\n                            e.preventDefault();\n                        } else {\n                            if (that.element.val() !== that._oldText) {\n                                date = parse(element.val(), options.parseFormats, options.culture);\n                                that.dateView[date ? 'current' : 'value'](date);\n                            }\n                            element.attr(ARIA_EXPANDED, true);\n                            div.attr(ARIA_HIDDEN, false);\n                            that._updateARIA(date);\n                        }\n                    }\n                }));\n                div = that.dateView.div;\n                that._icon();\n                try {\n                    element[0].setAttribute('type', 'text');\n                } catch (e) {\n                    element[0].type = 'text';\n                }\n                element.addClass('k-input').attr({\n                    role: 'combobox',\n                    'aria-expanded': false,\n                    'aria-owns': that.dateView._dateViewID\n                });\n                that._reset();\n                that._template();\n                disabled = element.is('[disabled]') || $(that.element).parents('fieldset').is(':disabled');\n                if (disabled) {\n                    that.enable(false);\n                } else {\n                    that.readonly(element.is('[readonly]'));\n                }\n                if (options.dateInput) {\n                    that._dateInput = new ui.DateInput(element, {\n                        culture: options.culture,\n                        format: options.format,\n                        min: options.min,\n                        max: options.max,\n                        value: options.value\n                    });\n                }\n                that._old = that._update(options.value || that.element.val());\n                that._oldText = element.val();\n                kendo.notify(that);\n            },\n            events: [\n                OPEN,\n                CLOSE,\n                CHANGE\n            ],\n            options: {\n                name: 'DatePicker',\n                value: null,\n                footer: '',\n                format: '',\n                culture: '',\n                parseFormats: [],\n                min: new Date(1900, 0, 1),\n                max: new Date(2099, 11, 31),\n                start: MONTH,\n                depth: MONTH,\n                animation: {},\n                month: {},\n                dates: [],\n                ARIATemplate: 'Current focused date is #=kendo.toString(data.current, \"D\")#',\n                dateInput: false\n            },\n            setOptions: function (options) {\n                var that = this;\n                var value = that._value;\n                Widget.fn.setOptions.call(that, options);\n                options = that.options;\n                options.min = parse(options.min);\n                options.max = parse(options.max);\n                normalize(options);\n                that.dateView.setOptions(options);\n                if (that._dateInput) {\n                    that._dateInput.setOptions({\n                        culture: options.culture,\n                        format: options.format,\n                        min: options.min,\n                        max: options.max,\n                        value: options.value\n                    });\n                }\n                if (value) {\n                    that.element.val(kendo.toString(value, options.format, options.culture));\n                    that._updateARIA(value);\n                }\n            },\n            _editable: function (options) {\n                var that = this, icon = that._dateIcon.off(ns), element = that.element.off(ns), wrapper = that._inputWrapper.off(ns), readonly = options.readonly, disable = options.disable;\n                if (!readonly && !disable) {\n                    wrapper.addClass(DEFAULT).removeClass(STATEDISABLED).on(HOVEREVENTS, that._toggleHover);\n                    element.removeAttr(DISABLED).removeAttr(READONLY).attr(ARIA_DISABLED, false).on('keydown' + ns, proxy(that._keydown, that)).on('focusout' + ns, proxy(that._blur, that)).on('focus' + ns, function () {\n                        that._inputWrapper.addClass(FOCUSED);\n                    });\n                    icon.on(CLICK, proxy(that._click, that)).on(MOUSEDOWN, preventDefault);\n                } else {\n                    wrapper.addClass(disable ? STATEDISABLED : DEFAULT).removeClass(disable ? DEFAULT : STATEDISABLED);\n                    element.attr(DISABLED, disable).attr(READONLY, readonly).attr(ARIA_DISABLED, disable);\n                }\n            },\n            readonly: function (readonly) {\n                this._editable({\n                    readonly: readonly === undefined ? true : readonly,\n                    disable: false\n                });\n            },\n            enable: function (enable) {\n                this._editable({\n                    readonly: false,\n                    disable: !(enable = enable === undefined ? true : enable)\n                });\n            },\n            destroy: function () {\n                var that = this;\n                Widget.fn.destroy.call(that);\n                that.dateView.destroy();\n                that.element.off(ns);\n                that._dateIcon.off(ns);\n                that._inputWrapper.off(ns);\n                if (that._form) {\n                    that._form.off('reset', that._resetHandler);\n                }\n            },\n            open: function () {\n                this.dateView.open();\n            },\n            close: function () {\n                this.dateView.close();\n            },\n            min: function (value) {\n                return this._option(MIN, value);\n            },\n            max: function (value) {\n                return this._option(MAX, value);\n            },\n            value: function (value) {\n                var that = this;\n                if (value === undefined) {\n                    return that._value;\n                }\n                that._old = that._update(value);\n                if (that._old === null) {\n                    that.element.val('');\n                }\n                that._oldText = that.element.val();\n            },\n            _toggleHover: function (e) {\n                $(e.currentTarget).toggleClass(HOVER, e.type === 'mouseenter');\n            },\n            _blur: function () {\n                var that = this, value = that.element.val();\n                that.close();\n                if (value !== that._oldText) {\n                    that._change(value);\n                }\n                that._inputWrapper.removeClass(FOCUSED);\n            },\n            _click: function () {\n                var that = this, element = that.element;\n                that.dateView.toggle();\n                if (!kendo.support.touch && element[0] !== activeElement()) {\n                    element.focus();\n                }\n            },\n            _change: function (value) {\n                var that = this, oldValue = that.element.val(), dateChanged;\n                value = that._update(value);\n                dateChanged = !kendo.calendar.isEqualDate(that._old, value);\n                var valueUpdated = dateChanged && !that._typing;\n                var textFormatted = oldValue !== that.element.val();\n                if (valueUpdated || textFormatted) {\n                    that.element.trigger(CHANGE);\n                }\n                if (dateChanged) {\n                    that._old = value;\n                    that._oldText = that.element.val();\n                    that.trigger(CHANGE);\n                }\n                that._typing = false;\n            },\n            _keydown: function (e) {\n                var that = this, dateView = that.dateView, value = that.element.val(), handled = false;\n                if (!dateView.popup.visible() && e.keyCode == keys.ENTER && value !== that._oldText) {\n                    that._change(value);\n                } else {\n                    handled = dateView.move(e);\n                    that._updateARIA(dateView._current);\n                    if (!handled) {\n                        that._typing = true;\n                    } else if (that._dateInput && e.stopImmediatePropagation) {\n                        e.stopImmediatePropagation();\n                    }\n                }\n            },\n            _icon: function () {\n                var that = this, element = that.element, icon;\n                icon = element.next('span.k-select');\n                if (!icon[0]) {\n                    icon = $('<span unselectable=\"on\" class=\"k-select\" aria-label=\"select\"><span class=\"k-icon k-i-calendar\"></span></span>').insertAfter(element);\n                }\n                that._dateIcon = icon.attr({\n                    'role': 'button',\n                    'aria-controls': that.dateView._dateViewID\n                });\n            },\n            _option: function (option, value) {\n                var that = this, options = that.options;\n                if (value === undefined) {\n                    return options[option];\n                }\n                value = parse(value, options.parseFormats, options.culture);\n                if (!value) {\n                    return;\n                }\n                options[option] = new DATE(+value);\n                that.dateView[option](value);\n            },\n            _update: function (value) {\n                var that = this, options = that.options, min = options.min, max = options.max, current = that._value, date = parse(value, options.parseFormats, options.culture), isSameType = date === null && current === null || date instanceof Date && current instanceof Date, formattedValue;\n                if (options.disableDates(date)) {\n                    date = null;\n                    if (!that._old && !that.element.val()) {\n                        value = null;\n                    }\n                }\n                if (+date === +current && isSameType) {\n                    formattedValue = kendo.toString(date, options.format, options.culture);\n                    if (formattedValue !== value) {\n                        that.element.val(date === null ? value : formattedValue);\n                    }\n                    return date;\n                }\n                if (date !== null && isEqualDatePart(date, min)) {\n                    date = restrictValue(date, min, max);\n                } else if (!isInRange(date, min, max)) {\n                    date = null;\n                }\n                that._value = date;\n                that.dateView.value(date);\n                if (that._dateInput) {\n                    that._dateInput.value(date || value);\n                } else {\n                    that.element.val(kendo.toString(date || value, options.format, options.culture));\n                }\n                that._updateARIA(date);\n                return date;\n            },\n            _wrapper: function () {\n                var that = this, element = that.element, wrapper;\n                wrapper = element.parents('.k-datepicker');\n                if (!wrapper[0]) {\n                    wrapper = element.wrap(SPAN).parent().addClass('k-picker-wrap k-state-default');\n                    wrapper = wrapper.wrap(SPAN).parent();\n                }\n                wrapper[0].style.cssText = element[0].style.cssText;\n                element.css({\n                    width: '100%',\n                    height: element[0].style.height\n                });\n                that.wrapper = wrapper.addClass('k-widget k-datepicker k-header').addClass(element[0].className);\n                that._inputWrapper = $(wrapper[0].firstChild);\n            },\n            _reset: function () {\n                var that = this, element = that.element, formId = element.attr('form'), form = formId ? $('#' + formId) : element.closest('form');\n                if (form[0]) {\n                    that._resetHandler = function () {\n                        that.value(element[0].defaultValue);\n                        that.max(that._initialOptions.max);\n                        that.min(that._initialOptions.min);\n                    };\n                    that._form = form.on('reset', that._resetHandler);\n                }\n            },\n            _template: function () {\n                this._ariaTemplate = template(this.options.ARIATemplate);\n            },\n            _updateARIA: function (date) {\n                var cell;\n                var that = this;\n                var calendar = that.dateView.calendar;\n                that.element.removeAttr('aria-activedescendant');\n                if (calendar) {\n                    cell = calendar._cell;\n                    cell.attr('aria-label', that._ariaTemplate({ current: date || calendar.current() }));\n                    that.element.attr('aria-activedescendant', cell.attr('id'));\n                }\n            }\n        });\n        ui.plugin(DatePicker);\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.dateinput', ['kendo.core'], f);\n}(function () {\n    var __meta__ = {\n        id: 'dateinput',\n        name: 'DateInput',\n        category: 'web',\n        description: 'The DateInput widget allows to edit date by typing.',\n        depends: ['core']\n    };\n    (function ($, undefined) {\n        var global = window;\n        var kendo = global.kendo;\n        var caret = kendo.caret;\n        var ui = kendo.ui;\n        var Widget = ui.Widget;\n        var keys = kendo.keys;\n        var ns = '.kendoDateInput';\n        var proxy = $.proxy;\n        var objectToString = {}.toString;\n        var INPUT_EVENT_NAME = (kendo.support.propertyChangeEvent ? 'propertychange.kendoDateInput input' : 'input') + ns;\n        var STATEDISABLED = 'k-state-disabled';\n        var STATEDEFAULT = 'k-state-default';\n        var STATEINVALID = 'k-state-invalid';\n        var DISABLED = 'disabled';\n        var READONLY = 'readonly';\n        var CHANGE = 'change';\n        var knownSymbols = 'dMyHhmftsz';\n        var DateInput = Widget.extend({\n            init: function (element, options) {\n                var that = this;\n                Widget.fn.init.call(that, element, options);\n                element = that.element;\n                options = that.options;\n                options.format = kendo._extractFormat(options.format || kendo.getCulture(options.culture).calendars.standard.patterns.d);\n                options.min = kendo.parseDate(element.attr('min')) || kendo.parseDate(options.min);\n                options.max = kendo.parseDate(element.attr('max')) || kendo.parseDate(options.max);\n                var insidePicker = (element.parent().attr('class') || '').indexOf('k-picker-wrap') >= 0;\n                if (insidePicker) {\n                    that.wrapper = element.parent();\n                } else {\n                    that.wrapper = element.wrap('<span class=\\'k-widget k-dateinput\\'></span>').parent();\n                    that.wrapper.addClass(element[0].className);\n                    that.wrapper[0].style.cssText = element[0].style.cssText;\n                    element.css({\n                        width: '100%',\n                        height: element[0].style.height\n                    });\n                }\n                $('<span class=\\'k-icon k-i-warning\\'></span>').insertAfter(element);\n                that._form();\n                that.element.addClass(insidePicker ? ' ' : 'k-textbox').attr('autocomplete', 'off').on('focusout' + ns, function () {\n                    that._change();\n                });\n                try {\n                    element[0].setAttribute('type', 'text');\n                } catch (e) {\n                    element[0].type = 'text';\n                }\n                var disabled = element.is('[disabled]') || $(that.element).parents('fieldset').is(':disabled');\n                if (disabled) {\n                    that.enable(false);\n                } else {\n                    that.readonly(element.is('[readonly]'));\n                }\n                that.value(that.options.value || element.val());\n                kendo.notify(that);\n            },\n            options: {\n                name: 'DateInput',\n                culture: '',\n                value: '',\n                format: '',\n                min: new Date(1900, 0, 1),\n                max: new Date(2099, 11, 31),\n                messages: {\n                    'year': 'year',\n                    'month': 'month',\n                    'day': 'day',\n                    'weekday': 'day of the week',\n                    'hour': 'hours',\n                    'minute': 'minutes',\n                    'second': 'seconds',\n                    'dayperiod': 'AM/PM'\n                }\n            },\n            events: [CHANGE],\n            min: function (value) {\n                if (value !== undefined) {\n                    this.options.min = value;\n                } else {\n                    return this.options.min;\n                }\n            },\n            max: function (value) {\n                if (value !== undefined) {\n                    this.options.max = value;\n                } else {\n                    return this.options.max;\n                }\n            },\n            setOptions: function (options) {\n                var that = this;\n                Widget.fn.setOptions.call(that, options);\n                this._unbindInput();\n                this._bindInput();\n                this._updateElementValue();\n            },\n            destroy: function () {\n                var that = this;\n                that.element.off(ns);\n                if (that._formElement) {\n                    that._formElement.off('reset', that._resetHandler);\n                }\n                Widget.fn.destroy.call(that);\n            },\n            value: function (value) {\n                if (value === undefined) {\n                    return this._dateTime.getDateObject();\n                }\n                if (value === null) {\n                    value = '';\n                }\n                if (objectToString.call(value) !== '[object Date]') {\n                    value = kendo.parseDate(value, this.options.format, this.options.culture);\n                }\n                if (value && !value.getTime()) {\n                    value = null;\n                }\n                this._dateTime = new customDateTime(value, this.options.format, this.options.culture, this.options.messages);\n                this._updateElementValue();\n                this._oldValue = value;\n            },\n            _updateElementValue: function () {\n                var stringAndFromat = this._dateTime.toPair(this.options.format, this.options.culture, this.options.messages);\n                this.element.val(stringAndFromat[0]);\n                this._oldText = stringAndFromat[0];\n                this._format = stringAndFromat[1];\n            },\n            readonly: function (readonly) {\n                this._editable({\n                    readonly: readonly === undefined ? true : readonly,\n                    disable: false\n                });\n            },\n            enable: function (enable) {\n                this._editable({\n                    readonly: false,\n                    disable: !(enable = enable === undefined ? true : enable)\n                });\n            },\n            _bindInput: function () {\n                var that = this;\n                that.element.on('paste' + ns, proxy(that._paste, that)).on('keydown' + ns, proxy(that._keydown, that)).on(INPUT_EVENT_NAME, proxy(that._input, that)).on('mouseup' + ns, proxy(that._mouseUp, that)).on('DOMMouseScroll' + ns + ' mousewheel' + ns, proxy(that._scroll, that));\n            },\n            _unbindInput: function () {\n                this.element.off('keydown' + ns).off('paste' + ns).off(INPUT_EVENT_NAME).off('mouseup' + ns).off('DOMMouseScroll' + ns + ' mousewheel' + ns);\n            },\n            _editable: function (options) {\n                var that = this;\n                var element = that.element;\n                var disable = options.disable;\n                var readonly = options.readonly;\n                var wrapper = that.wrapper;\n                that._unbindInput();\n                if (!readonly && !disable) {\n                    wrapper.addClass(STATEDEFAULT).removeClass(STATEDISABLED);\n                    element.removeAttr(DISABLED).removeAttr(READONLY);\n                    that._bindInput();\n                } else {\n                    wrapper.addClass(STATEDISABLED).removeClass(STATEDEFAULT);\n                    element.attr(DISABLED, disable).attr(READONLY, readonly);\n                }\n            },\n            _change: function () {\n                var that = this;\n                var oldValue = that._oldValue;\n                var value = that.value();\n                if (value && that.min() && value < that.min()) {\n                    that.value(that.min());\n                    value = that.value();\n                }\n                if (value && that.max() && value > that.max()) {\n                    that.value(that.max());\n                    value = that.value();\n                }\n                if (oldValue && value && value.getTime() !== oldValue.getTime() || oldValue && !value || !oldValue && value) {\n                    that._oldValue = value;\n                    that.trigger(CHANGE);\n                    that.element.trigger(CHANGE);\n                }\n            },\n            _input: function () {\n                var that = this;\n                var element = that.element[0];\n                var blinkInvalid = false;\n                if (kendo._activeElement() !== element) {\n                    return;\n                }\n                var diff = approximateStringMatching(this._oldText, this._format, this.element[0].value, caret(this.element[0])[0]);\n                var navigationOnly = diff.length === 1 && diff[0][1] === ' ';\n                if (!navigationOnly) {\n                    for (var i = 0; i < diff.length; i++) {\n                        var valid = this._dateTime.parsePart(diff[i][0], diff[i][1]);\n                        blinkInvalid = blinkInvalid || !valid;\n                    }\n                }\n                this._updateElementValue();\n                if (diff.length && diff[0][0] !== ' ') {\n                    this._selectSegment(diff[0][0]);\n                    if (!navigationOnly) {\n                        var difSym = diff[0][0];\n                        setTimeout(function () {\n                            that._selectSegment(difSym);\n                        });\n                    }\n                }\n                if (navigationOnly) {\n                    var newEvent = {\n                        keyCode: 39,\n                        preventDefault: function () {\n                        }\n                    };\n                    this._keydown(newEvent);\n                }\n                if (blinkInvalid) {\n                    clearTimeout(that._blinkInvalidTimeout);\n                    var stateInvalid = STATEINVALID;\n                    that.wrapper.addClass(STATEINVALID);\n                    that._blinkInvalidTimeout = setTimeout(function () {\n                        that.wrapper.removeClass(stateInvalid);\n                    }, 100);\n                }\n            },\n            _mouseUp: function () {\n                var selection = caret(this.element[0]);\n                if (selection[0] === selection[1]) {\n                    this._selectNearestSegment();\n                }\n            },\n            _scroll: function (e) {\n                if (kendo._activeElement() !== this.element[0] || this.element.is('[readonly]')) {\n                    return;\n                }\n                e = window.event || e;\n                var newEvent = {\n                    keyCode: 37,\n                    preventDefault: function () {\n                    }\n                };\n                if (e.shiftKey) {\n                    newEvent.keyCode = (e.wheelDelta || -e.detail) > 0 ? 37 : 39;\n                } else {\n                    newEvent.keyCode = (e.wheelDelta || -e.detail) > 0 ? 38 : 40;\n                }\n                this._keydown(newEvent);\n                e.returnValue = false;\n                if (e.preventDefault) {\n                    e.preventDefault();\n                }\n                if (e.stopPropagation) {\n                    e.stopPropagation();\n                }\n            },\n            _form: function () {\n                var that = this;\n                var element = that.element;\n                var formId = element.attr('form');\n                var form = formId ? $('#' + formId) : element.closest('form');\n                if (form[0]) {\n                    that._resetHandler = function () {\n                        setTimeout(function () {\n                            that.value(element[0].value);\n                        });\n                    };\n                    that._formElement = form.on('reset', that._resetHandler);\n                }\n            },\n            _paste: function (e) {\n                e.preventDefault();\n            },\n            _keydown: function (e) {\n                var key = e.keyCode;\n                var selection;\n                if (key == 37 || key == 39) {\n                    e.preventDefault();\n                    selection = caret(this.element[0]);\n                    if (selection[0] != selection[1]) {\n                        this._selectNearestSegment();\n                    }\n                    var dir = key == 37 ? -1 : 1;\n                    var index = dir == -1 ? caret(this.element[0])[0] - 1 : caret(this.element[0])[1] + 1;\n                    while (index >= 0 && index < this._format.length) {\n                        if (knownSymbols.indexOf(this._format[index]) >= 0) {\n                            this._selectSegment(this._format[index]);\n                            break;\n                        }\n                        index += dir;\n                    }\n                }\n                if (key == 38 || key == 40) {\n                    e.preventDefault();\n                    selection = caret(this.element[0]);\n                    var symbol = this._format[selection[0]];\n                    if (knownSymbols.indexOf(symbol) >= 0) {\n                        this._dateTime.modifyPart(symbol, key == 38 ? 1 : -1);\n                        this._updateElementValue();\n                        this._selectSegment(symbol);\n                    }\n                }\n                if (kendo.support.browser.msie && kendo.support.browser.version < 10) {\n                    var keycode = e.keyCode ? e.keyCode : e.which;\n                    if (keycode === 8 || keycode === 46) {\n                        var that = this;\n                        setTimeout(function () {\n                            that._input();\n                        }, 0);\n                    }\n                }\n                if (key === keys.ENTER) {\n                    this._change();\n                }\n            },\n            _selectNearestSegment: function () {\n                var selection = caret(this.element[0]);\n                var start = selection[0];\n                for (var i = start, j = start - 1; i < this._format.length || j >= 0; i++, j--) {\n                    if (i < this._format.length && knownSymbols.indexOf(this._format[i]) !== -1) {\n                        this._selectSegment(this._format[i]);\n                        return;\n                    }\n                    if (j >= 0 && knownSymbols.indexOf(this._format[j]) !== -1) {\n                        this._selectSegment(this._format[j]);\n                        return;\n                    }\n                }\n            },\n            _selectSegment: function (symbol) {\n                var begin = -1, end = 0;\n                for (var i = 0; i < this._format.length; i++) {\n                    if (this._format[i] === symbol) {\n                        end = i + 1;\n                        if (begin === -1) {\n                            begin = i;\n                        }\n                    }\n                }\n                if (begin < 0) {\n                    begin = 0;\n                }\n                caret(this.element, begin, end);\n            }\n        });\n        ui.plugin(DateInput);\n        var customDateTime = function (initDate, initFormat, initCulture, initMessages) {\n            var value = null;\n            var year = true, month = true, date = true, hours = true, minutes = true, seconds = true, milliseconds = true;\n            var typedMonthPart = '';\n            var typedDayPeriodPart = '';\n            var placeholders = {};\n            var zeros = [\n                '',\n                '0',\n                '00',\n                '000',\n                '0000'\n            ];\n            function pad(number, digits, end) {\n                number = number + '';\n                digits = digits || 2;\n                end = digits - number.length;\n                if (end) {\n                    return zeros[digits].substring(0, end) + number;\n                }\n                return number;\n            }\n            var dateFormatRegExp = /dddd|ddd|dd|d|MMMM|MMM|MM|M|yyyy|yy|HH|H|hh|h|mm|m|fff|ff|f|tt|ss|s|zzz|zz|z|\"[^\"]*\"|'[^']*'/g;\n            var months = null, calendar = null, days = null, returnsFormat = false;\n            var matcher = function (match) {\n                var mins, sign;\n                var result;\n                switch (match) {\n                case 'd':\n                    result = date ? value.getDate() : placeholders.day;\n                    break;\n                case 'dd':\n                    result = date ? pad(value.getDate()) : placeholders.day;\n                    break;\n                case 'ddd':\n                    result = date && month && year ? days.namesAbbr[value.getDay()] : placeholders.weekday;\n                    break;\n                case 'dddd':\n                    result = date && month && year ? days.names[value.getDay()] : placeholders.weekday;\n                    break;\n                case 'M':\n                    result = month ? value.getMonth() + 1 : placeholders.month;\n                    break;\n                case 'MM':\n                    result = month ? pad(value.getMonth() + 1) : placeholders.month;\n                    break;\n                case 'MMM':\n                    result = month ? months.namesAbbr[value.getMonth()] : placeholders.month;\n                    break;\n                case 'MMMM':\n                    result = month ? months.names[value.getMonth()] : placeholders.month;\n                    break;\n                case 'yy':\n                    result = year ? pad(value.getFullYear() % 100) : placeholders.year;\n                    break;\n                case 'yyyy':\n                    result = year ? pad(value.getFullYear(), 4) : placeholders.year;\n                    break;\n                case 'h':\n                    result = hours ? value.getHours() % 12 || 12 : placeholders.hour;\n                    break;\n                case 'hh':\n                    result = hours ? pad(value.getHours() % 12 || 12) : placeholders.hour;\n                    break;\n                case 'H':\n                    result = hours ? value.getHours() : placeholders.hour;\n                    break;\n                case 'HH':\n                    result = hours ? pad(value.getHours()) : placeholders.hour;\n                    break;\n                case 'm':\n                    result = minutes ? value.getMinutes() : placeholders.minute;\n                    break;\n                case 'mm':\n                    result = minutes ? pad(value.getMinutes()) : placeholders.minute;\n                    break;\n                case 's':\n                    result = seconds ? value.getSeconds() : placeholders.second;\n                    break;\n                case 'ss':\n                    result = seconds ? pad(value.getSeconds()) : placeholders.second;\n                    break;\n                case 'f':\n                    result = milliseconds ? Math.floor(value.getMilliseconds() / 100) : milliseconds;\n                    break;\n                case 'ff':\n                    result = value.getMilliseconds();\n                    if (result > 99) {\n                        result = Math.floor(result / 10);\n                    }\n                    result = milliseconds ? pad(result) : match;\n                    break;\n                case 'fff':\n                    result = milliseconds ? pad(value.getMilliseconds(), 3) : match;\n                    break;\n                case 'tt':\n                    result = hours ? value.getHours() < 12 ? calendar.AM[0] : calendar.PM[0] : placeholders.dayperiod;\n                    break;\n                case 'zzz':\n                    mins = value.getTimezoneOffset();\n                    sign = mins < 0;\n                    result = Math.abs(mins / 60).toString().split('.')[0];\n                    mins = Math.abs(mins) - result * 60;\n                    result = (sign ? '+' : '-') + pad(result);\n                    result += ':' + pad(mins);\n                    break;\n                case 'z':\n                case 'zz':\n                    result = value.getTimezoneOffset() / 60;\n                    sign = result < 0;\n                    result = Math.abs(result).toString().split('.')[0];\n                    result = (sign ? '+' : '-') + (match === 'zz' ? pad(result) : result);\n                    break;\n                }\n                result = result !== undefined ? result : match.slice(1, match.length - 1);\n                if (returnsFormat) {\n                    result = '' + result;\n                    var formatResult = '';\n                    if (match == 'ddd') {\n                        match = 'EEE';\n                    }\n                    if (match == 'dddd') {\n                        match = 'EEEE';\n                    }\n                    for (var i = 0; i < result.length; i++) {\n                        formatResult += match[0];\n                    }\n                    return formatResult;\n                } else {\n                    return result;\n                }\n            };\n            function generateMatcher(retFormat) {\n                returnsFormat = retFormat;\n                return matcher;\n            }\n            function setExisting(symbol, val) {\n                switch (symbol) {\n                case 'y':\n                    year = val;\n                    break;\n                case 'M':\n                    month = val;\n                    if (!val) {\n                        value.setMonth(0);\n                        typedMonthPart = '';\n                    }\n                    break;\n                case 'd':\n                    date = val;\n                    break;\n                case 'H':\n                case 'h':\n                    hours = val;\n                    if (!val) {\n                        typedDayPeriodPart = '';\n                    }\n                    break;\n                case 'm':\n                    minutes = val;\n                    break;\n                case 's':\n                    seconds = val;\n                    break;\n                default:\n                    return;\n                }\n            }\n            this.setValue = function (val) {\n                date = val;\n            };\n            this.getValue = function () {\n                return date;\n            };\n            this.modifyPart = function (symbol, offset) {\n                var newValue = new Date(value && value.getTime ? value.getTime() : value);\n                switch (symbol) {\n                case 'y':\n                    newValue.setFullYear(newValue.getFullYear() + offset);\n                    break;\n                case 'M':\n                    var newMonth = newValue.getMonth() + offset;\n                    newValue.setMonth(newMonth);\n                    if (newValue.getMonth() % 12 !== (newMonth + 12) % 12) {\n                        newValue.setDate(1);\n                        newValue.setMonth(newMonth);\n                    }\n                    break;\n                case 'd':\n                case 'E':\n                    newValue.setDate(newValue.getDate() + offset);\n                    break;\n                case 'H':\n                case 'h':\n                    newValue.setHours(newValue.getHours() + offset);\n                    break;\n                case 'm':\n                    newValue.setMinutes(newValue.getMinutes() + offset);\n                    break;\n                case 's':\n                    newValue.setSeconds(newValue.getSeconds() + offset);\n                    break;\n                case 't':\n                    newValue.setHours((newValue.getHours() + 12) % 24);\n                    break;\n                default:\n                    break;\n                }\n                if (newValue.getFullYear() > 0) {\n                    setExisting(symbol, true);\n                    value = newValue;\n                }\n            };\n            this.parsePart = function (symbol, currentChar) {\n                if (!currentChar) {\n                    setExisting(symbol, false);\n                    return true;\n                }\n                var newValue = new Date(value && value.getTime ? value.getTime() : value);\n                var newHours;\n                switch (symbol) {\n                case 'd':\n                    var newDate = (date ? newValue.getDate() * 10 : 0) + parseInt(currentChar, 10);\n                    if (isNaN(newDate)) {\n                        return;\n                    }\n                    while (newDate > 31) {\n                        newDate = parseInt(newDate.toString().slice(1), 10);\n                    }\n                    if (newDate < 1) {\n                        date = false;\n                    } else {\n                        newValue.setDate(newDate);\n                        if (newValue.getMonth() !== value.getMonth()) {\n                            return;\n                        }\n                        date = true;\n                    }\n                    break;\n                case 'M':\n                    var newMonth = (month ? (newValue.getMonth() + 1) * 10 : 0) + parseInt(currentChar, 10);\n                    if (!isNaN(newMonth)) {\n                        while (newMonth > 12) {\n                            newMonth = parseInt(newMonth.toString().slice(1), 10);\n                        }\n                        if (newMonth < 1) {\n                            month = false;\n                        } else {\n                            newValue.setMonth(newMonth - 1);\n                            if (newValue.getMonth() !== newMonth - 1) {\n                                newValue.setDate(1);\n                                newValue.setMonth(newMonth - 1);\n                            }\n                            month = true;\n                        }\n                    } else {\n                        var monthNames = calendar.months.names;\n                        typedMonthPart += currentChar.toLowerCase();\n                        while (typedMonthPart.length > 0) {\n                            for (var i = 0; i < monthNames.length; i++) {\n                                if (monthNames[i].toLowerCase().indexOf(typedMonthPart) === 0) {\n                                    newValue.setMonth(i);\n                                    month = true;\n                                    value = newValue;\n                                    return true;\n                                }\n                            }\n                            typedMonthPart = typedMonthPart.substring(1, typedMonthPart.length);\n                        }\n                        return false;\n                    }\n                    break;\n                case 'y':\n                    var newYear = (year ? newValue.getFullYear() * 10 : 0) + parseInt(currentChar, 10);\n                    if (isNaN(newYear)) {\n                        return;\n                    }\n                    while (newYear > 9999) {\n                        newYear = parseInt(newYear.toString().slice(1), 10);\n                    }\n                    if (newYear < 1) {\n                        year = false;\n                    } else {\n                        newValue.setFullYear(newYear);\n                        year = true;\n                    }\n                    break;\n                case 'h':\n                    newHours = (hours ? (newValue.getHours() % 12 || 12) * 10 : 0) + parseInt(currentChar, 10);\n                    if (isNaN(newHours)) {\n                        return;\n                    }\n                    while (newHours > 12) {\n                        newHours = parseInt(newHours.toString().slice(1), 10);\n                    }\n                    newValue.setHours(Math.floor(newValue.getHours() / 12) * 12 + newHours % 12);\n                    hours = true;\n                    break;\n                case 'H':\n                    newHours = (hours ? newValue.getHours() * 10 : 0) + parseInt(currentChar, 10);\n                    if (isNaN(newHours)) {\n                        return;\n                    }\n                    while (newHours > 23) {\n                        newHours = parseInt(newHours.toString().slice(1), 10);\n                    }\n                    newValue.setHours(newHours);\n                    hours = true;\n                    break;\n                case 'm':\n                    var newMinutes = (minutes ? newValue.getMinutes() * 10 : 0) + parseInt(currentChar, 10);\n                    if (isNaN(newMinutes)) {\n                        return;\n                    }\n                    while (newMinutes > 59) {\n                        newMinutes = parseInt(newMinutes.toString().slice(1), 10);\n                    }\n                    newValue.setMinutes(newMinutes);\n                    minutes = true;\n                    break;\n                case 's':\n                    var newSeconds = (seconds ? newValue.getSeconds() * 10 : 0) + parseInt(currentChar, 10);\n                    if (isNaN(newSeconds)) {\n                        return;\n                    }\n                    while (newSeconds > 59) {\n                        newSeconds = parseInt(newSeconds.toString().slice(1), 10);\n                    }\n                    newValue.setSeconds(newSeconds);\n                    seconds = true;\n                    break;\n                case 't':\n                    if (hours) {\n                        typedDayPeriodPart += currentChar.toLowerCase();\n                        while (typedDayPeriodPart.length > 0) {\n                            if (calendar.AM[0].toLowerCase().indexOf(typedDayPeriodPart) === 0 && newValue.getHours() >= 12 || calendar.PM[0].toLowerCase().indexOf(typedDayPeriodPart) === 0 && newValue.getHours() < 12) {\n                                newValue.setHours((newValue.getHours() + 12) % 24);\n                                value = newValue;\n                                return true;\n                            }\n                            typedDayPeriodPart = typedDayPeriodPart.substring(1, typedDayPeriodPart.length);\n                        }\n                        return false;\n                    }\n                    break;\n                default:\n                    break;\n                }\n                value = newValue;\n                return true;\n            };\n            this.toPair = function (format, culture, messages) {\n                if (!format) {\n                    return [\n                        '',\n                        ''\n                    ];\n                }\n                culture = kendo.getCulture(culture);\n                calendar = culture.calendars.standard;\n                format = calendar.patterns[format] || format;\n                days = calendar.days;\n                months = calendar.months;\n                placeholders = messages;\n                return [\n                    format.replace(dateFormatRegExp, generateMatcher(false)),\n                    format.replace(dateFormatRegExp, generateMatcher(true))\n                ];\n            };\n            this.getDateObject = function () {\n                return year && month && date && hours && minutes && seconds && milliseconds ? new Date(value.getTime()) : null;\n            };\n            if (!initDate) {\n                value = new Date();\n                var sampleFormat = this.toPair(initFormat, initCulture, initMessages)[1];\n                for (var i = 0; i < sampleFormat.length; i++) {\n                    setExisting(sampleFormat[i], false);\n                }\n            } else {\n                value = new Date(initDate.getTime());\n            }\n        };\n        function approximateStringMatching(oldText, oldFormat, newText, caret) {\n            var oldTextSeparator = oldText[caret + oldText.length - newText.length];\n            oldText = oldText.substring(0, caret + oldText.length - newText.length);\n            newText = newText.substring(0, caret);\n            var diff = [];\n            var i;\n            if (oldText === newText && caret > 0) {\n                diff.push([\n                    oldFormat[caret - 1],\n                    newText[caret - 1]\n                ]);\n                return diff;\n            }\n            if (oldText.indexOf(newText) === 0 && (newText.length === 0 || oldFormat[newText.length - 1] !== oldFormat[newText.length])) {\n                var deletedSymbol = '';\n                for (i = newText.length; i < oldText.length; i++) {\n                    if (oldFormat[i] !== deletedSymbol && knownSymbols.indexOf(oldFormat[i]) >= 0) {\n                        deletedSymbol = oldFormat[i];\n                        diff.push([\n                            deletedSymbol,\n                            ''\n                        ]);\n                    }\n                }\n                return diff;\n            }\n            if (newText[newText.length - 1] === ' ' || newText[newText.length - 1] === oldTextSeparator) {\n                return [[\n                        oldFormat[caret - 1],\n                        ' '\n                    ]];\n            }\n            if (newText.indexOf(oldText) === 0 || knownSymbols.indexOf(oldFormat[caret - 1]) === -1) {\n                var symbol = oldFormat[0];\n                for (i = Math.max(0, oldText.length - 1); i < oldFormat.length; i++) {\n                    if (knownSymbols.indexOf(oldFormat[i]) >= 0) {\n                        symbol = oldFormat[i];\n                        break;\n                    }\n                }\n                return [[\n                        symbol,\n                        newText[caret - 1]\n                    ]];\n            }\n            return [[\n                    oldFormat[caret - 1],\n                    newText[caret - 1]\n                ]];\n        }\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.autocomplete', [\n        'kendo.list',\n        'kendo.mobile.scroller'\n    ], f);\n}(function () {\n    var __meta__ = {\n        id: 'autocomplete',\n        name: 'AutoComplete',\n        category: 'web',\n        description: 'The AutoComplete widget provides suggestions depending on the typed text.It also allows multiple value entries.',\n        depends: ['list'],\n        features: [\n            {\n                id: 'mobile-scroller',\n                name: 'Mobile scroller',\n                description: 'Support for kinetic scrolling in mobile device',\n                depends: ['mobile.scroller']\n            },\n            {\n                id: 'virtualization',\n                name: 'VirtualList',\n                description: 'Support for virtualization',\n                depends: ['virtuallist']\n            }\n        ]\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, support = kendo.support, caret = kendo.caret, activeElement = kendo._activeElement, placeholderSupported = support.placeholder, ui = kendo.ui, List = ui.List, keys = kendo.keys, DataSource = kendo.data.DataSource, ARIA_DISABLED = 'aria-disabled', ARIA_READONLY = 'aria-readonly', CHANGE = 'change', DEFAULT = 'k-state-default', DISABLED = 'disabled', READONLY = 'readonly', FOCUSED = 'k-state-focused', SELECTED = 'k-state-selected', STATEDISABLED = 'k-state-disabled', HOVER = 'k-state-hover', ns = '.kendoAutoComplete', HOVEREVENTS = 'mouseenter' + ns + ' mouseleave' + ns, proxy = $.proxy;\n        function indexOfWordAtCaret(caretIdx, text, separator) {\n            return separator ? text.substring(0, caretIdx).split(separator).length - 1 : 0;\n        }\n        function wordAtCaret(caretIdx, text, separator) {\n            return text.split(separator)[indexOfWordAtCaret(caretIdx, text, separator)];\n        }\n        function replaceWordAtCaret(caretIdx, text, word, separator, defaultSeparator) {\n            var words = text.split(separator);\n            words.splice(indexOfWordAtCaret(caretIdx, text, separator), 1, word);\n            if (separator && words[words.length - 1] !== '') {\n                words.push('');\n            }\n            return words.join(defaultSeparator);\n        }\n        var AutoComplete = List.extend({\n            init: function (element, options) {\n                var that = this, wrapper, disabled;\n                that.ns = ns;\n                options = $.isArray(options) ? { dataSource: options } : options;\n                List.fn.init.call(that, element, options);\n                element = that.element;\n                options = that.options;\n                options.placeholder = options.placeholder || element.attr('placeholder');\n                if (placeholderSupported) {\n                    element.attr('placeholder', options.placeholder);\n                }\n                that._wrapper();\n                that._loader();\n                that._clearButton();\n                that._dataSource();\n                that._ignoreCase();\n                element[0].type = 'text';\n                wrapper = that.wrapper;\n                that._popup();\n                element.addClass('k-input').on('keydown' + ns, proxy(that._keydown, that)).on('keypress' + ns, proxy(that._keypress, that)).on('paste' + ns, proxy(that._search, that)).on('focus' + ns, function () {\n                    that._prev = that._accessor();\n                    that._oldText = that._prev;\n                    that._placeholder(false);\n                    wrapper.addClass(FOCUSED);\n                }).on('focusout' + ns, function () {\n                    that._change();\n                    that._placeholder();\n                    wrapper.removeClass(FOCUSED);\n                }).attr({\n                    autocomplete: 'off',\n                    role: 'textbox',\n                    'aria-haspopup': true\n                });\n                that._clear.on('click' + ns, proxy(that._clearValue, that));\n                that._enable();\n                that._old = that._accessor();\n                if (element[0].id) {\n                    element.attr('aria-owns', that.ul[0].id);\n                }\n                that._aria();\n                that._placeholder();\n                that._initList();\n                disabled = $(that.element).parents('fieldset').is(':disabled');\n                if (disabled) {\n                    that.enable(false);\n                }\n                that.listView.bind('click', function (e) {\n                    e.preventDefault();\n                });\n                that._resetFocusItemHandler = $.proxy(that._resetFocusItem, that);\n                kendo.notify(that);\n                that._toggleCloseVisibility();\n            },\n            options: {\n                name: 'AutoComplete',\n                enabled: true,\n                suggest: false,\n                template: '',\n                groupTemplate: '#:data#',\n                fixedGroupTemplate: '#:data#',\n                dataTextField: '',\n                minLength: 1,\n                enforceMinLength: false,\n                delay: 200,\n                height: 200,\n                filter: 'startswith',\n                ignoreCase: true,\n                highlightFirst: false,\n                separator: null,\n                placeholder: '',\n                animation: {},\n                virtual: false,\n                value: null,\n                clearButton: true\n            },\n            _dataSource: function () {\n                var that = this;\n                if (that.dataSource && that._refreshHandler) {\n                    that._unbindDataSource();\n                } else {\n                    that._progressHandler = proxy(that._showBusy, that);\n                    that._errorHandler = proxy(that._hideBusy, that);\n                }\n                that.dataSource = DataSource.create(that.options.dataSource).bind('progress', that._progressHandler).bind('error', that._errorHandler);\n            },\n            setDataSource: function (dataSource) {\n                this.options.dataSource = dataSource;\n                this._dataSource();\n                this.listView.setDataSource(this.dataSource);\n            },\n            events: [\n                'open',\n                'close',\n                CHANGE,\n                'select',\n                'filtering',\n                'dataBinding',\n                'dataBound'\n            ],\n            setOptions: function (options) {\n                var listOptions = this._listOptions(options);\n                List.fn.setOptions.call(this, options);\n                this.listView.setOptions(listOptions);\n                this._accessors();\n                this._aria();\n            },\n            _listOptions: function (options) {\n                var listOptions = List.fn._listOptions.call(this, $.extend(options, { skipUpdateOnBind: true }));\n                listOptions.dataValueField = listOptions.dataTextField;\n                listOptions.selectedItemChange = null;\n                return listOptions;\n            },\n            _editable: function (options) {\n                var that = this, element = that.element, wrapper = that.wrapper.off(ns), readonly = options.readonly, disable = options.disable;\n                if (!readonly && !disable) {\n                    wrapper.addClass(DEFAULT).removeClass(STATEDISABLED).on(HOVEREVENTS, that._toggleHover);\n                    element.removeAttr(DISABLED).removeAttr(READONLY).attr(ARIA_DISABLED, false).attr(ARIA_READONLY, false);\n                } else {\n                    wrapper.addClass(disable ? STATEDISABLED : DEFAULT).removeClass(disable ? DEFAULT : STATEDISABLED);\n                    element.attr(DISABLED, disable).attr(READONLY, readonly).attr(ARIA_DISABLED, disable).attr(ARIA_READONLY, readonly);\n                }\n            },\n            close: function () {\n                var that = this;\n                var current = that.listView.focus();\n                if (current) {\n                    current.removeClass(SELECTED);\n                }\n                that.popup.close();\n            },\n            destroy: function () {\n                var that = this;\n                that.element.off(ns);\n                that._clear.off(ns);\n                that.wrapper.off(ns);\n                List.fn.destroy.call(that);\n            },\n            refresh: function () {\n                this.listView.refresh();\n            },\n            select: function (li) {\n                this._select(li);\n            },\n            search: function (word) {\n                var that = this, options = that.options, ignoreCase = options.ignoreCase, separator = that._separator(), length;\n                word = word || that._accessor();\n                clearTimeout(that._typingTimeout);\n                if (separator) {\n                    word = wordAtCaret(caret(that.element)[0], word, separator);\n                }\n                length = word.length;\n                if (!options.enforceMinLength && !length || length >= options.minLength) {\n                    that._open = true;\n                    that._mute(function () {\n                        this.listView.value([]);\n                    });\n                    that._filterSource({\n                        value: ignoreCase ? word.toLowerCase() : word,\n                        operator: options.filter,\n                        field: options.dataTextField,\n                        ignoreCase: ignoreCase\n                    });\n                    that.one('close', $.proxy(that._unifySeparators, that));\n                }\n                that._toggleCloseVisibility();\n            },\n            suggest: function (word) {\n                var that = this, key = that._last, value = that._accessor(), element = that.element[0], caretIdx = caret(element)[0], separator = that._separator(), words = value.split(separator), wordIndex = indexOfWordAtCaret(caretIdx, value, separator), selectionEnd = caretIdx, idx;\n                if (key == keys.BACKSPACE || key == keys.DELETE) {\n                    that._last = undefined;\n                    return;\n                }\n                word = word || '';\n                if (typeof word !== 'string') {\n                    if (word[0]) {\n                        word = that.dataSource.view()[List.inArray(word[0], that.ul[0])];\n                    }\n                    word = word ? that._text(word) : '';\n                }\n                if (caretIdx <= 0) {\n                    caretIdx = value.toLowerCase().indexOf(word.toLowerCase()) + 1;\n                }\n                idx = value.substring(0, caretIdx).lastIndexOf(separator);\n                idx = idx > -1 ? caretIdx - (idx + separator.length) : caretIdx;\n                value = words[wordIndex].substring(0, idx);\n                if (word) {\n                    word = word.toString();\n                    idx = word.toLowerCase().indexOf(value.toLowerCase());\n                    if (idx > -1) {\n                        word = word.substring(idx + value.length);\n                        selectionEnd = caretIdx + word.length;\n                        value += word;\n                    }\n                    if (separator && words[words.length - 1] !== '') {\n                        words.push('');\n                    }\n                }\n                words[wordIndex] = value;\n                that._accessor(words.join(separator || ''));\n                if (element === activeElement()) {\n                    caret(element, caretIdx, selectionEnd);\n                }\n            },\n            value: function (value) {\n                if (value !== undefined) {\n                    this.listView.value(value);\n                    this._accessor(value);\n                    this._old = this._accessor();\n                    this._oldText = this._accessor();\n                } else {\n                    return this._accessor();\n                }\n            },\n            _click: function (e) {\n                var item = e.item;\n                var that = this;\n                var element = that.element;\n                var dataItem = that.listView.dataItemByIndex(that.listView.getElementIndex(item));\n                e.preventDefault();\n                that._active = true;\n                if (that.trigger('select', {\n                        dataItem: dataItem,\n                        item: item\n                    })) {\n                    that.close();\n                    return;\n                }\n                that._oldText = element.val();\n                that._select(item).done(function () {\n                    that._blur();\n                    caret(element, element.val().length);\n                });\n            },\n            _clearText: $.noop,\n            _resetFocusItem: function () {\n                var index = this.options.highlightFirst ? 0 : -1;\n                if (this.options.virtual) {\n                    this.listView.scrollTo(0);\n                }\n                this.listView.focus(index);\n            },\n            _listBound: function () {\n                var that = this;\n                var popup = that.popup;\n                var options = that.options;\n                var data = that.dataSource.flatView();\n                var length = data.length;\n                var groupsLength = that.dataSource._group.length;\n                var isActive = that.element[0] === activeElement();\n                var action;\n                that._renderFooter();\n                that._renderNoData();\n                that._toggleNoData(!length);\n                that._toggleHeader(!!groupsLength && !!length);\n                that._resizePopup();\n                popup.position();\n                if (length) {\n                    if (options.suggest && isActive) {\n                        that.suggest(data[0]);\n                    }\n                }\n                if (that._open) {\n                    that._open = false;\n                    action = that._allowOpening() ? 'open' : 'close';\n                    if (that._typingTimeout && !isActive) {\n                        action = 'close';\n                    }\n                    if (length) {\n                        that._resetFocusItem();\n                        if (options.virtual) {\n                            that.popup.unbind('activate', that._resetFocusItemHandler).one('activate', that._resetFocusItemHandler);\n                        }\n                    }\n                    popup[action]();\n                    that._typingTimeout = undefined;\n                }\n                if (that._touchScroller) {\n                    that._touchScroller.reset();\n                }\n                that._hideBusy();\n                that._makeUnselectable();\n                that.trigger('dataBound');\n            },\n            _mute: function (callback) {\n                this._muted = true;\n                callback.call(this);\n                this._muted = false;\n            },\n            _listChange: function () {\n                var isActive = this._active || this.element[0] === activeElement();\n                if (isActive && !this._muted) {\n                    this._selectValue(this.listView.selectedDataItems()[0]);\n                }\n            },\n            _selectValue: function (dataItem) {\n                var separator = this._separator();\n                var text = '';\n                if (dataItem) {\n                    text = this._text(dataItem);\n                }\n                if (text === null) {\n                    text = '';\n                }\n                if (separator) {\n                    text = replaceWordAtCaret(caret(this.element)[0], this._accessor(), text, separator, this._defaultSeparator());\n                }\n                this._prev = text;\n                this._accessor(text);\n                this._placeholder();\n            },\n            _unifySeparators: function () {\n                this._accessor(this.value().split(this._separator()).join(this._defaultSeparator()));\n                return this;\n            },\n            _change: function () {\n                var that = this;\n                var value = that._unifySeparators().value();\n                var trigger = value !== List.unifyType(that._old, typeof value);\n                var valueUpdated = trigger && !that._typing;\n                var itemSelected = that._oldText !== value;\n                that._old = value;\n                that._oldText = value;\n                if (valueUpdated || itemSelected) {\n                    that.element.trigger(CHANGE);\n                }\n                if (trigger) {\n                    that.trigger(CHANGE);\n                }\n                that.typing = false;\n                that._toggleCloseVisibility();\n            },\n            _accessor: function (value) {\n                var that = this, element = that.element[0];\n                if (value !== undefined) {\n                    element.value = value === null ? '' : value;\n                    that._placeholder();\n                } else {\n                    value = element.value;\n                    if (element.className.indexOf('k-readonly') > -1) {\n                        if (value === that.options.placeholder) {\n                            return '';\n                        } else {\n                            return value;\n                        }\n                    }\n                    return value;\n                }\n            },\n            _keydown: function (e) {\n                var that = this;\n                var key = e.keyCode;\n                var listView = that.listView;\n                var visible = that.popup.visible();\n                var current = listView.focus();\n                that._last = key;\n                if (key === keys.DOWN) {\n                    if (visible) {\n                        this._move(current ? 'focusNext' : 'focusFirst');\n                    }\n                    e.preventDefault();\n                } else if (key === keys.UP) {\n                    if (visible) {\n                        this._move(current ? 'focusPrev' : 'focusLast');\n                    }\n                    e.preventDefault();\n                } else if (key === keys.ENTER || key === keys.TAB) {\n                    if (key === keys.ENTER && visible) {\n                        e.preventDefault();\n                    }\n                    if (visible && current) {\n                        var dataItem = listView.dataItemByIndex(listView.getElementIndex(current));\n                        if (that.trigger('select', {\n                                dataItem: dataItem,\n                                item: current\n                            })) {\n                            return;\n                        }\n                        this._select(current);\n                    }\n                    this._blur();\n                } else if (key === keys.ESC) {\n                    if (visible) {\n                        e.preventDefault();\n                    }\n                    that.close();\n                } else if (that.popup.visible() && (key === keys.PAGEDOWN || key === keys.PAGEUP)) {\n                    e.preventDefault();\n                    var direction = key === keys.PAGEDOWN ? 1 : -1;\n                    listView.scrollWith(direction * listView.screenHeight());\n                } else {\n                    that._search();\n                }\n            },\n            _keypress: function () {\n                this._oldText = this.element.val();\n                this._typing = true;\n            },\n            _move: function (action) {\n                this.listView[action]();\n                if (this.options.suggest) {\n                    this.suggest(this.listView.focus());\n                }\n            },\n            _hideBusy: function () {\n                var that = this;\n                clearTimeout(that._busy);\n                that._loading.hide();\n                that.element.attr('aria-busy', false);\n                that._busy = null;\n                that._showClear();\n            },\n            _showBusy: function () {\n                var that = this;\n                if (that._busy) {\n                    return;\n                }\n                that._busy = setTimeout(function () {\n                    that.element.attr('aria-busy', true);\n                    that._loading.show();\n                    that._hideClear();\n                }, 100);\n            },\n            _placeholder: function (show) {\n                if (placeholderSupported) {\n                    return;\n                }\n                var that = this, element = that.element, placeholder = that.options.placeholder, value;\n                if (placeholder) {\n                    value = element.val();\n                    if (show === undefined) {\n                        show = !value;\n                    }\n                    if (!show) {\n                        if (value !== placeholder) {\n                            placeholder = value;\n                        } else {\n                            placeholder = '';\n                        }\n                    }\n                    if (value === that._old && !show) {\n                        return;\n                    }\n                    element.toggleClass('k-readonly', show).val(placeholder);\n                    if (!placeholder && element[0] === document.activeElement) {\n                        caret(element[0], 0, 0);\n                    }\n                }\n            },\n            _separator: function () {\n                var separator = this.options.separator;\n                if (separator instanceof Array) {\n                    return new RegExp(separator.join('|'), 'gi');\n                }\n                return separator;\n            },\n            _defaultSeparator: function () {\n                var separator = this.options.separator;\n                if (separator instanceof Array) {\n                    return separator[0];\n                }\n                return separator;\n            },\n            _inputValue: function () {\n                return this.element.val();\n            },\n            _search: function () {\n                var that = this;\n                clearTimeout(that._typingTimeout);\n                that._typingTimeout = setTimeout(function () {\n                    if (that._prev !== that._accessor()) {\n                        that._prev = that._accessor();\n                        that.search();\n                    }\n                }, that.options.delay);\n            },\n            _select: function (candidate) {\n                var that = this;\n                that._active = true;\n                return that.listView.select(candidate).done(function () {\n                    that._active = false;\n                });\n            },\n            _loader: function () {\n                this._loading = $('<span class=\"k-icon k-i-loading\" style=\"display:none\"></span>').insertAfter(this.element);\n            },\n            _clearButton: function () {\n                this._clear = $('<span unselectable=\"on\" class=\"k-icon k-clear-value k-i-close\" title=\"clear\"></span>').attr({\n                    'role': 'button',\n                    'tabIndex': -1\n                });\n                if (this.options.clearButton) {\n                    this._clear.insertAfter(this.element);\n                }\n            },\n            _toggleHover: function (e) {\n                $(e.currentTarget).toggleClass(HOVER, e.type === 'mouseenter');\n            },\n            _toggleCloseVisibility: function () {\n                if (this.value()) {\n                    this._showClear();\n                } else {\n                    this._hideClear();\n                }\n            },\n            _wrapper: function () {\n                var that = this, element = that.element, DOMelement = element[0], wrapper;\n                wrapper = element.parent();\n                if (!wrapper.is('span.k-widget')) {\n                    wrapper = element.wrap('<span />').parent();\n                }\n                wrapper.attr('tabindex', -1);\n                wrapper.attr('role', 'presentation');\n                wrapper[0].style.cssText = DOMelement.style.cssText;\n                element.css({\n                    width: '100%',\n                    height: DOMelement.style.height\n                });\n                that._focused = that.element;\n                that.wrapper = wrapper.addClass('k-widget k-autocomplete k-header').addClass(DOMelement.className);\n            }\n        });\n        ui.plugin(AutoComplete);\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.dropdownlist', [\n        'kendo.list',\n        'kendo.mobile.scroller'\n    ], f);\n}(function () {\n    var __meta__ = {\n        id: 'dropdownlist',\n        name: 'DropDownList',\n        category: 'web',\n        description: 'The DropDownList widget displays a list of values and allows the selection of a single value from the list.',\n        depends: ['list'],\n        features: [\n            {\n                id: 'mobile-scroller',\n                name: 'Mobile scroller',\n                description: 'Support for kinetic scrolling in mobile device',\n                depends: ['mobile.scroller']\n            },\n            {\n                id: 'virtualization',\n                name: 'VirtualList',\n                description: 'Support for virtualization',\n                depends: ['virtuallist']\n            }\n        ]\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, ui = kendo.ui, List = ui.List, Select = ui.Select, support = kendo.support, activeElement = kendo._activeElement, ObservableObject = kendo.data.ObservableObject, keys = kendo.keys, ns = '.kendoDropDownList', DISABLED = 'disabled', READONLY = 'readonly', CHANGE = 'change', FOCUSED = 'k-state-focused', DEFAULT = 'k-state-default', STATEDISABLED = 'k-state-disabled', ARIA_DISABLED = 'aria-disabled', HOVEREVENTS = 'mouseenter' + ns + ' mouseleave' + ns, TABINDEX = 'tabindex', STATE_FILTER = 'filter', STATE_ACCEPT = 'accept', MSG_INVALID_OPTION_LABEL = 'The `optionLabel` option is not valid due to missing fields. Define a custom optionLabel as shown here http://docs.telerik.com/kendo-ui/api/javascript/ui/dropdownlist#configuration-optionLabel', proxy = $.proxy;\n        var DropDownList = Select.extend({\n            init: function (element, options) {\n                var that = this;\n                var index = options && options.index;\n                var optionLabel, text, disabled;\n                that.ns = ns;\n                options = $.isArray(options) ? { dataSource: options } : options;\n                Select.fn.init.call(that, element, options);\n                options = that.options;\n                element = that.element.on('focus' + ns, proxy(that._focusHandler, that));\n                that._focusInputHandler = $.proxy(that._focusInput, that);\n                that.optionLabel = $();\n                that._optionLabel();\n                that._inputTemplate();\n                that._reset();\n                that._prev = '';\n                that._word = '';\n                that._wrapper();\n                that._tabindex();\n                that.wrapper.data(TABINDEX, that.wrapper.attr(TABINDEX));\n                that._span();\n                that._popup();\n                that._mobile();\n                that._dataSource();\n                that._ignoreCase();\n                that._filterHeader();\n                that._aria();\n                that._enable();\n                that._oldIndex = that.selectedIndex = -1;\n                if (index !== undefined) {\n                    options.index = index;\n                }\n                that._initialIndex = options.index;\n                that.requireValueMapper(that.options);\n                that._initList();\n                that._cascade();\n                if (options.autoBind) {\n                    that.dataSource.fetch();\n                } else if (that.selectedIndex === -1) {\n                    text = options.text || '';\n                    if (!text) {\n                        optionLabel = options.optionLabel;\n                        if (optionLabel && options.index === 0) {\n                            text = optionLabel;\n                        } else if (that._isSelect) {\n                            text = element.children(':selected').text();\n                        }\n                    }\n                    that._textAccessor(text);\n                }\n                disabled = $(that.element).parents('fieldset').is(':disabled');\n                if (disabled) {\n                    that.enable(false);\n                }\n                that.listView.bind('click', function (e) {\n                    e.preventDefault();\n                });\n                kendo.notify(that);\n            },\n            options: {\n                name: 'DropDownList',\n                enabled: true,\n                autoBind: true,\n                index: 0,\n                text: null,\n                value: null,\n                delay: 500,\n                height: 200,\n                dataTextField: '',\n                dataValueField: '',\n                optionLabel: '',\n                cascadeFrom: '',\n                cascadeFromField: '',\n                ignoreCase: true,\n                animation: {},\n                filter: 'none',\n                minLength: 1,\n                enforceMinLength: false,\n                virtual: false,\n                template: null,\n                valueTemplate: null,\n                optionLabelTemplate: null,\n                groupTemplate: '#:data#',\n                fixedGroupTemplate: '#:data#'\n            },\n            events: [\n                'open',\n                'close',\n                CHANGE,\n                'select',\n                'filtering',\n                'dataBinding',\n                'dataBound',\n                'cascade',\n                'set'\n            ],\n            setOptions: function (options) {\n                Select.fn.setOptions.call(this, options);\n                this.listView.setOptions(this._listOptions(options));\n                this._optionLabel();\n                this._inputTemplate();\n                this._accessors();\n                this._filterHeader();\n                this._enable();\n                this._aria();\n                if (!this.value() && this.hasOptionLabel()) {\n                    this.select(0);\n                }\n            },\n            destroy: function () {\n                var that = this;\n                Select.fn.destroy.call(that);\n                that.wrapper.off(ns);\n                that.element.off(ns);\n                that._inputWrapper.off(ns);\n                that._arrow.off();\n                that._arrow = null;\n                that._arrowIcon = null;\n                that.optionLabel.off();\n            },\n            open: function () {\n                var that = this;\n                if (that.popup.visible()) {\n                    return;\n                }\n                if (!that.listView.bound() || that._state === STATE_ACCEPT) {\n                    that._open = true;\n                    that._state = 'rebind';\n                    if (that.filterInput) {\n                        that.filterInput.val('');\n                        that._prev = '';\n                    }\n                    if (that.filterInput && that.options.minLength !== 1) {\n                        that.refresh();\n                        that.popup.one('activate', that._focusInputHandler);\n                        that.popup.open();\n                        that._resizeFilterInput();\n                    } else {\n                        that._filterSource();\n                    }\n                } else if (that._allowOpening()) {\n                    that.popup.one('activate', that._focusInputHandler);\n                    that.popup.open();\n                    that._resizeFilterInput();\n                    that._focusItem();\n                }\n            },\n            _focusInput: function () {\n                this._focusElement(this.filterInput);\n            },\n            _resizeFilterInput: function () {\n                var filterInput = this.filterInput;\n                var originalPrevent = this._prevent;\n                if (!filterInput) {\n                    return;\n                }\n                var isInputActive = this.filterInput[0] === activeElement();\n                var caret = kendo.caret(this.filterInput[0])[0];\n                this._prevent = true;\n                filterInput.css('display', 'none').css('width', this.popup.element.css('width')).css('display', 'inline-block');\n                if (isInputActive) {\n                    filterInput.focus();\n                    kendo.caret(filterInput[0], caret);\n                }\n                this._prevent = originalPrevent;\n            },\n            _allowOpening: function () {\n                return this.hasOptionLabel() || this.filterInput || Select.fn._allowOpening.call(this);\n            },\n            toggle: function (toggle) {\n                this._toggle(toggle, true);\n            },\n            current: function (candidate) {\n                var current;\n                if (candidate === undefined) {\n                    current = this.listView.focus();\n                    if (!current && this.selectedIndex === 0 && this.hasOptionLabel()) {\n                        return this.optionLabel;\n                    }\n                    return current;\n                }\n                this._focus(candidate);\n            },\n            dataItem: function (index) {\n                var that = this;\n                var dataItem = null;\n                if (index === null) {\n                    return index;\n                }\n                if (index === undefined) {\n                    dataItem = that.listView.selectedDataItems()[0];\n                } else {\n                    if (typeof index !== 'number') {\n                        if (that.options.virtual) {\n                            return that.dataSource.getByUid($(index).data('uid'));\n                        }\n                        if (index.hasClass('k-list-optionlabel')) {\n                            index = -1;\n                        } else {\n                            index = $(that.items()).index(index);\n                        }\n                    } else if (that.hasOptionLabel()) {\n                        index -= 1;\n                    }\n                    dataItem = that.dataSource.flatView()[index];\n                }\n                if (!dataItem) {\n                    dataItem = that._optionLabelDataItem();\n                }\n                return dataItem;\n            },\n            refresh: function () {\n                this.listView.refresh();\n            },\n            text: function (text) {\n                var that = this;\n                var loweredText;\n                var ignoreCase = that.options.ignoreCase;\n                text = text === null ? '' : text;\n                if (text !== undefined) {\n                    if (typeof text !== 'string') {\n                        that._textAccessor(text);\n                        return;\n                    }\n                    loweredText = ignoreCase ? text.toLowerCase() : text;\n                    that._select(function (data) {\n                        data = that._text(data);\n                        if (ignoreCase) {\n                            data = (data + '').toLowerCase();\n                        }\n                        return data === loweredText;\n                    }).done(function () {\n                        that._textAccessor(that.dataItem() || text);\n                    });\n                } else {\n                    return that._textAccessor();\n                }\n            },\n            _clearFilter: function () {\n                $(this.filterInput).val('');\n                Select.fn._clearFilter.call(this);\n            },\n            value: function (value) {\n                var that = this;\n                var listView = that.listView;\n                var dataSource = that.dataSource;\n                if (value === undefined) {\n                    value = that._accessor() || that.listView.value()[0];\n                    return value === undefined || value === null ? '' : value;\n                }\n                that.requireValueMapper(that.options, value);\n                if (value || !that.hasOptionLabel()) {\n                    that._initialIndex = null;\n                }\n                this.trigger('set', { value: value });\n                if (that._request && that.options.cascadeFrom && that.listView.bound()) {\n                    if (that._valueSetter) {\n                        dataSource.unbind(CHANGE, that._valueSetter);\n                    }\n                    that._valueSetter = proxy(function () {\n                        that.value(value);\n                    }, that);\n                    dataSource.one(CHANGE, that._valueSetter);\n                    return;\n                }\n                if (that._isFilterEnabled() && listView.bound() && listView.isFiltered()) {\n                    that._clearFilter();\n                } else {\n                    that._fetchData();\n                }\n                listView.value(value).done(function () {\n                    that._old = that._accessor();\n                    that._oldIndex = that.selectedIndex;\n                });\n            },\n            hasOptionLabel: function () {\n                return this.optionLabel && !!this.optionLabel[0];\n            },\n            _optionLabel: function () {\n                var that = this;\n                var options = that.options;\n                var optionLabel = options.optionLabel;\n                var template = options.optionLabelTemplate;\n                if (!optionLabel) {\n                    that.optionLabel.off().remove();\n                    that.optionLabel = $();\n                    return;\n                }\n                if (!template) {\n                    template = '#:';\n                    if (typeof optionLabel === 'string') {\n                        template += 'data';\n                    } else {\n                        template += kendo.expr(options.dataTextField, 'data');\n                    }\n                    template += '#';\n                }\n                if (typeof template !== 'function') {\n                    template = kendo.template(template);\n                }\n                that.optionLabelTemplate = template;\n                if (!that.hasOptionLabel()) {\n                    that.optionLabel = $('<div class=\"k-list-optionlabel\"></div>').prependTo(that.list);\n                }\n                that.optionLabel.html(template(optionLabel)).off().click(proxy(that._click, that)).on(HOVEREVENTS, that._toggleHover);\n                that.angular('compile', function () {\n                    return {\n                        elements: that.optionLabel,\n                        data: [{ dataItem: that._optionLabelDataItem() }]\n                    };\n                });\n            },\n            _optionLabelText: function () {\n                var optionLabel = this.options.optionLabel;\n                return typeof optionLabel === 'string' ? optionLabel : this._text(optionLabel);\n            },\n            _optionLabelDataItem: function () {\n                var that = this;\n                var optionLabel = that.options.optionLabel;\n                if (that.hasOptionLabel()) {\n                    return $.isPlainObject(optionLabel) ? new ObservableObject(optionLabel) : that._assignInstance(that._optionLabelText(), '');\n                }\n                return null;\n            },\n            _buildOptions: function (data) {\n                var that = this;\n                if (!that._isSelect) {\n                    return;\n                }\n                var value = that.listView.value()[0];\n                var optionLabel = that._optionLabelDataItem();\n                var optionLabelValue = optionLabel && that._value(optionLabel);\n                if (value === undefined || value === null) {\n                    value = '';\n                }\n                if (optionLabel) {\n                    if (optionLabelValue === undefined || optionLabelValue === null) {\n                        optionLabelValue = '';\n                    }\n                    optionLabel = '<option value=\"' + optionLabelValue + '\">' + that._text(optionLabel) + '</option>';\n                }\n                that._options(data, optionLabel, value);\n                if (value !== List.unifyType(that._accessor(), typeof value)) {\n                    that._customOption = null;\n                    that._custom(value);\n                }\n            },\n            _listBound: function () {\n                var that = this;\n                var initialIndex = that._initialIndex;\n                var filtered = that._state === STATE_FILTER;\n                var data = that.dataSource.flatView();\n                var dataItem;\n                that._presetValue = false;\n                that._renderFooter();\n                that._renderNoData();\n                that._toggleNoData(!data.length);\n                that._resizePopup(true);\n                that.popup.position();\n                that._buildOptions(data);\n                that._makeUnselectable();\n                if (!filtered) {\n                    if (that._open) {\n                        that.toggle(that._allowOpening());\n                    }\n                    that._open = false;\n                    if (!that._fetch) {\n                        if (data.length) {\n                            if (!that.listView.value().length && initialIndex > -1 && initialIndex !== null) {\n                                that.select(initialIndex);\n                            }\n                            that._initialIndex = null;\n                            dataItem = that.listView.selectedDataItems()[0];\n                            if (dataItem && that.text() !== that._text(dataItem)) {\n                                that._selectValue(dataItem);\n                            }\n                        } else if (that._textAccessor() !== that._optionLabelText()) {\n                            that.listView.value('');\n                            that._selectValue(null);\n                            that._oldIndex = that.selectedIndex;\n                        }\n                    }\n                }\n                that._hideBusy();\n                that.trigger('dataBound');\n            },\n            _listChange: function () {\n                this._selectValue(this.listView.selectedDataItems()[0]);\n                if (this._presetValue || this._old && this._oldIndex === -1) {\n                    this._oldIndex = this.selectedIndex;\n                }\n            },\n            _filterPaste: function () {\n                this._search();\n            },\n            _focusHandler: function () {\n                this.wrapper.focus();\n            },\n            _focusinHandler: function () {\n                this._inputWrapper.addClass(FOCUSED);\n                this._prevent = false;\n            },\n            _focusoutHandler: function () {\n                var that = this;\n                var isIFrame = window.self !== window.top;\n                if (!that._prevent) {\n                    clearTimeout(that._typingTimeout);\n                    if (support.mobileOS.ios && isIFrame) {\n                        that._change();\n                    } else {\n                        that._blur();\n                    }\n                    that._inputWrapper.removeClass(FOCUSED);\n                    that._prevent = true;\n                    that._open = false;\n                    that.element.blur();\n                }\n            },\n            _wrapperMousedown: function () {\n                this._prevent = !!this.filterInput;\n            },\n            _wrapperClick: function (e) {\n                e.preventDefault();\n                this.popup.unbind('activate', this._focusInputHandler);\n                this._focused = this.wrapper;\n                this._toggle();\n            },\n            _editable: function (options) {\n                var that = this;\n                var element = that.element;\n                var disable = options.disable;\n                var readonly = options.readonly;\n                var wrapper = that.wrapper.add(that.filterInput).off(ns);\n                var dropDownWrapper = that._inputWrapper.off(HOVEREVENTS);\n                if (!readonly && !disable) {\n                    element.removeAttr(DISABLED).removeAttr(READONLY);\n                    dropDownWrapper.addClass(DEFAULT).removeClass(STATEDISABLED).on(HOVEREVENTS, that._toggleHover);\n                    wrapper.attr(TABINDEX, wrapper.data(TABINDEX)).attr(ARIA_DISABLED, false).on('keydown' + ns, proxy(that._keydown, that)).on('focusin' + ns, proxy(that._focusinHandler, that)).on('focusout' + ns, proxy(that._focusoutHandler, that)).on('mousedown' + ns, proxy(that._wrapperMousedown, that)).on('paste' + ns, proxy(that._filterPaste, that));\n                    that.wrapper.on('click' + ns, proxy(that._wrapperClick, that));\n                    if (!that.filterInput) {\n                        wrapper.on('keypress' + ns, proxy(that._keypress, that));\n                    }\n                } else if (disable) {\n                    wrapper.removeAttr(TABINDEX);\n                    dropDownWrapper.addClass(STATEDISABLED).removeClass(DEFAULT);\n                } else {\n                    dropDownWrapper.addClass(DEFAULT).removeClass(STATEDISABLED);\n                    wrapper.on('focusin' + ns, proxy(that._focusinHandler, that)).on('focusout' + ns, proxy(that._focusoutHandler, that));\n                }\n                element.attr(DISABLED, disable).attr(READONLY, readonly);\n                wrapper.attr(ARIA_DISABLED, disable);\n            },\n            _keydown: function (e) {\n                var that = this;\n                var key = e.keyCode;\n                var altKey = e.altKey;\n                var isInputActive;\n                var handled;\n                var isPopupVisible = that.popup.visible();\n                if (that.filterInput) {\n                    isInputActive = that.filterInput[0] === activeElement();\n                }\n                if (key === keys.LEFT) {\n                    key = keys.UP;\n                    handled = true;\n                } else if (key === keys.RIGHT) {\n                    key = keys.DOWN;\n                    handled = true;\n                }\n                if (handled && isInputActive) {\n                    return;\n                }\n                e.keyCode = key;\n                if (altKey && key === keys.UP || key === keys.ESC) {\n                    that._focusElement(that.wrapper);\n                }\n                if (that._state === STATE_FILTER && key === keys.ESC) {\n                    that._clearFilter();\n                }\n                if (key === keys.ENTER && that._typingTimeout && that.filterInput && isPopupVisible) {\n                    e.preventDefault();\n                    return;\n                }\n                handled = that._move(e);\n                if (handled) {\n                    return;\n                }\n                if (!isPopupVisible || !that.filterInput) {\n                    var current = that._focus();\n                    if (key === keys.HOME) {\n                        handled = true;\n                        that._firstItem();\n                    } else if (key === keys.END) {\n                        handled = true;\n                        that._lastItem();\n                    }\n                    if (handled) {\n                        if (that.trigger('select', {\n                                dataItem: that._getElementDataItem(that._focus()),\n                                item: that._focus()\n                            })) {\n                            that._focus(current);\n                            return;\n                        }\n                        that._select(that._focus(), true).done(function () {\n                            if (!isPopupVisible) {\n                                that._blur();\n                            }\n                        });\n                        e.preventDefault();\n                    }\n                }\n                if (!altKey && !handled && that.filterInput) {\n                    that._search();\n                }\n            },\n            _matchText: function (text, word) {\n                var ignoreCase = this.options.ignoreCase;\n                if (text === undefined || text === null) {\n                    return false;\n                }\n                text = text + '';\n                if (ignoreCase) {\n                    text = text.toLowerCase();\n                }\n                return text.indexOf(word) === 0;\n            },\n            _shuffleData: function (data, splitIndex) {\n                var optionDataItem = this._optionLabelDataItem();\n                if (optionDataItem) {\n                    data = [optionDataItem].concat(data);\n                }\n                return data.slice(splitIndex).concat(data.slice(0, splitIndex));\n            },\n            _selectNext: function () {\n                var that = this;\n                var data = that.dataSource.flatView();\n                var dataLength = data.length + (that.hasOptionLabel() ? 1 : 0);\n                var isInLoop = sameCharsOnly(that._word, that._last);\n                var startIndex = that.selectedIndex;\n                var oldFocusedItem;\n                var text;\n                if (startIndex === -1) {\n                    startIndex = 0;\n                } else {\n                    startIndex += isInLoop ? 1 : 0;\n                    startIndex = normalizeIndex(startIndex, dataLength);\n                }\n                data = data.toJSON ? data.toJSON() : data.slice();\n                data = that._shuffleData(data, startIndex);\n                for (var idx = 0; idx < dataLength; idx++) {\n                    text = that._text(data[idx]);\n                    if (isInLoop && that._matchText(text, that._last)) {\n                        break;\n                    } else if (that._matchText(text, that._word)) {\n                        break;\n                    }\n                }\n                if (idx !== dataLength) {\n                    oldFocusedItem = that._focus();\n                    that._select(normalizeIndex(startIndex + idx, dataLength)).done(function () {\n                        var done = function () {\n                            if (!that.popup.visible()) {\n                                that._change();\n                            }\n                        };\n                        if (that.trigger('select', {\n                                dataItem: that._getElementDataItem(that._focus()),\n                                item: that._focus()\n                            })) {\n                            that._select(oldFocusedItem).done(done);\n                        } else {\n                            done();\n                        }\n                    });\n                }\n            },\n            _keypress: function (e) {\n                var that = this;\n                if (e.which === 0 || e.keyCode === kendo.keys.ENTER) {\n                    return;\n                }\n                var character = String.fromCharCode(e.charCode || e.keyCode);\n                if (that.options.ignoreCase) {\n                    character = character.toLowerCase();\n                }\n                if (character === ' ') {\n                    e.preventDefault();\n                }\n                that._word += character;\n                that._last = character;\n                that._search();\n            },\n            _popupOpen: function () {\n                var popup = this.popup;\n                popup.wrapper = kendo.wrap(popup.element);\n                if (popup.element.closest('.km-root')[0]) {\n                    popup.wrapper.addClass('km-popup km-widget');\n                    this.wrapper.addClass('km-widget');\n                }\n            },\n            _popup: function () {\n                Select.fn._popup.call(this);\n                this.popup.one('open', proxy(this._popupOpen, this));\n            },\n            _getElementDataItem: function (element) {\n                if (!element || !element[0]) {\n                    return null;\n                }\n                if (element[0] === this.optionLabel[0]) {\n                    return this._optionLabelDataItem();\n                }\n                return this.listView.dataItemByIndex(this.listView.getElementIndex(element));\n            },\n            _click: function (e) {\n                var that = this;\n                var item = e.item || $(e.currentTarget);\n                e.preventDefault();\n                if (that.trigger('select', {\n                        dataItem: that._getElementDataItem(item),\n                        item: item\n                    })) {\n                    that.close();\n                    return;\n                }\n                that._userTriggered = true;\n                that._select(item).done(function () {\n                    that._focusElement(that.wrapper);\n                    that._blur();\n                });\n            },\n            _focusElement: function (element) {\n                var active = activeElement();\n                var wrapper = this.wrapper;\n                var filterInput = this.filterInput;\n                var compareElement = element === filterInput ? wrapper : filterInput;\n                var touchEnabled = support.mobileOS && (support.touch || support.MSPointers || support.pointers);\n                if (filterInput && filterInput[0] === element[0] && touchEnabled) {\n                    return;\n                }\n                if (filterInput && compareElement[0] === active) {\n                    this._prevent = true;\n                    this._focused = element.focus();\n                }\n            },\n            _searchByWord: function (word) {\n                if (!word) {\n                    return;\n                }\n                var that = this;\n                var ignoreCase = that.options.ignoreCase;\n                if (ignoreCase) {\n                    word = word.toLowerCase();\n                }\n                that._select(function (dataItem) {\n                    return that._matchText(that._text(dataItem), word);\n                });\n            },\n            _inputValue: function () {\n                return this.text();\n            },\n            _search: function () {\n                var that = this;\n                var dataSource = that.dataSource;\n                clearTimeout(that._typingTimeout);\n                if (that._isFilterEnabled()) {\n                    that._typingTimeout = setTimeout(function () {\n                        var value = that.filterInput.val();\n                        if (that._prev !== value) {\n                            that._prev = value;\n                            that.search(value);\n                            that._resizeFilterInput();\n                        }\n                        that._typingTimeout = null;\n                    }, that.options.delay);\n                } else {\n                    that._typingTimeout = setTimeout(function () {\n                        that._word = '';\n                    }, that.options.delay);\n                    if (!that.listView.bound()) {\n                        dataSource.fetch().done(function () {\n                            that._selectNext();\n                        });\n                        return;\n                    }\n                    that._selectNext();\n                }\n            },\n            _get: function (candidate) {\n                var data, found, idx;\n                var isFunction = typeof candidate === 'function';\n                var jQueryCandidate = !isFunction ? $(candidate) : $();\n                if (this.hasOptionLabel()) {\n                    if (typeof candidate === 'number') {\n                        if (candidate > -1) {\n                            candidate -= 1;\n                        }\n                    } else if (jQueryCandidate.hasClass('k-list-optionlabel')) {\n                        candidate = -1;\n                    }\n                }\n                if (isFunction) {\n                    data = this.dataSource.flatView();\n                    for (idx = 0; idx < data.length; idx++) {\n                        if (candidate(data[idx])) {\n                            candidate = idx;\n                            found = true;\n                            break;\n                        }\n                    }\n                    if (!found) {\n                        candidate = -1;\n                    }\n                }\n                return candidate;\n            },\n            _firstItem: function () {\n                if (this.hasOptionLabel()) {\n                    this._focus(this.optionLabel);\n                } else {\n                    this.listView.focusFirst();\n                }\n            },\n            _lastItem: function () {\n                this._resetOptionLabel();\n                this.listView.focusLast();\n            },\n            _nextItem: function () {\n                if (this.optionLabel.hasClass('k-state-focused')) {\n                    this._resetOptionLabel();\n                    this.listView.focusFirst();\n                } else {\n                    this.listView.focusNext();\n                }\n            },\n            _prevItem: function () {\n                if (this.optionLabel.hasClass('k-state-focused')) {\n                    return;\n                }\n                this.listView.focusPrev();\n                if (!this.listView.focus()) {\n                    this._focus(this.optionLabel);\n                }\n            },\n            _focusItem: function () {\n                var options = this.options;\n                var listView = this.listView;\n                var focusedItem = listView.focus();\n                var index = listView.select();\n                index = index[index.length - 1];\n                if (index === undefined && options.highlightFirst && !focusedItem) {\n                    index = 0;\n                }\n                if (index !== undefined) {\n                    listView.focus(index);\n                } else {\n                    if (options.optionLabel && (!options.virtual || options.virtual.mapValueTo !== 'dataItem')) {\n                        this._focus(this.optionLabel);\n                        this._select(this.optionLabel);\n                    } else {\n                        listView.scrollToIndex(0);\n                    }\n                }\n            },\n            _resetOptionLabel: function (additionalClass) {\n                this.optionLabel.removeClass('k-state-focused' + (additionalClass || '')).removeAttr('id');\n            },\n            _focus: function (candidate) {\n                var listView = this.listView;\n                var optionLabel = this.optionLabel;\n                if (candidate === undefined) {\n                    candidate = listView.focus();\n                    if (!candidate && optionLabel.hasClass('k-state-focused')) {\n                        candidate = optionLabel;\n                    }\n                    return candidate;\n                }\n                this._resetOptionLabel();\n                candidate = this._get(candidate);\n                listView.focus(candidate);\n                if (candidate === -1) {\n                    optionLabel.addClass('k-state-focused').attr('id', listView._optionID);\n                    this._focused.add(this.filterInput).removeAttr('aria-activedescendant').attr('aria-activedescendant', listView._optionID);\n                }\n            },\n            _select: function (candidate, keepState) {\n                var that = this;\n                candidate = that._get(candidate);\n                return that.listView.select(candidate).done(function () {\n                    if (!keepState && that._state === STATE_FILTER) {\n                        that._state = STATE_ACCEPT;\n                    }\n                    if (candidate === -1) {\n                        that._selectValue(null);\n                    }\n                });\n            },\n            _selectValue: function (dataItem) {\n                var that = this;\n                var optionLabel = that.options.optionLabel;\n                var idx = that.listView.select();\n                var value = '';\n                var text = '';\n                idx = idx[idx.length - 1];\n                if (idx === undefined) {\n                    idx = -1;\n                }\n                this._resetOptionLabel(' k-state-selected');\n                if (dataItem || dataItem === 0) {\n                    text = dataItem;\n                    value = that._dataValue(dataItem);\n                    if (optionLabel) {\n                        idx += 1;\n                    }\n                } else if (optionLabel) {\n                    that._focus(that.optionLabel.addClass('k-state-selected'));\n                    text = that._optionLabelText();\n                    if (typeof optionLabel === 'string') {\n                        value = '';\n                    } else {\n                        value = that._value(optionLabel);\n                    }\n                    idx = 0;\n                }\n                that.selectedIndex = idx;\n                if (value === null) {\n                    value = '';\n                }\n                that._textAccessor(text);\n                that._accessor(value, idx);\n                that._triggerCascade();\n            },\n            _mobile: function () {\n                var that = this, popup = that.popup, mobileOS = support.mobileOS, root = popup.element.parents('.km-root').eq(0);\n                if (root.length && mobileOS) {\n                    popup.options.animation.open.effects = mobileOS.android || mobileOS.meego ? 'fadeIn' : mobileOS.ios || mobileOS.wp ? 'slideIn:up' : popup.options.animation.open.effects;\n                }\n            },\n            _filterHeader: function () {\n                var icon;\n                if (this.filterInput) {\n                    this.filterInput.off(ns).parent().remove();\n                    this.filterInput = null;\n                }\n                if (this._isFilterEnabled()) {\n                    icon = '<span class=\"k-icon k-i-zoom\"></span>';\n                    this.filterInput = $('<input class=\"k-textbox\"/>').attr({\n                        placeholder: this.element.attr('placeholder'),\n                        title: this.element.attr('title'),\n                        role: 'listbox',\n                        'aria-haspopup': true,\n                        'aria-expanded': false\n                    });\n                    this.list.prepend($('<span class=\"k-list-filter\" />').append(this.filterInput.add(icon)));\n                }\n            },\n            _span: function () {\n                var that = this, wrapper = that.wrapper, SELECTOR = 'span.k-input', span;\n                span = wrapper.find(SELECTOR);\n                if (!span[0]) {\n                    wrapper.append('<span unselectable=\"on\" class=\"k-dropdown-wrap k-state-default\"><span unselectable=\"on\" class=\"k-input\">&nbsp;</span><span unselectable=\"on\" class=\"k-select\" aria-label=\"select\"><span class=\"k-icon k-i-arrow-60-down\"></span></span></span>').append(that.element);\n                    span = wrapper.find(SELECTOR);\n                }\n                that.span = span;\n                that._inputWrapper = $(wrapper[0].firstChild);\n                that._arrow = wrapper.find('.k-select');\n                that._arrowIcon = that._arrow.find('.k-icon');\n            },\n            _wrapper: function () {\n                var that = this, element = that.element, DOMelement = element[0], wrapper;\n                wrapper = element.parent();\n                if (!wrapper.is('span.k-widget')) {\n                    wrapper = element.wrap('<span />').parent();\n                    wrapper[0].style.cssText = DOMelement.style.cssText;\n                    wrapper[0].title = DOMelement.title;\n                }\n                that._focused = that.wrapper = wrapper.addClass('k-widget k-dropdown k-header').addClass(DOMelement.className).css('display', '').attr({\n                    accesskey: element.attr('accesskey'),\n                    unselectable: 'on',\n                    role: 'listbox',\n                    'aria-haspopup': true,\n                    'aria-expanded': false\n                });\n                element.hide().removeAttr('accesskey');\n            },\n            _clearSelection: function (parent) {\n                this.select(parent.value() ? 0 : -1);\n            },\n            _inputTemplate: function () {\n                var that = this, template = that.options.valueTemplate;\n                if (!template) {\n                    template = $.proxy(kendo.template('#:this._text(data)#', { useWithBlock: false }), that);\n                } else {\n                    template = kendo.template(template);\n                }\n                that.valueTemplate = template;\n                if (that.hasOptionLabel() && !that.options.optionLabelTemplate) {\n                    try {\n                        that.valueTemplate(that._optionLabelDataItem());\n                    } catch (e) {\n                        throw new Error(MSG_INVALID_OPTION_LABEL);\n                    }\n                }\n            },\n            _textAccessor: function (text) {\n                var dataItem = null;\n                var template = this.valueTemplate;\n                var optionLabelText = this._optionLabelText();\n                var span = this.span;\n                if (text === undefined) {\n                    return span.text();\n                }\n                if ($.isPlainObject(text) || text instanceof ObservableObject) {\n                    dataItem = text;\n                } else if (optionLabelText && optionLabelText === text) {\n                    dataItem = this.options.optionLabel;\n                }\n                if (!dataItem) {\n                    dataItem = this._assignInstance(text, this._accessor());\n                }\n                if (this.hasOptionLabel()) {\n                    if (dataItem === optionLabelText || this._text(dataItem) === optionLabelText) {\n                        template = this.optionLabelTemplate;\n                        if (typeof this.options.optionLabel === 'string' && !this.options.optionLabelTemplate) {\n                            dataItem = optionLabelText;\n                        }\n                    }\n                }\n                var getElements = function () {\n                    return {\n                        elements: span.get(),\n                        data: [{ dataItem: dataItem }]\n                    };\n                };\n                this.angular('cleanup', getElements);\n                try {\n                    span.html(template(dataItem));\n                } catch (e) {\n                    span.html('');\n                }\n                this.angular('compile', getElements);\n            },\n            _preselect: function (value, text) {\n                if (!value && !text) {\n                    text = this._optionLabelText();\n                }\n                this._accessor(value);\n                this._textAccessor(text);\n                this._old = this._accessor();\n                this._oldIndex = this.selectedIndex;\n                this.listView.setValue(value);\n                this._initialIndex = null;\n                this._presetValue = true;\n            },\n            _assignInstance: function (text, value) {\n                var dataTextField = this.options.dataTextField;\n                var dataItem = {};\n                if (dataTextField) {\n                    assign(dataItem, dataTextField.split('.'), text);\n                    assign(dataItem, this.options.dataValueField.split('.'), value);\n                    dataItem = new ObservableObject(dataItem);\n                } else {\n                    dataItem = text;\n                }\n                return dataItem;\n            }\n        });\n        function assign(instance, fields, value) {\n            var idx = 0, lastIndex = fields.length - 1, field;\n            for (; idx < lastIndex; ++idx) {\n                field = fields[idx];\n                if (!(field in instance)) {\n                    instance[field] = {};\n                }\n                instance = instance[field];\n            }\n            instance[fields[lastIndex]] = value;\n        }\n        function normalizeIndex(index, length) {\n            if (index >= length) {\n                index -= length;\n            }\n            return index;\n        }\n        function sameCharsOnly(word, character) {\n            for (var idx = 0; idx < word.length; idx++) {\n                if (word.charAt(idx) !== character) {\n                    return false;\n                }\n            }\n            return true;\n        }\n        ui.plugin(DropDownList);\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.combobox', [\n        'kendo.list',\n        'kendo.mobile.scroller'\n    ], f);\n}(function () {\n    var __meta__ = {\n        id: 'combobox',\n        name: 'ComboBox',\n        category: 'web',\n        description: 'The ComboBox widget allows the selection from pre-defined values or entering a new value.',\n        depends: ['list'],\n        features: [\n            {\n                id: 'mobile-scroller',\n                name: 'Mobile scroller',\n                description: 'Support for kinetic scrolling in mobile device',\n                depends: ['mobile.scroller']\n            },\n            {\n                id: 'virtualization',\n                name: 'VirtualList',\n                description: 'Support for virtualization',\n                depends: ['virtuallist']\n            }\n        ]\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, ui = kendo.ui, List = ui.List, Select = ui.Select, caret = kendo.caret, support = kendo.support, placeholderSupported = support.placeholder, activeElement = kendo._activeElement, keys = kendo.keys, ns = '.kendoComboBox', CLICK = 'click' + ns, MOUSEDOWN = 'mousedown' + ns, DISABLED = 'disabled', READONLY = 'readonly', CHANGE = 'change', DEFAULT = 'k-state-default', FOCUSED = 'k-state-focused', STATEDISABLED = 'k-state-disabled', ARIA_DISABLED = 'aria-disabled', STATE_FILTER = 'filter', STATE_ACCEPT = 'accept', STATE_REBIND = 'rebind', HOVEREVENTS = 'mouseenter' + ns + ' mouseleave' + ns, proxy = $.proxy;\n        var ComboBox = Select.extend({\n            init: function (element, options) {\n                var that = this, text, disabled;\n                that.ns = ns;\n                options = $.isArray(options) ? { dataSource: options } : options;\n                Select.fn.init.call(that, element, options);\n                options = that.options;\n                element = that.element.on('focus' + ns, proxy(that._focusHandler, that));\n                options.placeholder = options.placeholder || element.attr('placeholder');\n                that._reset();\n                that._wrapper();\n                that._input();\n                that._clearButton();\n                that._tabindex(that.input);\n                that._popup();\n                that._dataSource();\n                that._ignoreCase();\n                that._enable();\n                that._oldIndex = that.selectedIndex = -1;\n                that._aria();\n                that._initialIndex = options.index;\n                that.requireValueMapper(that.options);\n                that._initList();\n                that._cascade();\n                if (options.autoBind) {\n                    that._filterSource();\n                } else {\n                    text = options.text;\n                    if (!text && that._isSelect) {\n                        text = element.children(':selected').text();\n                    }\n                    if (text) {\n                        that._setText(text);\n                    }\n                }\n                if (!text) {\n                    that._placeholder();\n                }\n                disabled = $(that.element).parents('fieldset').is(':disabled');\n                if (disabled) {\n                    that.enable(false);\n                }\n                kendo.notify(that);\n                that._toggleCloseVisibility();\n            },\n            options: {\n                name: 'ComboBox',\n                enabled: true,\n                index: -1,\n                text: null,\n                value: null,\n                autoBind: true,\n                delay: 200,\n                dataTextField: '',\n                dataValueField: '',\n                minLength: 1,\n                enforceMinLength: false,\n                height: 200,\n                highlightFirst: true,\n                filter: 'none',\n                placeholder: '',\n                suggest: false,\n                cascadeFrom: '',\n                cascadeFromField: '',\n                ignoreCase: true,\n                animation: {},\n                virtual: false,\n                template: null,\n                groupTemplate: '#:data#',\n                fixedGroupTemplate: '#:data#',\n                clearButton: true,\n                syncValueAndText: true\n            },\n            events: [\n                'open',\n                'close',\n                CHANGE,\n                'select',\n                'filtering',\n                'dataBinding',\n                'dataBound',\n                'cascade',\n                'set'\n            ],\n            setOptions: function (options) {\n                Select.fn.setOptions.call(this, options);\n                this.listView.setOptions(options);\n                this._accessors();\n                this._aria();\n            },\n            destroy: function () {\n                var that = this;\n                that.input.off(ns);\n                that.element.off(ns);\n                that._inputWrapper.off(ns);\n                clearTimeout(that._pasteTimeout);\n                that._arrow.off(CLICK + ' ' + MOUSEDOWN);\n                that._clear.off(CLICK + ' ' + MOUSEDOWN);\n                Select.fn.destroy.call(that);\n            },\n            _change: function () {\n                var that = this;\n                var text = that.text();\n                var hasText = text && text !== that._oldText && text !== that.options.placeholder;\n                var index = that.selectedIndex;\n                var isCustom = index === -1;\n                if (!that.options.syncValueAndText && !that.value() && isCustom && hasText) {\n                    that._old = '';\n                    that._oldIndex = index;\n                    that._oldText = text;\n                    if (!that._typing) {\n                        that.element.trigger(CHANGE);\n                    }\n                    that.trigger(CHANGE);\n                    that._typing = false;\n                    return;\n                }\n                Select.fn._change.call(that);\n                that._toggleCloseVisibility();\n            },\n            _focusHandler: function () {\n                this.input.focus();\n            },\n            _arrowClick: function () {\n                this._toggle();\n            },\n            _inputFocus: function () {\n                this._inputWrapper.addClass(FOCUSED);\n                this._placeholder(false);\n            },\n            _inputFocusout: function () {\n                var that = this;\n                var value = that.value();\n                that._inputWrapper.removeClass(FOCUSED);\n                clearTimeout(that._typingTimeout);\n                that._typingTimeout = null;\n                that.text(that.text());\n                var item = that._focus();\n                var dataItem = this.listView.dataItemByIndex(this.listView.getElementIndex(item));\n                if (value !== that.value() && that.trigger('select', {\n                        dataItem: dataItem,\n                        item: item\n                    })) {\n                    that.value(value);\n                    return;\n                }\n                that._placeholder();\n                that._blur();\n                that.element.blur();\n            },\n            _inputPaste: function () {\n                var that = this;\n                clearTimeout(that._pasteTimeout);\n                that._pasteTimeout = null;\n                that._pasteTimeout = setTimeout(function () {\n                    that.search();\n                });\n            },\n            _editable: function (options) {\n                var that = this, disable = options.disable, readonly = options.readonly, wrapper = that._inputWrapper.off(ns), input = that.element.add(that.input.off(ns)), arrow = that._arrow.off(CLICK + ' ' + MOUSEDOWN), clear = that._clear;\n                if (!readonly && !disable) {\n                    wrapper.addClass(DEFAULT).removeClass(STATEDISABLED).on(HOVEREVENTS, that._toggleHover);\n                    input.removeAttr(DISABLED).removeAttr(READONLY).attr(ARIA_DISABLED, false);\n                    arrow.on(CLICK, proxy(that._arrowClick, that)).on(MOUSEDOWN, function (e) {\n                        e.preventDefault();\n                    });\n                    clear.on(CLICK, proxy(that._clearValue, that)).on(MOUSEDOWN, function (e) {\n                        e.preventDefault();\n                    });\n                    that.input.on('keydown' + ns, proxy(that._keydown, that)).on('focus' + ns, proxy(that._inputFocus, that)).on('focusout' + ns, proxy(that._inputFocusout, that)).on('paste' + ns, proxy(that._inputPaste, that));\n                } else {\n                    wrapper.addClass(disable ? STATEDISABLED : DEFAULT).removeClass(disable ? DEFAULT : STATEDISABLED);\n                    input.attr(DISABLED, disable).attr(READONLY, readonly).attr(ARIA_DISABLED, disable);\n                }\n            },\n            open: function () {\n                var that = this;\n                var state = that._state;\n                if (that.popup.visible()) {\n                    return;\n                }\n                if (!that.listView.bound() && state !== STATE_FILTER || state === STATE_ACCEPT) {\n                    that._open = true;\n                    that._state = STATE_REBIND;\n                    if (that.options.minLength !== 1) {\n                        that.refresh();\n                        that._openPopup();\n                    } else {\n                        that._filterSource();\n                    }\n                } else if (that._allowOpening()) {\n                    that._openPopup();\n                    that._focusItem();\n                }\n            },\n            _scrollToFocusedItem: function () {\n                var listView = this.listView;\n                listView.scrollToIndex(listView.getElementIndex(listView.focus()));\n            },\n            _openPopup: function () {\n                this.popup.one('activate', proxy(this._scrollToFocusedItem, this));\n                this.popup.open();\n            },\n            _updateSelectionState: function () {\n                var that = this;\n                var text = that.options.text;\n                var value = that.options.value;\n                if (that.listView.isFiltered()) {\n                    return;\n                }\n                if (that.selectedIndex === -1) {\n                    if (text === undefined || text === null) {\n                        text = value;\n                    }\n                    that._accessor(value);\n                    that.input.val(text || that.input.val());\n                    that._placeholder();\n                } else if (that._oldIndex === -1) {\n                    that._oldIndex = that.selectedIndex;\n                }\n            },\n            _buildOptions: function (data) {\n                var that = this;\n                if (!that._isSelect) {\n                    return;\n                }\n                var custom = that._customOption;\n                if (that._state === STATE_REBIND) {\n                    that._state = '';\n                }\n                that._customOption = undefined;\n                that._options(data, '', that.value());\n                if (custom && custom[0].selected) {\n                    that._custom(custom.val());\n                }\n            },\n            _updateSelection: function () {\n                var that = this;\n                var listView = that.listView;\n                var initialIndex = that._initialIndex;\n                var hasInitialIndex = initialIndex !== null && initialIndex > -1;\n                var filtered = that._state === STATE_FILTER;\n                if (filtered) {\n                    $(listView.focus()).removeClass('k-state-selected');\n                    return;\n                }\n                if (that._fetch) {\n                    return;\n                }\n                if (!listView.value().length) {\n                    if (hasInitialIndex) {\n                        that.select(initialIndex);\n                    } else if (that._accessor()) {\n                        listView.value(that._accessor());\n                    }\n                }\n                that._initialIndex = null;\n                var dataItem = listView.selectedDataItems()[0];\n                if (!dataItem) {\n                    return;\n                }\n                if (that._value(dataItem) !== that.value()) {\n                    that._custom(that._value(dataItem));\n                }\n                if (that.text() && that.text() !== that._text(dataItem)) {\n                    that._selectValue(dataItem);\n                }\n            },\n            _updateItemFocus: function () {\n                var listView = this.listView;\n                if (!this.options.highlightFirst) {\n                    listView.focus(-1);\n                } else if (!listView.focus() && !listView.focusIndex()) {\n                    listView.focus(0);\n                }\n            },\n            _listBound: function () {\n                var that = this;\n                var isActive = that.input[0] === activeElement();\n                var data = that.dataSource.flatView();\n                var skip = that.listView.skip();\n                var length = data.length;\n                var groupsLength = that.dataSource._group.length;\n                var isFirstPage = skip === undefined || skip === 0;\n                that._presetValue = false;\n                that._renderFooter();\n                that._renderNoData();\n                that._toggleNoData(!length);\n                that._toggleHeader(!!groupsLength && !!length);\n                that._resizePopup();\n                that.popup.position();\n                that._buildOptions(data);\n                that._makeUnselectable();\n                that._updateSelection();\n                if (data.length && isFirstPage) {\n                    that._updateItemFocus();\n                    if (that.options.suggest && isActive && that.input.val()) {\n                        that.suggest(data[0]);\n                    }\n                }\n                if (that._open) {\n                    that._open = false;\n                    if (that._typingTimeout && !isActive) {\n                        that.popup.close();\n                    } else {\n                        that.toggle(that._allowOpening());\n                    }\n                    that._typingTimeout = null;\n                }\n                that._hideBusy();\n                that.trigger('dataBound');\n            },\n            _listChange: function () {\n                this._selectValue(this.listView.selectedDataItems()[0]);\n                if (this._presetValue) {\n                    this._oldIndex = this.selectedIndex;\n                }\n            },\n            _get: function (candidate) {\n                var data, found, idx;\n                if (typeof candidate === 'function') {\n                    data = this.dataSource.flatView();\n                    for (idx = 0; idx < data.length; idx++) {\n                        if (candidate(data[idx])) {\n                            candidate = idx;\n                            found = true;\n                            break;\n                        }\n                    }\n                    if (!found) {\n                        candidate = -1;\n                    }\n                }\n                return candidate;\n            },\n            _select: function (candidate, keepState) {\n                var that = this;\n                candidate = that._get(candidate);\n                if (candidate === -1) {\n                    that.input[0].value = '';\n                    that._accessor('');\n                }\n                return that.listView.select(candidate).done(function () {\n                    if (!keepState && that._state === STATE_FILTER) {\n                        that._state = STATE_ACCEPT;\n                    }\n                });\n            },\n            _selectValue: function (dataItem) {\n                var idx = this.listView.select();\n                var value = '';\n                var text = '';\n                idx = idx[idx.length - 1];\n                if (idx === undefined) {\n                    idx = -1;\n                }\n                this.selectedIndex = idx;\n                if (idx === -1 && !dataItem) {\n                    text = this.input[0].value;\n                    if (this.options.syncValueAndText) {\n                        value = text;\n                    }\n                    this.listView.focus(-1);\n                } else {\n                    if (dataItem || dataItem === 0) {\n                        value = this._dataValue(dataItem);\n                        text = this._text(dataItem);\n                    }\n                    if (value === null) {\n                        value = '';\n                    }\n                }\n                this._setDomInputValue(text);\n                this._accessor(value !== undefined ? value : text, idx);\n                this._placeholder();\n                this._triggerCascade();\n            },\n            _setDomInputValue: function (text) {\n                var that = this;\n                var currentCaret = caret(this.input);\n                var caretStart;\n                if (currentCaret && currentCaret.length) {\n                    caretStart = currentCaret[0];\n                }\n                this._prev = this.input[0].value = text;\n                if (caretStart && this.selectedIndex === -1) {\n                    var mobile = support.mobileOS;\n                    if (mobile.wp || mobile.android) {\n                        setTimeout(function () {\n                            that.input[0].setSelectionRange(caretStart, caretStart);\n                        }, 0);\n                    } else {\n                        this.input[0].setSelectionRange(caretStart, caretStart);\n                    }\n                }\n            },\n            refresh: function () {\n                this.listView.refresh();\n            },\n            _toggleCloseVisibility: function () {\n                if (this.text()) {\n                    this._showClear();\n                } else {\n                    this._hideClear();\n                }\n            },\n            suggest: function (word) {\n                var that = this;\n                var element = that.input[0];\n                var value = that.text();\n                var caretIdx = caret(element)[0];\n                var key = that._last;\n                var idx;\n                if (key == keys.BACKSPACE || key == keys.DELETE) {\n                    that._last = undefined;\n                    return;\n                }\n                word = word || '';\n                if (typeof word !== 'string') {\n                    if (word[0]) {\n                        word = that.dataSource.view()[List.inArray(word[0], that.ul[0])];\n                    }\n                    word = word ? that._text(word) : '';\n                }\n                if (caretIdx <= 0) {\n                    caretIdx = value.toLowerCase().indexOf(word.toLowerCase()) + 1;\n                }\n                if (word) {\n                    word = word.toString();\n                    idx = word.toLowerCase().indexOf(value.toLowerCase());\n                    if (idx > -1) {\n                        value += word.substring(idx + value.length);\n                    }\n                } else {\n                    value = value.substring(0, caretIdx);\n                }\n                if (value.length !== caretIdx || !word) {\n                    element.value = value;\n                    if (element === activeElement()) {\n                        caret(element, caretIdx, value.length);\n                    }\n                }\n            },\n            text: function (text) {\n                text = text === null ? '' : text;\n                var that = this;\n                var input = that.input[0];\n                var ignoreCase = that.options.ignoreCase;\n                var loweredText = text;\n                var dataItem;\n                var value;\n                if (text === undefined) {\n                    return input.value;\n                }\n                if (that.options.autoBind === false && !that.listView.bound()) {\n                    that._setText(text);\n                    return;\n                }\n                dataItem = that.dataItem();\n                if (dataItem && that._text(dataItem) === text) {\n                    value = that._value(dataItem);\n                    if (value === List.unifyType(that._old, typeof value)) {\n                        that._triggerCascade();\n                        return;\n                    }\n                }\n                if (ignoreCase && !that.listView.value().length) {\n                    loweredText = loweredText.toLowerCase();\n                }\n                that._select(function (data) {\n                    data = that._text(data);\n                    if (ignoreCase && !that.listView.value().length) {\n                        data = (data + '').toLowerCase();\n                    }\n                    return data === loweredText;\n                }).done(function () {\n                    if (that.selectedIndex < 0) {\n                        input.value = text;\n                        if (that.options.syncValueAndText) {\n                            that._accessor(text);\n                        }\n                        that._triggerCascade();\n                    }\n                    that._prev = input.value;\n                });\n            },\n            toggle: function (toggle) {\n                this._toggle(toggle, true);\n            },\n            value: function (value) {\n                var that = this;\n                var options = that.options;\n                var listView = that.listView;\n                if (value === undefined) {\n                    value = that._accessor() || that.listView.value()[0];\n                    return value === undefined || value === null ? '' : value;\n                }\n                that.requireValueMapper(that.options, value);\n                that.trigger('set', { value: value });\n                if (value === options.value && that.input.val() === options.text) {\n                    return;\n                }\n                that._accessor(value);\n                if (that._isFilterEnabled() && listView.bound() && listView.isFiltered()) {\n                    that._clearFilter();\n                } else {\n                    that._fetchData();\n                }\n                listView.value(value).done(function () {\n                    if (that.selectedIndex === -1) {\n                        that._accessor(value);\n                        that.input.val(value);\n                        that._placeholder(true);\n                    }\n                    that._old = that._accessor();\n                    that._oldIndex = that.selectedIndex;\n                    that._prev = that.input.val();\n                    if (that._state === STATE_FILTER) {\n                        that._state = STATE_ACCEPT;\n                    }\n                });\n            },\n            _click: function (e) {\n                var that = this;\n                var item = e.item;\n                var dataItem = that.listView.dataItemByIndex(that.listView.getElementIndex(item));\n                e.preventDefault();\n                if (that.trigger('select', {\n                        dataItem: dataItem,\n                        item: item\n                    })) {\n                    that.close();\n                    return;\n                }\n                that._userTriggered = true;\n                that._select(item).done(function () {\n                    that._blur();\n                });\n            },\n            _inputValue: function () {\n                return this.text();\n            },\n            _searchByWord: function (word) {\n                var that = this;\n                var options = that.options;\n                var dataSource = that.dataSource;\n                var ignoreCase = options.ignoreCase;\n                var predicate = function (dataItem) {\n                    var text = that._text(dataItem);\n                    if (text !== undefined) {\n                        text = text + '';\n                        if (text !== '' && word === '') {\n                            return false;\n                        }\n                        if (ignoreCase) {\n                            text = text.toLowerCase();\n                        }\n                        return text.indexOf(word) === 0;\n                    }\n                };\n                if (ignoreCase) {\n                    word = word.toLowerCase();\n                }\n                if (!that.ul[0].firstChild) {\n                    dataSource.one(CHANGE, function () {\n                        if (dataSource.view()[0]) {\n                            that.search(word);\n                        }\n                    }).fetch();\n                    return;\n                }\n                this.listView.focus(this._get(predicate));\n                var current = this.listView.focus();\n                if (current) {\n                    if (options.suggest) {\n                        that.suggest(current);\n                    }\n                    this.open();\n                }\n                if (this.options.highlightFirst && !word) {\n                    this.listView.focusFirst();\n                }\n            },\n            _input: function () {\n                var that = this, element = that.element.removeClass('k-input')[0], accessKey = element.accessKey, wrapper = that.wrapper, SELECTOR = 'input.k-input', name = element.name || '', input, maxLength;\n                if (name) {\n                    name = 'name=\"' + name + '_input\" ';\n                }\n                input = wrapper.find(SELECTOR);\n                if (!input[0]) {\n                    wrapper.append('<span tabindex=\"-1\" unselectable=\"on\" class=\"k-dropdown-wrap k-state-default\"><input ' + name + 'class=\"k-input\" type=\"text\" autocomplete=\"off\"/><span unselectable=\"on\" class=\"k-select\" aria-label=\"select\"><span class=\"k-icon k-i-arrow-60-down\"></span></span></span>').append(that.element);\n                    input = wrapper.find(SELECTOR);\n                }\n                input[0].style.cssText = element.style.cssText;\n                input[0].title = element.title;\n                maxLength = parseInt(this.element.prop('maxlength') || this.element.attr('maxlength'), 10);\n                if (maxLength > -1) {\n                    input[0].maxLength = maxLength;\n                }\n                input.addClass(element.className).css({\n                    width: '100%',\n                    height: element.style.height\n                }).attr({\n                    'role': 'combobox',\n                    'aria-expanded': false\n                }).show();\n                if (placeholderSupported) {\n                    input.attr('placeholder', that.options.placeholder);\n                }\n                if (accessKey) {\n                    element.accessKey = '';\n                    input[0].accessKey = accessKey;\n                }\n                that._focused = that.input = input;\n                that._inputWrapper = $(wrapper[0].firstChild);\n                that._arrow = wrapper.find('.k-select').attr({\n                    'role': 'button',\n                    'tabIndex': -1\n                });\n                that._arrowIcon = that._arrow.find('.k-icon');\n                if (element.id) {\n                    that._arrow.attr('aria-controls', that.ul[0].id);\n                }\n            },\n            _clearButton: function () {\n                this._clear = $('<span unselectable=\"on\" class=\"k-icon k-clear-value k-i-close\" title=\"clear\"></span>').attr({\n                    'role': 'button',\n                    'tabIndex': -1\n                });\n                if (this.options.clearButton) {\n                    this._clear.insertAfter(this.input);\n                    this.wrapper.addClass('k-combobox-clearable');\n                }\n            },\n            _keydown: function (e) {\n                var that = this, key = e.keyCode;\n                that._last = key;\n                clearTimeout(that._typingTimeout);\n                that._typingTimeout = null;\n                if (key != keys.TAB && !that._move(e)) {\n                    that._search();\n                }\n            },\n            _placeholder: function (show) {\n                if (placeholderSupported) {\n                    return;\n                }\n                var that = this, input = that.input, placeholder = that.options.placeholder, value;\n                if (placeholder) {\n                    value = that.value();\n                    if (show === undefined) {\n                        show = !value;\n                    }\n                    input.toggleClass('k-readonly', show);\n                    if (!show) {\n                        if (!value) {\n                            placeholder = '';\n                        } else {\n                            return;\n                        }\n                    }\n                    input.val(placeholder);\n                    if (!placeholder && input[0] === activeElement()) {\n                        caret(input[0], 0, 0);\n                    }\n                }\n            },\n            _search: function () {\n                var that = this;\n                that._typingTimeout = setTimeout(function () {\n                    var value = that.text();\n                    if (that._prev !== value) {\n                        that._prev = value;\n                        if (that.options.filter === 'none') {\n                            that.listView.select(-1);\n                        }\n                        that.search(value);\n                        that._toggleCloseVisibility();\n                    }\n                    that._typingTimeout = null;\n                }, that.options.delay);\n            },\n            _setText: function (text) {\n                this.input.val(text);\n                this._prev = text;\n            },\n            _wrapper: function () {\n                var that = this, element = that.element, wrapper = element.parent();\n                if (!wrapper.is('span.k-widget')) {\n                    wrapper = element.hide().wrap('<span />').parent();\n                    wrapper[0].style.cssText = element[0].style.cssText;\n                }\n                that.wrapper = wrapper.addClass('k-widget k-combobox k-header').addClass(element[0].className).css('display', '');\n            },\n            _clearSelection: function (parent, isFiltered) {\n                var that = this;\n                var hasValue = parent.value();\n                var custom = hasValue && parent.selectedIndex === -1;\n                if (this.selectedIndex == -1 && this.value()) {\n                    return;\n                }\n                if (isFiltered || !hasValue || custom) {\n                    that.options.value = '';\n                    that.value('');\n                }\n            },\n            _preselect: function (value, text) {\n                this.input.val(text);\n                this._accessor(value);\n                this._old = this._accessor();\n                this._oldIndex = this.selectedIndex;\n                this.listView.setValue(value);\n                this._placeholder();\n                this._initialIndex = null;\n                this._presetValue = true;\n            }\n        });\n        ui.plugin(ComboBox);\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.multiselect', [\n        'kendo.list',\n        'kendo.mobile.scroller'\n    ], f);\n}(function () {\n    var __meta__ = {\n        id: 'multiselect',\n        name: 'MultiSelect',\n        category: 'web',\n        description: 'The MultiSelect widget allows the selection from pre-defined values.',\n        depends: ['list'],\n        features: [\n            {\n                id: 'mobile-scroller',\n                name: 'Mobile scroller',\n                description: 'Support for kinetic scrolling in mobile device',\n                depends: ['mobile.scroller']\n            },\n            {\n                id: 'virtualization',\n                name: 'VirtualList',\n                description: 'Support for virtualization',\n                depends: ['virtuallist']\n            }\n        ]\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, ui = kendo.ui, List = ui.List, keys = kendo.keys, activeElement = kendo._activeElement, ObservableArray = kendo.data.ObservableArray, proxy = $.proxy, ID = 'id', LI = 'li', ACCEPT = 'accept', FILTER = 'filter', REBIND = 'rebind', OPEN = 'open', CLOSE = 'close', CHANGE = 'change', PROGRESS = 'progress', SELECT = 'select', DESELECT = 'deselect', ARIA_DISABLED = 'aria-disabled', FOCUSEDCLASS = 'k-state-focused', HIDDENCLASS = 'k-hidden', HOVERCLASS = 'k-state-hover', STATEDISABLED = 'k-state-disabled', DISABLED = 'disabled', READONLY = 'readonly', ns = '.kendoMultiSelect', CLICK = 'click' + ns, KEYDOWN = 'keydown' + ns, MOUSEENTER = 'mouseenter' + ns, MOUSELEAVE = 'mouseleave' + ns, HOVEREVENTS = MOUSEENTER + ' ' + MOUSELEAVE, quotRegExp = /\"/g, isArray = $.isArray, styles = [\n                'font-family',\n                'font-size',\n                'font-stretch',\n                'font-style',\n                'font-weight',\n                'letter-spacing',\n                'text-transform',\n                'line-height'\n            ];\n        var MultiSelect = List.extend({\n            init: function (element, options) {\n                var that = this, id, disabled;\n                that.ns = ns;\n                List.fn.init.call(that, element, options);\n                that._optionsMap = {};\n                that._customOptions = {};\n                that._wrapper();\n                that._tagList();\n                that._input();\n                that._textContainer();\n                that._loader();\n                that._clearButton();\n                that._tabindex(that.input);\n                element = that.element.attr('multiple', 'multiple').hide();\n                options = that.options;\n                if (!options.placeholder) {\n                    options.placeholder = element.data('placeholder');\n                }\n                id = element.attr(ID);\n                if (id) {\n                    that._tagID = id + '_tag_active';\n                    id = id + '_taglist';\n                    that.tagList.attr(ID, id);\n                }\n                that._aria(id);\n                that._dataSource();\n                that._ignoreCase();\n                that._popup();\n                that._tagTemplate();\n                that.requireValueMapper(that.options);\n                that._initList();\n                that._reset();\n                that._enable();\n                that._placeholder();\n                if (options.autoBind) {\n                    that.dataSource.fetch();\n                } else if (options.value) {\n                    that._preselect(options.value);\n                }\n                disabled = $(that.element).parents('fieldset').is(':disabled');\n                if (disabled) {\n                    that.enable(false);\n                }\n                kendo.notify(that);\n                that._toggleCloseVisibility();\n            },\n            options: {\n                name: 'MultiSelect',\n                tagMode: 'multiple',\n                enabled: true,\n                autoBind: true,\n                autoClose: true,\n                highlightFirst: true,\n                dataTextField: '',\n                dataValueField: '',\n                filter: 'startswith',\n                ignoreCase: true,\n                minLength: 1,\n                enforceMinLength: false,\n                delay: 100,\n                value: null,\n                maxSelectedItems: null,\n                placeholder: '',\n                height: 200,\n                animation: {},\n                virtual: false,\n                itemTemplate: '',\n                tagTemplate: '',\n                groupTemplate: '#:data#',\n                fixedGroupTemplate: '#:data#',\n                clearButton: true\n            },\n            events: [\n                OPEN,\n                CLOSE,\n                CHANGE,\n                SELECT,\n                DESELECT,\n                'filtering',\n                'dataBinding',\n                'dataBound'\n            ],\n            setDataSource: function (dataSource) {\n                this.options.dataSource = dataSource;\n                this._state = '';\n                this._dataSource();\n                this.listView.setDataSource(this.dataSource);\n                if (this.options.autoBind) {\n                    this.dataSource.fetch();\n                }\n            },\n            setOptions: function (options) {\n                var listOptions = this._listOptions(options);\n                List.fn.setOptions.call(this, options);\n                this.listView.setOptions(listOptions);\n                this._accessors();\n                this._aria(this.tagList.attr(ID));\n                this._tagTemplate();\n            },\n            currentTag: function (candidate) {\n                var that = this;\n                if (candidate !== undefined) {\n                    if (that._currentTag) {\n                        that._currentTag.removeClass(FOCUSEDCLASS).removeAttr(ID);\n                        that.input.removeAttr('aria-activedescendant');\n                    }\n                    if (candidate) {\n                        candidate.addClass(FOCUSEDCLASS).attr(ID, that._tagID);\n                        that.input.attr('aria-activedescendant', that._tagID);\n                    }\n                    that._currentTag = candidate;\n                } else {\n                    return that._currentTag;\n                }\n            },\n            dataItems: function () {\n                return this.listView.selectedDataItems();\n            },\n            destroy: function () {\n                var that = this, ns = that.ns;\n                clearTimeout(that._busy);\n                clearTimeout(that._typingTimeout);\n                that.wrapper.off(ns);\n                that.tagList.off(ns);\n                that.input.off(ns);\n                that._clear.off(ns);\n                List.fn.destroy.call(that);\n            },\n            _activateItem: function () {\n                List.fn._activateItem.call(this);\n                this.currentTag(null);\n            },\n            _listOptions: function (options) {\n                var that = this;\n                var listOptions = List.fn._listOptions.call(that, $.extend(options, {\n                    selectedItemChange: proxy(that._selectedItemChange, that),\n                    selectable: 'multiple'\n                }));\n                var itemTemplate = this.options.itemTemplate || this.options.template;\n                var template = listOptions.itemTemplate || itemTemplate || listOptions.template;\n                if (!template) {\n                    template = '#:' + kendo.expr(listOptions.dataTextField, 'data') + '#';\n                }\n                listOptions.template = template;\n                return listOptions;\n            },\n            _setListValue: function () {\n                List.fn._setListValue.call(this, this._initialValues.slice(0));\n            },\n            _listChange: function (e) {\n                var data = this.dataSource.flatView();\n                var optionsMap = this._optionsMap;\n                var valueGetter = this._value;\n                if (this._state === REBIND) {\n                    this._state = '';\n                }\n                for (var i = 0; i < e.added.length; i++) {\n                    if (optionsMap[valueGetter(e.added[i].dataItem)] === undefined) {\n                        this._render(data);\n                        break;\n                    }\n                }\n                this._selectValue(e.added, e.removed);\n            },\n            _selectedItemChange: function (e) {\n                var items = e.items;\n                var context;\n                var idx;\n                for (idx = 0; idx < items.length; idx++) {\n                    context = items[idx];\n                    this.tagList.children().eq(context.index).children('span:first').html(this.tagTextTemplate(context.item));\n                }\n            },\n            _wrapperMousedown: function (e) {\n                var that = this;\n                var notInput = e.target.nodeName.toLowerCase() !== 'input';\n                var target = $(e.target);\n                var closeButton = target.hasClass('k-select') || target.hasClass('k-icon');\n                if (closeButton) {\n                    closeButton = !target.closest('.k-select').children('.k-i-arrow-60-down').length;\n                }\n                if (notInput && !(closeButton && kendo.support.mobileOS)) {\n                    e.preventDefault();\n                }\n                if (!closeButton) {\n                    if (that.input[0] !== activeElement() && notInput) {\n                        that.input.focus();\n                    }\n                    if (that.options.minLength === 1) {\n                        that.open();\n                    }\n                }\n            },\n            _inputFocus: function () {\n                this._placeholder(false);\n                this.wrapper.addClass(FOCUSEDCLASS);\n            },\n            _inputFocusout: function () {\n                var that = this;\n                clearTimeout(that._typingTimeout);\n                that.wrapper.removeClass(FOCUSEDCLASS);\n                that._placeholder(!that.listView.selectedDataItems()[0], true);\n                that.close();\n                if (that._state === FILTER) {\n                    that._state = ACCEPT;\n                    that.listView.skipUpdate(true);\n                }\n                that.element.blur();\n            },\n            _removeTag: function (tag) {\n                var that = this;\n                var state = that._state;\n                var position = tag.index();\n                var listView = that.listView;\n                var value = listView.value()[position];\n                var dataItem = that.listView.selectedDataItems()[position];\n                var customIndex = that._customOptions[value];\n                var option;\n                if (that.trigger(DESELECT, {\n                        dataItem: dataItem,\n                        item: tag\n                    })) {\n                    that._close();\n                    return;\n                }\n                if (customIndex === undefined && (state === ACCEPT || state === FILTER)) {\n                    customIndex = that._optionsMap[value];\n                }\n                var done = function () {\n                    that.currentTag(null);\n                    that._change();\n                    that._close();\n                };\n                if (customIndex === undefined) {\n                    listView.select(listView.select()[position]).done(done);\n                } else {\n                    option = that.element[0].children[customIndex];\n                    option.selected = false;\n                    listView.removeAt(position);\n                    tag.remove();\n                    done();\n                }\n            },\n            _tagListClick: function (e) {\n                var target = $(e.currentTarget);\n                if (!target.children('.k-i-arrow-60-down').length) {\n                    this._removeTag(target.closest(LI));\n                }\n            },\n            _clearClick: function () {\n                var that = this;\n                that.tagList.children().each(function (index, tag) {\n                    that._removeTag($(tag));\n                });\n                that.input.val('');\n                that._search();\n                that.trigger('change');\n                that.focus();\n            },\n            _editable: function (options) {\n                var that = this, disable = options.disable, readonly = options.readonly, wrapper = that.wrapper.off(ns), tagList = that.tagList.off(ns), input = that.element.add(that.input.off(ns));\n                if (!readonly && !disable) {\n                    wrapper.removeClass(STATEDISABLED).on(HOVEREVENTS, that._toggleHover).on('mousedown' + ns + ' touchend' + ns, proxy(that._wrapperMousedown, that));\n                    that.input.on(KEYDOWN, proxy(that._keydown, that)).on('paste' + ns, proxy(that._search, that)).on('focus' + ns, proxy(that._inputFocus, that)).on('focusout' + ns, proxy(that._inputFocusout, that));\n                    that._clear.on('click' + ns, proxy(that._clearClick, that));\n                    input.removeAttr(DISABLED).removeAttr(READONLY).attr(ARIA_DISABLED, false);\n                    tagList.on(MOUSEENTER, LI, function () {\n                        $(this).addClass(HOVERCLASS);\n                    }).on(MOUSELEAVE, LI, function () {\n                        $(this).removeClass(HOVERCLASS);\n                    }).on(CLICK, 'li.k-button .k-select', proxy(that._tagListClick, that));\n                } else {\n                    if (disable) {\n                        wrapper.addClass(STATEDISABLED);\n                    } else {\n                        wrapper.removeClass(STATEDISABLED);\n                    }\n                    input.attr(DISABLED, disable).attr(READONLY, readonly).attr(ARIA_DISABLED, disable);\n                }\n            },\n            _close: function () {\n                var that = this;\n                if (that.options.autoClose) {\n                    that.close();\n                } else {\n                    that.popup.position();\n                }\n            },\n            _filterSource: function (filter, force) {\n                if (!force) {\n                    force = this._retrieveData;\n                }\n                this._retrieveData = false;\n                List.fn._filterSource.call(this, filter, force);\n            },\n            close: function () {\n                this.popup.close();\n            },\n            open: function () {\n                var that = this;\n                if (that._request) {\n                    that._retrieveData = false;\n                }\n                if (that._retrieveData || !that.listView.bound() || that._state === ACCEPT) {\n                    that._open = true;\n                    that._state = REBIND;\n                    that.listView.skipUpdate(true);\n                    that._filterSource();\n                } else if (that._allowOpening()) {\n                    that.popup.open();\n                    that._focusItem();\n                }\n            },\n            toggle: function (toggle) {\n                toggle = toggle !== undefined ? toggle : !this.popup.visible();\n                this[toggle ? OPEN : CLOSE]();\n            },\n            refresh: function () {\n                this.listView.refresh();\n            },\n            _listBound: function () {\n                var that = this;\n                var data = that.dataSource.flatView();\n                var skip = that.listView.skip();\n                that._render(data);\n                that._renderFooter();\n                that._renderNoData();\n                that._toggleNoData(!data.length);\n                that._resizePopup();\n                if (that._open) {\n                    that._open = false;\n                    that.toggle(that._allowOpening());\n                }\n                that.popup.position();\n                if (that.options.highlightFirst && (skip === undefined || skip === 0)) {\n                    that.listView.focusFirst();\n                }\n                if (that._touchScroller) {\n                    that._touchScroller.reset();\n                }\n                that._hideBusy();\n                that._makeUnselectable();\n                that.trigger('dataBound');\n            },\n            _inputValue: function () {\n                var that = this;\n                var inputValue = that.input.val();\n                if (that.options.placeholder === inputValue) {\n                    inputValue = '';\n                }\n                return inputValue;\n            },\n            value: function (value) {\n                var that = this;\n                var listView = that.listView;\n                var oldValue = listView.value().slice();\n                var maxSelectedItems = that.options.maxSelectedItems;\n                var clearFilters = listView.bound() && listView.isFiltered();\n                if (value === undefined) {\n                    return oldValue;\n                }\n                that.requireValueMapper(that.options, value);\n                value = that._normalizeValues(value);\n                if (maxSelectedItems !== null && value.length > maxSelectedItems) {\n                    value = value.slice(0, maxSelectedItems);\n                }\n                if (clearFilters) {\n                    that._clearFilter();\n                }\n                listView.value(value);\n                that._old = listView.value();\n                if (!clearFilters) {\n                    that._fetchData();\n                }\n            },\n            _preselect: function (data, value) {\n                var that = this;\n                if (!isArray(data) && !(data instanceof kendo.data.ObservableArray)) {\n                    data = [data];\n                }\n                if ($.isPlainObject(data[0]) || data[0] instanceof kendo.data.ObservableObject || !that.options.dataValueField) {\n                    that.dataSource.data(data);\n                    that.value(value || that._initialValues);\n                    that._retrieveData = true;\n                }\n            },\n            _setOption: function (value, selected) {\n                var option = this.element[0].children[this._optionsMap[value]];\n                if (option) {\n                    option.selected = selected;\n                }\n            },\n            _fetchData: function () {\n                var that = this;\n                var hasItems = !!that.dataSource.view().length;\n                var isEmptyArray = that.listView.value().length === 0;\n                if (isEmptyArray || that._request) {\n                    return;\n                }\n                if (that._retrieveData || !that._fetch && !hasItems) {\n                    that._fetch = true;\n                    that._retrieveData = false;\n                    that.dataSource.read().done(function () {\n                        that._fetch = false;\n                    });\n                }\n            },\n            _isBound: function () {\n                return this.listView.bound() && !this._retrieveData;\n            },\n            _dataSource: function () {\n                var that = this, element = that.element, options = that.options, dataSource = options.dataSource || {};\n                dataSource = isArray(dataSource) ? { data: dataSource } : dataSource;\n                dataSource.select = element;\n                dataSource.fields = [\n                    { field: options.dataTextField },\n                    { field: options.dataValueField }\n                ];\n                if (that.dataSource && that._refreshHandler) {\n                    that._unbindDataSource();\n                } else {\n                    that._progressHandler = proxy(that._showBusy, that);\n                    that._errorHandler = proxy(that._hideBusy, that);\n                }\n                that.dataSource = kendo.data.DataSource.create(dataSource).bind(PROGRESS, that._progressHandler).bind('error', that._errorHandler);\n            },\n            _reset: function () {\n                var that = this, element = that.element, formId = element.attr('form'), form = formId ? $('#' + formId) : element.closest('form');\n                if (form[0]) {\n                    that._resetHandler = function () {\n                        setTimeout(function () {\n                            that.value(that._initialValues);\n                            that._placeholder();\n                        });\n                    };\n                    that._form = form.on('reset', that._resetHandler);\n                }\n            },\n            _initValue: function () {\n                var value = this.options.value || this.element.val();\n                this._old = this._initialValues = this._normalizeValues(value);\n            },\n            _normalizeValues: function (value) {\n                var that = this;\n                if (value === null) {\n                    value = [];\n                } else if (value && $.isPlainObject(value)) {\n                    value = [that._value(value)];\n                } else if (value && $.isPlainObject(value[0])) {\n                    value = $.map(value, function (dataItem) {\n                        return that._value(dataItem);\n                    });\n                } else if (!isArray(value) && !(value instanceof ObservableArray)) {\n                    value = [value];\n                } else if (isArray(value)) {\n                    value = value.slice();\n                }\n                return value;\n            },\n            _change: function () {\n                var that = this, value = that.value();\n                if (!compare(value, that._old)) {\n                    that._old = value.slice();\n                    that.trigger(CHANGE);\n                    that.element.trigger(CHANGE);\n                }\n                that._toggleCloseVisibility();\n            },\n            _click: function (e) {\n                var that = this;\n                var item = e.item;\n                e.preventDefault();\n                that._select(item).done(function () {\n                    that._change();\n                    that._close();\n                });\n            },\n            _keydown: function (e) {\n                var that = this;\n                var key = e.keyCode;\n                var tag = that._currentTag;\n                var listView = that.listView;\n                var current = listView.focus();\n                var hasValue = that.input.val();\n                var isRtl = kendo.support.isRtl(that.wrapper);\n                var visible = that.popup.visible();\n                if (key === keys.DOWN) {\n                    e.preventDefault();\n                    if (!visible) {\n                        that.open();\n                        if (!current) {\n                            listView.focusFirst();\n                        }\n                        return;\n                    }\n                    if (current) {\n                        listView.focusNext();\n                        if (!listView.focus()) {\n                            listView.focusLast();\n                        }\n                    } else {\n                        listView.focusFirst();\n                    }\n                } else if (key === keys.UP) {\n                    if (visible) {\n                        if (current) {\n                            listView.focusPrev();\n                        }\n                        if (!listView.focus()) {\n                            that.close();\n                        }\n                    }\n                    e.preventDefault();\n                } else if (key === keys.LEFT && !isRtl || key === keys.RIGHT && isRtl) {\n                    if (!hasValue) {\n                        tag = tag ? tag.prev() : $(that.tagList[0].lastChild);\n                        if (tag[0]) {\n                            that.currentTag(tag);\n                        }\n                    }\n                } else if (key === keys.RIGHT && !isRtl || key === keys.LEFT && isRtl) {\n                    if (!hasValue && tag) {\n                        tag = tag.next();\n                        that.currentTag(tag[0] ? tag : null);\n                    }\n                } else if (key === keys.ENTER && visible) {\n                    that._select(current).done(function () {\n                        that._change();\n                        that._close();\n                    });\n                    e.preventDefault();\n                } else if (key === keys.ESC) {\n                    if (visible) {\n                        e.preventDefault();\n                    } else {\n                        that.currentTag(null);\n                    }\n                    that.close();\n                } else if (key === keys.HOME) {\n                    if (visible) {\n                        listView.focusFirst();\n                    } else if (!hasValue) {\n                        tag = that.tagList[0].firstChild;\n                        if (tag) {\n                            that.currentTag($(tag));\n                        }\n                    }\n                } else if (key === keys.END) {\n                    if (visible) {\n                        listView.focusLast();\n                    } else if (!hasValue) {\n                        tag = that.tagList[0].lastChild;\n                        if (tag) {\n                            that.currentTag($(tag));\n                        }\n                    }\n                } else if ((key === keys.DELETE || key === keys.BACKSPACE) && !hasValue) {\n                    if (that.options.tagMode === 'single') {\n                        listView.value([]);\n                        that._change();\n                        that._close();\n                        return;\n                    }\n                    if (key === keys.BACKSPACE && !tag) {\n                        tag = $(that.tagList[0].lastChild);\n                    }\n                    if (tag && tag[0]) {\n                        that._removeTag(tag);\n                    }\n                } else if (that.popup.visible() && (key === keys.PAGEDOWN || key === keys.PAGEUP)) {\n                    e.preventDefault();\n                    var direction = key === keys.PAGEDOWN ? 1 : -1;\n                    listView.scrollWith(direction * listView.screenHeight());\n                } else {\n                    clearTimeout(that._typingTimeout);\n                    setTimeout(function () {\n                        that._scale();\n                    });\n                    that._search();\n                }\n            },\n            _hideBusy: function () {\n                var that = this;\n                clearTimeout(that._busy);\n                that.input.attr('aria-busy', false);\n                that._loading.addClass(HIDDENCLASS);\n                that._request = false;\n                that._busy = null;\n                that._showClear();\n            },\n            _showBusyHandler: function () {\n                this.input.attr('aria-busy', true);\n                this._loading.removeClass(HIDDENCLASS);\n                this._hideClear();\n            },\n            _showBusy: function () {\n                var that = this;\n                that._request = true;\n                if (that._busy) {\n                    return;\n                }\n                that._busy = setTimeout(proxy(that._showBusyHandler, that), 100);\n            },\n            _placeholder: function (show, skipCaret) {\n                var that = this;\n                var input = that.input;\n                var active = activeElement();\n                var placeholder = that.options.placeholder;\n                var inputValue = input.val();\n                var isActive = input[0] === active;\n                var caretPos = inputValue.length;\n                if (!isActive || that.options.autoClose || inputValue === placeholder) {\n                    caretPos = 0;\n                    inputValue = '';\n                }\n                if (show === undefined) {\n                    show = false;\n                    if (input[0] !== active) {\n                        show = !that.listView.selectedDataItems()[0];\n                    }\n                }\n                that._prev = inputValue;\n                input.toggleClass('k-readonly', show).val(show ? placeholder : inputValue);\n                if (isActive && !skipCaret) {\n                    kendo.caret(input[0], caretPos, caretPos);\n                }\n                that._scale();\n            },\n            _scale: function () {\n                var that = this, wrapper = that.wrapper, wrapperWidth = wrapper.width(), span = that._span.text(that.input.val()), textWidth;\n                if (!wrapper.is(':visible')) {\n                    span.appendTo(document.documentElement);\n                    wrapperWidth = textWidth = span.width() + 25;\n                    span.appendTo(wrapper);\n                } else {\n                    textWidth = span.width() + 25;\n                }\n                that.input.width(textWidth > wrapperWidth ? wrapperWidth : textWidth);\n            },\n            _option: function (dataValue, dataText, selected) {\n                var option = '<option';\n                if (dataValue !== undefined) {\n                    dataValue += '';\n                    if (dataValue.indexOf('\"') !== -1) {\n                        dataValue = dataValue.replace(quotRegExp, '&quot;');\n                    }\n                    option += ' value=\"' + dataValue + '\"';\n                }\n                if (selected) {\n                    option += ' selected';\n                }\n                option += '>';\n                if (dataText !== undefined) {\n                    option += kendo.htmlEncode(dataText);\n                }\n                return option += '</option>';\n            },\n            _render: function (data) {\n                var selectedItems = this.listView.selectedDataItems();\n                var values = this.listView.value();\n                var length = data.length;\n                var selectedIndex;\n                var options = '';\n                var dataItem;\n                var value;\n                var idx;\n                if (values.length !== selectedItems.length) {\n                    selectedItems = this._buildSelectedItems(values);\n                }\n                var custom = {};\n                var optionsMap = {};\n                for (idx = 0; idx < length; idx++) {\n                    dataItem = data[idx];\n                    value = this._value(dataItem);\n                    selectedIndex = this._selectedItemIndex(value, selectedItems);\n                    if (selectedIndex !== -1) {\n                        selectedItems.splice(selectedIndex, 1);\n                    }\n                    optionsMap[value] = idx;\n                    options += this._option(value, this._text(dataItem), selectedIndex !== -1);\n                }\n                if (selectedItems.length) {\n                    for (idx = 0; idx < selectedItems.length; idx++) {\n                        dataItem = selectedItems[idx];\n                        value = this._value(dataItem);\n                        custom[value] = length;\n                        optionsMap[value] = length;\n                        length += 1;\n                        options += this._option(value, this._text(dataItem), true);\n                    }\n                }\n                this._customOptions = custom;\n                this._optionsMap = optionsMap;\n                this.element.html(options);\n            },\n            _buildSelectedItems: function (values) {\n                var valueField = this.options.dataValueField;\n                var textField = this.options.dataTextField;\n                var result = [];\n                var item;\n                for (var idx = 0; idx < values.length; idx++) {\n                    item = {};\n                    item[valueField] = values[idx];\n                    item[textField] = values[idx];\n                    result.push(item);\n                }\n                return result;\n            },\n            _selectedItemIndex: function (value, selectedItems) {\n                var valueGetter = this._value;\n                var idx = 0;\n                for (; idx < selectedItems.length; idx++) {\n                    if (value === valueGetter(selectedItems[idx])) {\n                        return idx;\n                    }\n                }\n                return -1;\n            },\n            _search: function () {\n                var that = this;\n                that._typingTimeout = setTimeout(function () {\n                    var value = that._inputValue();\n                    if (that._prev !== value) {\n                        that._prev = value;\n                        that.search(value);\n                        that._toggleCloseVisibility();\n                    }\n                }, that.options.delay);\n            },\n            _toggleCloseVisibility: function () {\n                if (this.value().length || this.input.val() && this.input.val() !== this.options.placeholder) {\n                    this._showClear();\n                } else {\n                    this._hideClear();\n                }\n            },\n            _allowOpening: function () {\n                return this._allowSelection() && List.fn._allowOpening.call(this);\n            },\n            _allowSelection: function () {\n                var max = this.options.maxSelectedItems;\n                return max === null || max > this.listView.value().length;\n            },\n            _angularTagItems: function (cmd) {\n                var that = this;\n                that.angular(cmd, function () {\n                    return {\n                        elements: that.tagList[0].children,\n                        data: $.map(that.dataItems(), function (dataItem) {\n                            return { dataItem: dataItem };\n                        })\n                    };\n                });\n            },\n            _selectValue: function (added, removed) {\n                var that = this;\n                var values = that.value();\n                var total = that.dataSource.total();\n                var tagList = that.tagList;\n                var getter = that._value;\n                var removedItem;\n                var addedItem;\n                var idx;\n                that._angularTagItems('cleanup');\n                if (that.options.tagMode === 'multiple') {\n                    for (idx = removed.length - 1; idx > -1; idx--) {\n                        removedItem = removed[idx];\n                        tagList[0].removeChild(tagList[0].children[removedItem.position]);\n                        that._setOption(getter(removedItem.dataItem), false);\n                    }\n                    for (idx = 0; idx < added.length; idx++) {\n                        addedItem = added[idx];\n                        tagList.append(that.tagTemplate(addedItem.dataItem));\n                        that._setOption(getter(addedItem.dataItem), true);\n                    }\n                } else {\n                    if (!that._maxTotal || that._maxTotal < total) {\n                        that._maxTotal = total;\n                    }\n                    tagList.html('');\n                    if (values.length) {\n                        tagList.append(that.tagTemplate({\n                            values: values,\n                            dataItems: that.dataItems(),\n                            maxTotal: that._maxTotal,\n                            currentTotal: total\n                        }));\n                    }\n                    for (idx = removed.length - 1; idx > -1; idx--) {\n                        that._setOption(getter(removed[idx].dataItem), false);\n                    }\n                    for (idx = 0; idx < added.length; idx++) {\n                        that._setOption(getter(added[idx].dataItem), true);\n                    }\n                }\n                that._angularTagItems('compile');\n                that._placeholder();\n            },\n            _select: function (candidate) {\n                var resolved = $.Deferred().resolve();\n                if (!candidate) {\n                    return resolved;\n                }\n                var that = this;\n                var listView = that.listView;\n                var dataItem = listView.dataItemByIndex(listView.getElementIndex(candidate));\n                var isSelected = candidate.hasClass('k-state-selected');\n                if (that._state === REBIND) {\n                    that._state = '';\n                }\n                if (!that._allowSelection()) {\n                    return resolved;\n                }\n                if (that.trigger(isSelected ? DESELECT : SELECT, {\n                        dataItem: dataItem,\n                        item: candidate\n                    })) {\n                    that._close();\n                    return resolved;\n                }\n                return listView.select(candidate).done(function () {\n                    that._placeholder();\n                    if (that._state === FILTER) {\n                        that._state = ACCEPT;\n                        listView.skipUpdate(true);\n                    }\n                });\n            },\n            _input: function () {\n                var that = this;\n                var element = that.element;\n                var accessKey = element[0].accessKey;\n                var input = that._innerWrapper.children('input.k-input');\n                if (!input[0]) {\n                    input = $('<input class=\"k-input\" style=\"width: 25px\" />').appendTo(that._innerWrapper);\n                }\n                element.removeAttr('accesskey');\n                that._focused = that.input = input.attr({\n                    'accesskey': accessKey,\n                    'autocomplete': 'off',\n                    'role': 'listbox',\n                    'title': element[0].title,\n                    'aria-expanded': false\n                });\n            },\n            _tagList: function () {\n                var that = this, tagList = that._innerWrapper.children('ul');\n                if (!tagList[0]) {\n                    tagList = $('<ul role=\"listbox\" deselectable=\"on\" class=\"k-reset\"/>').appendTo(that._innerWrapper);\n                }\n                that.tagList = tagList;\n            },\n            _tagTemplate: function () {\n                var that = this;\n                var options = that.options;\n                var tagTemplate = options.tagTemplate;\n                var hasDataSource = options.dataSource;\n                var isMultiple = options.tagMode === 'multiple';\n                var defaultTemplate;\n                if (that.element[0].length && !hasDataSource) {\n                    options.dataTextField = options.dataTextField || 'text';\n                    options.dataValueField = options.dataValueField || 'value';\n                }\n                defaultTemplate = isMultiple ? kendo.template('#:' + kendo.expr(options.dataTextField, 'data') + '#', { useWithBlock: false }) : kendo.template('#:values.length# item(s) selected');\n                that.tagTextTemplate = tagTemplate = tagTemplate ? kendo.template(tagTemplate) : defaultTemplate;\n                that.tagTemplate = function (data) {\n                    return '<li class=\"k-button\" deselectable=\"on\"><span deselectable=\"on\">' + tagTemplate(data) + '</span><span unselectable=\"on\" aria-label=\"' + (isMultiple ? 'delete' : 'open') + '\" class=\"k-select\"><span class=\"k-icon ' + (isMultiple ? 'k-i-close' : 'k-i-arrow-60-down') + '\">' + '</span></span></li>';\n                };\n            },\n            _loader: function () {\n                this._loading = $('<span class=\"k-icon k-i-loading ' + HIDDENCLASS + '\"></span>').insertAfter(this.input);\n            },\n            _clearButton: function () {\n                this._clear = $('<span deselectable=\"on\" class=\"k-icon k-clear-value k-i-close\" title=\"clear\"></span>').attr({\n                    'role': 'button',\n                    'tabIndex': -1\n                });\n                if (this.options.clearButton) {\n                    this._clear.insertAfter(this.input);\n                }\n            },\n            _textContainer: function () {\n                var computedStyles = kendo.getComputedStyles(this.input[0], styles);\n                computedStyles.position = 'absolute';\n                computedStyles.visibility = 'hidden';\n                computedStyles.top = -3333;\n                computedStyles.left = -3333;\n                this._span = $('<span/>').css(computedStyles).appendTo(this.wrapper);\n            },\n            _wrapper: function () {\n                var that = this, element = that.element, wrapper = element.parent('span.k-multiselect');\n                if (!wrapper[0]) {\n                    wrapper = element.wrap('<div class=\"k-widget k-multiselect k-header\" deselectable=\"on\" />').parent();\n                    wrapper[0].style.cssText = element[0].style.cssText;\n                    wrapper[0].title = element[0].title;\n                    $('<div class=\"k-multiselect-wrap k-floatwrap\" deselectable=\"on\" />').insertBefore(element);\n                }\n                that.wrapper = wrapper.addClass(element[0].className).css('display', '');\n                that._innerWrapper = $(wrapper[0].firstChild);\n            }\n        });\n        function compare(a, b) {\n            var length;\n            if (a === null && b !== null || a !== null && b === null) {\n                return false;\n            }\n            length = a.length;\n            if (length !== b.length) {\n                return false;\n            }\n            while (length--) {\n                if (a[length] !== b[length]) {\n                    return false;\n                }\n            }\n            return true;\n        }\n        ui.plugin(MultiSelect);\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.slider', ['kendo.draganddrop'], f);\n}(function () {\n    var __meta__ = {\n        id: 'slider',\n        name: 'Slider',\n        category: 'web',\n        description: 'The Slider widget provides a rich input for selecting values or ranges of values.',\n        depends: ['draganddrop']\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, Widget = kendo.ui.Widget, Draggable = kendo.ui.Draggable, outerWidth = kendo._outerWidth, outerHeight = kendo._outerHeight, extend = $.extend, format = kendo.format, parse = kendo.parseFloat, proxy = $.proxy, isArray = $.isArray, math = Math, support = kendo.support, pointers = support.pointers, msPointers = support.msPointers, CHANGE = 'change', SLIDE = 'slide', NS = '.slider', MOUSE_DOWN = 'touchstart' + NS + ' mousedown' + NS, TRACK_MOUSE_DOWN = pointers ? 'pointerdown' + NS : msPointers ? 'MSPointerDown' + NS : MOUSE_DOWN, MOUSE_UP = 'touchend' + NS + ' mouseup' + NS, TRACK_MOUSE_UP = pointers ? 'pointerup' : msPointers ? 'MSPointerUp' + NS : MOUSE_UP, MOVE_SELECTION = 'moveSelection', KEY_DOWN = 'keydown' + NS, CLICK = 'click' + NS, MOUSE_OVER = 'mouseover' + NS, FOCUS = 'focus' + NS, BLUR = 'blur' + NS, DRAG_HANDLE = '.k-draghandle', TRACK_SELECTOR = '.k-slider-track', TICK_SELECTOR = '.k-tick', STATE_SELECTED = 'k-state-selected', STATE_FOCUSED = 'k-state-focused', STATE_DEFAULT = 'k-state-default', STATE_DISABLED = 'k-state-disabled', DISABLED = 'disabled', UNDEFINED = 'undefined', TABINDEX = 'tabindex', getTouches = kendo.getTouches;\n        var SliderBase = Widget.extend({\n            init: function (element, options) {\n                var that = this;\n                Widget.fn.init.call(that, element, options);\n                options = that.options;\n                that._isHorizontal = options.orientation == 'horizontal';\n                that._isRtl = that._isHorizontal && kendo.support.isRtl(element);\n                that._position = that._isHorizontal ? 'left' : 'bottom';\n                that._sizeFn = that._isHorizontal ? 'width' : 'height';\n                that._outerSize = that._isHorizontal ? outerWidth : outerHeight;\n                options.tooltip.format = options.tooltip.enabled ? options.tooltip.format || '{0}' : '{0}';\n                if (options.smallStep <= 0) {\n                    throw new Error('Kendo UI Slider smallStep must be a positive number.');\n                }\n                that._createHtml();\n                that.wrapper = that.element.closest('.k-slider');\n                that._trackDiv = that.wrapper.find(TRACK_SELECTOR);\n                that._setTrackDivWidth();\n                that._maxSelection = that._trackDiv[that._sizeFn]();\n                that._sliderItemsInit();\n                that._reset();\n                that._tabindex(that.wrapper.find(DRAG_HANDLE));\n                that[options.enabled ? 'enable' : 'disable']();\n                var rtlDirectionSign = kendo.support.isRtl(that.wrapper) ? -1 : 1;\n                that._keyMap = {\n                    37: step(-1 * rtlDirectionSign * options.smallStep),\n                    40: step(-options.smallStep),\n                    39: step(+1 * rtlDirectionSign * options.smallStep),\n                    38: step(+options.smallStep),\n                    35: setValue(options.max),\n                    36: setValue(options.min),\n                    33: step(+options.largeStep),\n                    34: step(-options.largeStep)\n                };\n                kendo.notify(that);\n            },\n            events: [\n                CHANGE,\n                SLIDE\n            ],\n            options: {\n                enabled: true,\n                min: 0,\n                max: 10,\n                smallStep: 1,\n                largeStep: 5,\n                orientation: 'horizontal',\n                tickPlacement: 'both',\n                tooltip: {\n                    enabled: true,\n                    format: '{0}'\n                }\n            },\n            _distance: function () {\n                return round(this.options.max - this.options.min);\n            },\n            _resize: function () {\n                this._setTrackDivWidth();\n                this.wrapper.find('.k-slider-items').remove();\n                this._maxSelection = this._trackDiv[this._sizeFn]();\n                this._sliderItemsInit();\n                this._refresh();\n                if (this.options.enabled) {\n                    this.enable(true);\n                }\n            },\n            _sliderItemsInit: function () {\n                var that = this, options = that.options;\n                var sizeBetweenTicks = that._maxSelection / ((options.max - options.min) / options.smallStep);\n                var pixelWidths = that._calculateItemsWidth(math.floor(that._distance() / options.smallStep));\n                if (options.tickPlacement != 'none' && sizeBetweenTicks >= 2) {\n                    $(this.element).parent().find('.k-slider-items').remove();\n                    that._trackDiv.before(createSliderItems(options, that._distance()));\n                    that._setItemsWidth(pixelWidths);\n                    that._setItemsTitle();\n                }\n                that._calculateSteps(pixelWidths);\n                if (options.tickPlacement != 'none' && sizeBetweenTicks >= 2 && options.largeStep >= options.smallStep) {\n                    that._setItemsLargeTick();\n                }\n            },\n            getSize: function () {\n                return kendo.dimensions(this.wrapper);\n            },\n            _setTrackDivWidth: function () {\n                var that = this, trackDivPosition = parseFloat(that._trackDiv.css(that._isRtl ? 'right' : that._position), 10) * 2;\n                that._trackDiv[that._sizeFn](that.wrapper[that._sizeFn]() - 2 - trackDivPosition);\n            },\n            _setItemsWidth: function (pixelWidths) {\n                var that = this, options = that.options, first = 0, last = pixelWidths.length - 1, items = that.wrapper.find(TICK_SELECTOR), i, paddingTop = 0, bordersWidth = 2, count = items.length, selection = 0;\n                for (i = 0; i < count - 2; i++) {\n                    $(items[i + 1])[that._sizeFn](pixelWidths[i]);\n                }\n                if (that._isHorizontal) {\n                    $(items[first]).addClass('k-first')[that._sizeFn](pixelWidths[last - 1]);\n                    $(items[last]).addClass('k-last')[that._sizeFn](pixelWidths[last]);\n                } else {\n                    $(items[last]).addClass('k-first')[that._sizeFn](pixelWidths[last]);\n                    $(items[first]).addClass('k-last')[that._sizeFn](pixelWidths[last - 1]);\n                }\n                if (that._distance() % options.smallStep !== 0 && !that._isHorizontal) {\n                    for (i = 0; i < pixelWidths.length; i++) {\n                        selection += pixelWidths[i];\n                    }\n                    paddingTop = that._maxSelection - selection;\n                    paddingTop += parseFloat(that._trackDiv.css(that._position), 10) + bordersWidth;\n                    that.wrapper.find('.k-slider-items').css('padding-top', paddingTop);\n                }\n            },\n            _setItemsTitle: function () {\n                var that = this, options = that.options, items = that.wrapper.find(TICK_SELECTOR), titleNumber = options.min, count = items.length, i = that._isHorizontal && !that._isRtl ? 0 : count - 1, limit = that._isHorizontal && !that._isRtl ? count : -1, increment = that._isHorizontal && !that._isRtl ? 1 : -1;\n                for (; i - limit !== 0; i += increment) {\n                    $(items[i]).attr('title', format(options.tooltip.format, round(titleNumber)));\n                    titleNumber += options.smallStep;\n                }\n            },\n            _setItemsLargeTick: function () {\n                var that = this, options = that.options, items = that.wrapper.find(TICK_SELECTOR), i = 0, item, value;\n                if (removeFraction(options.largeStep) % removeFraction(options.smallStep) === 0 || that._distance() / options.largeStep >= 3) {\n                    if (!that._isHorizontal && !that._isRtl) {\n                        items = $.makeArray(items).reverse();\n                    }\n                    for (i = 0; i < items.length; i++) {\n                        item = $(items[i]);\n                        value = that._values[i];\n                        var valueWithoutFraction = round(removeFraction(value - this.options.min));\n                        if (valueWithoutFraction % removeFraction(options.smallStep) === 0 && valueWithoutFraction % removeFraction(options.largeStep) === 0) {\n                            item.addClass('k-tick-large').html('<span class=\\'k-label\\'>' + item.attr('title') + '</span>');\n                            if (i !== 0 && i !== items.length - 1) {\n                                item.css('line-height', item[that._sizeFn]() + 'px');\n                            }\n                        }\n                    }\n                }\n            },\n            _calculateItemsWidth: function (itemsCount) {\n                var that = this, options = that.options, trackDivSize = parseFloat(that._trackDiv.css(that._sizeFn)) + 1, distance = that._distance(), pixelStep = trackDivSize / distance, itemWidth, pixelWidths, i;\n                if (distance / options.smallStep - math.floor(distance / options.smallStep) > 0) {\n                    trackDivSize -= distance % options.smallStep * pixelStep;\n                }\n                itemWidth = trackDivSize / itemsCount;\n                pixelWidths = [];\n                for (i = 0; i < itemsCount - 1; i++) {\n                    pixelWidths[i] = itemWidth;\n                }\n                pixelWidths[itemsCount - 1] = pixelWidths[itemsCount] = itemWidth / 2;\n                return that._roundWidths(pixelWidths);\n            },\n            _roundWidths: function (pixelWidthsArray) {\n                var balance = 0, count = pixelWidthsArray.length, i;\n                for (i = 0; i < count; i++) {\n                    balance += pixelWidthsArray[i] - math.floor(pixelWidthsArray[i]);\n                    pixelWidthsArray[i] = math.floor(pixelWidthsArray[i]);\n                }\n                balance = math.round(balance);\n                return this._addAdditionalSize(balance, pixelWidthsArray);\n            },\n            _addAdditionalSize: function (additionalSize, pixelWidthsArray) {\n                if (additionalSize === 0) {\n                    return pixelWidthsArray;\n                }\n                var step = parseFloat(pixelWidthsArray.length - 1) / parseFloat(additionalSize == 1 ? additionalSize : additionalSize - 1), i;\n                for (i = 0; i < additionalSize; i++) {\n                    pixelWidthsArray[parseInt(math.round(step * i), 10)] += 1;\n                }\n                return pixelWidthsArray;\n            },\n            _calculateSteps: function (pixelWidths) {\n                var that = this, options = that.options, val = options.min, selection = 0, distance = that._distance(), itemsCount = math.ceil(distance / options.smallStep), i = 1, lastItem;\n                itemsCount += distance / options.smallStep % 1 === 0 ? 1 : 0;\n                pixelWidths.splice(0, 0, pixelWidths[itemsCount - 2] * 2);\n                pixelWidths.splice(itemsCount - 1, 1, pixelWidths.pop() * 2);\n                that._pixelSteps = [selection];\n                that._values = [val];\n                if (itemsCount === 0) {\n                    return;\n                }\n                while (i < itemsCount) {\n                    selection += (pixelWidths[i - 1] + pixelWidths[i]) / 2;\n                    that._pixelSteps[i] = selection;\n                    val += options.smallStep;\n                    that._values[i] = round(val);\n                    i++;\n                }\n                lastItem = distance % options.smallStep === 0 ? itemsCount - 1 : itemsCount;\n                that._pixelSteps[lastItem] = that._maxSelection;\n                that._values[lastItem] = options.max;\n                if (that._isRtl) {\n                    that._pixelSteps.reverse();\n                    that._values.reverse();\n                }\n            },\n            _getValueFromPosition: function (mousePosition, dragableArea) {\n                var that = this, options = that.options, step = math.max(options.smallStep * (that._maxSelection / that._distance()), 0), position = 0, halfStep = step / 2, i;\n                if (that._isHorizontal) {\n                    position = mousePosition - dragableArea.startPoint;\n                    if (that._isRtl) {\n                        position = that._maxSelection - position;\n                    }\n                } else {\n                    position = dragableArea.startPoint - mousePosition;\n                }\n                if (that._maxSelection - (parseInt(that._maxSelection % step, 10) - 3) / 2 < position) {\n                    return options.max;\n                }\n                for (i = 0; i < that._pixelSteps.length; i++) {\n                    if (math.abs(that._pixelSteps[i] - position) - 1 <= halfStep) {\n                        return round(that._values[i]);\n                    }\n                }\n            },\n            _getFormattedValue: function (val, drag) {\n                var that = this, html = '', tooltip = that.options.tooltip, tooltipTemplate, selectionStart, selectionEnd;\n                if (isArray(val)) {\n                    selectionStart = val[0];\n                    selectionEnd = val[1];\n                } else if (drag && drag.type) {\n                    selectionStart = drag.selectionStart;\n                    selectionEnd = drag.selectionEnd;\n                }\n                if (drag) {\n                    tooltipTemplate = drag.tooltipTemplate;\n                }\n                if (!tooltipTemplate && tooltip.template) {\n                    tooltipTemplate = kendo.template(tooltip.template);\n                }\n                if (isArray(val) || drag && drag.type) {\n                    if (tooltipTemplate) {\n                        html = tooltipTemplate({\n                            selectionStart: selectionStart,\n                            selectionEnd: selectionEnd\n                        });\n                    } else {\n                        selectionStart = format(tooltip.format, selectionStart);\n                        selectionEnd = format(tooltip.format, selectionEnd);\n                        html = selectionStart + ' - ' + selectionEnd;\n                    }\n                } else {\n                    if (drag) {\n                        drag.val = val;\n                    }\n                    if (tooltipTemplate) {\n                        html = tooltipTemplate({ value: val });\n                    } else {\n                        html = format(tooltip.format, val);\n                    }\n                }\n                return html;\n            },\n            _getDraggableArea: function () {\n                var that = this, offset = kendo.getOffset(that._trackDiv);\n                return {\n                    startPoint: that._isHorizontal ? offset.left : offset.top + that._maxSelection,\n                    endPoint: that._isHorizontal ? offset.left + that._maxSelection : offset.top\n                };\n            },\n            _createHtml: function () {\n                var that = this, element = that.element, options = that.options, inputs = element.find('input');\n                if (inputs.length == 2) {\n                    inputs.eq(0).prop('value', formatValue(options.selectionStart));\n                    inputs.eq(1).prop('value', formatValue(options.selectionEnd));\n                } else {\n                    element.prop('value', formatValue(options.value));\n                }\n                element.wrap(createWrapper(options, element, that._isHorizontal)).hide();\n                if (options.showButtons) {\n                    element.before(createButton(options, 'increase', that._isHorizontal, that._isRtl)).before(createButton(options, 'decrease', that._isHorizontal, that._isRtl));\n                }\n                element.before(createTrack(options, element));\n            },\n            _focus: function (e) {\n                var that = this, target = e.target, val = that.value(), drag = that._drag;\n                if (!drag) {\n                    if (target == that.wrapper.find(DRAG_HANDLE).eq(0)[0]) {\n                        drag = that._firstHandleDrag;\n                        that._activeHandle = 0;\n                    } else {\n                        drag = that._lastHandleDrag;\n                        that._activeHandle = 1;\n                    }\n                    val = val[that._activeHandle];\n                }\n                $(target).addClass(STATE_FOCUSED + ' ' + STATE_SELECTED);\n                if (drag) {\n                    that._activeHandleDrag = drag;\n                    drag.selectionStart = that.options.selectionStart;\n                    drag.selectionEnd = that.options.selectionEnd;\n                    drag._updateTooltip(val);\n                }\n            },\n            _focusWithMouse: function (target) {\n                target = $(target);\n                var that = this, idx = target.is(DRAG_HANDLE) ? target.index() : 0;\n                window.setTimeout(function () {\n                    that.wrapper.find(DRAG_HANDLE)[idx == 2 ? 1 : 0].focus();\n                }, 1);\n                that._setTooltipTimeout();\n            },\n            _blur: function (e) {\n                var that = this, drag = that._activeHandleDrag;\n                $(e.target).removeClass(STATE_FOCUSED + ' ' + STATE_SELECTED);\n                if (drag) {\n                    drag._removeTooltip();\n                    delete that._activeHandleDrag;\n                    delete that._activeHandle;\n                }\n            },\n            _setTooltipTimeout: function () {\n                var that = this;\n                that._tooltipTimeout = window.setTimeout(function () {\n                    var drag = that._drag || that._activeHandleDrag;\n                    if (drag) {\n                        drag._removeTooltip();\n                    }\n                }, 300);\n            },\n            _clearTooltipTimeout: function () {\n                var that = this;\n                window.clearTimeout(this._tooltipTimeout);\n                var drag = that._drag || that._activeHandleDrag;\n                if (drag && drag.tooltipDiv) {\n                    drag.tooltipDiv.stop(true, false).css('opacity', 1);\n                }\n            },\n            _reset: function () {\n                var that = this, element = that.element, formId = element.attr('form'), form = formId ? $('#' + formId) : element.closest('form');\n                if (form[0]) {\n                    that._form = form.on('reset', proxy(that._formResetHandler, that));\n                }\n            },\n            min: function (value) {\n                if (!value) {\n                    return this.options.min;\n                }\n                this.setOptions({ 'min': value });\n            },\n            max: function (value) {\n                if (!value) {\n                    return this.options.max;\n                }\n                this.setOptions({ 'max': value });\n            },\n            setOptions: function (options) {\n                Widget.fn.setOptions.call(this, options);\n                this._sliderItemsInit();\n                this._refresh();\n            },\n            destroy: function () {\n                if (this._form) {\n                    this._form.off('reset', this._formResetHandler);\n                }\n                Widget.fn.destroy.call(this);\n            }\n        });\n        function createWrapper(options, element, isHorizontal) {\n            var orientationCssClass = isHorizontal ? ' k-slider-horizontal' : ' k-slider-vertical', style = options.style ? options.style : element.attr('style'), cssClasses = element.attr('class') ? ' ' + element.attr('class') : '', tickPlacementCssClass = '';\n            if (options.tickPlacement == 'bottomRight') {\n                tickPlacementCssClass = ' k-slider-bottomright';\n            } else if (options.tickPlacement == 'topLeft') {\n                tickPlacementCssClass = ' k-slider-topleft';\n            }\n            style = style ? ' style=\\'' + style + '\\'' : '';\n            return '<div class=\\'k-widget k-slider' + orientationCssClass + cssClasses + '\\'' + style + '>' + '<div class=\\'k-slider-wrap' + (options.showButtons ? ' k-slider-buttons' : '') + tickPlacementCssClass + '\\'></div></div>';\n        }\n        function createButton(options, type, isHorizontal, isRtl) {\n            var buttonCssClass = '';\n            if (isHorizontal) {\n                if (!isRtl && type == 'increase' || isRtl && type != 'increase') {\n                    buttonCssClass = 'k-i-arrow-60-right';\n                } else {\n                    buttonCssClass = 'k-i-arrow-60-left';\n                }\n            } else {\n                if (type == 'increase') {\n                    buttonCssClass = 'k-i-arrow-60-up';\n                } else {\n                    buttonCssClass = 'k-i-arrow-60-down';\n                }\n            }\n            return '<a class=\\'k-button k-button-' + type + '\\' ' + 'title=\\'' + options[type + 'ButtonTitle'] + '\\' ' + 'aria-label=\\'' + options[type + 'ButtonTitle'] + '\\'>' + '<span class=\\'k-icon ' + buttonCssClass + '\\'></span></a>';\n        }\n        function createSliderItems(options, distance) {\n            var result = '<ul class=\\'k-reset k-slider-items\\'>', count = math.floor(round(distance / options.smallStep)) + 1, i;\n            for (i = 0; i < count; i++) {\n                result += '<li class=\\'k-tick\\' role=\\'presentation\\'>&nbsp;</li>';\n            }\n            result += '</ul>';\n            return result;\n        }\n        function createTrack(options, element) {\n            var dragHandleCount = element.is('input') ? 1 : 2, firstDragHandleTitle = dragHandleCount == 2 ? options.leftDragHandleTitle : options.dragHandleTitle;\n            return '<div class=\\'k-slider-track\\'><div class=\\'k-slider-selection\\'><!-- --></div>' + '<a href=\\'#\\' class=\\'k-draghandle\\' title=\\'' + firstDragHandleTitle + '\\' role=\\'slider\\' aria-valuemin=\\'' + options.min + '\\' aria-valuemax=\\'' + options.max + '\\' aria-valuenow=\\'' + (dragHandleCount > 1 ? options.selectionStart || options.min : options.value || options.min) + '\\'>Drag</a>' + (dragHandleCount > 1 ? '<a href=\\'#\\' class=\\'k-draghandle\\' title=\\'' + options.rightDragHandleTitle + '\\'role=\\'slider\\' aria-valuemin=\\'' + options.min + '\\' aria-valuemax=\\'' + options.max + '\\' aria-valuenow=\\'' + (options.selectionEnd || options.max) + '\\'>Drag</a>' : '') + '</div>';\n        }\n        function step(stepValue) {\n            return function (value) {\n                return value + stepValue;\n            };\n        }\n        function setValue(value) {\n            return function () {\n                return value;\n            };\n        }\n        function formatValue(value) {\n            return (value + '').replace('.', kendo.cultures.current.numberFormat['.']);\n        }\n        function calculatePrecision(value) {\n            var number = value.toString();\n            var precision = 0;\n            number = number.split('.');\n            if (number[1]) {\n                precision = number[1].length;\n            }\n            precision = precision > 10 ? 10 : precision;\n            return precision;\n        }\n        function round(value) {\n            var precision, power;\n            value = parseFloat(value, 10);\n            precision = calculatePrecision(value);\n            power = math.pow(10, precision || 0);\n            return math.round(value * power) / power;\n        }\n        function parseAttr(element, name) {\n            var value = parse(element.getAttribute(name));\n            if (value === null) {\n                value = undefined;\n            }\n            return value;\n        }\n        function defined(value) {\n            return typeof value !== UNDEFINED;\n        }\n        function removeFraction(value) {\n            return value * 10000;\n        }\n        var Slider = SliderBase.extend({\n            init: function (element, options) {\n                var that = this, dragHandle;\n                element.type = 'text';\n                options = extend({}, {\n                    value: parseAttr(element, 'value'),\n                    min: parseAttr(element, 'min'),\n                    max: parseAttr(element, 'max'),\n                    smallStep: parseAttr(element, 'step')\n                }, options);\n                element = $(element);\n                if (options && options.enabled === undefined) {\n                    options.enabled = !element.is('[disabled]');\n                }\n                SliderBase.fn.init.call(that, element, options);\n                options = that.options;\n                if (!defined(options.value) || options.value === null) {\n                    options.value = options.min;\n                    element.prop('value', formatValue(options.min));\n                }\n                options.value = math.max(math.min(options.value, options.max), options.min);\n                dragHandle = that.wrapper.find(DRAG_HANDLE);\n                this._selection = new Slider.Selection(dragHandle, that, options);\n                that._drag = new Slider.Drag(dragHandle, '', that, options);\n            },\n            options: {\n                name: 'Slider',\n                showButtons: true,\n                increaseButtonTitle: 'Increase',\n                decreaseButtonTitle: 'Decrease',\n                dragHandleTitle: 'drag',\n                tooltip: { format: '{0:#,#.##}' },\n                value: null\n            },\n            enable: function (enable) {\n                var that = this, options = that.options, clickHandler, move;\n                that.disable();\n                if (enable === false) {\n                    return;\n                }\n                that.wrapper.removeClass(STATE_DISABLED).addClass(STATE_DEFAULT);\n                that.wrapper.find('input').removeAttr(DISABLED);\n                clickHandler = function (e) {\n                    var touch = getTouches(e)[0];\n                    if (!touch) {\n                        return;\n                    }\n                    var mousePosition = that._isHorizontal ? touch.location.pageX : touch.location.pageY, dragableArea = that._getDraggableArea(), target = $(e.target);\n                    if (target.hasClass('k-draghandle')) {\n                        target.addClass(STATE_FOCUSED + ' ' + STATE_SELECTED);\n                        return;\n                    }\n                    that._update(that._getValueFromPosition(mousePosition, dragableArea));\n                    that._focusWithMouse(e.target);\n                    that._drag.dragstart(e);\n                    e.preventDefault();\n                };\n                that.wrapper.find(TICK_SELECTOR + ', ' + TRACK_SELECTOR).on(TRACK_MOUSE_DOWN, clickHandler).end().on(TRACK_MOUSE_DOWN, function () {\n                    $(document.documentElement).one('selectstart', kendo.preventDefault);\n                }).on(TRACK_MOUSE_UP, function () {\n                    that._drag._end();\n                });\n                that.wrapper.find(DRAG_HANDLE).attr(TABINDEX, 0).on(MOUSE_UP, function () {\n                    that._setTooltipTimeout();\n                }).on(CLICK, function (e) {\n                    that._focusWithMouse(e.target);\n                    e.preventDefault();\n                }).on(FOCUS, proxy(that._focus, that)).on(BLUR, proxy(that._blur, that));\n                move = proxy(function (sign) {\n                    var newVal = that._nextValueByIndex(that._valueIndex + sign * 1);\n                    that._setValueInRange(newVal);\n                    that._drag._updateTooltip(newVal);\n                }, that);\n                if (options.showButtons) {\n                    var mouseDownHandler = proxy(function (e, sign) {\n                        this._clearTooltipTimeout();\n                        if (e.which === 1 || support.touch && e.which === 0) {\n                            move(sign);\n                            this.timeout = setTimeout(proxy(function () {\n                                this.timer = setInterval(function () {\n                                    move(sign);\n                                }, 60);\n                            }, this), 200);\n                        }\n                    }, that);\n                    that.wrapper.find('.k-button').on(MOUSE_UP, proxy(function (e) {\n                        this._clearTimer();\n                        that._focusWithMouse(e.target);\n                    }, that)).on(MOUSE_OVER, function (e) {\n                        $(e.currentTarget).addClass('k-state-hover');\n                    }).on('mouseout' + NS, proxy(function (e) {\n                        $(e.currentTarget).removeClass('k-state-hover');\n                        this._clearTimer();\n                    }, that)).eq(0).on(MOUSE_DOWN, proxy(function (e) {\n                        mouseDownHandler(e, 1);\n                    }, that)).click(false).end().eq(1).on(MOUSE_DOWN, proxy(function (e) {\n                        mouseDownHandler(e, -1);\n                    }, that)).click(kendo.preventDefault);\n                }\n                that.wrapper.find(DRAG_HANDLE).off(KEY_DOWN, false).on(KEY_DOWN, proxy(this._keydown, that));\n                options.enabled = true;\n            },\n            disable: function () {\n                var that = this;\n                that.wrapper.removeClass(STATE_DEFAULT).addClass(STATE_DISABLED);\n                $(that.element).prop(DISABLED, DISABLED);\n                that.wrapper.find('.k-button').off(MOUSE_DOWN).on(MOUSE_DOWN, function (e) {\n                    e.preventDefault();\n                    $(this).addClass('k-state-active');\n                }).off(MOUSE_UP).on(MOUSE_UP, function (e) {\n                    e.preventDefault();\n                    $(this).removeClass('k-state-active');\n                }).off('mouseleave' + NS).on('mouseleave' + NS, kendo.preventDefault).off(MOUSE_OVER).on(MOUSE_OVER, kendo.preventDefault);\n                that.wrapper.find(TICK_SELECTOR + ', ' + TRACK_SELECTOR).off(TRACK_MOUSE_DOWN).off(TRACK_MOUSE_UP);\n                that.wrapper.find(DRAG_HANDLE).attr(TABINDEX, -1).off(MOUSE_UP).off(KEY_DOWN).off(CLICK).off(FOCUS).off(BLUR);\n                that.options.enabled = false;\n            },\n            _update: function (val) {\n                var that = this, change = that.value() != val;\n                that.value(val);\n                if (change) {\n                    that.trigger(CHANGE, { value: that.options.value });\n                }\n            },\n            value: function (value) {\n                var that = this, options = that.options;\n                value = round(value);\n                if (isNaN(value)) {\n                    return options.value;\n                }\n                if (value >= options.min && value <= options.max) {\n                    if (options.value != value) {\n                        that.element.prop('value', formatValue(value));\n                        options.value = value;\n                        that._refreshAriaAttr(value);\n                        that._refresh();\n                    }\n                }\n            },\n            _refresh: function () {\n                this.trigger(MOVE_SELECTION, { value: this.options.value });\n            },\n            _refreshAriaAttr: function (value) {\n                var that = this, drag = that._drag, formattedValue;\n                if (drag && drag._tooltipDiv) {\n                    formattedValue = drag._tooltipDiv.text();\n                } else {\n                    formattedValue = that._getFormattedValue(value, null);\n                }\n                this.wrapper.find(DRAG_HANDLE).attr('aria-valuenow', value).attr('aria-valuetext', formattedValue);\n            },\n            _clearTimer: function () {\n                clearTimeout(this.timeout);\n                clearInterval(this.timer);\n            },\n            _keydown: function (e) {\n                var that = this;\n                if (e.keyCode in that._keyMap) {\n                    that._clearTooltipTimeout();\n                    that._setValueInRange(that._keyMap[e.keyCode](that.options.value));\n                    that._drag._updateTooltip(that.value());\n                    e.preventDefault();\n                }\n            },\n            _setValueInRange: function (val) {\n                var that = this, options = that.options;\n                val = round(val);\n                if (isNaN(val)) {\n                    that._update(options.min);\n                    return;\n                }\n                val = math.max(math.min(val, options.max), options.min);\n                that._update(val);\n            },\n            _nextValueByIndex: function (index) {\n                var count = this._values.length;\n                if (this._isRtl) {\n                    index = count - 1 - index;\n                }\n                return this._values[math.max(0, math.min(index, count - 1))];\n            },\n            _formResetHandler: function () {\n                var that = this, min = that.options.min;\n                setTimeout(function () {\n                    var value = that.element[0].value;\n                    that.value(value === '' || isNaN(value) ? min : value);\n                });\n            },\n            destroy: function () {\n                var that = this;\n                SliderBase.fn.destroy.call(that);\n                that.wrapper.off(NS).find('.k-button').off(NS).end().find(DRAG_HANDLE).off(NS).end().find(TICK_SELECTOR + ', ' + TRACK_SELECTOR).off(NS).end();\n                that._drag.draggable.destroy();\n                that._drag._removeTooltip(true);\n            }\n        });\n        Slider.Selection = function (dragHandle, that, options) {\n            function moveSelection(val) {\n                var selectionValue = val - options.min, index = that._valueIndex = math.ceil(round(selectionValue / options.smallStep)), selection = parseInt(that._pixelSteps[index], 10), selectionDiv = that._trackDiv.find('.k-slider-selection'), halfDragHanndle = parseInt(that._outerSize(dragHandle) / 2, 10), rtlCorrection = that._isRtl ? 2 : 0;\n                selectionDiv[that._sizeFn](that._isRtl ? that._maxSelection - selection : selection);\n                dragHandle.css(that._position, selection - halfDragHanndle - rtlCorrection);\n            }\n            moveSelection(options.value);\n            that.bind([\n                SLIDE,\n                MOVE_SELECTION\n            ], function (e) {\n                moveSelection(parseFloat(e.value, 10));\n            });\n            that.bind(CHANGE, function (e) {\n                moveSelection(parseFloat(e.sender.value(), 10));\n            });\n        };\n        Slider.Drag = function (element, type, owner, options) {\n            var that = this;\n            that.owner = owner;\n            that.options = options;\n            that.element = element;\n            that.type = type;\n            that.draggable = new Draggable(element, {\n                distance: 0,\n                dragstart: proxy(that._dragstart, that),\n                drag: proxy(that.drag, that),\n                dragend: proxy(that.dragend, that),\n                dragcancel: proxy(that.dragcancel, that)\n            });\n            element.click(false);\n        };\n        Slider.Drag.prototype = {\n            dragstart: function (e) {\n                this.owner._activeDragHandle = this;\n                this.draggable.userEvents.cancel();\n                this._dragstart(e);\n                this.dragend();\n            },\n            _dragstart: function (e) {\n                var that = this, owner = that.owner, options = that.options;\n                if (!options.enabled) {\n                    e.preventDefault();\n                    return;\n                }\n                this.owner._activeDragHandle = this;\n                owner.element.off(MOUSE_OVER);\n                owner.wrapper.find('.' + STATE_FOCUSED).removeClass(STATE_FOCUSED + ' ' + STATE_SELECTED);\n                that.element.addClass(STATE_FOCUSED + ' ' + STATE_SELECTED);\n                $(document.documentElement).css('cursor', 'pointer');\n                that.dragableArea = owner._getDraggableArea();\n                that.step = math.max(options.smallStep * (owner._maxSelection / owner._distance()), 0);\n                if (that.type) {\n                    that.selectionStart = options.selectionStart;\n                    that.selectionEnd = options.selectionEnd;\n                    owner._setZIndex(that.type);\n                } else {\n                    that.oldVal = that.val = options.value;\n                }\n                that._removeTooltip(true);\n                that._createTooltip();\n            },\n            _createTooltip: function () {\n                var that = this, owner = that.owner, tooltip = that.options.tooltip, html = '', wnd = $(window), tooltipTemplate, colloutCssClass;\n                if (!tooltip.enabled) {\n                    return;\n                }\n                if (tooltip.template) {\n                    tooltipTemplate = that.tooltipTemplate = kendo.template(tooltip.template);\n                }\n                $('.k-slider-tooltip').remove();\n                that.tooltipDiv = $('<div class=\\'k-widget k-tooltip k-slider-tooltip\\'><!-- --></div>').appendTo(document.body);\n                html = owner._getFormattedValue(that.val || owner.value(), that);\n                if (!that.type) {\n                    colloutCssClass = 'k-callout-' + (owner._isHorizontal ? 's' : 'e');\n                    that.tooltipInnerDiv = '<div class=\\'k-callout ' + colloutCssClass + '\\'><!-- --></div>';\n                    html += that.tooltipInnerDiv;\n                }\n                that.tooltipDiv.html(html);\n                that._scrollOffset = {\n                    top: wnd.scrollTop(),\n                    left: wnd.scrollLeft()\n                };\n                that.moveTooltip();\n            },\n            drag: function (e) {\n                var that = this, owner = that.owner, x = e.x.location, y = e.y.location, startPoint = that.dragableArea.startPoint, endPoint = that.dragableArea.endPoint, slideParams;\n                e.preventDefault();\n                if (owner._isHorizontal) {\n                    if (owner._isRtl) {\n                        that.val = that.constrainValue(x, startPoint, endPoint, x < endPoint);\n                    } else {\n                        that.val = that.constrainValue(x, startPoint, endPoint, x >= endPoint);\n                    }\n                } else {\n                    that.val = that.constrainValue(y, endPoint, startPoint, y <= endPoint);\n                }\n                if (that.oldVal != that.val) {\n                    that.oldVal = that.val;\n                    if (that.type) {\n                        if (that.type == 'firstHandle') {\n                            if (that.val < that.selectionEnd) {\n                                that.selectionStart = that.val;\n                            } else {\n                                that.selectionStart = that.selectionEnd = that.val;\n                            }\n                        } else {\n                            if (that.val > that.selectionStart) {\n                                that.selectionEnd = that.val;\n                            } else {\n                                that.selectionStart = that.selectionEnd = that.val;\n                            }\n                        }\n                        slideParams = {\n                            values: [\n                                that.selectionStart,\n                                that.selectionEnd\n                            ],\n                            value: [\n                                that.selectionStart,\n                                that.selectionEnd\n                            ]\n                        };\n                    } else {\n                        slideParams = { value: that.val };\n                    }\n                    owner.trigger(SLIDE, slideParams);\n                }\n                that._updateTooltip(that.val);\n            },\n            _updateTooltip: function (val) {\n                var that = this, options = that.options, tooltip = options.tooltip, html = '';\n                if (!tooltip.enabled) {\n                    return;\n                }\n                if (!that.tooltipDiv) {\n                    that._createTooltip();\n                }\n                html = that.owner._getFormattedValue(round(val), that);\n                if (!that.type) {\n                    html += that.tooltipInnerDiv;\n                }\n                that.tooltipDiv.html(html);\n                that.moveTooltip();\n            },\n            dragcancel: function () {\n                this.owner._refresh();\n                $(document.documentElement).css('cursor', '');\n                return this._end();\n            },\n            dragend: function () {\n                var that = this, owner = that.owner;\n                $(document.documentElement).css('cursor', '');\n                if (that.type) {\n                    owner._update(that.selectionStart, that.selectionEnd);\n                } else {\n                    owner._update(that.val);\n                    that.draggable.userEvents._disposeAll();\n                }\n                that.draggable.userEvents.cancel();\n                return that._end();\n            },\n            _end: function () {\n                var that = this, owner = that.owner;\n                owner._focusWithMouse(that.element);\n                owner.element.on(MOUSE_OVER);\n                return false;\n            },\n            _removeTooltip: function (noAnimation) {\n                var that = this, owner = that.owner;\n                if (that.tooltipDiv && owner.options.tooltip.enabled && owner.options.enabled) {\n                    if (noAnimation) {\n                        that.tooltipDiv.remove();\n                        that.tooltipDiv = null;\n                    } else {\n                        that.tooltipDiv.fadeOut('slow', function () {\n                            $(this).remove();\n                            that.tooltipDiv = null;\n                        });\n                    }\n                }\n            },\n            moveTooltip: function () {\n                var that = this, owner = that.owner, top = 0, left = 0, element = that.element, offset = kendo.getOffset(element), margin = 8, viewport = $(window), callout = that.tooltipDiv.find('.k-callout'), width = outerWidth(that.tooltipDiv), height = outerHeight(that.tooltipDiv), dragHandles, sdhOffset, diff, anchorSize;\n                if (that.type) {\n                    dragHandles = owner.wrapper.find(DRAG_HANDLE);\n                    offset = kendo.getOffset(dragHandles.eq(0));\n                    sdhOffset = kendo.getOffset(dragHandles.eq(1));\n                    if (owner._isHorizontal) {\n                        top = sdhOffset.top;\n                        left = offset.left + (sdhOffset.left - offset.left) / 2;\n                    } else {\n                        top = offset.top + (sdhOffset.top - offset.top) / 2;\n                        left = sdhOffset.left;\n                    }\n                    anchorSize = outerWidth(dragHandles.eq(0)) + 2 * margin;\n                } else {\n                    top = offset.top;\n                    left = offset.left;\n                    anchorSize = outerWidth(element) + 2 * margin;\n                }\n                if (owner._isHorizontal) {\n                    left -= parseInt((width - owner._outerSize(element)) / 2, 10);\n                    top -= height + callout.height() + margin;\n                } else {\n                    top -= parseInt((height - owner._outerSize(element)) / 2, 10);\n                    left -= width + callout.width() + margin;\n                }\n                if (owner._isHorizontal) {\n                    diff = that._flip(top, height, anchorSize, outerHeight(viewport) + that._scrollOffset.top);\n                    top += diff;\n                    left += that._fit(left, width, outerWidth(viewport) + that._scrollOffset.left);\n                } else {\n                    diff = that._flip(left, width, anchorSize, outerWidth(viewport) + that._scrollOffset.left);\n                    top += that._fit(top, height, outerHeight(viewport) + that._scrollOffset.top);\n                    left += diff;\n                }\n                if (diff > 0 && callout) {\n                    callout.removeClass();\n                    callout.addClass('k-callout k-callout-' + (owner._isHorizontal ? 'n' : 'w'));\n                }\n                that.tooltipDiv.css({\n                    top: top,\n                    left: left\n                });\n            },\n            _fit: function (position, size, viewPortEnd) {\n                var output = 0;\n                if (position + size > viewPortEnd) {\n                    output = viewPortEnd - (position + size);\n                }\n                if (position < 0) {\n                    output = -position;\n                }\n                return output;\n            },\n            _flip: function (offset, size, anchorSize, viewPortEnd) {\n                var output = 0;\n                if (offset + size > viewPortEnd) {\n                    output += -(anchorSize + size);\n                }\n                if (offset + output < 0) {\n                    output += anchorSize + size;\n                }\n                return output;\n            },\n            constrainValue: function (position, min, max, maxOverflow) {\n                var that = this, val = 0;\n                if (min < position && position < max) {\n                    val = that.owner._getValueFromPosition(position, that.dragableArea);\n                } else {\n                    if (maxOverflow) {\n                        val = that.options.max;\n                    } else {\n                        val = that.options.min;\n                    }\n                }\n                return val;\n            }\n        };\n        kendo.ui.plugin(Slider);\n        var RangeSlider = SliderBase.extend({\n            init: function (element, options) {\n                var that = this, inputs = $(element).find('input'), firstInput = inputs.eq(0)[0], secondInput = inputs.eq(1)[0];\n                firstInput.type = 'text';\n                secondInput.type = 'text';\n                if (options && options.showButtons) {\n                    if (window.console) {\n                        window.console.warn('showbuttons option is not supported for the range slider, ignoring');\n                    }\n                    options.showButtons = false;\n                }\n                options = extend({}, {\n                    selectionStart: parseAttr(firstInput, 'value'),\n                    min: parseAttr(firstInput, 'min'),\n                    max: parseAttr(firstInput, 'max'),\n                    smallStep: parseAttr(firstInput, 'step')\n                }, {\n                    selectionEnd: parseAttr(secondInput, 'value'),\n                    min: parseAttr(secondInput, 'min'),\n                    max: parseAttr(secondInput, 'max'),\n                    smallStep: parseAttr(secondInput, 'step')\n                }, options);\n                if (options && options.enabled === undefined) {\n                    options.enabled = !inputs.is('[disabled]');\n                }\n                SliderBase.fn.init.call(that, element, options);\n                options = that.options;\n                if (!defined(options.selectionStart) || options.selectionStart === null) {\n                    options.selectionStart = options.min;\n                    inputs.eq(0).prop('value', formatValue(options.min));\n                }\n                if (!defined(options.selectionEnd) || options.selectionEnd === null) {\n                    options.selectionEnd = options.max;\n                    inputs.eq(1).prop('value', formatValue(options.max));\n                }\n                var dragHandles = that.wrapper.find(DRAG_HANDLE);\n                this._selection = new RangeSlider.Selection(dragHandles, that, options);\n                that._firstHandleDrag = new Slider.Drag(dragHandles.eq(0), 'firstHandle', that, options);\n                that._lastHandleDrag = new Slider.Drag(dragHandles.eq(1), 'lastHandle', that, options);\n            },\n            options: {\n                name: 'RangeSlider',\n                leftDragHandleTitle: 'drag',\n                rightDragHandleTitle: 'drag',\n                tooltip: { format: '{0:#,#.##}' },\n                selectionStart: null,\n                selectionEnd: null\n            },\n            enable: function (enable) {\n                var that = this, options = that.options, clickHandler;\n                that.disable();\n                if (enable === false) {\n                    return;\n                }\n                that.wrapper.removeClass(STATE_DISABLED).addClass(STATE_DEFAULT);\n                that.wrapper.find('input').removeAttr(DISABLED);\n                clickHandler = function (e) {\n                    var touch = getTouches(e)[0];\n                    if (!touch) {\n                        return;\n                    }\n                    var mousePosition = that._isHorizontal ? touch.location.pageX : touch.location.pageY, dragableArea = that._getDraggableArea(), val = that._getValueFromPosition(mousePosition, dragableArea), target = $(e.target), from, to, drag;\n                    if (target.hasClass('k-draghandle')) {\n                        that.wrapper.find('.' + STATE_FOCUSED).removeClass(STATE_FOCUSED + ' ' + STATE_SELECTED);\n                        target.addClass(STATE_FOCUSED + ' ' + STATE_SELECTED);\n                        return;\n                    }\n                    if (val < options.selectionStart) {\n                        from = val;\n                        to = options.selectionEnd;\n                        drag = that._firstHandleDrag;\n                    } else if (val > that.selectionEnd) {\n                        from = options.selectionStart;\n                        to = val;\n                        drag = that._lastHandleDrag;\n                    } else {\n                        if (val - options.selectionStart <= options.selectionEnd - val) {\n                            from = val;\n                            to = options.selectionEnd;\n                            drag = that._firstHandleDrag;\n                        } else {\n                            from = options.selectionStart;\n                            to = val;\n                            drag = that._lastHandleDrag;\n                        }\n                    }\n                    drag.dragstart(e);\n                    that._setValueInRange(from, to);\n                    that._focusWithMouse(drag.element);\n                };\n                that.wrapper.find(TICK_SELECTOR + ', ' + TRACK_SELECTOR).on(TRACK_MOUSE_DOWN, clickHandler).end().on(TRACK_MOUSE_DOWN, function () {\n                    $(document.documentElement).one('selectstart', kendo.preventDefault);\n                }).on(TRACK_MOUSE_UP, function () {\n                    if (that._activeDragHandle) {\n                        that._activeDragHandle._end();\n                    }\n                });\n                that.wrapper.find(DRAG_HANDLE).attr(TABINDEX, 0).on(MOUSE_UP, function () {\n                    that._setTooltipTimeout();\n                }).on(CLICK, function (e) {\n                    that._focusWithMouse(e.target);\n                    e.preventDefault();\n                }).on(FOCUS, proxy(that._focus, that)).on(BLUR, proxy(that._blur, that));\n                that.wrapper.find(DRAG_HANDLE).off(KEY_DOWN, kendo.preventDefault).eq(0).on(KEY_DOWN, proxy(function (e) {\n                    this._keydown(e, 'firstHandle');\n                }, that)).end().eq(1).on(KEY_DOWN, proxy(function (e) {\n                    this._keydown(e, 'lastHandle');\n                }, that));\n                that.options.enabled = true;\n            },\n            disable: function () {\n                var that = this;\n                that.wrapper.removeClass(STATE_DEFAULT).addClass(STATE_DISABLED);\n                that.wrapper.find('input').prop(DISABLED, DISABLED);\n                that.wrapper.find(TICK_SELECTOR + ', ' + TRACK_SELECTOR).off(TRACK_MOUSE_DOWN).off(TRACK_MOUSE_UP);\n                that.wrapper.find(DRAG_HANDLE).attr(TABINDEX, -1).off(MOUSE_UP).off(KEY_DOWN).off(CLICK).off(FOCUS).off(BLUR);\n                that.options.enabled = false;\n            },\n            _keydown: function (e, handle) {\n                var that = this, selectionStartValue = that.options.selectionStart, selectionEndValue = that.options.selectionEnd, dragSelectionStart, dragSelectionEnd, activeHandleDrag;\n                if (e.keyCode in that._keyMap) {\n                    that._clearTooltipTimeout();\n                    if (handle == 'firstHandle') {\n                        activeHandleDrag = that._activeHandleDrag = that._firstHandleDrag;\n                        selectionStartValue = that._keyMap[e.keyCode](selectionStartValue);\n                        if (selectionStartValue > selectionEndValue) {\n                            selectionEndValue = selectionStartValue;\n                        }\n                    } else {\n                        activeHandleDrag = that._activeHandleDrag = that._lastHandleDrag;\n                        selectionEndValue = that._keyMap[e.keyCode](selectionEndValue);\n                        if (selectionStartValue > selectionEndValue) {\n                            selectionStartValue = selectionEndValue;\n                        }\n                    }\n                    that._setValueInRange(round(selectionStartValue), round(selectionEndValue));\n                    dragSelectionStart = Math.max(selectionStartValue, that.options.selectionStart);\n                    dragSelectionEnd = Math.min(selectionEndValue, that.options.selectionEnd);\n                    activeHandleDrag.selectionEnd = Math.max(dragSelectionEnd, that.options.selectionStart);\n                    activeHandleDrag.selectionStart = Math.min(dragSelectionStart, that.options.selectionEnd);\n                    activeHandleDrag._updateTooltip(that.value()[that._activeHandle]);\n                    e.preventDefault();\n                }\n            },\n            _update: function (selectionStart, selectionEnd) {\n                var that = this, values = that.value();\n                var change = values[0] != selectionStart || values[1] != selectionEnd;\n                that.value([\n                    selectionStart,\n                    selectionEnd\n                ]);\n                if (change) {\n                    that.trigger(CHANGE, {\n                        values: [\n                            selectionStart,\n                            selectionEnd\n                        ],\n                        value: [\n                            selectionStart,\n                            selectionEnd\n                        ]\n                    });\n                }\n            },\n            value: function (value) {\n                if (value && value.length) {\n                    return this._value(value[0], value[1]);\n                } else {\n                    return this._value();\n                }\n            },\n            _value: function (start, end) {\n                var that = this, options = that.options, selectionStart = options.selectionStart, selectionEnd = options.selectionEnd;\n                if (isNaN(start) && isNaN(end)) {\n                    return [\n                        selectionStart,\n                        selectionEnd\n                    ];\n                } else {\n                    start = round(start);\n                    end = round(end);\n                }\n                if (start >= options.min && start <= options.max && end >= options.min && end <= options.max && start <= end) {\n                    if (selectionStart != start || selectionEnd != end) {\n                        that.element.find('input').eq(0).prop('value', formatValue(start)).end().eq(1).prop('value', formatValue(end));\n                        options.selectionStart = start;\n                        options.selectionEnd = end;\n                        that._refresh();\n                        that._refreshAriaAttr(start, end);\n                    }\n                }\n            },\n            values: function (start, end) {\n                if (isArray(start)) {\n                    return this._value(start[0], start[1]);\n                } else {\n                    return this._value(start, end);\n                }\n            },\n            _refresh: function () {\n                var that = this, options = that.options;\n                that.trigger(MOVE_SELECTION, {\n                    values: [\n                        options.selectionStart,\n                        options.selectionEnd\n                    ],\n                    value: [\n                        options.selectionStart,\n                        options.selectionEnd\n                    ]\n                });\n                if (options.selectionStart == options.max && options.selectionEnd == options.max) {\n                    that._setZIndex('firstHandle');\n                }\n            },\n            _refreshAriaAttr: function (start, end) {\n                var that = this, dragHandles = that.wrapper.find(DRAG_HANDLE), drag = that._activeHandleDrag, formattedValue;\n                formattedValue = that._getFormattedValue([\n                    start,\n                    end\n                ], drag);\n                dragHandles.eq(0).attr('aria-valuenow', start);\n                dragHandles.eq(1).attr('aria-valuenow', end);\n                dragHandles.attr('aria-valuetext', formattedValue);\n            },\n            _setValueInRange: function (selectionStart, selectionEnd) {\n                var options = this.options;\n                selectionStart = math.max(math.min(selectionStart, options.max), options.min);\n                selectionEnd = math.max(math.min(selectionEnd, options.max), options.min);\n                if (selectionStart == options.max && selectionEnd == options.max) {\n                    this._setZIndex('firstHandle');\n                }\n                this._update(math.min(selectionStart, selectionEnd), math.max(selectionStart, selectionEnd));\n            },\n            _setZIndex: function (type) {\n                this.wrapper.find(DRAG_HANDLE).each(function (index) {\n                    $(this).css('z-index', type == 'firstHandle' ? 1 - index : index);\n                });\n            },\n            _formResetHandler: function () {\n                var that = this, options = that.options;\n                setTimeout(function () {\n                    var inputs = that.element.find('input');\n                    var start = inputs[0].value;\n                    var end = inputs[1].value;\n                    that.values(start === '' || isNaN(start) ? options.min : start, end === '' || isNaN(end) ? options.max : end);\n                });\n            },\n            destroy: function () {\n                var that = this;\n                SliderBase.fn.destroy.call(that);\n                that.wrapper.off(NS).find(TICK_SELECTOR + ', ' + TRACK_SELECTOR).off(NS).end().find(DRAG_HANDLE).off(NS);\n                that._firstHandleDrag.draggable.destroy();\n                that._lastHandleDrag.draggable.destroy();\n            }\n        });\n        RangeSlider.Selection = function (dragHandles, that, options) {\n            function moveSelection(value) {\n                value = value || [];\n                var selectionStartValue = value[0] - options.min, selectionEndValue = value[1] - options.min, selectionStartIndex = math.ceil(round(selectionStartValue / options.smallStep)), selectionEndIndex = math.ceil(round(selectionEndValue / options.smallStep)), selectionStart = that._pixelSteps[selectionStartIndex], selectionEnd = that._pixelSteps[selectionEndIndex], halfHandle = parseInt(that._outerSize(dragHandles.eq(0)) / 2, 10), rtlCorrection = that._isRtl ? 2 : 0;\n                dragHandles.eq(0).css(that._position, selectionStart - halfHandle - rtlCorrection).end().eq(1).css(that._position, selectionEnd - halfHandle - rtlCorrection);\n                makeSelection(selectionStart, selectionEnd);\n            }\n            function makeSelection(selectionStart, selectionEnd) {\n                var selection, selectionPosition, selectionDiv = that._trackDiv.find('.k-slider-selection');\n                selection = math.abs(selectionStart - selectionEnd);\n                selectionDiv[that._sizeFn](selection);\n                if (that._isRtl) {\n                    selectionPosition = math.max(selectionStart, selectionEnd);\n                    selectionDiv.css('right', that._maxSelection - selectionPosition - 1);\n                } else {\n                    selectionPosition = math.min(selectionStart, selectionEnd);\n                    selectionDiv.css(that._position, selectionPosition - 1);\n                }\n            }\n            moveSelection(that.value());\n            that.bind([\n                CHANGE,\n                SLIDE,\n                MOVE_SELECTION\n            ], function (e) {\n                moveSelection(e.values);\n            });\n        };\n        kendo.ui.plugin(RangeSlider);\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.colorpicker', [\n        'kendo.core',\n        'kendo.color',\n        'kendo.popup',\n        'kendo.slider',\n        'kendo.userevents',\n        'kendo.button'\n    ], f);\n}(function () {\n    var __meta__ = {\n        id: 'colorpicker',\n        name: 'Color tools',\n        category: 'web',\n        description: 'Color selection widgets',\n        depends: [\n            'core',\n            'color',\n            'popup',\n            'slider',\n            'userevents',\n            'button'\n        ]\n    };\n    (function ($, parseInt, undefined) {\n        var kendo = window.kendo, ui = kendo.ui, Widget = ui.Widget, parseColor = kendo.parseColor, Color = kendo.Color, KEYS = kendo.keys, BACKGROUNDCOLOR = 'background-color', ITEMSELECTEDCLASS = 'k-state-selected', SIMPLEPALETTE = '000000,7f7f7f,880015,ed1c24,ff7f27,fff200,22b14c,00a2e8,3f48cc,a349a4,ffffff,c3c3c3,b97a57,ffaec9,ffc90e,efe4b0,b5e61d,99d9ea,7092be,c8bfe7', WEBPALETTE = 'FFFFFF,FFCCFF,FF99FF,FF66FF,FF33FF,FF00FF,CCFFFF,CCCCFF,CC99FF,CC66FF,CC33FF,CC00FF,99FFFF,99CCFF,9999FF,9966FF,9933FF,9900FF,FFFFCC,FFCCCC,FF99CC,FF66CC,FF33CC,FF00CC,CCFFCC,CCCCCC,CC99CC,CC66CC,CC33CC,CC00CC,99FFCC,99CCCC,9999CC,9966CC,9933CC,9900CC,FFFF99,FFCC99,FF9999,FF6699,FF3399,FF0099,CCFF99,CCCC99,CC9999,CC6699,CC3399,CC0099,99FF99,99CC99,999999,996699,993399,990099,FFFF66,FFCC66,FF9966,FF6666,FF3366,FF0066,CCFF66,CCCC66,CC9966,CC6666,CC3366,CC0066,99FF66,99CC66,999966,996666,993366,990066,FFFF33,FFCC33,FF9933,FF6633,FF3333,FF0033,CCFF33,CCCC33,CC9933,CC6633,CC3333,CC0033,99FF33,99CC33,999933,996633,993333,990033,FFFF00,FFCC00,FF9900,FF6600,FF3300,FF0000,CCFF00,CCCC00,CC9900,CC6600,CC3300,CC0000,99FF00,99CC00,999900,996600,993300,990000,66FFFF,66CCFF,6699FF,6666FF,6633FF,6600FF,33FFFF,33CCFF,3399FF,3366FF,3333FF,3300FF,00FFFF,00CCFF,0099FF,0066FF,0033FF,0000FF,66FFCC,66CCCC,6699CC,6666CC,6633CC,6600CC,33FFCC,33CCCC,3399CC,3366CC,3333CC,3300CC,00FFCC,00CCCC,0099CC,0066CC,0033CC,0000CC,66FF99,66CC99,669999,666699,663399,660099,33FF99,33CC99,339999,336699,333399,330099,00FF99,00CC99,009999,006699,003399,000099,66FF66,66CC66,669966,666666,663366,660066,33FF66,33CC66,339966,336666,333366,330066,00FF66,00CC66,009966,006666,003366,000066,66FF33,66CC33,669933,666633,663333,660033,33FF33,33CC33,339933,336633,333333,330033,00FF33,00CC33,009933,006633,003333,000033,66FF00,66CC00,669900,666600,663300,660000,33FF00,33CC00,339900,336600,333300,330000,00FF00,00CC00,009900,006600,003300,000000', WHITE = '#ffffff', MESSAGES = {\n                apply: 'Apply',\n                cancel: 'Cancel',\n                noColor: 'no color',\n                clearColor: 'Clear color',\n                previewInput: 'Color Hexadecimal Code'\n            }, NS = '.kendoColorTools', CLICK_NS = 'click' + NS, KEYDOWN_NS = 'keydown' + NS, browser = kendo.support.browser, isIE8 = browser.msie && browser.version < 9;\n        var ColorSelector = Widget.extend({\n            init: function (element, options) {\n                var that = this, ariaId;\n                Widget.fn.init.call(that, element, options);\n                element = that.element;\n                options = that.options;\n                that._value = options.value = parseColor(options.value);\n                that._tabIndex = element.attr('tabIndex') || 0;\n                ariaId = that._ariaId = options.ariaId;\n                if (ariaId) {\n                    element.attr('aria-labelledby', ariaId);\n                }\n                if (options._standalone) {\n                    that._triggerSelect = that._triggerChange;\n                }\n            },\n            options: {\n                name: 'ColorSelector',\n                value: null,\n                _standalone: true\n            },\n            events: [\n                'change',\n                'select',\n                'cancel'\n            ],\n            color: function (value) {\n                if (value !== undefined) {\n                    this._value = parseColor(value);\n                    this._updateUI(this._value);\n                }\n                return this._value;\n            },\n            value: function (color) {\n                color = this.color(color);\n                if (color) {\n                    if (this.options.opacity) {\n                        color = color.toCssRgba();\n                    } else {\n                        color = color.toCss();\n                    }\n                }\n                return color || null;\n            },\n            enable: function (enable) {\n                if (arguments.length === 0) {\n                    enable = true;\n                }\n                $('.k-disabled-overlay', this.wrapper).remove();\n                if (!enable) {\n                    this.wrapper.append('<div class=\\'k-disabled-overlay\\'></div>');\n                }\n                this._onEnable(enable);\n            },\n            _select: function (color, nohooks) {\n                var prev = this._value;\n                color = this.color(color);\n                if (!nohooks) {\n                    this.element.trigger('change');\n                    if (!color.equals(prev)) {\n                        this.trigger('change', { value: this.value() });\n                    } else if (!this._standalone) {\n                        this.trigger('cancel');\n                    }\n                }\n            },\n            _triggerSelect: function (color) {\n                triggerEvent(this, 'select', color);\n            },\n            _triggerChange: function (color) {\n                triggerEvent(this, 'change', color);\n            },\n            destroy: function () {\n                if (this.element) {\n                    this.element.off(NS);\n                }\n                if (this.wrapper) {\n                    this.wrapper.off(NS).find('*').off(NS);\n                }\n                this.wrapper = null;\n                Widget.fn.destroy.call(this);\n            },\n            _updateUI: $.noop,\n            _selectOnHide: function () {\n                return null;\n            },\n            _cancel: function () {\n                this.trigger('cancel');\n            }\n        });\n        function triggerEvent(self, type, color) {\n            color = parseColor(color);\n            if (color && !color.equals(self.color())) {\n                if (type == 'change') {\n                    self._value = color;\n                }\n                if (color.a != 1) {\n                    color = color.toCssRgba();\n                } else {\n                    color = color.toCss();\n                }\n                self.trigger(type, { value: color });\n            }\n        }\n        var ColorPalette = ColorSelector.extend({\n            init: function (element, options) {\n                var that = this;\n                ColorSelector.fn.init.call(that, element, options);\n                element = that.wrapper = that.element;\n                options = that.options;\n                var colors = options.palette;\n                if (colors == 'websafe') {\n                    colors = WEBPALETTE;\n                    options.columns = 18;\n                } else if (colors == 'basic') {\n                    colors = SIMPLEPALETTE;\n                }\n                if (typeof colors == 'string') {\n                    colors = colors.split(',');\n                }\n                if ($.isArray(colors)) {\n                    colors = $.map(colors, function (x) {\n                        return parseColor(x);\n                    });\n                }\n                that._selectedID = (options.ariaId || kendo.guid()) + '_selected';\n                element.addClass('k-widget k-colorpalette').attr('role', 'grid').attr('aria-readonly', 'true').append($(that._template({\n                    colors: colors,\n                    columns: options.columns,\n                    tileSize: options.tileSize,\n                    value: that._value,\n                    id: options.ariaId\n                }))).on(CLICK_NS, '.k-item', function (ev) {\n                    that._select($(ev.currentTarget).css(BACKGROUNDCOLOR));\n                }).attr('tabIndex', that._tabIndex).on(KEYDOWN_NS, bind(that._keydown, that));\n                var tileSize = options.tileSize, width, height;\n                if (tileSize) {\n                    if (/number|string/.test(typeof tileSize)) {\n                        width = height = parseFloat(tileSize);\n                    } else if (typeof tileSize == 'object') {\n                        width = parseFloat(tileSize.width);\n                        height = parseFloat(tileSize.height);\n                    } else {\n                        throw new Error('Unsupported value for the \\'tileSize\\' argument');\n                    }\n                    element.find('.k-item').css({\n                        width: width,\n                        height: height\n                    });\n                }\n            },\n            focus: function () {\n                this.wrapper.focus();\n            },\n            options: {\n                name: 'ColorPalette',\n                columns: 10,\n                tileSize: null,\n                palette: 'basic'\n            },\n            _onEnable: function (enable) {\n                if (enable) {\n                    this.wrapper.attr('tabIndex', this._tabIndex);\n                } else {\n                    this.wrapper.removeAttr('tabIndex');\n                }\n            },\n            _keydown: function (e) {\n                var selected, wrapper = this.wrapper, items = wrapper.find('.k-item'), current = items.filter('.' + ITEMSELECTEDCLASS).get(0), keyCode = e.keyCode;\n                if (keyCode == KEYS.LEFT) {\n                    selected = relative(items, current, -1);\n                } else if (keyCode == KEYS.RIGHT) {\n                    selected = relative(items, current, 1);\n                } else if (keyCode == KEYS.DOWN) {\n                    selected = relative(items, current, this.options.columns);\n                } else if (keyCode == KEYS.UP) {\n                    selected = relative(items, current, -this.options.columns);\n                } else if (keyCode == KEYS.ENTER) {\n                    preventDefault(e);\n                    if (current) {\n                        this._select($(current).css(BACKGROUNDCOLOR));\n                    }\n                } else if (keyCode == KEYS.ESC) {\n                    this._cancel();\n                }\n                if (selected) {\n                    preventDefault(e);\n                    this._current(selected);\n                    try {\n                        var color = parseColor(selected.css(BACKGROUNDCOLOR));\n                        this._triggerSelect(color);\n                    } catch (ex) {\n                    }\n                }\n            },\n            _current: function (item) {\n                this.wrapper.find('.' + ITEMSELECTEDCLASS).removeClass(ITEMSELECTEDCLASS).attr('aria-selected', false).removeAttr('id');\n                $(item).addClass(ITEMSELECTEDCLASS).attr('aria-selected', true).attr('id', this._selectedID);\n                this.element.removeAttr('aria-activedescendant').attr('aria-activedescendant', this._selectedID);\n            },\n            _updateUI: function (color) {\n                var item = null;\n                this.wrapper.find('.k-item').each(function () {\n                    var c = parseColor($(this).css(BACKGROUNDCOLOR));\n                    if (c && c.equals(color)) {\n                        item = this;\n                        return false;\n                    }\n                });\n                this._current(item);\n            },\n            _template: kendo.template('<table class=\"k-palette k-reset\" role=\"presentation\"><tr role=\"row\">' + '# for (var i = 0; i < colors.length; ++i) { #' + '# var selected = colors[i].equals(value); #' + '# if (i && i % columns == 0) { # </tr><tr role=\"row\"> # } #' + '<td role=\"gridcell\" unselectable=\"on\" style=\"background-color:#= colors[i].toCss() #\"' + '#= selected ? \" aria-selected=true\" : \"\" # ' + '#=(id && i === 0) ? \"id=\\\\\"\"+id+\"\\\\\" \" : \"\" # ' + 'class=\"k-item#= selected ? \" ' + ITEMSELECTEDCLASS + '\" : \"\" #\" ' + 'aria-label=\"#= colors[i].toCss() #\"></td>' + '# } #' + '</tr></table>')\n        });\n        var FlatColorPicker = ColorSelector.extend({\n            init: function (element, options) {\n                var that = this;\n                ColorSelector.fn.init.call(that, element, options);\n                options = that.options;\n                options.messages = options.options ? $.extend(that.options.messages, options.options.messages) : that.options.messages;\n                element = that.element;\n                that.wrapper = element.addClass('k-widget k-flatcolorpicker').append(that._template(options));\n                that._hueElements = $('.k-hsv-rectangle, .k-transparency-slider .k-slider-track', element);\n                that._selectedColor = $('.k-selected-color-display', element);\n                that._colorAsText = $('input.k-color-value', element);\n                that._sliders();\n                that._hsvArea();\n                that._updateUI(that._value || parseColor('#f00'));\n                element.find('input.k-color-value').on(KEYDOWN_NS, function (ev) {\n                    var input = this;\n                    if (ev.keyCode == KEYS.ENTER) {\n                        try {\n                            var color = parseColor(input.value);\n                            var val = that.color();\n                            that._select(color, color.equals(val));\n                        } catch (ex) {\n                            $(input).addClass('k-state-error');\n                        }\n                    } else if (that.options.autoupdate) {\n                        setTimeout(function () {\n                            var color = parseColor(input.value, true);\n                            if (color) {\n                                that._updateUI(color, true);\n                            }\n                        }, 10);\n                    }\n                }).end().on(CLICK_NS, '.k-controls button.apply', function () {\n                    if (that.options._clearedColor) {\n                        that.trigger('change');\n                    } else {\n                        that._select(that._getHSV());\n                    }\n                }).on(CLICK_NS, '.k-controls button.cancel', function () {\n                    that._updateUI(that.color());\n                    that._cancel();\n                });\n                if (isIE8) {\n                    that._applyIEFilter();\n                }\n            },\n            destroy: function () {\n                this._hueSlider.destroy();\n                if (this._opacitySlider) {\n                    this._opacitySlider.destroy();\n                }\n                this._hueSlider = this._opacitySlider = this._hsvRect = this._hsvHandle = this._hueElements = this._selectedColor = this._colorAsText = null;\n                ColorSelector.fn.destroy.call(this);\n            },\n            options: {\n                name: 'FlatColorPicker',\n                opacity: false,\n                buttons: false,\n                input: true,\n                preview: true,\n                clearButton: false,\n                autoupdate: true,\n                messages: MESSAGES\n            },\n            _applyIEFilter: function () {\n                var track = this.element.find('.k-hue-slider .k-slider-track')[0], url = track.currentStyle.backgroundImage;\n                url = url.replace(/^url\\([\\'\\\"]?|[\\'\\\"]?\\)$/g, '');\n                track.style.filter = 'progid:DXImageTransform.Microsoft.AlphaImageLoader(src=\\'' + url + '\\', sizingMethod=\\'scale\\')';\n            },\n            _sliders: function () {\n                var that = this, element = that.element, hueSlider = element.find('.k-hue-slider'), opacitySlider = element.find('.k-transparency-slider');\n                function hueChange(e) {\n                    that._updateUI(that._getHSV(e.value, null, null, null));\n                }\n                hueSlider.attr('aria-label', 'hue saturation');\n                that._hueSlider = hueSlider.kendoSlider({\n                    min: 0,\n                    max: 360,\n                    tickPlacement: 'none',\n                    showButtons: false,\n                    slide: hueChange,\n                    change: hueChange\n                }).data('kendoSlider');\n                function opacityChange(e) {\n                    that._updateUI(that._getHSV(null, null, null, e.value / 100));\n                }\n                opacitySlider.attr('aria-label', 'opacity');\n                that._opacitySlider = opacitySlider.kendoSlider({\n                    min: 0,\n                    max: 100,\n                    tickPlacement: 'none',\n                    showButtons: false,\n                    slide: opacityChange,\n                    change: opacityChange\n                }).data('kendoSlider');\n            },\n            _hsvArea: function () {\n                var that = this, element = that.element, hsvRect = element.find('.k-hsv-rectangle'), hsvHandle = hsvRect.find('.k-draghandle').attr('tabIndex', 0).on(KEYDOWN_NS, bind(that._keydown, that));\n                function update(x, y) {\n                    var offset = this.offset, dx = x - offset.left, dy = y - offset.top, rw = this.width, rh = this.height;\n                    dx = dx < 0 ? 0 : dx > rw ? rw : dx;\n                    dy = dy < 0 ? 0 : dy > rh ? rh : dy;\n                    that._svChange(dx / rw, 1 - dy / rh);\n                }\n                that._hsvEvents = new kendo.UserEvents(hsvRect, {\n                    global: true,\n                    press: function (e) {\n                        this.offset = kendo.getOffset(hsvRect);\n                        this.width = hsvRect.width();\n                        this.height = hsvRect.height();\n                        hsvHandle.focus();\n                        update.call(this, e.x.location, e.y.location);\n                    },\n                    start: function () {\n                        hsvRect.addClass('k-dragging');\n                        hsvHandle.focus();\n                    },\n                    move: function (e) {\n                        e.preventDefault();\n                        update.call(this, e.x.location, e.y.location);\n                    },\n                    end: function () {\n                        hsvRect.removeClass('k-dragging');\n                    }\n                });\n                that._hsvRect = hsvRect;\n                that._hsvHandle = hsvHandle;\n            },\n            _onEnable: function (enable) {\n                this._hueSlider.enable(enable);\n                if (this._opacitySlider) {\n                    this._opacitySlider.enable(enable);\n                }\n                this.wrapper.find('input').attr('disabled', !enable);\n                var handle = this._hsvRect.find('.k-draghandle');\n                if (enable) {\n                    handle.attr('tabIndex', this._tabIndex);\n                } else {\n                    handle.removeAttr('tabIndex');\n                }\n            },\n            _keydown: function (ev) {\n                var that = this;\n                function move(prop, d) {\n                    var c = that._getHSV();\n                    c[prop] += d * (ev.shiftKey ? 0.01 : 0.05);\n                    if (c[prop] < 0) {\n                        c[prop] = 0;\n                    }\n                    if (c[prop] > 1) {\n                        c[prop] = 1;\n                    }\n                    that._updateUI(c);\n                    preventDefault(ev);\n                }\n                function hue(d) {\n                    var c = that._getHSV();\n                    c.h += d * (ev.shiftKey ? 1 : 5);\n                    if (c.h < 0) {\n                        c.h = 0;\n                    }\n                    if (c.h > 359) {\n                        c.h = 359;\n                    }\n                    that._updateUI(c);\n                    preventDefault(ev);\n                }\n                switch (ev.keyCode) {\n                case KEYS.LEFT:\n                    if (ev.ctrlKey) {\n                        hue(-1);\n                    } else {\n                        move('s', -1);\n                    }\n                    break;\n                case KEYS.RIGHT:\n                    if (ev.ctrlKey) {\n                        hue(1);\n                    } else {\n                        move('s', 1);\n                    }\n                    break;\n                case KEYS.UP:\n                    move(ev.ctrlKey && that._opacitySlider ? 'a' : 'v', 1);\n                    break;\n                case KEYS.DOWN:\n                    move(ev.ctrlKey && that._opacitySlider ? 'a' : 'v', -1);\n                    break;\n                case KEYS.ENTER:\n                    that._select(that._getHSV());\n                    break;\n                case KEYS.F2:\n                    that.wrapper.find('input.k-color-value').focus().select();\n                    break;\n                case KEYS.ESC:\n                    that._cancel();\n                    break;\n                }\n            },\n            focus: function () {\n                this._hsvHandle.focus();\n            },\n            _getHSV: function (h, s, v, a) {\n                var rect = this._hsvRect, width = rect.width(), height = rect.height(), handlePosition = this._hsvHandle.position();\n                if (h == null) {\n                    h = this._hueSlider.value();\n                }\n                if (s == null) {\n                    s = handlePosition.left / width;\n                }\n                if (v == null) {\n                    v = 1 - handlePosition.top / height;\n                }\n                if (a == null) {\n                    a = this._opacitySlider ? this._opacitySlider.value() / 100 : 1;\n                }\n                return Color.fromHSV(h, s, v, a);\n            },\n            _svChange: function (s, v) {\n                var color = this._getHSV(null, s, v, null);\n                this._updateUI(color);\n            },\n            _updateUI: function (color, dontChangeInput) {\n                var that = this, rect = that._hsvRect;\n                if (!color) {\n                    return;\n                }\n                this._colorAsText.attr('title', that.options.messages.previewInput);\n                this._colorAsText.removeClass('k-state-error');\n                that._selectedColor.css(BACKGROUNDCOLOR, color.toDisplay());\n                if (!dontChangeInput) {\n                    that._colorAsText.val(that._opacitySlider ? color.toCssRgba() : color.toCss());\n                }\n                that._triggerSelect(color);\n                color = color.toHSV();\n                that._hsvHandle.css({\n                    left: color.s * rect.width() + 'px',\n                    top: (1 - color.v) * rect.height() + 'px'\n                });\n                that._hueElements.css(BACKGROUNDCOLOR, Color.fromHSV(color.h, 1, 1, 1).toCss());\n                that._hueSlider.value(color.h);\n                if (that._opacitySlider) {\n                    that._opacitySlider.value(100 * color.a);\n                }\n            },\n            _selectOnHide: function () {\n                return this.options.buttons ? null : this._getHSV();\n            },\n            _template: kendo.template('# if (preview) { #' + '<div class=\"k-selected-color\"><div class=\"k-selected-color-display\"><div class=\"k-color-input\"><input class=\"k-color-value\" ' + '# if (clearButton && !_standalone) { #' + 'placeholder=\"#: messages.noColor #\" ' + '# } #' + '#= !data.input ? \\'style=\"visibility: hidden;\"\\' : \"\" #>' + '# if (clearButton && !_standalone) { #' + '<span class=\"k-clear-color k-button k-bare\" title=\"#: messages.clearColor #\"></span>' + '# } #' + '</div></div></div>' + '# } #' + '# if (clearButton && !_standalone && !preview) { #' + '<div class=\"k-clear-color-container\"><span class=\"k-clear-color k-button k-bare\">#: messages.clearColor #</span></div>' + '# } #' + '<div class=\"k-hsv-rectangle\"><div class=\"k-hsv-gradient\"></div><div class=\"k-draghandle\"></div></div>' + '<input class=\"k-hue-slider\" />' + '# if (opacity) { #' + '<input class=\"k-transparency-slider\" />' + '# } #' + '# if (buttons) { #' + '<div unselectable=\"on\" class=\"k-controls\"><button class=\"k-button k-primary apply\">#: messages.apply #</button> <button class=\"k-button cancel\">#: messages.cancel #</button></div>' + '# } #')\n        });\n        function relative(array, element, delta) {\n            array = Array.prototype.slice.call(array);\n            var n = array.length;\n            var pos = array.indexOf(element);\n            if (pos < 0) {\n                return delta < 0 ? array[n - 1] : array[0];\n            }\n            pos += delta;\n            if (pos < 0) {\n                pos += n;\n            } else {\n                pos %= n;\n            }\n            return array[pos];\n        }\n        var ColorPicker = Widget.extend({\n            init: function (element, options) {\n                var that = this;\n                Widget.fn.init.call(that, element, options);\n                options = that.options;\n                element = that.element;\n                var value = element.attr('value') || element.val();\n                if (value) {\n                    value = parseColor(value, true);\n                } else {\n                    value = parseColor(options.value, true);\n                }\n                that._value = options.value = value;\n                var content = that.wrapper = $(that._template(options));\n                element.hide().after(content);\n                if (element.is('input')) {\n                    element.appendTo(content);\n                    var label = element.closest('label');\n                    var id = element.attr('id');\n                    if (id) {\n                        label = label.add('label[for=\"' + id + '\"]');\n                    }\n                    label.click(function (ev) {\n                        that.open();\n                        ev.preventDefault();\n                    });\n                }\n                that._tabIndex = element.attr('tabIndex') || 0;\n                that.enable(!element.attr('disabled'));\n                var accesskey = element.attr('accesskey');\n                if (accesskey) {\n                    element.attr('accesskey', null);\n                    content.attr('accesskey', accesskey);\n                }\n                that.bind('activate', function (ev) {\n                    if (!ev.isDefaultPrevented()) {\n                        that.toggle();\n                    }\n                });\n                that._updateUI(value);\n            },\n            destroy: function () {\n                this.wrapper.off(NS).find('*').off(NS);\n                if (this._popup) {\n                    this._selector.destroy();\n                    this._popup.destroy();\n                }\n                this._selector = this._popup = this.wrapper = null;\n                Widget.fn.destroy.call(this);\n            },\n            enable: function (enable) {\n                var that = this, wrapper = that.wrapper, innerWrapper = wrapper.children('.k-picker-wrap'), arrow = innerWrapper.find('.k-select');\n                if (arguments.length === 0) {\n                    enable = true;\n                }\n                that.element.attr('disabled', !enable);\n                wrapper.attr('aria-disabled', !enable);\n                arrow.off(NS).on('mousedown' + NS, preventDefault);\n                wrapper.addClass('k-state-disabled').removeAttr('tabIndex').add('*', wrapper).off(NS);\n                if (enable) {\n                    wrapper.removeClass('k-state-disabled').attr('tabIndex', that._tabIndex).on('mouseenter' + NS, function () {\n                        innerWrapper.addClass('k-state-hover');\n                    }).on('mouseleave' + NS, function () {\n                        innerWrapper.removeClass('k-state-hover');\n                    }).on('focus' + NS, function () {\n                        innerWrapper.addClass('k-state-focused');\n                    }).on('blur' + NS, function () {\n                        innerWrapper.removeClass('k-state-focused');\n                    }).on(KEYDOWN_NS, bind(that._keydown, that)).on(CLICK_NS, '.k-select', bind(that.toggle, that)).on(CLICK_NS, that.options.toolIcon ? '.k-tool-icon' : '.k-selected-color', function () {\n                        that.trigger('activate');\n                    });\n                } else {\n                    that.close();\n                }\n            },\n            _template: kendo.template('<span role=\"textbox\" aria-haspopup=\"true\" class=\"k-widget k-colorpicker k-header\">' + '<span class=\"k-picker-wrap k-state-default\">' + '# if (toolIcon) { #' + '<span class=\"k-icon k-tool-icon #= toolIcon #\">' + '<span class=\"k-selected-color\"></span>' + '</span>' + '# } else { #' + '<span class=\"k-selected-color\"><span class=\"k-icon k-i-line\" style=\"display: none;\"></span></span>' + '# } #' + '<span class=\"k-select\" unselectable=\"on\" aria-label=\"select\">' + '<span class=\"k-icon k-i-arrow-60-down\"></span>' + '</span>' + '</span>' + '</span>'),\n            options: {\n                name: 'ColorPicker',\n                palette: null,\n                columns: 10,\n                toolIcon: null,\n                value: null,\n                messages: MESSAGES,\n                opacity: false,\n                buttons: true,\n                preview: true,\n                clearButton: false,\n                ARIATemplate: 'Current selected color is #=data || \"\"#'\n            },\n            events: [\n                'activate',\n                'change',\n                'select',\n                'open',\n                'close'\n            ],\n            open: function () {\n                if (!this.element.prop('disabled')) {\n                    this._getPopup().open();\n                }\n            },\n            close: function () {\n                var selOptions = this._selector && this._selector.options || {};\n                selOptions._closing = true;\n                this._getPopup().close();\n                delete selOptions._closing;\n            },\n            toggle: function () {\n                if (!this.element.prop('disabled')) {\n                    this._getPopup().toggle();\n                }\n            },\n            _noColorIcon: function () {\n                return this.wrapper.find('.k-picker-wrap > .k-selected-color > .k-icon.k-i-line');\n            },\n            color: ColorSelector.fn.color,\n            value: ColorSelector.fn.value,\n            _select: ColorSelector.fn._select,\n            _triggerSelect: ColorSelector.fn._triggerSelect,\n            _isInputTypeColor: function () {\n                var el = this.element[0];\n                return /^input$/i.test(el.tagName) && /^color$/i.test(el.type);\n            },\n            _updateUI: function (value) {\n                var formattedValue = '';\n                if (value) {\n                    if (this._isInputTypeColor() || value.a == 1) {\n                        formattedValue = value.toCss();\n                    } else {\n                        formattedValue = value.toCssRgba();\n                    }\n                    this.element.val(formattedValue);\n                }\n                if (!this._ariaTemplate) {\n                    this._ariaTemplate = kendo.template(this.options.ARIATemplate);\n                }\n                this.wrapper.attr('aria-label', this._ariaTemplate(formattedValue));\n                this._triggerSelect(value);\n                this.wrapper.find('.k-selected-color').css(BACKGROUNDCOLOR, value ? value.toDisplay() : WHITE);\n                this._noColorIcon()[formattedValue ? 'hide' : 'show']();\n            },\n            _keydown: function (ev) {\n                var key = ev.keyCode;\n                if (this._getPopup().visible()) {\n                    if (key == KEYS.ESC) {\n                        this._selector._cancel();\n                    } else {\n                        this._selector._keydown(ev);\n                    }\n                    preventDefault(ev);\n                } else if (key == KEYS.ENTER || key == KEYS.DOWN) {\n                    this.open();\n                    preventDefault(ev);\n                }\n            },\n            _getPopup: function () {\n                var that = this, popup = that._popup;\n                if (!popup) {\n                    var options = that.options;\n                    var selectorType;\n                    if (options.palette) {\n                        selectorType = ColorPalette;\n                    } else {\n                        selectorType = FlatColorPicker;\n                    }\n                    options._standalone = false;\n                    delete options.select;\n                    delete options.change;\n                    delete options.cancel;\n                    var id = kendo.guid();\n                    var selector = that._selector = new selectorType($('<div id=\"' + id + '\"/>').appendTo(document.body), options);\n                    that.wrapper.attr('aria-owns', id);\n                    that._popup = popup = selector.wrapper.kendoPopup({\n                        anchor: that.wrapper,\n                        adjustSize: {\n                            width: 5,\n                            height: 0\n                        }\n                    }).data('kendoPopup');\n                    selector.element.find('.k-clear-color').kendoButton({\n                        icon: 'reset-color',\n                        click: function (e) {\n                            selector.options._clearedColor = true;\n                            that.value(null);\n                            that.element.val(null);\n                            that._updateUI(null);\n                            selector._colorAsText.val('');\n                            selector._hsvHandle.css({\n                                top: '0px',\n                                left: '0px'\n                            });\n                            selector._selectedColor.css(BACKGROUNDCOLOR, WHITE);\n                            that.trigger('change', { value: that.value() });\n                            e.preventDefault();\n                        }\n                    });\n                    selector.bind({\n                        select: function (ev) {\n                            that._updateUI(parseColor(ev.value));\n                            delete selector.options._clearedColor;\n                        },\n                        change: function () {\n                            if (!selector.options._clearedColor) {\n                                that._select(selector.color());\n                            }\n                            that.close();\n                        },\n                        cancel: function () {\n                            if (selector.options._clearedColor && !that.value() && selector.value()) {\n                                that._select(selector.color(), true);\n                            }\n                            that.close();\n                        }\n                    });\n                    popup.bind({\n                        close: function (ev) {\n                            if (that.trigger('close')) {\n                                ev.preventDefault();\n                                return;\n                            }\n                            that.wrapper.children('.k-picker-wrap').removeClass('k-state-focused');\n                            var color = selector._selectOnHide();\n                            var selectorColor = selector.value();\n                            var value = that.value();\n                            var options = selector.options;\n                            if (!color) {\n                                setTimeout(function () {\n                                    if (that.wrapper) {\n                                        that.wrapper.focus();\n                                    }\n                                });\n                                if (!options._closing && options._clearedColor && !value && selectorColor) {\n                                    that._select(selectorColor, true);\n                                } else {\n                                    that._updateUI(that.color());\n                                }\n                            } else if (!(options._clearedColor && !value)) {\n                                that._select(color);\n                            }\n                        },\n                        open: function (ev) {\n                            if (that.trigger('open')) {\n                                ev.preventDefault();\n                            } else {\n                                that.wrapper.children('.k-picker-wrap').addClass('k-state-focused');\n                            }\n                        },\n                        activate: function () {\n                            selector._select(that.color(), true);\n                            selector.focus();\n                            that.wrapper.children('.k-picker-wrap').addClass('k-state-focused');\n                        }\n                    });\n                }\n                return popup;\n            }\n        });\n        function preventDefault(ev) {\n            ev.preventDefault();\n        }\n        function bind(callback, obj) {\n            return function () {\n                return callback.apply(obj, arguments);\n            };\n        }\n        ui.plugin(ColorPalette);\n        ui.plugin(FlatColorPicker);\n        ui.plugin(ColorPicker);\n    }(jQuery, parseInt));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.numerictextbox', [\n        'kendo.core',\n        'kendo.userevents'\n    ], f);\n}(function () {\n    var __meta__ = {\n        id: 'numerictextbox',\n        name: 'NumericTextBox',\n        category: 'web',\n        description: 'The NumericTextBox widget can format and display numeric, percentage or currency textbox.',\n        depends: [\n            'core',\n            'userevents'\n        ]\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, caret = kendo.caret, keys = kendo.keys, ui = kendo.ui, Widget = ui.Widget, activeElement = kendo._activeElement, extractFormat = kendo._extractFormat, parse = kendo.parseFloat, placeholderSupported = kendo.support.placeholder, getCulture = kendo.getCulture, CHANGE = 'change', DISABLED = 'disabled', READONLY = 'readonly', INPUT = 'k-input', SPIN = 'spin', ns = '.kendoNumericTextBox', TOUCHEND = 'touchend', MOUSELEAVE = 'mouseleave' + ns, HOVEREVENTS = 'mouseenter' + ns + ' ' + MOUSELEAVE, DEFAULT = 'k-state-default', FOCUSED = 'k-state-focused', HOVER = 'k-state-hover', FOCUS = 'focus', POINT = '.', CLASS_ICON = 'k-icon', SELECTED = 'k-state-selected', STATEDISABLED = 'k-state-disabled', STATE_INVALID = 'k-state-invalid', ARIA_DISABLED = 'aria-disabled', INTEGER_REGEXP = /^(-)?(\\d*)$/, NULL = null, proxy = $.proxy, extend = $.extend;\n        var NumericTextBox = Widget.extend({\n            init: function (element, options) {\n                var that = this, isStep = options && options.step !== undefined, min, max, step, value, disabled;\n                Widget.fn.init.call(that, element, options);\n                options = that.options;\n                element = that.element.on('focusout' + ns, proxy(that._focusout, that)).attr('role', 'spinbutton');\n                options.placeholder = options.placeholder || element.attr('placeholder');\n                that._initialOptions = extend({}, options);\n                min = that.min(element.attr('min'));\n                max = that.max(element.attr('max'));\n                step = that._parse(element.attr('step'));\n                if (options.min === NULL && min !== NULL) {\n                    options.min = min;\n                }\n                if (options.max === NULL && max !== NULL) {\n                    options.max = max;\n                }\n                if (!isStep && step !== NULL) {\n                    options.step = step;\n                }\n                that._reset();\n                that._wrapper();\n                that._arrows();\n                that._validation();\n                that._input();\n                if (!kendo.support.mobileOS) {\n                    that._text.on(FOCUS + ns, proxy(that._click, that));\n                } else {\n                    that._text.on(TOUCHEND + ns + ' ' + FOCUS + ns, function () {\n                        if (kendo.support.browser.edge) {\n                            that._text.one(FOCUS + ns, function () {\n                                that._toggleText(false);\n                                element.focus();\n                            });\n                        } else {\n                            that._toggleText(false);\n                            element.focus();\n                        }\n                    });\n                }\n                element.attr('aria-valuemin', options.min !== NULL ? options.min * options.factor : options.min).attr('aria-valuemax', options.max !== NULL ? options.max * options.factor : options.max);\n                options.format = extractFormat(options.format);\n                value = options.value;\n                that.value(value !== NULL ? value : element.val());\n                disabled = element.is('[disabled]') || $(that.element).parents('fieldset').is(':disabled');\n                if (disabled) {\n                    that.enable(false);\n                } else {\n                    that.readonly(element.is('[readonly]'));\n                }\n                kendo.notify(that);\n            },\n            options: {\n                name: 'NumericTextBox',\n                decimals: NULL,\n                restrictDecimals: false,\n                min: NULL,\n                max: NULL,\n                value: NULL,\n                step: 1,\n                round: true,\n                culture: '',\n                format: 'n',\n                spinners: true,\n                placeholder: '',\n                factor: 1,\n                upArrowText: 'Increase value',\n                downArrowText: 'Decrease value'\n            },\n            events: [\n                CHANGE,\n                SPIN\n            ],\n            _editable: function (options) {\n                var that = this, element = that.element, disable = options.disable, readonly = options.readonly, text = that._text.add(element), wrapper = that._inputWrapper.off(HOVEREVENTS);\n                that._toggleText(true);\n                that._upArrowEventHandler.unbind('press');\n                that._downArrowEventHandler.unbind('press');\n                element.off('keydown' + ns).off('keypress' + ns).off('keyup' + ns).off('paste' + ns);\n                if (!readonly && !disable) {\n                    wrapper.addClass(DEFAULT).removeClass(STATEDISABLED).on(HOVEREVENTS, that._toggleHover);\n                    text.removeAttr(DISABLED).removeAttr(READONLY).attr(ARIA_DISABLED, false);\n                    that._upArrowEventHandler.bind('press', function (e) {\n                        e.preventDefault();\n                        that._spin(1);\n                        that._upArrow.addClass(SELECTED);\n                    });\n                    that._downArrowEventHandler.bind('press', function (e) {\n                        e.preventDefault();\n                        that._spin(-1);\n                        that._downArrow.addClass(SELECTED);\n                    });\n                    that.element.on('keydown' + ns, proxy(that._keydown, that)).on('keypress' + ns, proxy(that._keypress, that)).on('keyup' + ns, proxy(that._keyup, that)).on('paste' + ns, proxy(that._paste, that));\n                } else {\n                    wrapper.addClass(disable ? STATEDISABLED : DEFAULT).removeClass(disable ? DEFAULT : STATEDISABLED);\n                    text.attr(DISABLED, disable).attr(READONLY, readonly).attr(ARIA_DISABLED, disable);\n                }\n            },\n            readonly: function (readonly) {\n                this._editable({\n                    readonly: readonly === undefined ? true : readonly,\n                    disable: false\n                });\n            },\n            enable: function (enable) {\n                this._editable({\n                    readonly: false,\n                    disable: !(enable = enable === undefined ? true : enable)\n                });\n            },\n            destroy: function () {\n                var that = this;\n                that.element.add(that._text).add(that._upArrow).add(that._downArrow).add(that._inputWrapper).off(ns);\n                that._upArrowEventHandler.destroy();\n                that._downArrowEventHandler.destroy();\n                if (that._form) {\n                    that._form.off('reset', that._resetHandler);\n                }\n                Widget.fn.destroy.call(that);\n            },\n            min: function (value) {\n                return this._option('min', value);\n            },\n            max: function (value) {\n                return this._option('max', value);\n            },\n            step: function (value) {\n                return this._option('step', value);\n            },\n            value: function (value) {\n                var that = this, adjusted;\n                if (value === undefined) {\n                    return that._value;\n                }\n                value = that._parse(value);\n                adjusted = that._adjust(value);\n                if (value !== adjusted) {\n                    return;\n                }\n                that._update(value);\n                that._old = that._value;\n            },\n            focus: function () {\n                this._focusin();\n            },\n            _adjust: function (value) {\n                var that = this, options = that.options, min = options.min, max = options.max;\n                if (value === NULL) {\n                    return value;\n                }\n                if (min !== NULL && value < min) {\n                    value = min;\n                } else if (max !== NULL && value > max) {\n                    value = max;\n                }\n                return value;\n            },\n            _arrows: function () {\n                var that = this, arrows, _release = function () {\n                        clearTimeout(that._spinning);\n                        arrows.removeClass(SELECTED);\n                    }, options = that.options, spinners = options.spinners, element = that.element;\n                arrows = element.siblings('.' + CLASS_ICON);\n                if (!arrows[0]) {\n                    arrows = $(buttonHtml('increase', options.upArrowText) + buttonHtml('decrease', options.downArrowText)).insertAfter(element);\n                    arrows.wrapAll('<span class=\"k-select\"/>');\n                }\n                if (!spinners) {\n                    arrows.parent().toggle(spinners);\n                    that._inputWrapper.addClass('k-expand-padding');\n                }\n                that._upArrow = arrows.eq(0);\n                that._upArrowEventHandler = new kendo.UserEvents(that._upArrow, { release: _release });\n                that._downArrow = arrows.eq(1);\n                that._downArrowEventHandler = new kendo.UserEvents(that._downArrow, { release: _release });\n            },\n            _validation: function () {\n                var that = this;\n                var element = that.element;\n                that._validationIcon = $('<span class=\\'' + CLASS_ICON + ' k-i-warning\\'></span>').hide().insertAfter(element);\n            },\n            _blur: function () {\n                var that = this;\n                that._toggleText(true);\n                that._change(that.element.val());\n            },\n            _click: function (e) {\n                var that = this;\n                clearTimeout(that._focusing);\n                that._focusing = setTimeout(function () {\n                    var input = e.target, idx = caret(input)[0], value = input.value.substring(0, idx), format = that._format(that.options.format), group = format[','], result, groupRegExp, extractRegExp, caretPosition = 0;\n                    if (group) {\n                        groupRegExp = new RegExp('\\\\' + group, 'g');\n                        extractRegExp = new RegExp('([\\\\d\\\\' + group + ']+)(\\\\' + format[POINT] + ')?(\\\\d+)?');\n                    }\n                    if (extractRegExp) {\n                        result = extractRegExp.exec(value);\n                    }\n                    if (result) {\n                        caretPosition = result[0].replace(groupRegExp, '').length;\n                        if (value.indexOf('(') != -1 && that._value < 0) {\n                            caretPosition++;\n                        }\n                    }\n                    that._focusin();\n                    caret(that.element[0], caretPosition);\n                });\n            },\n            _change: function (value) {\n                var that = this, factor = that.options.factor;\n                if (factor && factor !== 1) {\n                    value = parseFloat(value);\n                    if (value !== null) {\n                        value = value / factor;\n                    }\n                }\n                that._update(value);\n                value = that._value;\n                if (that._old != value) {\n                    that._old = value;\n                    if (!that._typing) {\n                        that.element.trigger(CHANGE);\n                    }\n                    that.trigger(CHANGE);\n                }\n                that._typing = false;\n            },\n            _culture: function (culture) {\n                return culture || getCulture(this.options.culture);\n            },\n            _focusin: function () {\n                var that = this;\n                that._inputWrapper.addClass(FOCUSED);\n                that._toggleText(false);\n                that.element[0].focus();\n            },\n            _focusout: function () {\n                var that = this;\n                clearTimeout(that._focusing);\n                that._inputWrapper.removeClass(FOCUSED).removeClass(HOVER);\n                that._blur();\n                that._removeInvalidState();\n            },\n            _format: function (format, culture) {\n                var numberFormat = this._culture(culture).numberFormat;\n                format = format.toLowerCase();\n                if (format.indexOf('c') > -1) {\n                    numberFormat = numberFormat.currency;\n                } else if (format.indexOf('p') > -1) {\n                    numberFormat = numberFormat.percent;\n                }\n                return numberFormat;\n            },\n            _input: function () {\n                var that = this, options = that.options, CLASSNAME = 'k-formatted-value', element = that.element.addClass(INPUT).show()[0], accessKey = element.accessKey, wrapper = that.wrapper, text;\n                text = wrapper.find(POINT + CLASSNAME);\n                if (!text[0]) {\n                    text = $('<input type=\"text\"/>').insertBefore(element).addClass(CLASSNAME);\n                }\n                try {\n                    element.setAttribute('type', 'text');\n                } catch (e) {\n                    element.type = 'text';\n                }\n                that._initialTitle = element.title;\n                text[0].title = element.title;\n                text[0].tabIndex = element.tabIndex;\n                text[0].style.cssText = element.style.cssText;\n                text.prop('placeholder', options.placeholder);\n                if (accessKey) {\n                    text.attr('accesskey', accessKey);\n                    element.accessKey = '';\n                }\n                that._text = text.addClass(element.className).attr({\n                    'role': 'spinbutton',\n                    'aria-valuemin': options.min !== NULL ? options.min * options.factor : options.min,\n                    'aria-valuemax': options.max !== NULL ? options.max * options.factor : options.max\n                });\n            },\n            _keydown: function (e) {\n                var that = this, key = e.keyCode;\n                that._key = key;\n                if (key == keys.DOWN) {\n                    that._step(-1);\n                } else if (key == keys.UP) {\n                    that._step(1);\n                } else if (key == keys.ENTER) {\n                    that._change(that.element.val());\n                } else {\n                    that._typing = true;\n                }\n            },\n            _keypress: function (e) {\n                if (e.which === 0 || e.metaKey || e.ctrlKey || e.keyCode === keys.BACKSPACE || e.keyCode === keys.ENTER) {\n                    return;\n                }\n                var that = this;\n                var min = that.options.min;\n                var element = that.element;\n                var selection = caret(element);\n                var selectionStart = selection[0];\n                var selectionEnd = selection[1];\n                var character = String.fromCharCode(e.which);\n                var numberFormat = that._format(that.options.format);\n                var isNumPadDecimal = that._key === keys.NUMPAD_DOT;\n                var value = element.val();\n                var isValid;\n                if (isNumPadDecimal) {\n                    character = numberFormat[POINT];\n                }\n                value = value.substring(0, selectionStart) + character + value.substring(selectionEnd);\n                isValid = that._numericRegex(numberFormat).test(value);\n                if (isValid && isNumPadDecimal) {\n                    element.val(value);\n                    caret(element, selectionStart + character.length);\n                    e.preventDefault();\n                } else if (min !== null && min >= 0 && value.charAt(0) === '-' || !isValid) {\n                    that._addInvalidState();\n                    e.preventDefault();\n                }\n                that._key = 0;\n            },\n            _keyup: function () {\n                this._removeInvalidState();\n            },\n            _addInvalidState: function () {\n                var that = this;\n                that._inputWrapper.addClass(STATE_INVALID);\n                that._validationIcon.show();\n            },\n            _removeInvalidState: function () {\n                var that = this;\n                that._inputWrapper.removeClass(STATE_INVALID);\n                that._validationIcon.hide();\n            },\n            _numericRegex: function (numberFormat) {\n                var that = this;\n                var separator = numberFormat[POINT];\n                var precision = that.options.decimals;\n                var fractionRule = '*';\n                if (separator === POINT) {\n                    separator = '\\\\' + separator;\n                }\n                if (precision === NULL) {\n                    precision = numberFormat.decimals;\n                }\n                if (precision === 0) {\n                    return INTEGER_REGEXP;\n                }\n                if (that.options.restrictDecimals) {\n                    fractionRule = '{0,' + precision + '}';\n                }\n                if (that._separator !== separator) {\n                    that._separator = separator;\n                    that._floatRegExp = new RegExp('^(-)?(((\\\\d+(' + separator + '\\\\d' + fractionRule + ')?)|(' + separator + '\\\\d' + fractionRule + ')))?$');\n                }\n                return that._floatRegExp;\n            },\n            _paste: function (e) {\n                var that = this;\n                var element = e.target;\n                var value = element.value;\n                var numberFormat = that._format(that.options.format);\n                setTimeout(function () {\n                    var result = that._parse(element.value);\n                    if (result === NULL) {\n                        that._update(value);\n                    } else {\n                        element.value = result.toString().replace(POINT, numberFormat[POINT]);\n                        if (that._adjust(result) !== result || !that._numericRegex(numberFormat).test(element.value)) {\n                            that._update(value);\n                        }\n                    }\n                });\n            },\n            _option: function (option, value) {\n                var that = this, element = that.element, options = that.options;\n                if (value === undefined) {\n                    return options[option];\n                }\n                value = that._parse(value);\n                if (!value && option === 'step') {\n                    return;\n                }\n                options[option] = value;\n                element.add(that._text).attr('aria-value' + option, value);\n                element.attr(option, value);\n            },\n            _spin: function (step, timeout) {\n                var that = this;\n                timeout = timeout || 500;\n                clearTimeout(that._spinning);\n                that._spinning = setTimeout(function () {\n                    that._spin(step, 50);\n                }, timeout);\n                that._step(step);\n            },\n            _step: function (step) {\n                var that = this, element = that.element, value = that._parse(element.val()) || 0;\n                if (activeElement() != element[0]) {\n                    that._focusin();\n                }\n                if (that.options.factor && value) {\n                    value = value / that.options.factor;\n                }\n                value += that.options.step * step;\n                that._update(that._adjust(value));\n                that._typing = false;\n                that.trigger(SPIN);\n            },\n            _toggleHover: function (e) {\n                $(e.currentTarget).toggleClass(HOVER, e.type === 'mouseenter');\n            },\n            _toggleText: function (toggle) {\n                var that = this;\n                that._text.toggle(toggle);\n                that.element.toggle(!toggle);\n            },\n            _parse: function (value, culture) {\n                return parse(value, this._culture(culture), this.options.format);\n            },\n            _round: function (value, precision) {\n                var rounder = this.options.round ? kendo._round : truncate;\n                return rounder(value, precision);\n            },\n            _update: function (value) {\n                var that = this, options = that.options, factor = options.factor, format = options.format, decimals = options.decimals, culture = that._culture(), numberFormat = that._format(format, culture), isNotNull;\n                if (decimals === NULL) {\n                    decimals = numberFormat.decimals;\n                }\n                value = that._parse(value, culture);\n                isNotNull = value !== NULL;\n                if (isNotNull) {\n                    value = parseFloat(that._round(value, decimals), 10);\n                }\n                that._value = value = that._adjust(value);\n                that._placeholder(kendo.toString(value, format, culture));\n                if (isNotNull) {\n                    if (factor) {\n                        value = parseFloat(that._round(value * factor, decimals), 10);\n                    }\n                    value = value.toString();\n                    if (value.indexOf('e') !== -1) {\n                        value = that._round(+value, decimals);\n                    }\n                    value = value.replace(POINT, numberFormat[POINT]);\n                } else {\n                    value = null;\n                }\n                that.element.val(value);\n                that.element.add(that._text).attr('aria-valuenow', value);\n            },\n            _placeholder: function (value) {\n                var input = this._text;\n                input.val(value);\n                if (!placeholderSupported && !value) {\n                    input.val(this.options.placeholder);\n                }\n                input.attr('title', this._initialTitle || input.val());\n            },\n            _wrapper: function () {\n                var that = this, element = that.element, DOMElement = element[0], wrapper;\n                wrapper = element.parents('.k-numerictextbox');\n                if (!wrapper.is('span.k-numerictextbox')) {\n                    wrapper = element.hide().wrap('<span class=\"k-numeric-wrap k-state-default\" />').parent();\n                    wrapper = wrapper.wrap('<span/>').parent();\n                }\n                wrapper[0].style.cssText = DOMElement.style.cssText;\n                DOMElement.style.width = '';\n                that.wrapper = wrapper.addClass('k-widget k-numerictextbox').addClass(DOMElement.className).css('display', '');\n                that._inputWrapper = $(wrapper[0].firstChild);\n            },\n            _reset: function () {\n                var that = this, element = that.element, formId = element.attr('form'), form = formId ? $('#' + formId) : element.closest('form');\n                if (form[0]) {\n                    that._resetHandler = function () {\n                        setTimeout(function () {\n                            that.value(element[0].value);\n                            that.max(that._initialOptions.max);\n                            that.min(that._initialOptions.min);\n                        });\n                    };\n                    that._form = form.on('reset', that._resetHandler);\n                }\n            }\n        });\n        function buttonHtml(direction, text) {\n            var className = 'k-i-arrow-' + (direction === 'increase' ? '60-up' : '60-down');\n            return '<span unselectable=\"on\" class=\"k-link k-link-' + direction + '\" aria-label=\"' + text + '\" title=\"' + text + '\">' + '<span unselectable=\"on\" class=\"' + CLASS_ICON + ' ' + className + '\"></span>' + '</span>';\n        }\n        function truncate(value, precision) {\n            var parts = parseFloat(value, 10).toString().split(POINT);\n            if (parts[1]) {\n                parts[1] = parts[1].substring(0, precision);\n            }\n            return parts.join(POINT);\n        }\n        ui.plugin(NumericTextBox);\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.filtermenu', [\n        'kendo.datepicker',\n        'kendo.numerictextbox',\n        'kendo.dropdownlist',\n        'kendo.binder'\n    ], f);\n}(function () {\n    var __meta__ = {\n        id: 'filtermenu',\n        name: 'Filtering Menu',\n        category: 'framework',\n        depends: [\n            'datepicker',\n            'numerictextbox',\n            'dropdownlist',\n            'binder'\n        ],\n        advanced: true\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, ui = kendo.ui, proxy = $.proxy, POPUP = 'kendoPopup', INIT = 'init', OPEN = 'open', REFRESH = 'refresh', CHANGE = 'change', NS = '.kendoFilterMenu', EQ = 'Is equal to', NEQ = 'Is not equal to', roles = {\n                'number': 'numerictextbox',\n                'date': 'datepicker'\n            }, mobileRoles = {\n                'string': 'text',\n                'number': 'number',\n                'date': 'date'\n            }, isFunction = kendo.isFunction, Widget = ui.Widget;\n        var booleanTemplate = '<div>' + '<div class=\"k-filter-help-text\">#=messages.info#</div>' + '<label>' + '<input type=\"radio\" data-#=ns#bind=\"checked: filters[0].value\" value=\"true\" name=\"filters[0].value\"/>' + '#=messages.isTrue#' + '</label>' + '<label>' + '<input type=\"radio\" data-#=ns#bind=\"checked: filters[0].value\" value=\"false\" name=\"filters[0].value\"/>' + '#=messages.isFalse#' + '</label>' + '<div>' + '<button type=\"submit\" class=\"k-button k-primary\">#=messages.filter#</button>' + '<button type=\"reset\" class=\"k-button\">#=messages.clear#</button>' + '</div>' + '</div>';\n        var defaultTemplate = '<div>' + '<div class=\"k-filter-help-text\">#=messages.info#</div>' + '<select title=\"#=messages.operator#\" data-#=ns#bind=\"value: filters[0].operator\" data-#=ns#role=\"dropdownlist\">' + '#for(var op in operators){#' + '<option value=\"#=op#\">#=operators[op]#</option>' + '#}#' + '</select>' + '#if(values){#' + '<select title=\"#=messages.value#\" data-#=ns#bind=\"value:filters[0].value\" data-#=ns#text-field=\"text\" data-#=ns#value-field=\"value\" data-#=ns#source=\\'#=kendo.stringify(values).replace(/\\'/g,\"&\\\\#39;\")#\\' data-#=ns#role=\"dropdownlist\" data-#=ns#option-label=\"#=messages.selectValue#\" data-#=ns#value-primitive=\"true\">' + '</select>' + '#}else{#' + '<input title=\"#=messages.value#\" data-#=ns#bind=\"value:filters[0].value\" class=\"k-textbox\" type=\"text\" #=role ? \"data-\" + ns + \"role=\\'\" + role + \"\\'\" : \"\"# />' + '#}#' + '#if(extra){#' + '<select title=\"#=messages.logic#\" class=\"k-filter-and\" data-#=ns#bind=\"value: logic\" data-#=ns#role=\"dropdownlist\">' + '<option value=\"and\">#=messages.and#</option>' + '<option value=\"or\">#=messages.or#</option>' + '</select>' + '<select title=\"#=messages.additionalOperator#\" data-#=ns#bind=\"value: filters[1].operator\" data-#=ns#role=\"dropdownlist\">' + '#for(var op in operators){#' + '<option value=\"#=op#\">#=operators[op]#</option>' + '#}#' + '</select>' + '#if(values){#' + '<select title=\"#=messages.additionalValue#\" data-#=ns#bind=\"value:filters[1].value\" data-#=ns#text-field=\"text\" data-#=ns#value-field=\"value\" data-#=ns#source=\\'#=kendo.stringify(values).replace(/\\'/g,\"&\\\\#39;\")#\\' data-#=ns#role=\"dropdownlist\" data-#=ns#option-label=\"#=messages.selectValue#\" data-#=ns#value-primitive=\"true\">' + '</select>' + '#}else{#' + '<input title=\"#=messages.additionalValue#\" data-#=ns#bind=\"value: filters[1].value\" class=\"k-textbox\" type=\"text\" #=role ? \"data-\" + ns + \"role=\\'\" + role + \"\\'\" : \"\"#/>' + '#}#' + '#}#' + '<div>' + '<button type=\"submit\" class=\"k-button k-primary\">#=messages.filter#</button>' + '<button type=\"reset\" class=\"k-button\">#=messages.clear#</button>' + '</div>' + '</div>';\n        var defaultMobileTemplate = '<div data-#=ns#role=\"view\" data-#=ns#init-widgets=\"false\" data-#=ns#use-native-scrolling=\"true\" class=\"k-grid-filter-menu\">' + '<div data-#=ns#role=\"header\" class=\"k-header\">' + '<button class=\"k-button k-i-cancel\">#=messages.cancel#</button>' + '#=title#' + '<button type=\"submit\" class=\"k-button k-submit\">#=messages.filter#</button>' + '</div>' + '<form title=\"#=messages.info#\" class=\"k-filter-menu k-mobile-list\">' + '<ul class=\"k-filter-help-text\"><li><span class=\"k-link\">#=messages.info#</span>' + '<ul>' + '<li class=\"k-item\"><label class=\"k-label\">#=messages.operator#' + '<select data-#=ns#bind=\"value: filters[0].operator\">' + '#for(var op in operators){#' + '<option value=\"#=op#\">#=operators[op]#</option>' + '#}#' + '</select>' + '</label></li>' + '<li class=\"k-item\"><label class=\"k-label\">#=messages.value#' + '#if(values){#' + '<select data-#=ns#bind=\"value:filters[0].value\">' + '<option value=\"\">#=messages.selectValue#</option>' + '#for(var val in values){#' + '<option value=\"#=values[val].value#\">#=values[val].text#</option>' + '#}#' + '</select>' + '#}else{#' + '<input data-#=ns#bind=\"value:filters[0].value\" class=\"k-textbox\" type=\"#=inputType#\" ' + '#=useRole ? \"data-\" + ns + \"role=\\'\" + role + \"\\'\" : \"\"# />' + '#}#' + '</label></li>' + '#if(extra){#' + '</ul>' + '<ul class=\"k-filter-help-text\"><li><span class=\"k-link\"></span>' + '<li class=\"k-item\"><label class=\"k-label\"><input type=\"radio\" name=\"logic\" class=\"k-check\" data-#=ns#bind=\"checked: logic\" value=\"and\" />#=messages.and#</label></li>' + '<li class=\"k-item\"><label class=\"k-label\"><input type=\"radio\" name=\"logic\" class=\"k-check\" data-#=ns#bind=\"checked: logic\" value=\"or\" />#=messages.or#</label></li>' + '</ul>' + '<ul class=\"k-filter-help-text\"><li><span class=\"k-link\"></span>' + '<li class=\"k-item\"><label class=\"k-label\">#=messages.additionalOperator#' + '<select data-#=ns#bind=\"value: filters[1].operator\">' + '#for(var op in operators){#' + '<option value=\"#=op#\">#=operators[op]#</option>' + '#}#' + '</select>' + '</label></li>' + '<li class=\"k-item\"><label class=\"k-label\">#=messages.additionalValue#' + '#if(values){#' + '<select data-#=ns#bind=\"value:filters[1].value\">' + '<option value=\"\">#=messages.selectValue#</option>' + '#for(var val in values){#' + '<option value=\"#=values[val].value#\">#=values[val].text#</option>' + '#}#' + '</select>' + '#}else{#' + '<input data-#=ns#bind=\"value:filters[1].value\" class=\"k-textbox\" type=\"#=inputType#\" ' + '#=useRole ? \"data-\" + ns + \"role=\\'\" + role + \"\\'\" : \"\"# />' + '#}#' + '</label></li>' + '#}#' + '</ul>' + '</li><li class=\"k-button-container\">' + '<button type=\"reset\" class=\"k-button\">#=messages.clear#</button>' + '</li></ul>' + '</div>' + '</form>' + '</div>';\n        var booleanMobileTemplate = '<div data-#=ns#role=\"view\" data-#=ns#init-widgets=\"false\" data-#=ns#use-native-scrolling=\"true\" class=\"k-grid-filter-menu\">' + '<div data-#=ns#role=\"header\" class=\"k-header\">' + '<button class=\"k-button k-i-cancel\">#=messages.cancel#</button>' + '#=title#' + '<button type=\"submit\" class=\"k-button k-submit\">#=messages.filter#</button>' + '</div>' + '<form title=\"#=messages.info#\" class=\"k-filter-menu k-mobile-list\">' + '<ul class=\"k-filter-help-text\"><li><span class=\"k-link\">#=messages.info#</span>' + '<ul>' + '<li class=\"k-item\"><label class=\"k-label\">' + '<input class=\"k-check\" type=\"radio\" data-#=ns#bind=\"checked: filters[0].value\" value=\"true\" name=\"filters[0].value\"/>' + '#=messages.isTrue#' + '</label></li>' + '<li class=\"k-item\"><label class=\"k-label\">' + '<input class=\"k-check\" type=\"radio\" data-#=ns#bind=\"checked: filters[0].value\" value=\"false\" name=\"filters[0].value\"/>' + '#=messages.isFalse#' + '</label></li>' + '</ul>' + '</li><li class=\"k-button-container\">' + '<button type=\"reset\" class=\"k-button\">#=messages.clear#</button>' + '</li></ul>' + '</form>' + '</div>';\n        function removeFiltersForField(expression, field) {\n            if (expression.filters) {\n                expression.filters = $.grep(expression.filters, function (filter) {\n                    removeFiltersForField(filter, field);\n                    if (filter.filters) {\n                        return filter.filters.length;\n                    } else {\n                        return filter.field != field;\n                    }\n                });\n            }\n        }\n        function convertItems(items) {\n            var idx, length, item, value, text, result;\n            if (items && items.length) {\n                result = [];\n                for (idx = 0, length = items.length; idx < length; idx++) {\n                    item = items[idx];\n                    text = item.text !== '' ? item.text || item.value || item : item.text;\n                    value = item.value == null ? item.text || item : item.value;\n                    result[idx] = {\n                        text: text,\n                        value: value\n                    };\n                }\n            }\n            return result;\n        }\n        function clearFilter(filters, field) {\n            return $.grep(filters, function (expr) {\n                if (expr.filters) {\n                    expr.filters = $.grep(expr.filters, function (nested) {\n                        return nested.field != field;\n                    });\n                    return expr.filters.length;\n                }\n                return expr.field != field;\n            });\n        }\n        var FilterMenu = Widget.extend({\n            init: function (element, options) {\n                var that = this, type = 'string', operators, initial, link, field;\n                Widget.fn.init.call(that, element, options);\n                operators = that.operators = options.operators || {};\n                element = that.element;\n                options = that.options;\n                if (!options.appendToElement) {\n                    link = element.addClass('k-with-icon k-filterable').find('.k-grid-filter');\n                    if (!link[0]) {\n                        link = element.prepend('<a class=\"k-grid-filter\" href=\"#\" title=\"' + options.messages.filter + '\" aria-label=\"' + options.messages.filter + '\"><span class=\"k-icon k-i-filter\"></span></a>').find('.k-grid-filter');\n                    }\n                    link.attr('tabindex', -1).on('click' + NS, proxy(that._click, that));\n                }\n                that.link = link || $();\n                that.dataSource = DataSource.create(options.dataSource);\n                that.field = options.field || element.attr(kendo.attr('field'));\n                that.model = that.dataSource.reader.model;\n                that._parse = function (value) {\n                    return value != null ? value + '' : value;\n                };\n                if (that.model && that.model.fields) {\n                    field = that.model.fields[that.field];\n                    if (field) {\n                        type = field.type || 'string';\n                        if (field.parse) {\n                            that._parse = proxy(field.parse, field);\n                        }\n                    }\n                }\n                if (options.values) {\n                    type = 'enums';\n                }\n                that.type = type;\n                operators = operators[type] || options.operators[type];\n                for (initial in operators) {\n                    break;\n                }\n                that._defaultFilter = function () {\n                    return {\n                        field: that.field,\n                        operator: initial || 'eq',\n                        value: ''\n                    };\n                };\n                that._refreshHandler = proxy(that.refresh, that);\n                that.dataSource.bind(CHANGE, that._refreshHandler);\n                if (options.appendToElement) {\n                    that._init();\n                } else {\n                    that.refresh();\n                }\n            },\n            _init: function () {\n                var that = this, ui = that.options.ui, setUI = isFunction(ui), role;\n                that.pane = that.options.pane;\n                if (that.pane) {\n                    that._isMobile = true;\n                }\n                if (!setUI) {\n                    role = ui || roles[that.type];\n                }\n                if (that._isMobile) {\n                    that._createMobileForm(role);\n                } else {\n                    that._createForm(role);\n                }\n                that.form.on('submit' + NS, proxy(that._submit, that)).on('reset' + NS, proxy(that._reset, that));\n                if (setUI) {\n                    that.form.find('.k-textbox').removeClass('k-textbox').each(function () {\n                        ui($(this));\n                    });\n                }\n                that.form.find('[' + kendo.attr('role') + '=numerictextbox]').removeClass('k-textbox').end().find('[' + kendo.attr('role') + '=datetimepicker]').removeClass('k-textbox').end().find('[' + kendo.attr('role') + '=timepicker]').removeClass('k-textbox').end().find('[' + kendo.attr('role') + '=datepicker]').removeClass('k-textbox');\n                that.refresh();\n                that.trigger(INIT, {\n                    field: that.field,\n                    container: that.form\n                });\n                kendo.cycleForm(that.form);\n            },\n            _createForm: function (role) {\n                var that = this, options = that.options, operators = that.operators || {}, type = that.type;\n                operators = operators[type] || options.operators[type];\n                that.form = $('<form title=\"' + that.options.messages.info + '\" class=\"k-filter-menu\"/>').html(kendo.template(type === 'boolean' ? booleanTemplate : defaultTemplate)({\n                    field: that.field,\n                    format: options.format,\n                    ns: kendo.ns,\n                    messages: options.messages,\n                    extra: options.extra,\n                    operators: operators,\n                    type: type,\n                    role: role,\n                    values: convertItems(options.values)\n                }));\n                if (!options.appendToElement) {\n                    that.popup = that.form[POPUP]({\n                        anchor: that.link,\n                        open: proxy(that._open, that),\n                        activate: proxy(that._activate, that),\n                        close: function () {\n                            if (that.options.closeCallback) {\n                                that.options.closeCallback(that.element);\n                            }\n                        }\n                    }).data(POPUP);\n                } else {\n                    that.element.append(that.form);\n                    that.popup = that.element.closest('.k-popup').data(POPUP);\n                }\n                that.form.on('keydown' + NS, proxy(that._keydown, that));\n            },\n            _createMobileForm: function (role) {\n                var that = this, options = that.options, operators = that.operators || {}, type = that.type;\n                operators = operators[type] || options.operators[type];\n                that.form = $('<div />').html(kendo.template(type === 'boolean' ? booleanMobileTemplate : defaultMobileTemplate)({\n                    field: that.field,\n                    title: options.title || that.field,\n                    format: options.format,\n                    ns: kendo.ns,\n                    messages: options.messages,\n                    extra: options.extra,\n                    operators: operators,\n                    type: type,\n                    role: role,\n                    useRole: !kendo.support.input.date && type === 'date' || type === 'number',\n                    inputType: mobileRoles[type],\n                    values: convertItems(options.values)\n                }));\n                that.view = that.pane.append(that.form.html());\n                that.form = that.view.element.find('form');\n                that.view.element.on('click', '.k-submit', function (e) {\n                    that.form.submit();\n                    e.preventDefault();\n                }).on('click', '.k-i-cancel', function (e) {\n                    that._closeForm();\n                    e.preventDefault();\n                });\n            },\n            refresh: function () {\n                var that = this, expression = that.dataSource.filter() || {\n                        filters: [],\n                        logic: 'and'\n                    };\n                var defaultFilters = [that._defaultFilter()];\n                var defaultOperator = that._defaultFilter().operator;\n                if (that.options.extra || defaultOperator !== 'isnull' && defaultOperator !== 'isnotnull') {\n                    defaultFilters.push(that._defaultFilter());\n                }\n                that.filterModel = kendo.observable({\n                    logic: 'and',\n                    filters: defaultFilters\n                });\n                if (that.form) {\n                    kendo.bind(that.form.children().first(), that.filterModel);\n                }\n                if (that._bind(expression)) {\n                    that.link.addClass('k-state-active');\n                } else {\n                    that.link.removeClass('k-state-active');\n                }\n            },\n            destroy: function () {\n                var that = this;\n                Widget.fn.destroy.call(that);\n                if (that.form) {\n                    kendo.unbind(that.form);\n                    kendo.destroy(that.form);\n                    that.form.unbind(NS);\n                    if (that.popup) {\n                        that.popup.destroy();\n                        that.popup = null;\n                    }\n                    that.form = null;\n                }\n                if (that.view) {\n                    that.view.purge();\n                    that.view = null;\n                }\n                that.link.unbind(NS);\n                if (that._refreshHandler) {\n                    that.dataSource.unbind(CHANGE, that._refreshHandler);\n                    that.dataSource = null;\n                }\n                that.element = that.link = that._refreshHandler = that.filterModel = null;\n            },\n            _bind: function (expression) {\n                var that = this, filters = expression.filters, idx, length, found = false, current = 0, filterModel = that.filterModel, currentFilter, filter;\n                for (idx = 0, length = filters.length; idx < length; idx++) {\n                    filter = filters[idx];\n                    if (filter.field == that.field) {\n                        filterModel.set('logic', expression.logic);\n                        currentFilter = filterModel.filters[current];\n                        if (!currentFilter) {\n                            filterModel.filters.push({ field: that.field });\n                            currentFilter = filterModel.filters[current];\n                        }\n                        currentFilter.set('value', that._parse(filter.value));\n                        currentFilter.set('operator', filter.operator);\n                        current++;\n                        found = true;\n                    } else if (filter.filters) {\n                        found = found || that._bind(filter);\n                    }\n                }\n                return found;\n            },\n            _stripFilters: function (filters) {\n                return $.grep(filters, function (filter) {\n                    return filter.value !== '' && filter.value != null || (filter.operator === 'isnull' || filter.operator === 'isnotnull' || filter.operator === 'isempty' || filter.operator === 'isnotempty');\n                });\n            },\n            _merge: function (expression) {\n                var that = this, logic = expression.logic || 'and', filters = this._stripFilters(expression.filters), filter, result = that.dataSource.filter() || {\n                        filters: [],\n                        logic: 'and'\n                    }, idx, length;\n                removeFiltersForField(result, that.field);\n                for (idx = 0, length = filters.length; idx < length; idx++) {\n                    filter = filters[idx];\n                    filter.value = that._parse(filter.value);\n                }\n                if (filters.length) {\n                    if (result.filters.length) {\n                        expression.filters = filters;\n                        if (result.logic !== 'and') {\n                            result.filters = [{\n                                    logic: result.logic,\n                                    filters: result.filters\n                                }];\n                            result.logic = 'and';\n                        }\n                        if (filters.length > 1) {\n                            result.filters.push(expression);\n                        } else {\n                            result.filters.push(filters[0]);\n                        }\n                    } else {\n                        result.filters = filters;\n                        result.logic = logic;\n                    }\n                }\n                return result;\n            },\n            filter: function (expression) {\n                var filters = this._stripFilters(expression.filters);\n                if (filters.length && this.trigger('change', {\n                        filter: {\n                            logic: expression.logic,\n                            filters: filters\n                        },\n                        field: this.field\n                    })) {\n                    return;\n                }\n                expression = this._merge(expression);\n                if (expression.filters.length) {\n                    this.dataSource.filter(expression);\n                }\n            },\n            clear: function () {\n                var that = this, expression = that.dataSource.filter() || { filters: [] };\n                if (this.trigger('change', {\n                        filter: null,\n                        field: that.field\n                    })) {\n                    return;\n                }\n                expression.filters = $.grep(expression.filters, function (filter) {\n                    if (filter.filters) {\n                        filter.filters = clearFilter(filter.filters, that.field);\n                        return filter.filters.length;\n                    }\n                    return filter.field != that.field;\n                });\n                if (!expression.filters.length) {\n                    expression = null;\n                }\n                that.dataSource.filter(expression);\n            },\n            _submit: function (e) {\n                e.preventDefault();\n                e.stopPropagation();\n                this.filter(this.filterModel.toJSON());\n                this._closeForm();\n            },\n            _reset: function () {\n                this.clear();\n                if (this.options.search && this.container) {\n                    this.container.find('label').parent().show();\n                }\n                this._closeForm();\n            },\n            _closeForm: function () {\n                if (this._isMobile) {\n                    this.pane.navigate('', this.options.animations.right);\n                } else {\n                    this.popup.close();\n                }\n            },\n            _click: function (e) {\n                e.preventDefault();\n                e.stopPropagation();\n                if (!this.popup && !this.pane) {\n                    this._init();\n                }\n                if (this._isMobile) {\n                    this.pane.navigate(this.view, this.options.animations.left);\n                } else {\n                    this.popup.toggle();\n                }\n            },\n            _open: function () {\n                var popup;\n                $('.k-filter-menu').not(this.form).each(function () {\n                    popup = $(this).data(POPUP);\n                    if (popup) {\n                        popup.close();\n                    }\n                });\n            },\n            _activate: function () {\n                this.form.find(':kendoFocusable:first').focus();\n                this.trigger(OPEN, {\n                    field: this.field,\n                    container: this.form\n                });\n            },\n            _keydown: function (e) {\n                if (e.keyCode == kendo.keys.ESC) {\n                    this.popup.close();\n                }\n            },\n            events: [\n                INIT,\n                'change',\n                OPEN\n            ],\n            options: {\n                name: 'FilterMenu',\n                extra: true,\n                appendToElement: false,\n                type: 'string',\n                operators: {\n                    string: {\n                        eq: EQ,\n                        neq: NEQ,\n                        startswith: 'Starts with',\n                        contains: 'Contains',\n                        doesnotcontain: 'Does not contain',\n                        endswith: 'Ends with',\n                        isnull: 'Is null',\n                        isnotnull: 'Is not null',\n                        isempty: 'Is empty',\n                        isnotempty: 'Is not empty'\n                    },\n                    number: {\n                        eq: EQ,\n                        neq: NEQ,\n                        gte: 'Is greater than or equal to',\n                        gt: 'Is greater than',\n                        lte: 'Is less than or equal to',\n                        lt: 'Is less than',\n                        isnull: 'Is null',\n                        isnotnull: 'Is not null'\n                    },\n                    date: {\n                        eq: EQ,\n                        neq: NEQ,\n                        gte: 'Is after or equal to',\n                        gt: 'Is after',\n                        lte: 'Is before or equal to',\n                        lt: 'Is before',\n                        isnull: 'Is null',\n                        isnotnull: 'Is not null'\n                    },\n                    enums: {\n                        eq: EQ,\n                        neq: NEQ,\n                        isnull: 'Is null',\n                        isnotnull: 'Is not null'\n                    }\n                },\n                messages: {\n                    info: 'Show items with value that:',\n                    isTrue: 'is true',\n                    isFalse: 'is false',\n                    filter: 'Filter',\n                    clear: 'Clear',\n                    and: 'And',\n                    or: 'Or',\n                    selectValue: '-Select value-',\n                    operator: 'Operator',\n                    value: 'Value',\n                    additionalValue: 'Additional value',\n                    additionalOperator: 'Additional operator',\n                    logic: 'Filters logic',\n                    cancel: 'Cancel'\n                },\n                animations: {\n                    left: 'slide',\n                    right: 'slide:right'\n                }\n            }\n        });\n        var multiCheckNS = '.kendoFilterMultiCheck';\n        function filterValuesForField(expression, field) {\n            if (expression.filters) {\n                expression.filters = $.grep(expression.filters, function (filter) {\n                    filterValuesForField(filter, field);\n                    if (filter.filters) {\n                        return filter.filters.length;\n                    } else {\n                        return filter.field == field && filter.operator == 'eq';\n                    }\n                });\n            }\n        }\n        function flatFilterValues(expression) {\n            if (expression.logic == 'and' && expression.filters.length > 1) {\n                return [];\n            }\n            if (expression.filters) {\n                return $.map(expression.filters, function (filter) {\n                    return flatFilterValues(filter);\n                });\n            } else if (expression.value !== null && expression.value !== undefined) {\n                return [expression.value];\n            } else {\n                return [];\n            }\n        }\n        function distinct(items, field) {\n            var getter = kendo.getter(field, true), result = [], index = 0, seen = {};\n            while (index < items.length) {\n                var item = items[index++], text = getter(item);\n                if (text !== undefined && text !== null && !seen.hasOwnProperty(text)) {\n                    result.push(item);\n                    seen[text] = true;\n                }\n            }\n            return result;\n        }\n        function removeDuplicates(dataSelector, dataTextField) {\n            return function (e) {\n                var items = dataSelector(e);\n                return distinct(items, dataTextField);\n            };\n        }\n        var DataSource = kendo.data.DataSource;\n        var multiCkeckMobileTemplate = '<div data-#=ns#role=\"view\" data-#=ns#init-widgets=\"false\" class=\"k-grid-filter-menu\">' + '<div data-#=ns#role=\"header\" class=\"k-header\">' + '<button class=\"k-button k-i-cancel\">#=messages.cancel#</button>' + '#=title#' + '<button type=\"submit\" class=\"k-button k-submit\">#=messages.filter#</button>' + '</div>' + '<form class=\"k-filter-menu k-mobile-list\">' + '#if(search){#' + '<div class=\\'k-textbox k-space-right\\'>' + '<input placeholder=\\'#=messages.search#\\'/>' + '<span class=\\'k-icon k-i-zoom\\' />' + '</div>' + '#}#' + '<ul class=\"k-multicheck-wrap\"></ul>' + '</li><li class=\"k-button-container\">' + '#if(messages.selectedItemsFormat){#<div class=\\'k-filter-selected-items\\'></div>#}#' + '<button type=\"reset\" class=\"k-button\">#=messages.clear#</button>' + '</li></ul>' + '</form>' + '</div>';\n        var FilterMultiCheck = Widget.extend({\n            init: function (element, options) {\n                Widget.fn.init.call(this, element, options);\n                options = this.options;\n                this.element = $(element);\n                var field = this.field = this.options.field || this.element.attr(kendo.attr('field'));\n                var checkSource = options.checkSource;\n                if (this._foreignKeyValues()) {\n                    this.checkSource = DataSource.create(options.values);\n                    this.checkSource.fetch();\n                } else if (options.forceUnique) {\n                    checkSource = options.dataSource.options;\n                    delete checkSource.pageSize;\n                    this.checkSource = DataSource.create(checkSource);\n                    this.checkSource.reader.data = removeDuplicates(this.checkSource.reader.data, this.field);\n                } else {\n                    this.checkSource = DataSource.create(checkSource);\n                }\n                this.dataSource = options.dataSource;\n                this.model = this.dataSource.reader.model;\n                this._parse = function (value) {\n                    return value + '';\n                };\n                if (this.model && this.model.fields) {\n                    field = this.model.fields[this.field];\n                    if (field) {\n                        if (field.type == 'number') {\n                            this._parse = parseFloat;\n                        } else if (field.parse) {\n                            this._parse = proxy(field.parse, field);\n                        }\n                        this.type = field.type || 'string';\n                    }\n                }\n                if (!options.appendToElement) {\n                    this._createLink();\n                } else {\n                    this._init();\n                }\n                this._refreshHandler = proxy(this.refresh, this);\n                this.dataSource.bind(CHANGE, this._refreshHandler);\n            },\n            _createLink: function () {\n                var element = this.element;\n                var link = element.addClass('k-with-icon k-filterable').find('.k-grid-filter');\n                if (!link[0]) {\n                    link = element.prepend('<a class=\"k-grid-filter\" href=\"#\" aria-label=\"' + this.options.messages.filter + '\"><span class=\"k-icon k-i-filter\"/></a>').find('.k-grid-filter');\n                }\n                this._link = link.attr('tabindex', -1).on('click' + NS, proxy(this._click, this));\n            },\n            _init: function () {\n                var that = this;\n                var forceUnique = this.options.forceUnique;\n                var options = this.options;\n                this.pane = options.pane;\n                if (this.pane) {\n                    this._isMobile = true;\n                }\n                this._createForm();\n                if (this._foreignKeyValues()) {\n                    this.refresh();\n                } else if (forceUnique && !this.checkSource.options.serverPaging && this.dataSource.data().length) {\n                    this.checkSource.data(distinct(this.dataSource.data(), this.field));\n                    this.refresh();\n                } else {\n                    this._attachProgress();\n                    this.checkSource.fetch(function () {\n                        that.refresh.call(that);\n                    });\n                }\n                if (!this.options.forceUnique) {\n                    this.checkChangeHandler = function () {\n                        that.container.empty();\n                        that.refresh();\n                    };\n                    this.checkSource.bind(CHANGE, this.checkChangeHandler);\n                }\n                this.form.on('keydown' + multiCheckNS, proxy(this._keydown, this)).on('submit' + multiCheckNS, proxy(this._filter, this)).on('reset' + multiCheckNS, proxy(this._reset, this));\n                this.trigger(INIT, {\n                    field: this.field,\n                    container: this.form\n                });\n            },\n            _attachProgress: function () {\n                var that = this;\n                this._progressHandler = function () {\n                    ui.progress(that.container, true);\n                };\n                this._progressHideHandler = function () {\n                    ui.progress(that.container, false);\n                };\n                this.checkSource.bind('progress', this._progressHandler).bind('change', this._progressHideHandler);\n            },\n            _input: function () {\n                var that = this;\n                that._clearTypingTimeout();\n                that._typingTimeout = setTimeout(function () {\n                    that.search();\n                }, 100);\n            },\n            _clearTypingTimeout: function () {\n                if (this._typingTimeout) {\n                    clearTimeout(this._typingTimeout);\n                    this._typingTimeout = null;\n                }\n            },\n            search: function () {\n                var ignoreCase = this.options.ignoreCase;\n                var searchString = this.searchTextBox[0].value;\n                var labels = this.container.find('label');\n                if (ignoreCase) {\n                    searchString = searchString.toLowerCase();\n                }\n                var i = 0;\n                if (this.options.checkAll && labels.length) {\n                    labels[0].parentNode.style.display = searchString ? 'none' : '';\n                    i++;\n                }\n                while (i < labels.length) {\n                    var label = labels[i];\n                    var labelText = label.textContent || label.innerText;\n                    if (ignoreCase) {\n                        labelText = labelText.toLowerCase();\n                    }\n                    label.parentNode.style.display = labelText.indexOf(searchString) >= 0 ? '' : 'none';\n                    i++;\n                }\n            },\n            _activate: function () {\n                this.form.find(':kendoFocusable:first').focus();\n                this.trigger(OPEN, {\n                    field: this.field,\n                    container: this.form\n                });\n            },\n            _createForm: function () {\n                var options = this.options;\n                var html = '';\n                if (!this._isMobile) {\n                    if (options.search) {\n                        html += '<div class=\\'k-textbox k-space-right\\'>' + '<input placeholder=\\'' + options.messages.search + '\\'/>' + '<span class=\\'k-icon k-i-zoom\\' />' + '</div>';\n                    }\n                    html += '<ul class=\\'k-reset k-multicheck-wrap\\'></ul>';\n                    if (options.messages.selectedItemsFormat) {\n                        html += '<div class=\\'k-filter-selected-items\\'>' + kendo.format(options.messages.selectedItemsFormat, 0) + '</div>';\n                    }\n                    html += '<button type=\\'submit\\' class=\\'k-button k-primary\\'>' + options.messages.filter + '</button>';\n                    html += '<button type=\\'reset\\' class=\\'k-button\\'>' + options.messages.clear + '</button>';\n                    this.form = $('<form class=\"k-filter-menu\"/>').html(html);\n                    this.container = this.form.find('.k-multicheck-wrap');\n                }\n                if (this._isMobile) {\n                    var that = this;\n                    that.form = $('<div />').html(kendo.template(multiCkeckMobileTemplate)({\n                        field: that.field,\n                        title: options.title || that.field,\n                        ns: kendo.ns,\n                        messages: options.messages,\n                        search: options.search\n                    }));\n                    that.view = that.pane.append(that.form.html());\n                    that.form = that.view.element.find('form');\n                    var element = this.view.element;\n                    this.container = element.find('.k-multicheck-wrap');\n                    element.on('click', '.k-submit', function (e) {\n                        that.form.submit();\n                        e.preventDefault();\n                    }).on('click', '.k-i-cancel', function (e) {\n                        that._closeForm();\n                        e.preventDefault();\n                    });\n                } else {\n                    if (!options.appendToElement) {\n                        this.popup = this.form.kendoPopup({\n                            anchor: this._link,\n                            activate: proxy(this._activate, this)\n                        }).data(POPUP);\n                    } else {\n                        this.popup = this.element.closest('.k-popup').data(POPUP);\n                        this.element.append(this.form);\n                    }\n                }\n                if (options.search) {\n                    this.searchTextBox = this.form.find('.k-textbox > input');\n                    this.searchTextBox.on('input', proxy(this._input, this));\n                }\n            },\n            createCheckAllItem: function () {\n                var options = this.options;\n                var template = kendo.template(options.itemTemplate({\n                    field: 'all',\n                    mobile: this._isMobile\n                }));\n                var checkAllContainer = $(template({ all: options.messages.checkAll }));\n                this.container.prepend(checkAllContainer);\n                this.checkBoxAll = checkAllContainer.find(':checkbox').eq(0).addClass('k-check-all');\n                this.checkAllHandler = proxy(this.checkAll, this);\n                this.checkBoxAll.on(CHANGE + multiCheckNS, this.checkAllHandler);\n            },\n            updateCheckAllState: function () {\n                if (this.options.messages.selectedItemsFormat) {\n                    this.form.find('.k-filter-selected-items').text(kendo.format(this.options.messages.selectedItemsFormat, this.container.find(':checked:not(.k-check-all)').length));\n                }\n                if (this.checkBoxAll) {\n                    var state = this.container.find(':checkbox:not(.k-check-all)').length == this.container.find(':checked:not(.k-check-all)').length;\n                    this.checkBoxAll.prop('checked', state);\n                }\n            },\n            refresh: function (e) {\n                var forceUnique = this.options.forceUnique;\n                var dataSource = this.dataSource;\n                var filters = this.getFilterArray();\n                if (this._link) {\n                    this._link.toggleClass('k-state-active', filters.length !== 0);\n                }\n                if (this.form) {\n                    if (e && forceUnique && e.sender === dataSource && !dataSource.options.serverPaging && (e.action == 'itemchange' || e.action == 'add' || e.action == 'remove' || dataSource.options.autoSync && e.action === 'sync') && !this._foreignKeyValues()) {\n                        this.checkSource.data(distinct(this.dataSource.data(), this.field));\n                        this.container.empty();\n                    }\n                    if (this.container.is(':empty')) {\n                        this.createCheckBoxes();\n                    }\n                    this.checkValues(filters);\n                    this.trigger(REFRESH);\n                }\n            },\n            getFilterArray: function () {\n                var expression = $.extend(true, {}, {\n                    filters: [],\n                    logic: 'and'\n                }, this.dataSource.filter());\n                filterValuesForField(expression, this.field);\n                var flatValues = flatFilterValues(expression);\n                return flatValues;\n            },\n            createCheckBoxes: function () {\n                var options = this.options;\n                var data;\n                var templateOptions = {\n                    field: this.field,\n                    format: options.format,\n                    mobile: this._isMobile,\n                    type: this.type\n                };\n                if (!this.options.forceUnique) {\n                    data = this.checkSource.view();\n                } else if (this._foreignKeyValues()) {\n                    data = this.checkSource.data();\n                    templateOptions.valueField = 'value';\n                    templateOptions.field = 'text';\n                } else {\n                    data = this.checkSource.data();\n                }\n                var template = kendo.template(options.itemTemplate(templateOptions));\n                var itemsHtml = kendo.render(template, data);\n                if (options.checkAll) {\n                    this.createCheckAllItem();\n                }\n                this.container.on(CHANGE + multiCheckNS, ':checkbox', proxy(this.updateCheckAllState, this));\n                this.container.append(itemsHtml);\n            },\n            checkAll: function () {\n                var state = this.checkBoxAll.is(':checked');\n                this.container.find(':checkbox').prop('checked', state);\n            },\n            checkValues: function (values) {\n                var that = this;\n                $($.grep(this.container.find(':checkbox').prop('checked', false), function (ele) {\n                    var found = false;\n                    if ($(ele).is('.k-check-all')) {\n                        return;\n                    }\n                    var checkBoxVal = that._parse($(ele).val());\n                    for (var i = 0; i < values.length; i++) {\n                        if (that.type == 'date') {\n                            found = values[i].getTime() == checkBoxVal.getTime();\n                        } else {\n                            found = values[i] == checkBoxVal;\n                        }\n                        if (found) {\n                            return found;\n                        }\n                    }\n                })).prop('checked', true);\n                this.updateCheckAllState();\n            },\n            _filter: function (e) {\n                e.preventDefault();\n                e.stopPropagation();\n                var expression = { logic: 'or' };\n                var that = this;\n                expression.filters = $.map(this.form.find(':checkbox:checked:not(.k-check-all)'), function (item) {\n                    return {\n                        value: $(item).val(),\n                        operator: 'eq',\n                        field: that.field\n                    };\n                });\n                if (expression.filters.length && this.trigger('change', {\n                        filter: expression,\n                        field: that.field\n                    })) {\n                    return;\n                }\n                expression = this._merge(expression);\n                if (expression.filters.length) {\n                    this.dataSource.filter(expression);\n                }\n                this._closeForm();\n            },\n            _stripFilters: function (filters) {\n                return $.grep(filters, function (filter) {\n                    return filter.value != null;\n                });\n            },\n            _foreignKeyValues: function () {\n                var options = this.options;\n                return options.values && !options.checkSource;\n            },\n            destroy: function () {\n                var that = this;\n                Widget.fn.destroy.call(that);\n                if (that.form) {\n                    kendo.unbind(that.form);\n                    kendo.destroy(that.form);\n                    that.form.unbind(multiCheckNS);\n                    if (that.popup) {\n                        that.popup.destroy();\n                        that.popup = null;\n                    }\n                    that.form = null;\n                    if (that.container) {\n                        that.container.unbind(multiCheckNS);\n                        that.container = null;\n                    }\n                    if (that.checkBoxAll) {\n                        that.checkBoxAll.unbind(multiCheckNS);\n                    }\n                }\n                if (that.view) {\n                    that.view.purge();\n                    that.view = null;\n                }\n                if (that._link) {\n                    that._link.unbind(NS);\n                }\n                if (that._refreshHandler) {\n                    that.dataSource.unbind(CHANGE, that._refreshHandler);\n                    that.dataSource = null;\n                }\n                if (that.checkChangeHandler) {\n                    that.checkSource.unbind(CHANGE, that.checkChangeHandler);\n                }\n                if (that._progressHandler) {\n                    that.checkSource.unbind('progress', that._progressHandler);\n                }\n                if (that._progressHideHandler) {\n                    that.checkSource.unbind('change', that._progressHideHandler);\n                }\n                this._clearTypingTimeout();\n                this.searchTextBox = null;\n                that.element = that.checkSource = that.container = that.checkBoxAll = that._link = that._refreshHandler = that.checkAllHandler = null;\n            },\n            options: {\n                name: 'FilterMultiCheck',\n                itemTemplate: function (options) {\n                    var field = options.field;\n                    var format = options.format;\n                    var valueField = options.valueField;\n                    var mobile = options.mobile;\n                    var valueFormat = '';\n                    if (valueField === undefined) {\n                        valueField = field;\n                    }\n                    if (options.type == 'date') {\n                        valueFormat = ':yyyy-MM-ddTHH:mm:sszzz';\n                    }\n                    return '<li class=\\'k-item\\'>' + '<label class=\\'k-label\\'>' + '<input type=\\'checkbox\\' class=\\'' + (mobile ? 'k-check' : '') + '\\'  value=\\'#:kendo.format(\\'{0' + valueFormat + '}\\',' + valueField + ')#\\'/>' + '#:kendo.format(\\'' + (format ? format : '{0}') + '\\', ' + field + ')#' + '</label>' + '</li>';\n                },\n                checkAll: true,\n                search: false,\n                ignoreCase: true,\n                appendToElement: false,\n                messages: {\n                    checkAll: 'Select All',\n                    clear: 'Clear',\n                    filter: 'Filter',\n                    search: 'Search',\n                    cancel: 'Cancel',\n                    selectedItemsFormat: '{0} items selected'\n                },\n                forceUnique: true,\n                animations: {\n                    left: 'slide',\n                    right: 'slide:right'\n                }\n            },\n            events: [\n                INIT,\n                REFRESH,\n                'change',\n                OPEN\n            ]\n        });\n        $.extend(FilterMultiCheck.fn, {\n            _click: FilterMenu.fn._click,\n            _keydown: FilterMenu.fn._keydown,\n            _reset: FilterMenu.fn._reset,\n            _closeForm: FilterMenu.fn._closeForm,\n            clear: FilterMenu.fn.clear,\n            _merge: FilterMenu.fn._merge\n        });\n        ui.plugin(FilterMenu);\n        ui.plugin(FilterMultiCheck);\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.menu', ['kendo.popup'], f);\n}(function () {\n    var __meta__ = {\n        id: 'menu',\n        name: 'Menu',\n        category: 'web',\n        description: 'The Menu widget displays hierarchical data as a multi-level menu.',\n        depends: ['popup']\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, ui = kendo.ui, activeElement = kendo._activeElement, touch = kendo.support.touch && kendo.support.mobileOS, MOUSEDOWN = 'mousedown', CLICK = 'click', DELAY = 30, SCROLLSPEED = 50, extend = $.extend, proxy = $.proxy, each = $.each, template = kendo.template, keys = kendo.keys, Widget = ui.Widget, excludedNodesRegExp = /^(ul|a|div)$/i, NS = '.kendoMenu', IMG = 'img', OPEN = 'open', MENU = 'k-menu', LINK = 'k-link', LAST = 'k-last', CLOSE = 'close', TIMER = 'timer', FIRST = 'k-first', IMAGE = 'k-image', SELECT = 'select', ZINDEX = 'zIndex', ACTIVATE = 'activate', DEACTIVATE = 'deactivate', POINTERDOWN = 'touchstart' + NS + ' MSPointerDown' + NS + ' pointerdown' + NS, pointers = kendo.support.pointers, msPointers = kendo.support.msPointers, allPointers = msPointers || pointers, MOUSEENTER = pointers ? 'pointerenter' : msPointers ? 'MSPointerEnter' : 'mouseenter', MOUSELEAVE = pointers ? 'pointerleave' : msPointers ? 'MSPointerLeave' : 'mouseleave', MOUSEWHEEL = 'DOMMouseScroll' + NS + ' mousewheel' + NS, RESIZE = kendo.support.resize + NS, SCROLLWIDTH = 'scrollWidth', SCROLLHEIGHT = 'scrollHeight', OFFSETWIDTH = 'offsetWidth', OFFSETHEIGHT = 'offsetHeight', POPUP_ID_ATTR = 'group', POPUP_OPENER_ATTR = 'groupparent', DOCUMENT_ELEMENT = $(document.documentElement), KENDOPOPUP = 'kendoPopup', DEFAULTSTATE = 'k-state-default', HOVERSTATE = 'k-state-hover', FOCUSEDSTATE = 'k-state-focused', DISABLEDSTATE = 'k-state-disabled', SELECTEDSTATE = 'k-state-selected', menuSelector = '.k-menu', groupSelector = '.k-menu-group', animationContainerSelector = '.k-animation-container', popupSelector = groupSelector + ',' + animationContainerSelector, allItemsSelector = ':not(.k-list) > .k-item', disabledSelector = '.k-item.k-state-disabled', itemSelector = '.k-item:not(.k-state-disabled)', linkSelector = '.k-item:not(.k-state-disabled) > .k-link', exclusionSelector = ':not(.k-item.k-separator)', nextSelector = exclusionSelector + ':eq(0)', lastSelector = exclusionSelector + ':last', templateSelector = 'div:not(.k-animation-container,.k-list-container)', scrollButtonSelector = '.k-menu-scroll-button', touchPointerTypes = {\n                '2': 1,\n                'touch': 1\n            }, templates = {\n                content: template('<div #= contentCssAttributes(item) # tabindex=\\'-1\\'>#= content(item) #</div>'),\n                group: template('<ul class=\\'#= groupCssClass(group) #\\'#= groupAttributes(group) # role=\\'menu\\' aria-hidden=\\'true\\'>' + '#= renderItems(data) #' + '</ul>'),\n                itemWrapper: template('<#= tag(item) # class=\\'#= textClass(item) #\\'#= textAttributes(item) #>' + '#= image(data) ##= sprite(item) ##= text(item) #' + '#= arrow(data) #' + '</#= tag(item) #>'),\n                item: template('<li class=\\'#= wrapperCssClass(group, item) #\\' #= itemCssAttributes(item) # role=\\'menuitem\\'  #=item.items ? \"aria-haspopup=\\'true\\'\": \"\"#' + '#=item.enabled === false ? \"aria-disabled=\\'true\\'\" : \\'\\'#>' + '#= itemWrapper(data) #' + '# if (item.items) { #' + '#= subGroup({ items: item.items, menu: menu, group: { expanded: item.expanded } }) #' + '# } else if (item.content || item.contentUrl) { #' + '#= renderContent(data) #' + '# } #' + '</li>'),\n                scrollButton: template('<span class=\\'k-button k-button-icon k-menu-scroll-button k-scroll-#= direction #\\' unselectable=\\'on\\'>' + '<span class=\\'k-icon k-i-arrow-60-#= direction #\\'></span></span>'),\n                image: template('<img #= imageCssAttributes(item) # alt=\\'\\' src=\\'#= item.imageUrl #\\' />'),\n                arrow: template('<span class=\\'#= arrowClass(item, group) #\\'></span>'),\n                sprite: template('<span class=\\'k-sprite #= spriteCssClass #\\'></span>'),\n                empty: template('')\n            }, rendering = {\n                wrapperCssClass: function (group, item) {\n                    var result = 'k-item', index = item.index;\n                    if (item.enabled === false) {\n                        result += ' k-state-disabled';\n                    } else {\n                        result += ' k-state-default';\n                    }\n                    if (group.firstLevel && index === 0) {\n                        result += ' k-first';\n                    }\n                    if (index == group.length - 1) {\n                        result += ' k-last';\n                    }\n                    if (item.cssClass) {\n                        result += ' ' + item.cssClass;\n                    }\n                    if (item.attr && item.attr.hasOwnProperty('class')) {\n                        result += ' ' + item.attr['class'];\n                    }\n                    if (item.selected) {\n                        result += ' ' + SELECTEDSTATE;\n                    }\n                    return result;\n                },\n                itemCssAttributes: function (item) {\n                    var result = '';\n                    var attributes = item.attr || {};\n                    for (var attr in attributes) {\n                        if (attributes.hasOwnProperty(attr) && attr !== 'class') {\n                            result += attr + '=\"' + attributes[attr] + '\" ';\n                        }\n                    }\n                    return result;\n                },\n                imageCssAttributes: function (item) {\n                    var result = '';\n                    var attributes = item.imageAttr || {};\n                    if (!attributes['class']) {\n                        attributes['class'] = IMAGE;\n                    } else {\n                        attributes['class'] += ' ' + IMAGE;\n                    }\n                    for (var attr in attributes) {\n                        if (attributes.hasOwnProperty(attr)) {\n                            result += attr + '=\"' + attributes[attr] + '\" ';\n                        }\n                    }\n                    return result;\n                },\n                contentCssAttributes: function (item) {\n                    var result = '';\n                    var attributes = item.contentAttr || {};\n                    var defaultClasses = 'k-content k-group k-menu-group';\n                    if (!attributes['class']) {\n                        attributes['class'] = defaultClasses;\n                    } else {\n                        attributes['class'] += ' ' + defaultClasses;\n                    }\n                    for (var attr in attributes) {\n                        if (attributes.hasOwnProperty(attr)) {\n                            result += attr + '=\"' + attributes[attr] + '\" ';\n                        }\n                    }\n                    return result;\n                },\n                textClass: function () {\n                    return LINK;\n                },\n                textAttributes: function (item) {\n                    return item.url ? ' href=\\'' + item.url + '\\'' : '';\n                },\n                arrowClass: function (item, group) {\n                    var result = 'k-icon';\n                    if (group.horizontal) {\n                        result += ' k-i-arrow-60-down';\n                    } else {\n                        result += ' k-i-arrow-60-right';\n                    }\n                    return result;\n                },\n                text: function (item) {\n                    return item.encoded === false ? item.text : kendo.htmlEncode(item.text);\n                },\n                tag: function (item) {\n                    return item.url ? 'a' : 'span';\n                },\n                groupAttributes: function (group) {\n                    return group.expanded !== true ? ' style=\\'display:none\\'' : '';\n                },\n                groupCssClass: function () {\n                    return 'k-group k-menu-group';\n                },\n                content: function (item) {\n                    return item.content ? item.content : '&nbsp;';\n                }\n            };\n        function getEffectDirection(direction, root) {\n            direction = direction.split(' ')[!root + 0] || direction;\n            return direction.replace('top', 'up').replace('bottom', 'down');\n        }\n        function parseDirection(direction, root, isRtl) {\n            direction = direction.split(' ')[!root + 0] || direction;\n            var output = {\n                    origin: [\n                        'bottom',\n                        isRtl ? 'right' : 'left'\n                    ],\n                    position: [\n                        'top',\n                        isRtl ? 'right' : 'left'\n                    ]\n                }, horizontal = /left|right/.test(direction);\n            if (horizontal) {\n                output.origin = [\n                    'top',\n                    direction\n                ];\n                output.position[1] = kendo.directions[direction].reverse;\n            } else {\n                output.origin[0] = direction;\n                output.position[0] = kendo.directions[direction].reverse;\n            }\n            output.origin = output.origin.join(' ');\n            output.position = output.position.join(' ');\n            return output;\n        }\n        function contains(parent, child) {\n            try {\n                return $.contains(parent, child);\n            } catch (e) {\n                return false;\n            }\n        }\n        function updateItemClasses(item) {\n            item = $(item);\n            item.addClass('k-item').children(IMG).addClass(IMAGE);\n            item.children('a').addClass(LINK).children(IMG).addClass(IMAGE);\n            item.filter(':not([disabled])').addClass(DEFAULTSTATE);\n            item.filter('.k-separator').empty().append('&nbsp;');\n            item.filter('li[disabled]').addClass(DISABLEDSTATE).removeAttr('disabled').attr('aria-disabled', true);\n            if (!item.filter('[role]').length) {\n                item.attr('role', 'menuitem');\n            }\n            if (!item.children('.' + LINK).length) {\n                item.contents().filter(function () {\n                    return !this.nodeName.match(excludedNodesRegExp) && !(this.nodeType == 3 && !$.trim(this.nodeValue));\n                }).wrapAll('<span class=\\'' + LINK + '\\'/>');\n            }\n            updateArrow(item);\n            updateFirstLast(item);\n        }\n        function updateArrow(item) {\n            item = $(item);\n            item.find('> .k-link > [class*=k-i-arrow]:not(.k-sprite)').remove();\n            item.filter(':has(.k-menu-group)').children('.k-link:not(:has([class*=k-i-arrow]:not(.k-sprite)))').each(function () {\n                var item = $(this), arrowCssClass = getArrowCssClass(item);\n                item.append('<span class=\\'k-icon ' + arrowCssClass + '\\'/>');\n            });\n        }\n        function getArrowCssClass(item) {\n            var arrowCssClass, parent = item.parent().parent(), isRtl = kendo.support.isRtl(parent);\n            if (parent.hasClass(MENU + '-horizontal')) {\n                arrowCssClass = ' k-i-arrow-60-down';\n            } else {\n                if (isRtl) {\n                    arrowCssClass = ' k-i-arrow-60-left';\n                } else {\n                    arrowCssClass = ' k-i-arrow-60-right';\n                }\n            }\n            return arrowCssClass;\n        }\n        function updateFirstLast(item) {\n            item = $(item);\n            item.filter('.k-first:not(:first-child)').removeClass(FIRST);\n            item.filter('.k-last:not(:last-child)').removeClass(LAST);\n            item.filter(':first-child').addClass(FIRST);\n            item.filter(':last-child').addClass(LAST);\n        }\n        function storeItemSelectEventHandler(element, options) {\n            var selectHandler = getItemSelectEventHandler(options);\n            if (selectHandler) {\n                setItemData(element, selectHandler);\n            }\n            if (options.items) {\n                $(element).children('ul').children('li').each(function (i) {\n                    storeItemSelectEventHandler(this, options.items[i]);\n                });\n            }\n        }\n        function setItemData(element, selectHandler) {\n            $(element).children('.k-link').data({ selectHandler: selectHandler });\n        }\n        function getItemSelectEventHandler(options) {\n            var selectHandler = options.select, isFunction = kendo.isFunction;\n            if (selectHandler && isFunction(selectHandler)) {\n                return selectHandler;\n            }\n            return null;\n        }\n        function popupOpenerSelector(id) {\n            return id ? 'li[data-groupparent=\\'' + id + '\\']' : 'li[data-groupparent]';\n        }\n        function popupGroupSelector(id) {\n            return id ? 'ul[data-group=\\'' + id + '\\']' : 'ul[data-group]';\n        }\n        function getChildPopups(currentPopup, overflowWrapper) {\n            var childPopupOpener = currentPopup.find(popupOpenerSelector());\n            var result = [];\n            childPopupOpener.each(function (i, opener) {\n                opener = $(opener);\n                var popupId = opener.data(POPUP_OPENER_ATTR);\n                var popup = currentPopup;\n                while (popupId) {\n                    popup = overflowWrapper.find(popupGroupSelector(popupId) + ':visible');\n                    if (popup.length) {\n                        result.push(popup);\n                    }\n                    opener = popup.find(popupOpenerSelector());\n                    popupId = opener.data(POPUP_OPENER_ATTR);\n                }\n            });\n            return result;\n        }\n        function popupParentItem(popupElement, overflowWrapper) {\n            var popupId = popupElement.data(POPUP_ID_ATTR);\n            return popupId ? overflowWrapper.find(popupOpenerSelector(popupId)) : $([]);\n        }\n        function itemPopup(item, overflowWrapper) {\n            var popupId = item.data(POPUP_OPENER_ATTR);\n            return popupId ? overflowWrapper.children(animationContainerSelector).children(popupGroupSelector(popupId)) : $([]);\n        }\n        function overflowMenuParents(current, overflowWrapper) {\n            var parents = [];\n            var getParents = function (item) {\n                while (item.parentNode && !overflowWrapper.is(item.parentNode)) {\n                    parents.push(item.parentNode);\n                    item = item.parentNode;\n                }\n            };\n            var elem = current[0] || current;\n            getParents(elem);\n            var last = parents[parents.length - 1];\n            while ($(last).is(animationContainerSelector)) {\n                var popupElement = $(last).children('ul');\n                elem = popupParentItem(popupElement, overflowWrapper)[0];\n                if (!elem) {\n                    break;\n                }\n                parents.push(elem);\n                getParents(elem);\n                last = parents[parents.length - 1];\n            }\n            return parents;\n        }\n        function mousewheelDelta(e) {\n            var delta = 0;\n            if (e.wheelDelta) {\n                delta = -e.wheelDelta / 120;\n                delta = delta > 0 ? Math.ceil(delta) : Math.floor(delta);\n            }\n            if (e.detail) {\n                delta = Math.round(e.detail / 3);\n            }\n            return delta;\n        }\n        function parentsScroll(current, scrollDirection) {\n            var scroll = 0;\n            var parent = current.parentNode;\n            while (parent && !isNaN(parent[scrollDirection])) {\n                scroll += parent[scrollDirection];\n                parent = parent.parentNode;\n            }\n            return scroll;\n        }\n        function isPointerTouch(e) {\n            return allPointers && e.originalEvent.pointerType in touchPointerTypes;\n        }\n        function isTouch(e) {\n            var ev = e.originalEvent;\n            return touch && /touch/i.test(ev.type || '');\n        }\n        function removeSpacesBetweenItems(ul) {\n            ul.contents().filter(function () {\n                return this.nodeName != 'LI';\n            }).remove();\n        }\n        var Menu = Widget.extend({\n            init: function (element, options) {\n                var that = this;\n                Widget.fn.init.call(that, element, options);\n                element = that.wrapper = that.element;\n                options = that.options;\n                that._initData(options);\n                that._updateClasses();\n                that._animations(options);\n                that.nextItemZIndex = 100;\n                that._tabindex();\n                that._initOverflow(options);\n                that._attachMenuEventsHandlers();\n                if (options.openOnClick) {\n                    that.clicked = false;\n                }\n                element.attr('role', 'menubar');\n                if (element[0].id) {\n                    that._ariaId = kendo.format('{0}_mn_active', element[0].id);\n                }\n                kendo.notify(that);\n            },\n            events: [\n                OPEN,\n                CLOSE,\n                ACTIVATE,\n                DEACTIVATE,\n                SELECT\n            ],\n            options: {\n                name: 'Menu',\n                animation: {\n                    open: { duration: 200 },\n                    close: { duration: 100 }\n                },\n                orientation: 'horizontal',\n                direction: 'default',\n                openOnClick: false,\n                closeOnClick: true,\n                hoverDelay: 100,\n                scrollable: false,\n                popupCollision: undefined\n            },\n            _initData: function (options) {\n                var that = this;\n                if (options.dataSource) {\n                    that.angular('cleanup', function () {\n                        return { elements: that.element.children() };\n                    });\n                    that.element.empty();\n                    that.append(options.dataSource, that.element);\n                    that.angular('compile', function () {\n                        return { elements: that.element.children() };\n                    });\n                }\n            },\n            _attachMenuEventsHandlers: function () {\n                var that = this;\n                var element = that.element;\n                var options = that.options;\n                var overflowWrapper = that._overflowWrapper();\n                (overflowWrapper || element).on(POINTERDOWN, itemSelector, proxy(that._focusHandler, that)).on(CLICK + NS, disabledSelector, false).on(CLICK + NS, itemSelector, proxy(that._click, that)).on(POINTERDOWN + ' ' + MOUSEDOWN + NS, '.k-content', proxy(that._preventClose, that)).on(MOUSEENTER + NS, itemSelector, proxy(that._mouseenter, that)).on(MOUSELEAVE + NS, itemSelector, proxy(that._mouseleave, that)).on(MOUSEENTER + NS + ' ' + MOUSELEAVE + NS + ' ' + MOUSEDOWN + NS + ' ' + CLICK + NS, linkSelector, proxy(that._toggleHover, that));\n                element.on('keydown' + NS, proxy(that._keydown, that)).on('focus' + NS, proxy(that._focus, that)).on('focus' + NS, '.k-content', proxy(that._focus, that)).on('blur' + NS, proxy(that._removeHoverItem, that)).on('blur' + NS, '[tabindex]', proxy(that._checkActiveElement, that));\n                if (overflowWrapper) {\n                    overflowWrapper.on(MOUSELEAVE + NS, popupSelector, proxy(that._mouseleavePopup, that)).on(MOUSEENTER + NS, popupSelector, proxy(that._mouseenterPopup, that));\n                }\n                if (options.openOnClick) {\n                    that._documentClickHandler = proxy(that._documentClick, that);\n                    $(document).click(that._documentClickHandler);\n                }\n            },\n            _detachMenuEventsHandlers: function () {\n                var that = this;\n                var overflowWrapper = that._overflowWrapper();\n                if (overflowWrapper) {\n                    overflowWrapper.off(NS);\n                }\n                that.element.off(NS);\n                if (that._documentClickHandler) {\n                    $(document).unbind('click', that._documentClickHandler);\n                }\n            },\n            _initOverflow: function (options) {\n                var that = this;\n                var isHorizontal = options.orientation == 'horizontal';\n                var backwardBtn, forwardBtn;\n                if (options.scrollable) {\n                    that._openedPopups = {};\n                    that._scrollWrapper = that.element.wrap('<div class=\\'k-menu-scroll-wrapper ' + options.orientation + '\\'></div>').parent();\n                    if (isHorizontal) {\n                        removeSpacesBetweenItems(that.element);\n                    }\n                    backwardBtn = $(templates.scrollButton({ direction: isHorizontal ? 'left' : 'up' }));\n                    forwardBtn = $(templates.scrollButton({ direction: isHorizontal ? 'right' : 'down' }));\n                    backwardBtn.add(forwardBtn).appendTo(that._scrollWrapper);\n                    that._initScrolling(that.element, backwardBtn, forwardBtn, isHorizontal);\n                    var initialWidth = that.element.outerWidth();\n                    var initialCssWidth = that.element[0].style.width;\n                    initialCssWidth = initialCssWidth === 'auto' ? '' : initialCssWidth;\n                    if (isHorizontal) {\n                        $(window).on(RESIZE, kendo.throttle(function () {\n                            that._setOverflowWrapperWidth(initialWidth, initialCssWidth);\n                            that._toggleScrollButtons(that.element, backwardBtn, forwardBtn, isHorizontal);\n                        }, 100));\n                    }\n                    that._setOverflowWrapperWidth(initialWidth, initialCssWidth);\n                    that._toggleScrollButtons(that.element, backwardBtn, forwardBtn, isHorizontal);\n                }\n            },\n            _overflowWrapper: function () {\n                return this._scrollWrapper || this._popupsWrapper;\n            },\n            _setOverflowWrapperWidth: function (initialWidth, initialCssWidth) {\n                var that = this;\n                var wrapperCssWidth = that._scrollWrapper.css('width');\n                that._scrollWrapper.css({ width: '' });\n                var wrapperWidth = that._scrollWrapper.outerWidth();\n                that._scrollWrapper.css({ width: wrapperCssWidth });\n                var menuWidth = that.element.outerWidth();\n                var borders = that.element[0].offsetWidth - that.element[0].clientWidth;\n                if (menuWidth != wrapperWidth) {\n                    var width = initialCssWidth ? Math.min(initialWidth, wrapperWidth) : wrapperWidth;\n                    that.element.width(width - borders);\n                    that._scrollWrapper.width(width);\n                }\n            },\n            _reinitOverflow: function (options) {\n                var that = this;\n                var overflowChanged = options.scrollable && !that.options.scrollable || !options.scrollable && that.options.scrollable || options.scrollable && that.options.scrollable && options.scrollable.distance != that.options.scrollable.distance || options.orientation != that.options.orientation;\n                if (overflowChanged) {\n                    that._detachMenuEventsHandlers();\n                    that._destroyOverflow();\n                    that._initOverflow(options);\n                    that._attachMenuEventsHandlers();\n                }\n            },\n            _destroyOverflow: function () {\n                var that = this;\n                var overflowWrapper = that._overflowWrapper();\n                if (overflowWrapper) {\n                    overflowWrapper.off(NS);\n                    overflowWrapper.find(scrollButtonSelector).off(NS).remove();\n                    overflowWrapper.children(animationContainerSelector).each(function (i, popupWrapper) {\n                        var ul = $(popupWrapper).children(groupSelector);\n                        ul.off(MOUSEWHEEL);\n                        var popupParentLi = popupParentItem(ul, overflowWrapper);\n                        if (popupParentLi.length) {\n                            popupParentLi.append(popupWrapper);\n                        }\n                    });\n                    overflowWrapper.find(popupOpenerSelector()).removeAttr('data-groupparent');\n                    overflowWrapper.find(popupGroupSelector()).removeAttr('data-group');\n                    that.element.off(MOUSEWHEEL);\n                    $(window).off(RESIZE);\n                    overflowWrapper.contents().unwrap();\n                    that._scrollWrapper = that._popupsWrapper = that._openedPopups = undefined;\n                }\n            },\n            _initScrolling: function (scrollElement, backwardBtn, forwardBtn, isHorizontal) {\n                var that = this;\n                var scrollable = that.options.scrollable;\n                var distance = $.isNumeric(scrollable.distance) ? scrollable.distance : SCROLLSPEED;\n                var mouseWheelDistance = distance / 2;\n                var backward = '-=' + distance;\n                var forward = '+=' + distance;\n                var backwardDouble = '-=' + distance * 2;\n                var forwardDouble = '+=' + distance * 2;\n                var scrolling = false;\n                var touchEvents = false;\n                var scroll = function (value) {\n                    var scrollValue = isHorizontal ? { 'scrollLeft': value } : { 'scrollTop': value };\n                    scrollElement.finish().animate(scrollValue, 'fast', 'linear', function () {\n                        if (scrolling) {\n                            scroll(value);\n                        }\n                    });\n                    that._toggleScrollButtons(scrollElement, backwardBtn, forwardBtn, isHorizontal);\n                };\n                var mouseenterHandler = function (e) {\n                    if (!scrolling && !touchEvents) {\n                        scroll(e.data.direction);\n                        scrolling = true;\n                    }\n                };\n                var mousedownHandler = function (e) {\n                    var scrollValue = isHorizontal ? { 'scrollLeft': e.data.direction } : { 'scrollTop': e.data.direction };\n                    touchEvents = isTouch(e) || isPointerTouch(e);\n                    scrollElement.stop().animate(scrollValue, 'fast', 'linear', function () {\n                        if (!touchEvents) {\n                            $(e.currentTarget).trigger(MOUSEENTER);\n                        } else {\n                            that._toggleScrollButtons(scrollElement, backwardBtn, forwardBtn, isHorizontal);\n                            scrolling = true;\n                        }\n                    });\n                    scrolling = false;\n                    e.stopPropagation();\n                    e.preventDefault();\n                };\n                backwardBtn.on(MOUSEENTER + NS, { direction: backward }, mouseenterHandler).on(kendo.eventMap.down + NS, { direction: backwardDouble }, mousedownHandler);\n                forwardBtn.on(MOUSEENTER + NS, { direction: forward }, mouseenterHandler).on(kendo.eventMap.down + NS, { direction: forwardDouble }, mousedownHandler);\n                backwardBtn.add(forwardBtn).on(MOUSELEAVE + NS, function () {\n                    scrollElement.stop();\n                    scrolling = false;\n                    that._toggleScrollButtons(scrollElement, backwardBtn, forwardBtn, isHorizontal);\n                });\n                scrollElement.on(MOUSEWHEEL, function (e) {\n                    if (!e.ctrlKey && !e.shiftKey && !e.altKey) {\n                        var wheelDelta = mousewheelDelta(e.originalEvent);\n                        var scrollSpeed = Math.abs(wheelDelta) * mouseWheelDistance;\n                        var value = (wheelDelta > 0 ? '+=' : '-=') + scrollSpeed;\n                        var scrollValue = isHorizontal ? { 'scrollLeft': value } : { 'scrollTop': value };\n                        that._closeChildPopups(scrollElement);\n                        scrollElement.finish().animate(scrollValue, 'fast', 'linear', function () {\n                            that._toggleScrollButtons(scrollElement, backwardBtn, forwardBtn, isHorizontal);\n                        });\n                        e.preventDefault();\n                    }\n                });\n            },\n            _toggleScrollButtons: function (scrollElement, backwardBtn, forwardBtn, horizontal) {\n                var currentScroll = horizontal ? scrollElement.scrollLeft() : scrollElement.scrollTop();\n                var scrollSize = horizontal ? SCROLLWIDTH : SCROLLHEIGHT;\n                var offset = horizontal ? OFFSETWIDTH : OFFSETHEIGHT;\n                backwardBtn.toggle(currentScroll !== 0);\n                forwardBtn.toggle(currentScroll < scrollElement[0][scrollSize] - scrollElement[0][offset] - 1);\n            },\n            setOptions: function (options) {\n                var animation = this.options.animation;\n                this._animations(options);\n                options.animation = extend(true, animation, options.animation);\n                if ('dataSource' in options) {\n                    this._initData(options);\n                }\n                this._updateClasses();\n                this._reinitOverflow(options);\n                Widget.fn.setOptions.call(this, options);\n            },\n            destroy: function () {\n                var that = this;\n                Widget.fn.destroy.call(that);\n                that._detachMenuEventsHandlers();\n                that._destroyOverflow();\n                kendo.destroy(that.element);\n            },\n            enable: function (element, enable) {\n                this._toggleDisabled(element, enable !== false);\n                return this;\n            },\n            disable: function (element) {\n                this._toggleDisabled(element, false);\n                return this;\n            },\n            append: function (item, referenceItem) {\n                referenceItem = this.element.find(referenceItem);\n                var inserted = this._insert(item, referenceItem, referenceItem.length ? referenceItem.find('> .k-menu-group, > .k-animation-container > .k-menu-group') : null);\n                each(inserted.items, function (i) {\n                    inserted.group.append(this);\n                    updateArrow(this);\n                    storeItemSelectEventHandler(this, item[i] || item);\n                });\n                updateArrow(referenceItem);\n                updateFirstLast(inserted.group.find('.k-first, .k-last').add(inserted.items));\n                return this;\n            },\n            insertBefore: function (item, referenceItem) {\n                referenceItem = this.element.find(referenceItem);\n                var inserted = this._insert(item, referenceItem, referenceItem.parent());\n                each(inserted.items, function (i) {\n                    referenceItem.before(this);\n                    updateArrow(this);\n                    updateFirstLast(this);\n                    storeItemSelectEventHandler(this, item[i] || item);\n                });\n                updateFirstLast(referenceItem);\n                return this;\n            },\n            insertAfter: function (item, referenceItem) {\n                referenceItem = this.element.find(referenceItem);\n                var inserted = this._insert(item, referenceItem, referenceItem.parent());\n                each(inserted.items, function (i) {\n                    referenceItem.after(this);\n                    updateArrow(this);\n                    updateFirstLast(this);\n                    storeItemSelectEventHandler(this, item[i] || item);\n                });\n                updateFirstLast(referenceItem);\n                return this;\n            },\n            _insert: function (item, referenceItem, parent) {\n                var that = this, items, groups;\n                if (!referenceItem || !referenceItem.length) {\n                    parent = that.element;\n                }\n                var plain = $.isPlainObject(item), groupData = {\n                        firstLevel: parent.hasClass(MENU),\n                        horizontal: parent.hasClass(MENU + '-horizontal'),\n                        expanded: true,\n                        length: parent.children().length\n                    };\n                if (referenceItem && !parent.length) {\n                    parent = $(Menu.renderGroup({ group: groupData })).appendTo(referenceItem);\n                }\n                if (plain || $.isArray(item)) {\n                    items = $($.map(plain ? [item] : item, function (value, idx) {\n                        if (typeof value === 'string') {\n                            return $(value).get();\n                        } else {\n                            return $(Menu.renderItem({\n                                group: groupData,\n                                item: extend(value, { index: idx })\n                            })).get();\n                        }\n                    }));\n                } else {\n                    if (typeof item == 'string' && item.charAt(0) != '<') {\n                        items = that.element.find(item);\n                    } else {\n                        items = $(item);\n                    }\n                    groups = items.find('> ul').addClass('k-menu-group').attr('role', 'menu');\n                    items = items.filter('li');\n                    items.add(groups.find('> li')).each(function () {\n                        updateItemClasses(this);\n                    });\n                }\n                return {\n                    items: items,\n                    group: parent\n                };\n            },\n            remove: function (element) {\n                element = this.element.find(element);\n                var that = this, parent = element.parentsUntil(that.element, allItemsSelector), group = element.parent('ul:not(.k-menu)');\n                element.remove();\n                if (group && !group.children(allItemsSelector).length) {\n                    var container = group.parent(animationContainerSelector);\n                    if (container.length) {\n                        container.remove();\n                    } else {\n                        group.remove();\n                    }\n                }\n                if (parent.length) {\n                    parent = parent.eq(0);\n                    updateArrow(parent);\n                    updateFirstLast(parent);\n                }\n                return that;\n            },\n            open: function (element) {\n                var that = this;\n                var options = that.options;\n                var horizontal = options.orientation == 'horizontal';\n                var direction = options.direction;\n                var isRtl = kendo.support.isRtl(that.wrapper);\n                var overflowWrapper = that._overflowWrapper();\n                element = (overflowWrapper || that.element).find(element);\n                if (/^(top|bottom|default)$/.test(direction)) {\n                    if (isRtl) {\n                        direction = horizontal ? (direction + ' left').replace('default', 'bottom') : 'left';\n                    } else {\n                        direction = horizontal ? (direction + ' right').replace('default', 'bottom') : 'right';\n                    }\n                }\n                var visiblePopups = '>.k-popup:visible,>.k-animation-container>.k-popup:visible';\n                var closePopup = function () {\n                    var popup = $(this).data(KENDOPOPUP);\n                    if (popup) {\n                        popup.close(true);\n                    }\n                };\n                element.siblings().find(visiblePopups).each(closePopup);\n                if (overflowWrapper) {\n                    element.find(visiblePopups).each(closePopup);\n                }\n                element.each(function () {\n                    var li = $(this);\n                    clearTimeout(li.data(TIMER));\n                    li.data(TIMER, setTimeout(function () {\n                        var ul = li.find('.k-menu-group:first:hidden');\n                        var popup;\n                        var overflowPopup;\n                        if (!ul[0] && overflowWrapper) {\n                            overflowPopup = that._getPopup(li);\n                            ul = overflowPopup && overflowPopup.element;\n                        }\n                        if (ul.is(':visible')) {\n                            return;\n                        }\n                        if (ul[0] && that._triggerEvent({\n                                item: li[0],\n                                type: OPEN\n                            }) === false) {\n                            if (!ul.find('.k-menu-group')[0] && ul.children('.k-item').length > 1) {\n                                var windowHeight = $(window).height(), setScrolling = function () {\n                                        ul.css({\n                                            maxHeight: windowHeight - (kendo._outerHeight(ul) - ul.height()) - kendo.getShadows(ul).bottom,\n                                            overflow: 'auto'\n                                        });\n                                    };\n                                if (kendo.support.browser.msie && kendo.support.browser.version <= 7) {\n                                    setTimeout(setScrolling, 0);\n                                } else {\n                                    setScrolling();\n                                }\n                            } else {\n                                ul.css({\n                                    maxHeight: '',\n                                    overflow: ''\n                                });\n                            }\n                            li.data(ZINDEX, li.css(ZINDEX));\n                            var nextZindex = that.nextItemZIndex++;\n                            li.css(ZINDEX, nextZindex);\n                            if (that.options.scrollable) {\n                                li.parent().siblings(scrollButtonSelector).css({ zIndex: ++nextZindex });\n                            }\n                            popup = ul.data(KENDOPOPUP);\n                            var root = li.parent().hasClass(MENU), parentHorizontal = root && horizontal, directions = parseDirection(direction, root, isRtl), effects = options.animation.open.effects, openEffects = effects !== undefined ? effects : 'slideIn:' + getEffectDirection(direction, root);\n                            if (!popup) {\n                                popup = ul.kendoPopup({\n                                    activate: function () {\n                                        that._triggerEvent({\n                                            item: this.wrapper.parent(),\n                                            type: ACTIVATE\n                                        });\n                                    },\n                                    deactivate: function (e) {\n                                        e.sender.element.removeData('targetTransform').css({ opacity: '' });\n                                        that._triggerEvent({\n                                            item: this.wrapper.parent(),\n                                            type: DEACTIVATE\n                                        });\n                                    },\n                                    origin: directions.origin,\n                                    position: directions.position,\n                                    collision: options.popupCollision !== undefined ? options.popupCollision : parentHorizontal ? 'fit' : 'fit flip',\n                                    anchor: li,\n                                    appendTo: overflowWrapper || li,\n                                    animation: {\n                                        open: extend(true, { effects: openEffects }, options.animation.open),\n                                        close: options.animation.close\n                                    },\n                                    open: proxy(that._popupOpen, that),\n                                    close: function (e) {\n                                        var li = e.sender.wrapper.parent();\n                                        if (overflowWrapper) {\n                                            var popupId = e.sender.element.data(POPUP_ID_ATTR);\n                                            if (popupId) {\n                                                li = (overflowWrapper || that.element).find(popupOpenerSelector(popupId));\n                                            }\n                                            e.sender.wrapper.children(scrollButtonSelector).hide();\n                                        }\n                                        if (!that._triggerEvent({\n                                                item: li[0],\n                                                type: CLOSE\n                                            })) {\n                                            li.css(ZINDEX, li.data(ZINDEX));\n                                            li.removeData(ZINDEX);\n                                            if (that.options.scrollable) {\n                                                li.parent().siblings(scrollButtonSelector).css({ zIndex: '' });\n                                            }\n                                            if (touch || allPointers) {\n                                                li.removeClass(HOVERSTATE);\n                                                that._removeHoverItem();\n                                            }\n                                        } else {\n                                            e.preventDefault();\n                                        }\n                                    }\n                                }).data(KENDOPOPUP);\n                            } else {\n                                popup = ul.data(KENDOPOPUP);\n                                popup.options.origin = directions.origin;\n                                popup.options.position = directions.position;\n                                popup.options.animation.open.effects = openEffects;\n                            }\n                            ul.removeAttr('aria-hidden');\n                            that._configurePopupOverflow(popup, li);\n                            popup.open();\n                            that._initPopupScrolling(popup);\n                        }\n                    }, that.options.hoverDelay));\n                });\n                return that;\n            },\n            _configurePopupOverflow: function (popup, popupOpener) {\n                var that = this;\n                if (that.options.scrollable) {\n                    that._wrapPopupElement(popup);\n                    if (!popupOpener.attr('data-groupparent')) {\n                        var groupId = new Date().getTime();\n                        popupOpener.attr('data-groupparent', groupId);\n                        popup.element.attr('data-group', groupId);\n                    }\n                }\n            },\n            _wrapPopupElement: function (popup) {\n                if (!popup.element.parent().is(animationContainerSelector)) {\n                    popup.wrapper = kendo.wrap(popup.element, popup.options.autosize).css({\n                        overflow: 'hidden',\n                        display: 'block',\n                        position: 'absolute'\n                    });\n                }\n            },\n            _initPopupScrolling: function (popup, isHorizontal, skipMouseEvents) {\n                var that = this;\n                if (that.options.scrollable && popup.element[0].scrollHeight > popup.element[0].offsetHeight) {\n                    that._initPopupScrollButtons(popup, isHorizontal, skipMouseEvents);\n                }\n            },\n            _initPopupScrollButtons: function (popup, isHorizontal, skipMouseEvents) {\n                var that = this;\n                var scrollButtons = popup.wrapper.children(scrollButtonSelector);\n                var animation = that.options.animation;\n                var timeout = (animation && animation.open && animation.open.duration || 0) + DELAY;\n                setTimeout(function () {\n                    if (!scrollButtons.length) {\n                        var backwardBtn = $(templates.scrollButton({ direction: isHorizontal ? 'left' : 'up' }));\n                        var forwardBtn = $(templates.scrollButton({ direction: isHorizontal ? 'right' : 'down' }));\n                        scrollButtons = backwardBtn.add(forwardBtn).appendTo(popup.wrapper);\n                        that._initScrolling(popup.element, backwardBtn, forwardBtn, isHorizontal);\n                        if (!skipMouseEvents) {\n                            scrollButtons.on(MOUSEENTER + NS, function () {\n                                var overflowWrapper = that._overflowWrapper();\n                                $(getChildPopups(popup.element, overflowWrapper)).each(function (i, p) {\n                                    var popupOpener = overflowWrapper.find(popupOpenerSelector(p.data(POPUP_ID_ATTR)));\n                                    that.close(popupOpener);\n                                });\n                            }).on(MOUSELEAVE + NS, function () {\n                                setTimeout(function () {\n                                    if ($.isEmptyObject(that._openedPopups)) {\n                                        that._closeParentPopups(popup.element);\n                                    }\n                                }, DELAY);\n                            });\n                        }\n                    }\n                    that._toggleScrollButtons(popup.element, scrollButtons.first(), scrollButtons.last(), isHorizontal);\n                }, timeout);\n            },\n            _popupOpen: function (e) {\n                e.sender.element.children('.' + FOCUSEDSTATE).removeClass(FOCUSEDSTATE);\n                if (this.options.scrollable) {\n                    this._setPopupHeight(e.sender);\n                }\n            },\n            _setPopupHeight: function (popup, isFixed) {\n                var popupElement = popup.element;\n                var popups = popupElement.add(popupElement.parent(animationContainerSelector));\n                popups.height(popupElement.hasClass(MENU) && this._initialHeight || '');\n                var location = popup._location(isFixed);\n                var windowHeight = $(window).height();\n                var popupOuterHeight = location.height;\n                var popupOffsetTop = isFixed ? 0 : Math.max(location.top, 0);\n                var scrollTop = isFixed ? 0 : parentsScroll(this._overflowWrapper()[0], 'scrollTop');\n                var bottomScrollbar = window.innerHeight - windowHeight;\n                var maxHeight = windowHeight - kendo.getShadows(popupElement).bottom + bottomScrollbar;\n                var canFit = maxHeight + scrollTop > popupOuterHeight + popupOffsetTop;\n                if (!canFit) {\n                    var height = Math.min(maxHeight, maxHeight - popupOffsetTop + scrollTop);\n                    popups.css({\n                        overflow: 'hidden',\n                        height: height + 'px'\n                    });\n                }\n            },\n            close: function (items, dontClearClose) {\n                var that = this;\n                var overflowWrapper = that._overflowWrapper();\n                var element = overflowWrapper || that.element;\n                items = element.find(items);\n                if (!items.length) {\n                    items = element.find('>.k-item');\n                }\n                var hasChildPopupsHovered = function (currentPopup) {\n                    var result = false;\n                    if ($.isEmptyObject(that._openedPopups)) {\n                        return result;\n                    }\n                    $(getChildPopups(currentPopup, overflowWrapper)).each(function (i, popup) {\n                        result = !!that._openedPopups[popup.data(POPUP_ID_ATTR).toString()];\n                        return !result;\n                    });\n                    return result;\n                };\n                var isPopupMouseLeaved = function (opener) {\n                    var groupId = opener.data(POPUP_OPENER_ATTR);\n                    return !overflowWrapper || !groupId || !that._openedPopups[groupId.toString()];\n                };\n                items.each(function () {\n                    var li = $(this);\n                    if (!dontClearClose && that._isRootItem(li)) {\n                        that.clicked = false;\n                    }\n                    clearTimeout(li.data(TIMER));\n                    li.data(TIMER, setTimeout(function () {\n                        var popup = that._getPopup(li);\n                        if (popup && (isPopupMouseLeaved(li) || that._forceClose)) {\n                            if (!that._forceClose && hasChildPopupsHovered(popup.element)) {\n                                return;\n                            }\n                            popup.close();\n                            popup.element.attr('aria-hidden', true);\n                            if (overflowWrapper) {\n                                if (that._forceClose && items.last().is(li[0])) {\n                                    delete that._forceClose;\n                                }\n                            }\n                        }\n                    }, that.options.hoverDelay));\n                });\n                return that;\n            },\n            _getPopup: function (li) {\n                var that = this;\n                var popup = li.find('.k-menu-group:not(.k-list-container):not(.k-calendar-container):first:visible').data(KENDOPOPUP);\n                var overflowWrapper = that._overflowWrapper();\n                if (!popup && overflowWrapper) {\n                    var groupId = li.data(POPUP_OPENER_ATTR);\n                    if (groupId) {\n                        var popupElement = overflowWrapper.find(popupGroupSelector(groupId));\n                        popup = popupElement.data(KENDOPOPUP);\n                    }\n                }\n                return popup;\n            },\n            _toggleDisabled: function (items, enable) {\n                this.element.find(items).each(function () {\n                    $(this).toggleClass(DEFAULTSTATE, enable).toggleClass(DISABLEDSTATE, !enable).attr('aria-disabled', !enable);\n                });\n            },\n            _toggleHover: function (e) {\n                var target = $(kendo.eventTarget(e) || e.target).closest(allItemsSelector), isEnter = e.type == MOUSEENTER || MOUSEDOWN.indexOf(e.type) !== -1;\n                if (!target.parents('li.' + DISABLEDSTATE).length) {\n                    target.toggleClass(HOVERSTATE, isEnter || e.type == 'mousedown' || e.type == 'click');\n                }\n                this._removeHoverItem();\n            },\n            _preventClose: function () {\n                if (!this.options.closeOnClick) {\n                    this._closurePrevented = true;\n                }\n            },\n            _checkActiveElement: function (e) {\n                var that = this, hoverItem = $(e ? e.currentTarget : this._hoverItem()), target = that._findRootParent(hoverItem)[0];\n                if (!this._closurePrevented) {\n                    setTimeout(function () {\n                        if (!document.hasFocus() || !contains(target, kendo._activeElement()) && e && !contains(target, e.currentTarget)) {\n                            that.close(target);\n                        }\n                    }, 0);\n                }\n                this._closurePrevented = false;\n            },\n            _removeHoverItem: function () {\n                var oldHoverItem = this._hoverItem();\n                if (oldHoverItem && oldHoverItem.hasClass(FOCUSEDSTATE)) {\n                    oldHoverItem.removeClass(FOCUSEDSTATE);\n                    this._oldHoverItem = null;\n                }\n            },\n            _updateClasses: function () {\n                var element = this.element, nonContentGroupsSelector = '.k-menu-init div ul', items;\n                element.removeClass('k-menu-horizontal k-menu-vertical');\n                element.addClass('k-widget k-reset k-header k-menu-init ' + MENU).addClass(MENU + '-' + this.options.orientation);\n                element.find('li > ul').filter(function () {\n                    return !kendo.support.matchesSelector.call(this, nonContentGroupsSelector);\n                }).addClass('k-group k-menu-group').attr('role', 'menu').attr('aria-hidden', element.is(':visible')).end().find('li > div').addClass('k-content').attr('tabindex', '-1');\n                items = element.find('> li,.k-menu-group > li');\n                element.removeClass('k-menu-init');\n                items.each(function () {\n                    updateItemClasses(this);\n                });\n            },\n            _mouseenter: function (e) {\n                var that = this;\n                var element = $(e.currentTarget);\n                var hasChildren = that._itemHasChildren(element);\n                var popupId = element.data(POPUP_OPENER_ATTR) || element.parent().data(POPUP_ID_ATTR);\n                var pointerTouch = isPointerTouch(e);\n                if (popupId) {\n                    that._openedPopups[popupId.toString()] = true;\n                }\n                if (e.delegateTarget != element.parents(menuSelector)[0] && e.delegateTarget != element.parents('.k-menu-scroll-wrapper,.k-popups-wrapper')[0]) {\n                    return;\n                }\n                if ((!that.options.openOnClick || that.clicked) && !touch && !(pointerTouch && that._isRootItem(element.closest(allItemsSelector)))) {\n                    if (!contains(e.currentTarget, e.relatedTarget) && hasChildren) {\n                        that.open(element);\n                    }\n                }\n                if (that.options.openOnClick && that.clicked || touch) {\n                    element.siblings().each(proxy(function (_, sibling) {\n                        that.close(sibling, true);\n                    }, that));\n                }\n            },\n            _mouseleave: function (e) {\n                var that = this;\n                var element = $(e.currentTarget);\n                var popupOpener = element.data(POPUP_OPENER_ATTR);\n                var hasChildren = element.children(animationContainerSelector).length || element.children(groupSelector).length || popupOpener;\n                var $window = $(window);\n                if (popupOpener) {\n                    delete that._openedPopups[popupOpener.toString()];\n                }\n                if (element.parentsUntil(animationContainerSelector, '.k-list-container,.k-calendar-container')[0]) {\n                    e.stopImmediatePropagation();\n                    return;\n                }\n                if (!that.options.openOnClick && !touch && !isPointerTouch(e) && !contains(e.currentTarget, e.relatedTarget || e.target) && hasChildren && !contains(e.currentTarget, kendo._activeElement())) {\n                    that.close(element);\n                    return;\n                }\n                if (!e.toElement && !e.relatedTarget || e.clientX < 0 || e.clientY < 0 || e.clientY > $window.height() || e.clientX > $window.width()) {\n                    that.close(element);\n                }\n            },\n            _mouseenterPopup: function (e) {\n                var that = this;\n                var popupElement = $(e.currentTarget);\n                if (popupElement.parent().is(animationContainerSelector)) {\n                    return;\n                }\n                popupElement = popupElement.children('ul');\n                var popupId = popupElement.data(POPUP_ID_ATTR);\n                if (popupId) {\n                    that._openedPopups[popupId.toString()] = true;\n                }\n            },\n            _mouseleavePopup: function (e) {\n                var that = this;\n                var popupElement = $(e.currentTarget);\n                if (!isPointerTouch(e) && popupElement.is(animationContainerSelector)) {\n                    that._closePopups(popupElement.children('ul'));\n                }\n            },\n            _closePopups: function (rootPopup) {\n                var that = this;\n                var overflowWrapper = that._overflowWrapper();\n                var popupId = rootPopup.data(POPUP_ID_ATTR);\n                if (popupId) {\n                    delete that._openedPopups[popupId.toString()];\n                    var groupParent = overflowWrapper.find(popupOpenerSelector(popupId));\n                    setTimeout(function () {\n                        if (that.options.openOnClick) {\n                            that._closeChildPopups(rootPopup);\n                        } else {\n                            if ($.isEmptyObject(that._openedPopups)) {\n                                var innerPopup = that._innerPopup(rootPopup);\n                                that._closeParentPopups(innerPopup);\n                            } else {\n                                that.close(groupParent, true);\n                            }\n                        }\n                    }, 0);\n                }\n            },\n            _closeChildPopups: function (current) {\n                var that = this;\n                var overflowWrapper = that._overflowWrapper();\n                $(getChildPopups(current, overflowWrapper)).each(function () {\n                    var popupOpener = overflowWrapper.find(popupOpenerSelector(this.data(POPUP_ID_ATTR)));\n                    that.close(popupOpener, true);\n                });\n            },\n            _innerPopup: function (current) {\n                var overflowWrapper = this._overflowWrapper();\n                var popups = getChildPopups(current, overflowWrapper);\n                return popups[popups.length - 1] || current;\n            },\n            _closeParentPopups: function (current) {\n                var that = this;\n                var overflowWrapper = that._overflowWrapper();\n                var popupId = current.data(POPUP_ID_ATTR);\n                var popupOpener = overflowWrapper.find(popupOpenerSelector(popupId));\n                popupId = popupOpener.parent().data(POPUP_ID_ATTR);\n                that.close(popupOpener, true);\n                while (popupId && !that._openedPopups[popupId]) {\n                    if (popupOpener.parent().is(menuSelector)) {\n                        break;\n                    }\n                    popupOpener = overflowWrapper.find(popupOpenerSelector(popupId));\n                    that.close(popupOpener, true);\n                    popupId = popupOpener.parent().data(POPUP_ID_ATTR);\n                }\n            },\n            _click: function (e) {\n                var that = this, openHandle, options = that.options, target = $(kendo.eventTarget(e)), targetElement = target[0], nodeName = target[0] ? target[0].nodeName.toUpperCase() : '', formNode = nodeName == 'INPUT' || nodeName == 'SELECT' || nodeName == 'BUTTON' || nodeName == 'LABEL', link = target.closest('.' + LINK), element = target.closest(allItemsSelector), itemElement = element[0], href = link.attr('href'), childGroup, childGroupVisible, targetHref = target.attr('href'), sampleHref = $('<a href=\\'#\\' />').attr('href'), isLink = !!href && href !== sampleHref, isLocalLink = isLink && !!href.match(/^#/), isTargetLink = !!targetHref && targetHref !== sampleHref, overflowWrapper = that._overflowWrapper(), shouldCloseTheRootItem;\n                while (targetElement && targetElement.parentNode != itemElement) {\n                    targetElement = targetElement.parentNode;\n                }\n                if ($(targetElement).is(templateSelector)) {\n                    return;\n                }\n                if (element.hasClass(DISABLEDSTATE)) {\n                    e.preventDefault();\n                    return;\n                }\n                if (!e.handled && that._triggerSelect(target, itemElement) && !formNode) {\n                    e.preventDefault();\n                }\n                e.handled = true;\n                childGroup = element.children(popupSelector);\n                if (overflowWrapper) {\n                    var childPopupId = element.data(POPUP_OPENER_ATTR);\n                    if (childPopupId) {\n                        childGroup = overflowWrapper.find(popupGroupSelector(childPopupId));\n                    }\n                }\n                childGroupVisible = childGroup.is(':visible');\n                shouldCloseTheRootItem = options.openOnClick && childGroupVisible && that._isRootItem(element);\n                if (options.closeOnClick && (!isLink || isLocalLink) && (!childGroup.length || shouldCloseTheRootItem)) {\n                    element.removeClass(HOVERSTATE).css('height');\n                    that._oldHoverItem = that._findRootParent(element);\n                    var item = that._parentsUntil(link, that.element, allItemsSelector);\n                    that._forceClose = !!overflowWrapper;\n                    that.close(item);\n                    that.clicked = false;\n                    if ('MSPointerUp'.indexOf(e.type) != -1) {\n                        e.preventDefault();\n                    }\n                    return;\n                }\n                if (isLink && e.enterKey) {\n                    link[0].click();\n                }\n                if ((!that._isRootItem(element) || !options.openOnClick) && !kendo.support.touch && !(allPointers && that._isRootItem(element.closest(allItemsSelector)))) {\n                    return;\n                }\n                if (!isLink && !formNode && !isTargetLink) {\n                    e.preventDefault();\n                }\n                that.clicked = true;\n                openHandle = childGroup.is(':visible') ? CLOSE : OPEN;\n                if (!options.closeOnClick && openHandle == CLOSE) {\n                    return;\n                }\n                that[openHandle](element);\n            },\n            _parentsUntil: function (context, top, selector) {\n                var overflowWrapper = this._overflowWrapper();\n                if (!overflowWrapper) {\n                    return context.parentsUntil(top, selector);\n                } else {\n                    var parents = overflowMenuParents(context, overflowWrapper);\n                    var result = [];\n                    $(parents).each(function () {\n                        var parent = $(this);\n                        if (parent.is(top)) {\n                            return false;\n                        }\n                        if (parent.is(selector)) {\n                            result.push(this);\n                        }\n                    });\n                    return $(result);\n                }\n            },\n            _triggerSelect: function (target, itemElement) {\n                var selectHandler = target.data('selectHandler'), itemSelectEventData;\n                if (selectHandler) {\n                    itemSelectEventData = this._getEventData(target);\n                    selectHandler.call(this, itemSelectEventData);\n                }\n                var isSelectItemDefaultPrevented = itemSelectEventData && itemSelectEventData.isDefaultPrevented();\n                var isSelectDefaultPrevented = this._triggerEvent({\n                    item: itemElement,\n                    type: SELECT\n                });\n                return isSelectItemDefaultPrevented || isSelectDefaultPrevented;\n            },\n            _getEventData: function (target) {\n                var eventData = {\n                    sender: this,\n                    target: target,\n                    _defaultPrevented: false,\n                    preventDefault: function () {\n                        this._defaultPrevented = true;\n                    },\n                    isDefaultPrevented: function () {\n                        return this._defaultPrevented;\n                    }\n                };\n                return eventData;\n            },\n            _documentClick: function (e) {\n                var that = this;\n                if (contains((that._overflowWrapper() || that.element)[0], e.target)) {\n                    return;\n                }\n                that.clicked = false;\n            },\n            _focus: function (e) {\n                var that = this, target = e.target, hoverItem = that._hoverItem(), active = activeElement();\n                if (target != that.wrapper[0] && !$(target).is(':kendoFocusable')) {\n                    e.stopPropagation();\n                    $(target).closest('.k-content').closest('.k-menu-group').closest('.k-item').addClass(FOCUSEDSTATE);\n                    that.wrapper.focus();\n                    return;\n                }\n                if (active === e.currentTarget) {\n                    if (hoverItem.length) {\n                        that._moveHover([], hoverItem);\n                    } else if (!that._oldHoverItem) {\n                        that._moveHover([], that.wrapper.children().first());\n                    }\n                }\n            },\n            _keydown: function (e) {\n                var that = this, key = e.keyCode, hoverItem = that._oldHoverItem, target, belongsToVertical, hasChildren, isRtl = kendo.support.isRtl(that.wrapper);\n                if (e.target != e.currentTarget && key != keys.ESC) {\n                    return;\n                }\n                if (!hoverItem) {\n                    hoverItem = that._oldHoverItem = that._hoverItem();\n                }\n                belongsToVertical = that._itemBelongsToVertival(hoverItem);\n                hasChildren = that._itemHasChildren(hoverItem);\n                if (key == keys.RIGHT) {\n                    target = that[isRtl ? '_itemLeft' : '_itemRight'](hoverItem, belongsToVertical, hasChildren);\n                } else if (key == keys.LEFT) {\n                    target = that[isRtl ? '_itemRight' : '_itemLeft'](hoverItem, belongsToVertical, hasChildren);\n                } else if (key == keys.DOWN) {\n                    target = that._itemDown(hoverItem, belongsToVertical, hasChildren);\n                } else if (key == keys.UP) {\n                    target = that._itemUp(hoverItem, belongsToVertical, hasChildren);\n                } else if (key == keys.ESC) {\n                    target = that._itemEsc(hoverItem, belongsToVertical);\n                } else if (key == keys.ENTER || key == keys.SPACEBAR) {\n                    target = hoverItem.children('.k-link');\n                    if (target.length > 0) {\n                        that._click({\n                            target: target[0],\n                            preventDefault: function () {\n                            },\n                            enterKey: true\n                        });\n                        that._moveHover(hoverItem, that._findRootParent(hoverItem));\n                    }\n                } else if (key == keys.TAB) {\n                    target = that._findRootParent(hoverItem);\n                    that._moveHover(hoverItem, target);\n                    that._checkActiveElement();\n                    return;\n                }\n                if (target && target[0]) {\n                    e.preventDefault();\n                    e.stopPropagation();\n                }\n            },\n            _hoverItem: function () {\n                return this.wrapper.find('.k-item.k-state-hover,.k-item.k-state-focused').filter(':visible');\n            },\n            _itemBelongsToVertival: function (item) {\n                var menuIsVertical = this.wrapper.hasClass('k-menu-vertical');\n                if (!item.length) {\n                    return menuIsVertical;\n                }\n                return item.parent().hasClass('k-menu-group') || menuIsVertical;\n            },\n            _itemHasChildren: function (item) {\n                if (!item || !item.length || !item[0].nodeType) {\n                    return false;\n                }\n                return item.children('ul.k-menu-group, div.k-animation-container').length > 0 || !!item.data(POPUP_OPENER_ATTR) && !!this._overflowWrapper().children(popupGroupSelector(item.data(POPUP_OPENER_ATTR)));\n            },\n            _moveHover: function (item, nextItem) {\n                var that = this, id = that._ariaId;\n                if (item.length && nextItem.length) {\n                    item.removeClass(FOCUSEDSTATE);\n                }\n                if (nextItem.length) {\n                    if (nextItem[0].id) {\n                        id = nextItem[0].id;\n                    }\n                    nextItem.addClass(FOCUSEDSTATE);\n                    that._oldHoverItem = nextItem;\n                    if (id) {\n                        that.element.removeAttr('aria-activedescendant');\n                        $('#' + id).removeAttr('id');\n                        nextItem.attr('id', id);\n                        that.element.attr('aria-activedescendant', id);\n                    }\n                    that._scrollToItem(nextItem);\n                }\n            },\n            _findRootParent: function (item) {\n                if (this._isRootItem(item)) {\n                    return item;\n                } else {\n                    return this._parentsUntil(item, menuSelector, 'li.k-item').last();\n                }\n            },\n            _isRootItem: function (item) {\n                return item.parent().hasClass(MENU);\n            },\n            _itemRight: function (item, belongsToVertical, hasChildren) {\n                var that = this, nextItem, parentItem, overflowWrapper;\n                if (item.hasClass(DISABLEDSTATE)) {\n                    return;\n                }\n                if (!belongsToVertical) {\n                    nextItem = item.nextAll(nextSelector);\n                    if (!nextItem.length) {\n                        nextItem = item.prevAll(lastSelector);\n                    }\n                } else if (hasChildren) {\n                    that.open(item);\n                    nextItem = that._childPopupElement(item).children().first();\n                } else if (that.options.orientation == 'horizontal') {\n                    parentItem = that._findRootParent(item);\n                    overflowWrapper = that._overflowWrapper();\n                    if (overflowWrapper) {\n                        var rootPopup = itemPopup(parentItem, overflowWrapper);\n                        that._closeChildPopups(rootPopup);\n                    }\n                    that.close(parentItem);\n                    nextItem = parentItem.nextAll(nextSelector);\n                }\n                if (nextItem && !nextItem.length) {\n                    nextItem = that.wrapper.children('.k-item').first();\n                } else if (!nextItem) {\n                    nextItem = [];\n                }\n                that._moveHover(item, nextItem);\n                return nextItem;\n            },\n            _itemLeft: function (item, belongsToVertical) {\n                var that = this, nextItem, overflowWrapper;\n                if (!belongsToVertical) {\n                    nextItem = item.prevAll(nextSelector);\n                    if (!nextItem.length) {\n                        nextItem = item.nextAll(lastSelector);\n                    }\n                } else {\n                    nextItem = item.parent().closest('.k-item');\n                    overflowWrapper = that._overflowWrapper();\n                    if (!nextItem.length && overflowWrapper) {\n                        nextItem = popupParentItem(item.parent(), overflowWrapper);\n                    }\n                    that.close(nextItem);\n                    if (that._isRootItem(nextItem) && that.options.orientation == 'horizontal') {\n                        nextItem = nextItem.prevAll(nextSelector);\n                    }\n                }\n                if (!nextItem.length) {\n                    nextItem = that.wrapper.children('.k-item').last();\n                }\n                that._moveHover(item, nextItem);\n                return nextItem;\n            },\n            _itemDown: function (item, belongsToVertical, hasChildren) {\n                var that = this, nextItem;\n                if (!belongsToVertical) {\n                    if (!hasChildren || item.hasClass(DISABLEDSTATE)) {\n                        return;\n                    } else {\n                        that.open(item);\n                        nextItem = that._childPopupElement(item).children().first();\n                    }\n                } else {\n                    nextItem = item.nextAll(nextSelector);\n                }\n                if (!nextItem.length && item.length) {\n                    nextItem = item.parent().children().first();\n                } else if (!item.length) {\n                    nextItem = that.wrapper.children('.k-item').first();\n                }\n                that._moveHover(item, nextItem);\n                return nextItem;\n            },\n            _itemUp: function (item, belongsToVertical) {\n                var that = this, nextItem;\n                if (!belongsToVertical) {\n                    return;\n                } else {\n                    nextItem = item.prevAll(nextSelector);\n                }\n                if (!nextItem.length && item.length) {\n                    nextItem = item.parent().children().last();\n                } else if (!item.length) {\n                    nextItem = that.wrapper.children('.k-item').last();\n                }\n                that._moveHover(item, nextItem);\n                return nextItem;\n            },\n            _scrollToItem: function (item) {\n                var that = this;\n                if (that.options.scrollable && item && item.length) {\n                    var ul = item.parent();\n                    var isHorizontal = ul.hasClass(MENU) ? that.options.orientation == 'horizontal' : false;\n                    var scrollDir = isHorizontal ? 'scrollLeft' : 'scrollTop';\n                    var getSize = isHorizontal ? kendo._outerWidth : kendo._outerHeight;\n                    var currentScrollOffset = ul[scrollDir]();\n                    var itemSize = getSize(item);\n                    var itemOffset = item[0][isHorizontal ? 'offsetLeft' : 'offsetTop'];\n                    var ulSize = getSize(ul);\n                    var scrollButtons = ul.siblings(scrollButtonSelector);\n                    var scrollButtonSize = scrollButtons.length ? getSize(scrollButtons.first()) : 0;\n                    var itemPosition;\n                    if (currentScrollOffset + ulSize < itemOffset + itemSize + scrollButtonSize) {\n                        itemPosition = itemOffset + itemSize - ulSize + scrollButtonSize;\n                    } else if (currentScrollOffset > itemOffset - scrollButtonSize) {\n                        itemPosition = itemOffset - scrollButtonSize;\n                    }\n                    if (!isNaN(itemPosition)) {\n                        var scrolling = {};\n                        scrolling[scrollDir] = itemPosition;\n                        ul.finish().animate(scrolling, 'fast', 'linear', function () {\n                            that._toggleScrollButtons(ul, scrollButtons.first(), scrollButtons.last(), isHorizontal);\n                        });\n                    }\n                }\n            },\n            _itemEsc: function (item, belongsToVertical) {\n                var that = this, nextItem;\n                if (!belongsToVertical) {\n                    return item;\n                } else {\n                    nextItem = item.parent().closest('.k-item');\n                    that.close(nextItem);\n                    that._moveHover(item, nextItem);\n                }\n                return nextItem;\n            },\n            _childPopupElement: function (item) {\n                var popupElement = item.find('.k-menu-group');\n                var wrapper = this._overflowWrapper();\n                if (!popupElement.length && wrapper) {\n                    popupElement = itemPopup(item, wrapper);\n                }\n                return popupElement;\n            },\n            _triggerEvent: function (e) {\n                var that = this;\n                return that.trigger(e.type, {\n                    type: e.type,\n                    item: e.item\n                });\n            },\n            _focusHandler: function (e) {\n                var that = this, item = $(kendo.eventTarget(e)).closest(allItemsSelector);\n                if (item.hasClass(DISABLEDSTATE)) {\n                    return;\n                }\n                setTimeout(function () {\n                    that._moveHover([], item);\n                    if (item.children('.k-content')[0]) {\n                        item.parent().closest('.k-item').removeClass(FOCUSEDSTATE);\n                    }\n                }, 200);\n            },\n            _animations: function (options) {\n                if (options && 'animation' in options && !options.animation) {\n                    options.animation = {\n                        open: { effects: {} },\n                        close: {\n                            hide: true,\n                            effects: {}\n                        }\n                    };\n                }\n            }\n        });\n        extend(Menu, {\n            renderItem: function (options) {\n                options = extend({\n                    menu: {},\n                    group: {}\n                }, options);\n                var empty = templates.empty, item = options.item;\n                return templates.item(extend(options, {\n                    image: item.imageUrl ? templates.image : empty,\n                    sprite: item.spriteCssClass ? templates.sprite : empty,\n                    itemWrapper: templates.itemWrapper,\n                    renderContent: Menu.renderContent,\n                    arrow: item.items || item.content ? templates.arrow : empty,\n                    subGroup: Menu.renderGroup\n                }, rendering));\n            },\n            renderGroup: function (options) {\n                return templates.group(extend({\n                    renderItems: function (options) {\n                        var html = '', i = 0, items = options.items, len = items ? items.length : 0, group = extend({ length: len }, options.group);\n                        for (; i < len; i++) {\n                            html += Menu.renderItem(extend(options, {\n                                group: group,\n                                item: extend({ index: i }, items[i])\n                            }));\n                        }\n                        return html;\n                    }\n                }, options, rendering));\n            },\n            renderContent: function (options) {\n                return templates.content(extend(options, rendering));\n            }\n        });\n        var ContextMenu = Menu.extend({\n            init: function (element, options) {\n                var that = this;\n                Menu.fn.init.call(that, element, options);\n                that._marker = kendo.guid().substring(0, 8);\n                that.target = $(that.options.target);\n                that._popup();\n                that._wire();\n            },\n            _initOverflow: function (options) {\n                var that = this;\n                if (options.scrollable && !that._overflowWrapper()) {\n                    that._openedPopups = {};\n                    that._popupsWrapper = (that.element.parent().is(animationContainerSelector) ? that.element.parent() : that.element).wrap('<div class=\\'k-popups-wrapper ' + options.orientation + '\\'></div>').parent();\n                    if (that.options.orientation == 'horizontal') {\n                        removeSpacesBetweenItems(that.element);\n                    }\n                    if (options.appendTo) {\n                        options.appendTo.append(that._popupsWrapper);\n                    }\n                    that._initialHeight = that.element[0].style.height;\n                    that._initialWidth = that.element[0].style.width;\n                }\n            },\n            options: {\n                name: 'ContextMenu',\n                filter: null,\n                showOn: 'contextmenu',\n                orientation: 'vertical',\n                alignToAnchor: false,\n                target: 'body'\n            },\n            events: [\n                OPEN,\n                CLOSE,\n                ACTIVATE,\n                DEACTIVATE,\n                SELECT\n            ],\n            setOptions: function (options) {\n                var that = this;\n                Menu.fn.setOptions.call(that, options);\n                that.target.off(that.showOn + NS + that._marker, that._showProxy);\n                if (that.userEvents) {\n                    that.userEvents.destroy();\n                }\n                that.target = $(that.options.target);\n                if (options.orientation && that.popup.wrapper[0]) {\n                    that.popup.element.unwrap();\n                }\n                that._wire();\n                Menu.fn.setOptions.call(this, options);\n            },\n            destroy: function () {\n                var that = this;\n                that.target.off(that.options.showOn + NS + that._marker);\n                DOCUMENT_ELEMENT.off(kendo.support.mousedown + NS + that._marker, that._closeProxy);\n                if (that.userEvents) {\n                    that.userEvents.destroy();\n                }\n                Menu.fn.destroy.call(that);\n            },\n            open: function (x, y) {\n                var that = this;\n                x = $(x)[0];\n                if (contains(that.element[0], $(x)[0]) || that._itemHasChildren($(x))) {\n                    Menu.fn.open.call(that, x);\n                } else {\n                    if (that._triggerEvent({\n                            item: that.element,\n                            type: OPEN\n                        }) === false) {\n                        if (that.popup.visible() && that.options.filter) {\n                            that.popup.close(true);\n                            that.popup.element.kendoStop(true);\n                        }\n                        if (y !== undefined) {\n                            var overflowWrapper = that._overflowWrapper();\n                            if (overflowWrapper) {\n                                var offset = overflowWrapper.offset();\n                                x -= offset.left;\n                                y -= offset.top;\n                            }\n                            that.popup.wrapper.hide();\n                            that._configurePopupScrolling(x, y);\n                            that.popup.open(x, y);\n                        } else {\n                            that.popup.options.anchor = (x ? x : that.popup.anchor) || that.target;\n                            that.popup.element.kendoStop(true);\n                            that._configurePopupScrolling();\n                            that.popup.open();\n                        }\n                        DOCUMENT_ELEMENT.off(that.popup.downEvent, that.popup._mousedownProxy);\n                        DOCUMENT_ELEMENT.on(kendo.support.mousedown + NS + that._marker, that._closeProxy);\n                    }\n                }\n                return that;\n            },\n            _configurePopupScrolling: function (x, y) {\n                var that = this;\n                var popup = that.popup;\n                var isHorizontal = that.options.orientation == 'horizontal';\n                if (that.options.scrollable) {\n                    that._wrapPopupElement(popup);\n                    popup.element.parent().css({\n                        position: '',\n                        height: ''\n                    });\n                    popup.element.css({\n                        visibility: 'hidden',\n                        display: '',\n                        position: ''\n                    });\n                    if (isHorizontal) {\n                        that._setPopupWidth(popup, isNaN(x) ? undefined : {\n                            isFixed: true,\n                            x: x,\n                            y: y\n                        });\n                    } else {\n                        that._setPopupHeight(popup, isNaN(x) ? undefined : {\n                            isFixed: true,\n                            x: x,\n                            y: y\n                        });\n                    }\n                    popup.element.css({\n                        visibility: '',\n                        display: 'none',\n                        position: 'absolute'\n                    });\n                    that._initPopupScrollButtons(popup, isHorizontal, true);\n                    popup.element.siblings(scrollButtonSelector).hide();\n                }\n            },\n            _setPopupWidth: function (popup, isFixed) {\n                var popupElement = popup.element;\n                var popups = popupElement.add(popupElement.parent(animationContainerSelector));\n                popups.width(this._initialWidth || '');\n                var location = popup._location(isFixed);\n                var windowWidth = $(window).width();\n                var popupOuterWidth = location.width;\n                var popupOffsetLeft = Math.max(location.left, 0);\n                var scrollLeft = isFixed ? 0 : parentsScroll(this._overflowWrapper()[0], 'scrollLeft');\n                var shadow = kendo.getShadows(popupElement);\n                var maxWidth = windowWidth - shadow.left - shadow.right;\n                var canFit = maxWidth + scrollLeft > popupOuterWidth + popupOffsetLeft;\n                if (!canFit) {\n                    popups.css({\n                        overflow: 'hidden',\n                        width: maxWidth - popupOffsetLeft + scrollLeft + 'px'\n                    });\n                }\n            },\n            close: function () {\n                var that = this;\n                if (contains(that.element[0], $(arguments[0])[0]) || that._itemHasChildren(arguments[0])) {\n                    Menu.fn.close.call(that, arguments[0]);\n                } else {\n                    if (that.popup.visible()) {\n                        if (that._triggerEvent({\n                                item: that.element,\n                                type: CLOSE\n                            }) === false) {\n                            that.popup.close();\n                            DOCUMENT_ELEMENT.off(kendo.support.mousedown + NS, that._closeProxy);\n                            that.unbind(SELECT, that._closeTimeoutProxy);\n                        }\n                    }\n                }\n            },\n            _showHandler: function (e) {\n                var ev = e, offset, that = this, options = that.options;\n                if (e.event) {\n                    ev = e.event;\n                    ev.pageX = e.x.location;\n                    ev.pageY = e.y.location;\n                }\n                if (contains(that.element[0], e.relatedTarget || e.target)) {\n                    return;\n                }\n                that._eventOrigin = ev;\n                ev.preventDefault();\n                ev.stopImmediatePropagation();\n                that.element.find('.' + FOCUSEDSTATE).removeClass(FOCUSEDSTATE);\n                if (options.filter && kendo.support.matchesSelector.call(ev.currentTarget, options.filter) || !options.filter) {\n                    if (options.alignToAnchor) {\n                        that.popup.options.anchor = ev.currentTarget;\n                        that.open(ev.currentTarget);\n                    } else {\n                        that.popup.options.anchor = ev.currentTarget;\n                        if (that._targetChild) {\n                            offset = that.target.offset();\n                            that.open(ev.pageX - offset.left, ev.pageY - offset.top);\n                        } else {\n                            that.open(ev.pageX, ev.pageY);\n                        }\n                    }\n                }\n            },\n            _closeHandler: function (e) {\n                var that = this, target = $(e.relatedTarget || e.target), sameTarget = target.closest(that.target.selector)[0] == that.target[0], item = target.closest(itemSelector), children = that._itemHasChildren(item), overflowWrapper = that._overflowWrapper(), containment = contains(that.element[0], target[0]) || overflowWrapper && contains(overflowWrapper[0], target[0]);\n                that._eventOrigin = e;\n                var normalClick = e.which !== 3;\n                if (that.popup.visible() && (normalClick && sameTarget || !sameTarget) && (that.options.closeOnClick && !children && containment || !containment)) {\n                    if (containment) {\n                        this.unbind(SELECT, this._closeTimeoutProxy);\n                        that.bind(SELECT, that._closeTimeoutProxy);\n                    } else {\n                        that.close();\n                    }\n                }\n            },\n            _wire: function () {\n                var that = this, options = that.options, target = that.target;\n                that._showProxy = proxy(that._showHandler, that);\n                that._closeProxy = proxy(that._closeHandler, that);\n                that._closeTimeoutProxy = proxy(that.close, that);\n                if (target[0]) {\n                    if (kendo.support.mobileOS && options.showOn == 'contextmenu') {\n                        that.userEvents = new kendo.UserEvents(target, {\n                            filter: options.filter,\n                            allowSelection: false\n                        });\n                        target.on(options.showOn + NS + that._marker, false);\n                        that.userEvents.bind('hold', that._showProxy);\n                    } else {\n                        if (options.filter) {\n                            target.on(options.showOn + NS + that._marker, options.filter, that._showProxy);\n                        } else {\n                            target.on(options.showOn + NS + that._marker, that._showProxy);\n                        }\n                    }\n                }\n            },\n            _triggerEvent: function (e) {\n                var that = this, anchor = $(that.popup.options.anchor)[0], origin = that._eventOrigin;\n                that._eventOrigin = undefined;\n                return that.trigger(e.type, extend({\n                    type: e.type,\n                    item: e.item || this.element[0],\n                    target: anchor\n                }, origin ? { event: origin } : {}));\n            },\n            _popup: function () {\n                var that = this;\n                var overflowWrapper = that._overflowWrapper();\n                that._triggerProxy = proxy(that._triggerEvent, that);\n                that.popup = that.element.addClass('k-context-menu').kendoPopup({\n                    anchor: that.target || 'body',\n                    copyAnchorStyles: that.options.copyAnchorStyles,\n                    collision: that.options.popupCollision || 'fit',\n                    animation: that.options.animation,\n                    activate: that._triggerProxy,\n                    deactivate: that._triggerProxy,\n                    appendTo: overflowWrapper || that.options.appendTo,\n                    close: !overflowWrapper ? $.noop : function (e) {\n                        $(getChildPopups(e.sender.element, overflowWrapper)).each(function (i, p) {\n                            var popup = p.data(KENDOPOPUP);\n                            if (popup) {\n                                popup.close(true);\n                            }\n                        });\n                    }\n                }).data(KENDOPOPUP);\n                that._targetChild = contains(that.target[0], that.popup.element[0]);\n            }\n        });\n        ui.plugin(Menu);\n        ui.plugin(ContextMenu);\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.columnmenu', [\n        'kendo.popup',\n        'kendo.filtermenu',\n        'kendo.menu'\n    ], f);\n}(function () {\n    var __meta__ = {\n        id: 'columnmenu',\n        name: 'Column Menu',\n        category: 'framework',\n        depends: [\n            'popup',\n            'filtermenu',\n            'menu'\n        ],\n        advanced: true\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, ui = kendo.ui, proxy = $.proxy, extend = $.extend, grep = $.grep, map = $.map, inArray = $.inArray, ACTIVE = 'k-state-selected', ASC = 'asc', DESC = 'desc', CHANGE = 'change', INIT = 'init', OPEN = 'open', SELECT = 'select', POPUP = 'kendoPopup', FILTERMENU = 'kendoFilterMenu', MENU = 'kendoMenu', NS = '.kendoColumnMenu', Widget = ui.Widget;\n        function trim(text) {\n            return $.trim(text).replace(/&nbsp;/gi, '');\n        }\n        function toHash(arr, key) {\n            var result = {};\n            var idx, len, current;\n            for (idx = 0, len = arr.length; idx < len; idx++) {\n                current = arr[idx];\n                result[current[key]] = current;\n            }\n            return result;\n        }\n        function leafColumns(columns) {\n            var result = [];\n            for (var idx = 0; idx < columns.length; idx++) {\n                if (!columns[idx].columns) {\n                    result.push(columns[idx]);\n                    continue;\n                }\n                result = result.concat(leafColumns(columns[idx].columns));\n            }\n            return result;\n        }\n        var ColumnMenu = Widget.extend({\n            init: function (element, options) {\n                var that = this, link;\n                Widget.fn.init.call(that, element, options);\n                element = that.element;\n                options = that.options;\n                that.owner = options.owner;\n                that.dataSource = options.dataSource;\n                that.field = element.attr(kendo.attr('field'));\n                that.title = element.attr(kendo.attr('title'));\n                link = element.find('.k-header-column-menu');\n                if (!link[0]) {\n                    link = element.addClass('k-with-icon').prepend('<a class=\"k-header-column-menu\" href=\"#\" title=\"' + options.messages.settings + '\" aria-label=\"' + options.messages.settings + '\"><span class=\"k-icon k-i-more-vertical\"></span></a>').find('.k-header-column-menu');\n                }\n                that.link = link.attr('tabindex', -1).on('click' + NS, proxy(that._click, that));\n                that.wrapper = $('<div class=\"k-column-menu\"/>');\n                that._refreshHandler = proxy(that.refresh, that);\n                that.dataSource.bind(CHANGE, that._refreshHandler);\n            },\n            _init: function () {\n                var that = this;\n                that.pane = that.options.pane;\n                if (that.pane) {\n                    that._isMobile = true;\n                }\n                if (that._isMobile) {\n                    that._createMobileMenu();\n                } else {\n                    that._createMenu();\n                }\n                that.owner._muteAngularRebind(function () {\n                    that._angularItems('compile');\n                });\n                that._sort();\n                that._columns();\n                that._filter();\n                that._lockColumns();\n                that.trigger(INIT, {\n                    field: that.field,\n                    container: that.wrapper\n                });\n            },\n            events: [\n                INIT,\n                OPEN,\n                'sort',\n                'filtering'\n            ],\n            options: {\n                name: 'ColumnMenu',\n                messages: {\n                    sortAscending: 'Sort Ascending',\n                    sortDescending: 'Sort Descending',\n                    filter: 'Filter',\n                    columns: 'Columns',\n                    done: 'Done',\n                    settings: 'Column Settings',\n                    lock: 'Lock',\n                    unlock: 'Unlock'\n                },\n                filter: '',\n                columns: true,\n                sortable: true,\n                filterable: true,\n                animations: { left: 'slide' }\n            },\n            _createMenu: function () {\n                var that = this, options = that.options;\n                that.wrapper.html(kendo.template(template)({\n                    uid: kendo.guid(),\n                    ns: kendo.ns,\n                    messages: options.messages,\n                    sortable: options.sortable,\n                    filterable: options.filterable,\n                    columns: that._ownerColumns(),\n                    showColumns: options.columns,\n                    lockedColumns: options.lockedColumns\n                }));\n                that.popup = that.wrapper[POPUP]({\n                    anchor: that.link,\n                    open: proxy(that._open, that),\n                    activate: proxy(that._activate, that),\n                    close: function () {\n                        if (that.options.closeCallback) {\n                            that.options.closeCallback(that.element);\n                        }\n                    }\n                }).data(POPUP);\n                that.menu = that.wrapper.children()[MENU]({\n                    orientation: 'vertical',\n                    closeOnClick: false\n                }).data(MENU);\n            },\n            _createMobileMenu: function () {\n                var that = this, options = that.options;\n                var html = kendo.template(mobileTemplate)({\n                    ns: kendo.ns,\n                    field: that.field,\n                    title: that.title || that.field,\n                    messages: options.messages,\n                    sortable: options.sortable,\n                    filterable: options.filterable,\n                    columns: that._ownerColumns(),\n                    showColumns: options.columns,\n                    lockedColumns: options.lockedColumns\n                });\n                that.view = that.pane.append(html);\n                that.wrapper = that.view.element.find('.k-column-menu');\n                that.menu = new MobileMenu(that.wrapper.children(), { pane: that.pane });\n                that.view.element.on('click', '.k-done', function (e) {\n                    that.close();\n                    e.preventDefault();\n                });\n                if (that.options.lockedColumns) {\n                    that.view.bind('show', function () {\n                        that._updateLockedColumns();\n                    });\n                }\n            },\n            _angularItems: function (action) {\n                var that = this;\n                that.angular(action, function () {\n                    var items = that.wrapper.find('.k-columns-item input[' + kendo.attr('field') + ']').map(function () {\n                        return $(this).closest('li');\n                    });\n                    var data = map(that._ownerColumns(), function (col) {\n                        return { column: col._originalObject };\n                    });\n                    return {\n                        elements: items,\n                        data: data\n                    };\n                });\n            },\n            destroy: function () {\n                var that = this;\n                that._angularItems('cleanup');\n                Widget.fn.destroy.call(that);\n                if (that.filterMenu) {\n                    that.filterMenu.destroy();\n                }\n                if (that._refreshHandler) {\n                    that.dataSource.unbind(CHANGE, that._refreshHandler);\n                }\n                if (that.options.columns && that.owner) {\n                    if (that._updateColumnsMenuHandler) {\n                        that.owner.unbind('columnShow', that._updateColumnsMenuHandler);\n                        that.owner.unbind('columnHide', that._updateColumnsMenuHandler);\n                    }\n                    if (that._updateColumnsLockedStateHandler) {\n                        that.owner.unbind('columnLock', that._updateColumnsLockedStateHandler);\n                        that.owner.unbind('columnUnlock', that._updateColumnsLockedStateHandler);\n                    }\n                }\n                if (that.menu) {\n                    that.menu.element.off(NS);\n                    that.menu.destroy();\n                }\n                that.wrapper.off(NS);\n                if (that.popup) {\n                    that.popup.destroy();\n                }\n                if (that.view) {\n                    that.view.purge();\n                }\n                that.link.off(NS);\n                that.owner = null;\n                that.wrapper = null;\n                that.element = null;\n            },\n            close: function () {\n                this.menu.close();\n                if (this.popup) {\n                    this.popup.close();\n                    this.popup.element.off('keydown' + NS);\n                }\n            },\n            _click: function (e) {\n                e.preventDefault();\n                e.stopPropagation();\n                var options = this.options;\n                if (options.filter && this.element.is(!options.filter)) {\n                    return;\n                }\n                if (!this.popup && !this.pane) {\n                    this._init();\n                }\n                if (this._isMobile) {\n                    this.pane.navigate(this.view, this.options.animations.left);\n                } else {\n                    this.popup.toggle();\n                }\n            },\n            _open: function () {\n                var that = this;\n                $('.k-column-menu').not(that.wrapper).each(function () {\n                    $(this).data(POPUP).close();\n                });\n                that.popup.element.on('keydown' + NS, function (e) {\n                    if (e.keyCode == kendo.keys.ESC) {\n                        that.close();\n                    }\n                });\n                if (that.options.lockedColumns) {\n                    that._updateLockedColumns();\n                }\n            },\n            _activate: function () {\n                this.menu.element.focus();\n                this.trigger(OPEN, {\n                    field: this.field,\n                    container: this.wrapper\n                });\n            },\n            _ownerColumns: function () {\n                var columns = leafColumns(this.owner.columns), menuColumns = grep(columns, function (col) {\n                        var result = true, title = trim(col.title || '');\n                        if (col.menu === false || !col.field && !title.length) {\n                            result = false;\n                        }\n                        return result;\n                    });\n                return map(menuColumns, function (col) {\n                    return {\n                        originalField: col.field,\n                        field: col.field || col.title,\n                        title: col.title || col.field,\n                        hidden: col.hidden,\n                        index: inArray(col, columns),\n                        locked: !!col.locked,\n                        _originalObject: col\n                    };\n                });\n            },\n            _sort: function () {\n                var that = this;\n                if (that.options.sortable) {\n                    that.refresh();\n                    that.menu.bind(SELECT, function (e) {\n                        var item = $(e.item), dir;\n                        if (item.hasClass('k-sort-asc')) {\n                            dir = ASC;\n                        } else if (item.hasClass('k-sort-desc')) {\n                            dir = DESC;\n                        }\n                        if (!dir) {\n                            return;\n                        }\n                        item.parent().find('.k-sort-' + (dir == ASC ? DESC : ASC)).removeClass(ACTIVE);\n                        that._sortDataSource(item, dir);\n                        that.close();\n                    });\n                }\n            },\n            _sortDataSource: function (item, dir) {\n                var that = this, sortable = that.options.sortable, compare = sortable.compare === null ? undefined : sortable.compare, dataSource = that.dataSource, idx, length, sort = dataSource.sort() || [];\n                var removeClass = item.hasClass(ACTIVE) && sortable && sortable.allowUnsort !== false;\n                dir = !removeClass ? dir : undefined;\n                if (that.trigger('sort', {\n                        sort: {\n                            field: that.field,\n                            dir: dir,\n                            compare: compare\n                        }\n                    })) {\n                    return;\n                }\n                if (removeClass) {\n                    item.removeClass(ACTIVE);\n                } else {\n                    item.addClass(ACTIVE);\n                }\n                if (sortable.mode === 'multiple') {\n                    for (idx = 0, length = sort.length; idx < length; idx++) {\n                        if (sort[idx].field === that.field) {\n                            sort.splice(idx, 1);\n                            break;\n                        }\n                    }\n                    sort.push({\n                        field: that.field,\n                        dir: dir,\n                        compare: compare\n                    });\n                } else {\n                    sort = [{\n                            field: that.field,\n                            dir: dir,\n                            compare: compare\n                        }];\n                }\n                dataSource.sort(sort);\n            },\n            _columns: function () {\n                var that = this;\n                if (that.options.columns) {\n                    that._updateColumnsMenu();\n                    that._updateColumnsMenuHandler = proxy(that._updateColumnsMenu, that);\n                    that.owner.bind([\n                        'columnHide',\n                        'columnShow'\n                    ], that._updateColumnsMenuHandler);\n                    that._updateColumnsLockedStateHandler = proxy(that._updateColumnsLockedState, that);\n                    that.owner.bind([\n                        'columnUnlock',\n                        'columnLock'\n                    ], that._updateColumnsLockedStateHandler);\n                    that.menu.bind(SELECT, function (e) {\n                        var item = $(e.item), input, column, columns = leafColumns(that.owner.columns), field;\n                        if (that._isMobile) {\n                            e.preventDefault();\n                        }\n                        if (!item.parent().closest('li.k-columns-item')[0]) {\n                            return;\n                        }\n                        input = item.find(':checkbox');\n                        if (input.attr('disabled')) {\n                            return;\n                        }\n                        field = input.attr(kendo.attr('field'));\n                        column = grep(columns, function (column) {\n                            return column.field == field || column.title == field;\n                        })[0];\n                        if (column.hidden === true) {\n                            that.owner.showColumn(column);\n                        } else {\n                            that.owner.hideColumn(column);\n                        }\n                    });\n                }\n            },\n            _updateColumnsMenu: function () {\n                var idx, length, current, checked, locked;\n                var fieldAttr = kendo.attr('field'), lockedAttr = kendo.attr('locked'), visible = grep(this._ownerColumns(), function (field) {\n                        return !field.hidden;\n                    }), visibleDataFields = grep(visible, function (field) {\n                        return field.originalField;\n                    }), lockedCount = grep(visibleDataFields, function (col) {\n                        return col.locked === true;\n                    }).length, nonLockedCount = grep(visibleDataFields, function (col) {\n                        return col.locked !== true;\n                    }).length;\n                visible = map(visible, function (col) {\n                    return col.field;\n                });\n                this.wrapper.find('[role=\\'menuitemcheckbox\\']').attr('aria-checked', false);\n                var checkboxes = this.wrapper.find('.k-columns-item input[' + fieldAttr + ']').prop('disabled', false).prop('checked', false);\n                for (idx = 0, length = checkboxes.length; idx < length; idx++) {\n                    current = checkboxes.eq(idx);\n                    locked = current.attr(lockedAttr) === 'true';\n                    checked = false;\n                    if (inArray(current.attr(fieldAttr), visible) > -1) {\n                        checked = true;\n                        current.prop('checked', checked);\n                    }\n                    current.closest('[role=\\'menuitemcheckbox\\']').attr('aria-checked', checked);\n                    if (checked) {\n                        if (lockedCount == 1 && locked) {\n                            current.prop('disabled', true);\n                        }\n                        if (nonLockedCount == 1 && !locked) {\n                            current.prop('disabled', true);\n                        }\n                    }\n                }\n            },\n            _updateColumnsLockedState: function () {\n                var idx, length, current, column;\n                var fieldAttr = kendo.attr('field');\n                var lockedAttr = kendo.attr('locked');\n                var columns = toHash(this._ownerColumns(), 'field');\n                var checkboxes = this.wrapper.find('.k-columns-item input[type=checkbox]');\n                for (idx = 0, length = checkboxes.length; idx < length; idx++) {\n                    current = checkboxes.eq(idx);\n                    column = columns[current.attr(fieldAttr)];\n                    if (column) {\n                        current.attr(lockedAttr, column.locked);\n                    }\n                }\n                this._updateColumnsMenu();\n            },\n            _filter: function () {\n                var that = this, widget = FILTERMENU, options = that.options;\n                if (options.filterable !== false) {\n                    if (options.filterable.multi) {\n                        widget = 'kendoFilterMultiCheck';\n                        if (options.filterable.dataSource) {\n                            options.filterable.checkSource = options.filterable.dataSource;\n                            delete options.filterable.dataSource;\n                        }\n                    }\n                    that.filterMenu = that.wrapper.find('.k-filterable')[widget](extend(true, {}, {\n                        appendToElement: true,\n                        dataSource: options.dataSource,\n                        values: options.values,\n                        field: that.field,\n                        title: that.title,\n                        change: function (e) {\n                            if (that.trigger('filtering', {\n                                    filter: e.filter,\n                                    field: e.field\n                                })) {\n                                e.preventDefault();\n                            }\n                        }\n                    }, options.filterable)).data(widget);\n                    if (that._isMobile) {\n                        that.menu.bind(SELECT, function (e) {\n                            var item = $(e.item);\n                            if (item.hasClass('k-filter-item')) {\n                                that.pane.navigate(that.filterMenu.view, that.options.animations.left);\n                            }\n                        });\n                    }\n                }\n            },\n            _lockColumns: function () {\n                var that = this;\n                that.menu.bind(SELECT, function (e) {\n                    var item = $(e.item);\n                    if (item.hasClass('k-lock')) {\n                        that.owner.lockColumn(that.field);\n                        that.close();\n                    } else if (item.hasClass('k-unlock')) {\n                        that.owner.unlockColumn(that.field);\n                        that.close();\n                    }\n                });\n            },\n            _updateLockedColumns: function () {\n                var field = this.field;\n                var columns = this.owner.columns;\n                var column = grep(columns, function (column) {\n                    return column.field == field || column.title == field;\n                })[0];\n                if (!column) {\n                    return;\n                }\n                var locked = column.locked === true;\n                var length = grep(columns, function (column) {\n                    return !column.hidden && (column.locked && locked || !column.locked && !locked);\n                }).length;\n                var lockItem = this.wrapper.find('.k-lock').removeClass('k-state-disabled');\n                var unlockItem = this.wrapper.find('.k-unlock').removeClass('k-state-disabled');\n                if (locked || length == 1) {\n                    lockItem.addClass('k-state-disabled');\n                }\n                if (!locked || length == 1) {\n                    unlockItem.addClass('k-state-disabled');\n                }\n                this._updateColumnsLockedState();\n            },\n            refresh: function () {\n                var that = this, sort = that.options.dataSource.sort() || [], descriptor, field = that.field, idx, length;\n                that.wrapper.find('.k-sort-asc, .k-sort-desc').removeClass(ACTIVE);\n                for (idx = 0, length = sort.length; idx < length; idx++) {\n                    descriptor = sort[idx];\n                    if (field == descriptor.field) {\n                        that.wrapper.find('.k-sort-' + descriptor.dir).addClass(ACTIVE);\n                    }\n                }\n                that.link[that._filterExist(that.dataSource.filter()) ? 'addClass' : 'removeClass']('k-state-active');\n            },\n            _filterExist: function (filters) {\n                var found = false;\n                var filter;\n                if (!filters) {\n                    return;\n                }\n                filters = filters.filters;\n                for (var idx = 0, length = filters.length; idx < length; idx++) {\n                    filter = filters[idx];\n                    if (filter.field == this.field) {\n                        found = true;\n                    } else if (filter.filters) {\n                        found = found || this._filterExist(filter);\n                    }\n                }\n                return found;\n            }\n        });\n        var template = '<ul id=\"#=uid#\">' + '#if(sortable){#' + '<li class=\"k-item k-sort-asc\"><span class=\"k-link\"><span class=\"k-icon k-i-sort-asc-sm\"></span>${messages.sortAscending}</span></li>' + '<li class=\"k-item k-sort-desc\"><span class=\"k-link\"><span class=\"k-icon k-i-sort-desc-sm\"></span>${messages.sortDescending}</span></li>' + '#if(showColumns || filterable){#' + '<li class=\"k-separator\" role=\"presentation\"></li>' + '#}#' + '#}#' + '#if(showColumns){#' + '<li class=\"k-item k-columns-item\" aria-haspopup=\"true\"><span class=\"k-link\"><span class=\"k-icon k-i-columns\"></span>${messages.columns}</span><ul>' + '#for (var idx = 0; idx < columns.length; idx++) {#' + '<li role=\"menuitemcheckbox\" aria-checked=\"false\"><input type=\"checkbox\" data-#=ns#field=\"#=columns[idx].field.replace(/\"/g,\"&\\\\#34;\")#\" data-#=ns#index=\"#=columns[idx].index#\" data-#=ns#locked=\"#=columns[idx].locked#\"/>#=columns[idx].title#</li>' + '#}#' + '</ul></li>' + '#if(filterable || lockedColumns){#' + '<li class=\"k-separator\" role=\"presentation\"></li>' + '#}#' + '#}#' + '#if(filterable){#' + '<li class=\"k-item k-filter-item\" aria-haspopup=\"true\"><span class=\"k-link\"><span class=\"k-icon k-i-filter\"></span>${messages.filter}</span><ul>' + '<li><div class=\"k-filterable\"></div></li>' + '</ul></li>' + '#if(lockedColumns){#' + '<li class=\"k-separator\" role=\"presentation\"></li>' + '#}#' + '#}#' + '#if(lockedColumns){#' + '<li class=\"k-item k-lock\"><span class=\"k-link\"><span class=\"k-icon k-i-lock\"></span>${messages.lock}</span></li>' + '<li class=\"k-item k-unlock\"><span class=\"k-link\"><span class=\"k-icon k-i-unlock\"></span>${messages.unlock}</span></li>' + '#}#' + '</ul>';\n        var mobileTemplate = '<div data-#=ns#role=\"view\" data-#=ns#init-widgets=\"false\" data-#=ns#use-native-scrolling=\"true\" class=\"k-grid-column-menu\">' + '<div data-#=ns#role=\"header\" class=\"k-header\">' + '${messages.settings}' + '<button class=\"k-button k-done\">#=messages.done#</button>' + '</div>' + '<div class=\"k-column-menu k-mobile-list\"><ul><li>' + '<span class=\"k-link\">${title}</span><ul>' + '#if(sortable){#' + '<li class=\"k-item k-sort-asc\"><span class=\"k-link\"><span class=\"k-icon k-i-sort-asc-sm\"></span>${messages.sortAscending}</span></li>' + '<li class=\"k-item k-sort-desc\"><span class=\"k-link\"><span class=\"k-icon k-i-sort-desc-sm\"></span>${messages.sortDescending}</span></li>' + '#}#' + '#if(lockedColumns){#' + '<li class=\"k-item k-lock\"><span class=\"k-link\"><span class=\"k-icon k-i-lock\"></span>${messages.lock}</span></li>' + '<li class=\"k-item k-unlock\"><span class=\"k-link\"><span class=\"k-icon k-i-unlock\"></span>${messages.unlock}</span></li>' + '#}#' + '#if(filterable){#' + '<li class=\"k-item k-filter-item\">' + '<span class=\"k-link k-filterable\">' + '<span class=\"k-icon k-i-filter\"></span>' + '${messages.filter}</span>' + '</li>' + '#}#' + '</ul></li>' + '#if(showColumns){#' + '<li class=\"k-columns-item\"><span class=\"k-link\">${messages.columns}</span><ul>' + '#for (var idx = 0; idx < columns.length; idx++) {#' + '<li class=\"k-item\"><label class=\"k-label\"><input type=\"checkbox\" class=\"k-check\" data-#=ns#field=\"#=columns[idx].field.replace(/\"/g,\"&\\\\#34;\")#\" data-#=ns#index=\"#=columns[idx].index#\" data-#=ns#locked=\"#=columns[idx].locked#\"/>#=columns[idx].title#</label></li>' + '#}#' + '</ul></li>' + '#}#' + '</ul></div>' + '</div>';\n        var MobileMenu = Widget.extend({\n            init: function (element, options) {\n                Widget.fn.init.call(this, element, options);\n                this.element.on('click' + NS, 'li.k-item:not(.k-separator):not(.k-state-disabled)', '_click');\n            },\n            events: [SELECT],\n            _click: function (e) {\n                if (!$(e.target).is('[type=checkbox]')) {\n                    e.preventDefault();\n                }\n                this.trigger(SELECT, { item: e.currentTarget });\n            },\n            close: function () {\n                this.options.pane.navigate('');\n            },\n            destroy: function () {\n                Widget.fn.destroy.call(this);\n                this.element.off(NS);\n            }\n        });\n        ui.plugin(ColumnMenu);\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.columnsorter', ['kendo.core'], f);\n}(function () {\n    var __meta__ = {\n        id: 'columnsorter',\n        name: 'Column Sorter',\n        category: 'framework',\n        depends: ['core'],\n        advanced: true\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo;\n        var ui = kendo.ui;\n        var Widget = ui.Widget;\n        var DIR = 'dir';\n        var ASC = 'asc';\n        var SINGLE = 'single';\n        var FIELD = 'field';\n        var DESC = 'desc';\n        var sorterNS = '.kendoColumnSorter';\n        var TLINK = '.k-link';\n        var ARIASORT = 'aria-sort';\n        var proxy = $.proxy;\n        var ColumnSorter = Widget.extend({\n            init: function (element, options) {\n                var that = this, link;\n                Widget.fn.init.call(that, element, options);\n                that._refreshHandler = proxy(that.refresh, that);\n                that.dataSource = that.options.dataSource.bind('change', that._refreshHandler);\n                that.directions = that.options.initialDirection === ASC ? [\n                    ASC,\n                    DESC\n                ] : [\n                    DESC,\n                    ASC\n                ];\n                link = that.element.find(TLINK);\n                if (!link[0]) {\n                    link = that.element.wrapInner('<a class=\"k-link\" href=\"#\"/>').find(TLINK);\n                }\n                that.link = link;\n                that.element.on('click' + sorterNS, proxy(that._click, that));\n            },\n            options: {\n                name: 'ColumnSorter',\n                mode: SINGLE,\n                allowUnsort: true,\n                compare: null,\n                filter: '',\n                initialDirection: ASC,\n                showIndexes: false\n            },\n            events: ['change'],\n            destroy: function () {\n                var that = this;\n                Widget.fn.destroy.call(that);\n                that.element.off(sorterNS);\n                that.dataSource.unbind('change', that._refreshHandler);\n                that._refreshHandler = that.element = that.link = that.dataSource = null;\n            },\n            refresh: function () {\n                var that = this, sort = that.dataSource.sort() || [], idx, length, descriptor, dir, element = that.element, field = element.attr(kendo.attr(FIELD)), sortOrder;\n                element.removeAttr(kendo.attr(DIR));\n                element.removeAttr(ARIASORT);\n                for (idx = 0, length = sort.length; idx < length; idx++) {\n                    descriptor = sort[idx];\n                    if (field == descriptor.field) {\n                        element.attr(kendo.attr(DIR), descriptor.dir);\n                        sortOrder = idx + 1;\n                    }\n                }\n                dir = element.attr(kendo.attr(DIR));\n                if (element.is('th')) {\n                    var table = element.closest('table');\n                    if (table.parent().hasClass('k-grid-header-wrap')) {\n                        table = table.closest('.k-grid').find('.k-grid-content > table');\n                    } else if (!table.parent().hasClass('k-grid')) {\n                        table = null;\n                    }\n                    if (table) {\n                        element.toggleClass('k-sorted', dir !== undefined);\n                        table.children('colgroup').children().eq(element.index()).toggleClass('k-sorted', dir !== undefined);\n                    }\n                }\n                element.find('.k-i-sort-asc-sm,.k-i-sort-desc-sm,.k-sort-order').remove();\n                if (dir === ASC) {\n                    $('<span class=\"k-icon k-i-sort-asc-sm\" />').appendTo(that.link);\n                    element.attr(ARIASORT, 'ascending');\n                } else if (dir === DESC) {\n                    $('<span class=\"k-icon k-i-sort-desc-sm\" />').appendTo(that.link);\n                    element.attr(ARIASORT, 'descending');\n                }\n                if (that.options.showIndexes && sort.length > 1 && sortOrder) {\n                    $('<span class=\"k-sort-order\" />').html(sortOrder).appendTo(that.link);\n                }\n            },\n            _toggleSortDirection: function (dir) {\n                var directions = this.directions;\n                if (dir === directions[directions.length - 1] && this.options.allowUnsort) {\n                    return undefined;\n                }\n                return directions[0] === dir ? directions[1] : directions[0];\n            },\n            _click: function (e) {\n                var that = this, element = that.element, field = element.attr(kendo.attr(FIELD)), dir = element.attr(kendo.attr(DIR)), options = that.options, compare = that.options.compare === null ? undefined : that.options.compare, sort = that.dataSource.sort() || [], idx, length;\n                e.preventDefault();\n                if (options.filter && !element.is(options.filter)) {\n                    return;\n                }\n                dir = this._toggleSortDirection(dir);\n                if (this.trigger('change', {\n                        sort: {\n                            field: field,\n                            dir: dir,\n                            compare: compare\n                        }\n                    })) {\n                    return;\n                }\n                if (options.mode === SINGLE) {\n                    sort = [{\n                            field: field,\n                            dir: dir,\n                            compare: compare\n                        }];\n                } else if (options.mode === 'multiple') {\n                    for (idx = 0, length = sort.length; idx < length; idx++) {\n                        if (sort[idx].field === field) {\n                            sort.splice(idx, 1);\n                            break;\n                        }\n                    }\n                    sort.push({\n                        field: field,\n                        dir: dir,\n                        compare: compare\n                    });\n                }\n                this.dataSource.sort(sort);\n            }\n        });\n        ui.plugin(ColumnSorter);\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.editable', [\n        'kendo.datepicker',\n        'kendo.numerictextbox',\n        'kendo.validator',\n        'kendo.binder'\n    ], f);\n}(function () {\n    var __meta__ = {\n        id: 'editable',\n        name: 'Editable',\n        category: 'framework',\n        depends: [\n            'datepicker',\n            'numerictextbox',\n            'validator',\n            'binder'\n        ],\n        hidden: true\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, ui = kendo.ui, Widget = ui.Widget, extend = $.extend, oldIE = kendo.support.browser.msie && kendo.support.browser.version < 9, isFunction = kendo.isFunction, isPlainObject = $.isPlainObject, inArray = $.inArray, nameSpecialCharRegExp = /(\"|\\%|'|\\[|\\]|\\$|\\.|\\,|\\:|\\;|\\+|\\*|\\&|\\!|\\#|\\(|\\)|<|>|\\=|\\?|\\@|\\^|\\{|\\}|\\~|\\/|\\||`)/g, ERRORTEMPLATE = '<div class=\"k-widget k-tooltip k-tooltip-validation\" style=\"margin:0.5em\"><span class=\"k-icon k-i-warning\"> </span>' + '#=message#<div class=\"k-callout k-callout-n\"></div></div>', CHANGE = 'change';\n        var specialRules = [\n            'url',\n            'email',\n            'number',\n            'date',\n            'boolean'\n        ];\n        function fieldType(field) {\n            field = field != null ? field : '';\n            return field.type || $.type(field) || 'string';\n        }\n        function convertToValueBinding(container) {\n            container.find(':input:not(:button, [' + kendo.attr('role') + '=upload], [' + kendo.attr('skip') + '], [type=file]), select').each(function () {\n                var bindAttr = kendo.attr('bind'), binding = this.getAttribute(bindAttr) || '', bindingName = this.type === 'checkbox' || this.type === 'radio' ? 'checked:' : 'value:', fieldName = this.name;\n                if (binding.indexOf(bindingName) === -1 && fieldName) {\n                    binding += (binding.length ? ',' : '') + bindingName + fieldName;\n                    $(this).attr(bindAttr, binding);\n                }\n            });\n        }\n        function createAttributes(options) {\n            var field = (options.model.fields || options.model)[options.field], type = fieldType(field), validation = field ? field.validation : {}, ruleName, DATATYPE = kendo.attr('type'), BINDING = kendo.attr('bind'), rule, attr = {\n                    name: options.field,\n                    title: options.title\n                };\n            for (ruleName in validation) {\n                rule = validation[ruleName];\n                if (inArray(ruleName, specialRules) >= 0) {\n                    attr[DATATYPE] = ruleName;\n                } else if (!isFunction(rule)) {\n                    attr[ruleName] = isPlainObject(rule) ? rule.value || ruleName : rule;\n                }\n                attr[kendo.attr(ruleName + '-msg')] = rule.message;\n            }\n            if (inArray(type, specialRules) >= 0) {\n                attr[DATATYPE] = type;\n            }\n            attr[BINDING] = (type === 'boolean' ? 'checked:' : 'value:') + options.field;\n            return attr;\n        }\n        function convertItems(items) {\n            var idx, length, item, value, text, result;\n            if (items && items.length) {\n                result = [];\n                for (idx = 0, length = items.length; idx < length; idx++) {\n                    item = items[idx];\n                    text = item.text || item.value || item;\n                    value = item.value == null ? item.text || item : item.value;\n                    result[idx] = {\n                        text: text,\n                        value: value\n                    };\n                }\n            }\n            return result;\n        }\n        var editors = {\n            'number': function (container, options) {\n                var attr = createAttributes(options);\n                $('<input type=\"text\"/>').attr(attr).appendTo(container).kendoNumericTextBox({ format: options.format });\n                $('<span ' + kendo.attr('for') + '=\"' + options.field + '\" class=\"k-invalid-msg\"/>').hide().appendTo(container);\n            },\n            'date': function (container, options) {\n                var attr = createAttributes(options), format = options.format;\n                if (format) {\n                    format = kendo._extractFormat(format);\n                }\n                attr[kendo.attr('format')] = format;\n                $('<input type=\"text\"/>').attr(attr).appendTo(container).kendoDatePicker({ format: options.format });\n                $('<span ' + kendo.attr('for') + '=\"' + options.field + '\" class=\"k-invalid-msg\"/>').hide().appendTo(container);\n            },\n            'string': function (container, options) {\n                var attr = createAttributes(options);\n                $('<input type=\"text\" class=\"k-input k-textbox\"/>').attr(attr).appendTo(container);\n            },\n            'boolean': function (container, options) {\n                var attr = createAttributes(options);\n                $('<input type=\"checkbox\" />').attr(attr).appendTo(container);\n            },\n            'values': function (container, options) {\n                var attr = createAttributes(options);\n                var items = kendo.stringify(convertItems(options.values));\n                $('<select ' + kendo.attr('text-field') + '=\"text\"' + kendo.attr('value-field') + '=\"value\"' + kendo.attr('source') + '=\\'' + (items ? items.replace(/\\'/g, '&apos;') : items) + '\\'' + kendo.attr('role') + '=\"dropdownlist\"/>').attr(attr).appendTo(container);\n                $('<span ' + kendo.attr('for') + '=\"' + options.field + '\" class=\"k-invalid-msg\"/>').hide().appendTo(container);\n            }\n        };\n        function addValidationRules(modelField, rules) {\n            var validation = modelField ? modelField.validation || {} : {}, rule, descriptor;\n            for (rule in validation) {\n                descriptor = validation[rule];\n                if (isPlainObject(descriptor) && descriptor.value) {\n                    descriptor = descriptor.value;\n                }\n                if (isFunction(descriptor)) {\n                    rules[rule] = descriptor;\n                }\n            }\n        }\n        var Editable = Widget.extend({\n            init: function (element, options) {\n                var that = this;\n                if (options.target) {\n                    options.$angular = options.target.options.$angular;\n                }\n                Widget.fn.init.call(that, element, options);\n                that._validateProxy = $.proxy(that._validate, that);\n                that.refresh();\n            },\n            events: [CHANGE],\n            options: {\n                name: 'Editable',\n                editors: editors,\n                clearContainer: true,\n                errorTemplate: ERRORTEMPLATE\n            },\n            editor: function (field, modelField) {\n                var that = this, editors = that.options.editors, isObject = isPlainObject(field), fieldName = isObject ? field.field : field, model = that.options.model || {}, isValuesEditor = isObject && field.values, type = isValuesEditor ? 'values' : fieldType(modelField), isCustomEditor = isObject && field.editor, editor = isCustomEditor ? field.editor : editors[type], container = that.element.find('[' + kendo.attr('container-for') + '=' + fieldName.replace(nameSpecialCharRegExp, '\\\\$1') + ']');\n                editor = editor ? editor : editors.string;\n                if (isCustomEditor && typeof field.editor === 'string') {\n                    editor = function (container) {\n                        container.append(field.editor);\n                    };\n                }\n                container = container.length ? container : that.element;\n                editor(container, extend(true, {}, isObject ? field : { field: fieldName }, { model: model }));\n            },\n            _validate: function (e) {\n                var that = this, input, value = e.value, preventChangeTrigger = that._validationEventInProgress, values = {}, bindAttribute = kendo.attr('bind'), fieldName = e.field.replace(nameSpecialCharRegExp, '\\\\$1'), bindingRegex = new RegExp('(value|checked)\\\\s*:\\\\s*' + fieldName + '\\\\s*(,|$)');\n                values[e.field] = e.value;\n                input = $(':input[' + bindAttribute + '*=\"' + fieldName + '\"]', that.element).filter('[' + kendo.attr('validate') + '!=\\'false\\']').filter(function () {\n                    return bindingRegex.test($(this).attr(bindAttribute));\n                });\n                if (input.length > 1) {\n                    input = input.filter(function () {\n                        var element = $(this);\n                        return !element.is(':radio') || element.val() == value;\n                    });\n                }\n                try {\n                    that._validationEventInProgress = true;\n                    if (!that.validatable.validateInput(input) || !preventChangeTrigger && that.trigger(CHANGE, { values: values })) {\n                        e.preventDefault();\n                    }\n                } finally {\n                    that._validationEventInProgress = false;\n                }\n            },\n            end: function () {\n                return this.validatable.validate();\n            },\n            destroy: function () {\n                var that = this;\n                that.angular('cleanup', function () {\n                    return { elements: that.element };\n                });\n                Widget.fn.destroy.call(that);\n                that.options.model.unbind('set', that._validateProxy);\n                kendo.unbind(that.element);\n                if (that.validatable) {\n                    that.validatable.destroy();\n                }\n                kendo.destroy(that.element);\n                that.element.removeData('kendoValidator');\n                if (that.element.is('[' + kendo.attr('role') + '=editable]')) {\n                    that.element.removeAttr(kendo.attr('role'));\n                }\n            },\n            refresh: function () {\n                var that = this, idx, length, fields = that.options.fields || [], container = that.options.clearContainer ? that.element.empty() : that.element, model = that.options.model || {}, rules = {}, field, isObject, fieldName, modelField, modelFields;\n                if (!$.isArray(fields)) {\n                    fields = [fields];\n                }\n                for (idx = 0, length = fields.length; idx < length; idx++) {\n                    field = fields[idx];\n                    isObject = isPlainObject(field);\n                    fieldName = isObject ? field.field : field;\n                    modelField = (model.fields || model)[fieldName];\n                    addValidationRules(modelField, rules);\n                    that.editor(field, modelField);\n                }\n                if (that.options.target) {\n                    that.angular('compile', function () {\n                        return {\n                            elements: container,\n                            data: container.map(function () {\n                                return { dataItem: model };\n                            })\n                        };\n                    });\n                }\n                if (!length) {\n                    modelFields = model.fields || model;\n                    for (fieldName in modelFields) {\n                        addValidationRules(modelFields[fieldName], rules);\n                    }\n                }\n                convertToValueBinding(container);\n                if (that.validatable) {\n                    that.validatable.destroy();\n                }\n                kendo.bind(container, that.options.model);\n                that.options.model.unbind('set', that._validateProxy);\n                that.options.model.bind('set', that._validateProxy);\n                that.validatable = new kendo.ui.Validator(container, {\n                    validateOnBlur: false,\n                    errorTemplate: that.options.errorTemplate || undefined,\n                    rules: rules\n                });\n                var focusable = container.find(':kendoFocusable').eq(0).focus();\n                if (oldIE) {\n                    focusable.focus();\n                }\n            }\n        });\n        ui.plugin(Editable);\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.window', [\n        'kendo.draganddrop',\n        'kendo.popup'\n    ], f);\n}(function () {\n    var __meta__ = {\n        id: 'window',\n        name: 'Window',\n        category: 'web',\n        description: 'The Window widget displays content in a modal or non-modal HTML window.',\n        depends: [\n            'draganddrop',\n            'popup'\n        ],\n        features: [{\n                id: 'window-fx',\n                name: 'Animation',\n                description: 'Support for animation',\n                depends: ['fx']\n            }]\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, Widget = kendo.ui.Widget, TabKeyTrap = kendo.ui.Popup.TabKeyTrap, Draggable = kendo.ui.Draggable, isPlainObject = $.isPlainObject, activeElement = kendo._activeElement, outerWidth = kendo._outerWidth, outerHeight = kendo._outerHeight, proxy = $.proxy, extend = $.extend, each = $.each, template = kendo.template, BODY = 'body', templates, NS = '.kendoWindow', KWINDOW = '.k-window', KWINDOWTITLE = '.k-window-title', KWINDOWTITLEBAR = KWINDOWTITLE + 'bar', KWINDOWCONTENT = '.k-window-content', KWINDOWRESIZEHANDLES = '.k-resize-handle', KOVERLAY = '.k-overlay', KCONTENTFRAME = 'k-content-frame', LOADING = 'k-i-loading', KHOVERSTATE = 'k-state-hover', KFOCUSEDSTATE = 'k-state-focused', MAXIMIZEDSTATE = 'k-window-maximized', VISIBLE = ':visible', HIDDEN = 'hidden', CURSOR = 'cursor', OPEN = 'open', ACTIVATE = 'activate', DEACTIVATE = 'deactivate', CLOSE = 'close', REFRESH = 'refresh', MINIMIZE = 'minimize', MAXIMIZE = 'maximize', RESIZESTART = 'resizeStart', RESIZE = 'resize', RESIZEEND = 'resizeEnd', DRAGSTART = 'dragstart', DRAGEND = 'dragend', ERROR = 'error', OVERFLOW = 'overflow', ZINDEX = 'zIndex', MINIMIZE_MAXIMIZE = '.k-window-actions .k-i-window-minimize,.k-window-actions .k-i-window-maximize', KPIN = '.k-i-pin', KUNPIN = '.k-i-unpin', PIN_UNPIN = KPIN + ',' + KUNPIN, TITLEBAR_BUTTONS = '.k-window-titlebar .k-window-action', REFRESHICON = '.k-window-titlebar .k-i-refresh', zero = /^0[a-z]*$/i, isLocalUrl = kendo.isLocalUrl;\n        function defined(x) {\n            return typeof x != 'undefined';\n        }\n        function constrain(value, low, high) {\n            return Math.max(Math.min(parseInt(value, 10), high === Infinity ? high : parseInt(high, 10)), parseInt(low, 10));\n        }\n        function executableScript() {\n            return !this.type || this.type.toLowerCase().indexOf('script') >= 0;\n        }\n        var Window = Widget.extend({\n            init: function (element, options) {\n                var that = this, wrapper, offset = {}, visibility, display, position, isVisible = false, content, windowContent, suppressActions = options && options.actions && !options.actions.length, id;\n                Widget.fn.init.call(that, element, options);\n                options = that.options;\n                position = options.position;\n                element = that.element;\n                content = options.content;\n                if (suppressActions) {\n                    options.actions = [];\n                }\n                that.appendTo = $(options.appendTo);\n                if (content && !isPlainObject(content)) {\n                    content = options.content = { url: content };\n                }\n                element.find('script').filter(executableScript).remove();\n                if (!element.parent().is(that.appendTo) && (position.top === undefined || position.left === undefined)) {\n                    if (element.is(VISIBLE)) {\n                        offset = element.offset();\n                        isVisible = true;\n                    } else {\n                        visibility = element.css('visibility');\n                        display = element.css('display');\n                        element.css({\n                            visibility: HIDDEN,\n                            display: ''\n                        });\n                        offset = element.offset();\n                        element.css({\n                            visibility: visibility,\n                            display: display\n                        });\n                    }\n                    if (position.top === undefined) {\n                        position.top = offset.top;\n                    }\n                    if (position.left === undefined) {\n                        position.left = offset.left;\n                    }\n                }\n                if (!defined(options.visible) || options.visible === null) {\n                    options.visible = element.is(VISIBLE);\n                }\n                wrapper = that.wrapper = element.closest(KWINDOW);\n                if (!element.is('.k-content') || !wrapper[0]) {\n                    element.addClass('k-window-content k-content');\n                    that._createWindow(element, options);\n                    wrapper = that.wrapper = element.closest(KWINDOW);\n                    that._dimensions();\n                }\n                that._position();\n                if (content) {\n                    that.refresh(content);\n                }\n                if (options.visible) {\n                    that.toFront();\n                }\n                windowContent = wrapper.children(KWINDOWCONTENT);\n                that._tabindex(windowContent);\n                if (options.visible && options.modal) {\n                    that._overlay(wrapper.is(VISIBLE)).css({ opacity: 0.5 });\n                }\n                wrapper.on('mouseenter' + NS, TITLEBAR_BUTTONS, proxy(that._buttonEnter, that)).on('mouseleave' + NS, TITLEBAR_BUTTONS, proxy(that._buttonLeave, that)).on('click' + NS, '> ' + TITLEBAR_BUTTONS, proxy(that._windowActionHandler, that));\n                windowContent.on('keydown' + NS, proxy(that._keydown, that)).on('focus' + NS, proxy(that._focus, that)).on('blur' + NS, proxy(that._blur, that));\n                this._resizable();\n                this._draggable();\n                if (options.pinned) {\n                    that.pin();\n                }\n                id = element.attr('id');\n                if (id) {\n                    id = id + '_wnd_title';\n                    wrapper.children(KWINDOWTITLEBAR).children(KWINDOWTITLE).attr('id', id);\n                    windowContent.attr({\n                        'role': 'dialog',\n                        'aria-labelledby': id\n                    });\n                }\n                wrapper.add(wrapper.children('.k-resize-handle,' + KWINDOWTITLEBAR)).on('mousedown' + NS, proxy(that.toFront, that));\n                that.touchScroller = kendo.touchScroller(element);\n                that._resizeHandler = proxy(that._onDocumentResize, that);\n                that._marker = kendo.guid().substring(0, 8);\n                $(window).on('resize' + NS + that._marker, that._resizeHandler);\n                if (options.visible) {\n                    that.trigger(OPEN);\n                    that.trigger(ACTIVATE);\n                }\n                kendo.notify(that);\n                if (this.options.modal) {\n                    this._tabKeyTrap = new TabKeyTrap(wrapper);\n                    this._tabKeyTrap.trap();\n                    this._tabKeyTrap.shouldTrap = function () {\n                        return windowContent.data('isFront');\n                    };\n                }\n            },\n            _buttonEnter: function (e) {\n                $(e.currentTarget).addClass(KHOVERSTATE);\n            },\n            _buttonLeave: function (e) {\n                $(e.currentTarget).removeClass(KHOVERSTATE);\n            },\n            _focus: function () {\n                this.wrapper.addClass(KFOCUSEDSTATE);\n            },\n            _blur: function () {\n                this.wrapper.removeClass(KFOCUSEDSTATE);\n            },\n            _dimensions: function () {\n                var wrapper = this.wrapper;\n                var options = this.options;\n                var width = options.width;\n                var height = options.height;\n                var maxHeight = options.maxHeight;\n                var dimensions = [\n                    'minWidth',\n                    'minHeight',\n                    'maxWidth',\n                    'maxHeight'\n                ];\n                this.title(options.title);\n                for (var i = 0; i < dimensions.length; i++) {\n                    var value = options[dimensions[i]] || '';\n                    if (value != Infinity) {\n                        wrapper.css(dimensions[i], value);\n                    }\n                }\n                if (maxHeight != Infinity) {\n                    this.element.css('maxHeight', maxHeight);\n                }\n                if (width) {\n                    if (width.toString().indexOf('%') > 0) {\n                        wrapper.width(width);\n                    } else {\n                        wrapper.width(constrain(width, options.minWidth, options.maxWidth));\n                    }\n                } else {\n                    wrapper.width('');\n                }\n                if (height) {\n                    if (height.toString().indexOf('%') > 0) {\n                        wrapper.height(height);\n                    } else {\n                        wrapper.height(constrain(height, options.minHeight, options.maxHeight));\n                    }\n                } else {\n                    wrapper.height('');\n                }\n                if (!options.visible) {\n                    wrapper.hide();\n                }\n            },\n            _position: function () {\n                var wrapper = this.wrapper, position = this.options.position;\n                if (position.top === 0) {\n                    position.top = position.top.toString();\n                }\n                if (position.left === 0) {\n                    position.left = position.left.toString();\n                }\n                wrapper.css({\n                    top: position.top || '',\n                    left: position.left || ''\n                });\n            },\n            _animationOptions: function (id) {\n                var animation = this.options.animation;\n                var basicAnimation = {\n                    open: { effects: {} },\n                    close: {\n                        hide: true,\n                        effects: {}\n                    }\n                };\n                return animation && animation[id] || basicAnimation[id];\n            },\n            _resize: function () {\n                kendo.resize(this.element.children());\n            },\n            _resizable: function () {\n                var resizable = this.options.resizable;\n                var wrapper = this.wrapper;\n                if (this.resizing) {\n                    wrapper.off('dblclick' + NS).children(KWINDOWRESIZEHANDLES).remove();\n                    this.resizing.destroy();\n                    this.resizing = null;\n                }\n                if (resizable) {\n                    wrapper.on('dblclick' + NS, KWINDOWTITLEBAR, proxy(function (e) {\n                        if (!$(e.target).closest('.k-window-action').length) {\n                            this.toggleMaximization();\n                        }\n                    }, this));\n                    each('n e s w se sw ne nw'.split(' '), function (index, handler) {\n                        wrapper.append(templates.resizeHandle(handler));\n                    });\n                    this.resizing = new WindowResizing(this);\n                }\n                wrapper = null;\n            },\n            _draggable: function () {\n                var draggable = this.options.draggable;\n                if (this.dragging) {\n                    this.dragging.destroy();\n                    this.dragging = null;\n                }\n                if (draggable) {\n                    this.dragging = new WindowDragging(this, draggable.dragHandle || KWINDOWTITLEBAR);\n                }\n            },\n            _actions: function () {\n                var options = this.options;\n                var actions = options.actions;\n                var pinned = options.pinned;\n                var titlebar = this.wrapper.children(KWINDOWTITLEBAR);\n                var container = titlebar.find('.k-window-actions');\n                var windowSpecificCommands = [\n                    'maximize',\n                    'minimize'\n                ];\n                actions = $.map(actions, function (action) {\n                    action = pinned && action.toLowerCase() === 'pin' ? 'unpin' : action;\n                    return { name: windowSpecificCommands.indexOf(action.toLowerCase()) > -1 ? 'window-' + action : action };\n                });\n                container.html(kendo.render(templates.action, actions));\n            },\n            setOptions: function (options) {\n                Widget.fn.setOptions.call(this, options);\n                var scrollable = this.options.scrollable !== false;\n                this.restore();\n                this._dimensions();\n                this._position();\n                this._resizable();\n                this._draggable();\n                this._actions();\n                if (typeof options.modal !== 'undefined') {\n                    var visible = this.options.visible !== false;\n                    this._overlay(options.modal && visible);\n                }\n                this.element.css(OVERFLOW, scrollable ? '' : 'hidden');\n            },\n            events: [\n                OPEN,\n                ACTIVATE,\n                DEACTIVATE,\n                CLOSE,\n                MINIMIZE,\n                MAXIMIZE,\n                REFRESH,\n                RESIZESTART,\n                RESIZE,\n                RESIZEEND,\n                DRAGSTART,\n                DRAGEND,\n                ERROR\n            ],\n            options: {\n                name: 'Window',\n                animation: {\n                    open: {\n                        effects: {\n                            zoom: { direction: 'in' },\n                            fade: { direction: 'in' }\n                        },\n                        duration: 350\n                    },\n                    close: {\n                        effects: {\n                            zoom: {\n                                direction: 'out',\n                                properties: { scale: 0.7 }\n                            },\n                            fade: { direction: 'out' }\n                        },\n                        duration: 350,\n                        hide: true\n                    }\n                },\n                title: '',\n                actions: ['Close'],\n                autoFocus: true,\n                modal: false,\n                resizable: true,\n                draggable: true,\n                minWidth: 90,\n                minHeight: 50,\n                maxWidth: Infinity,\n                maxHeight: Infinity,\n                pinned: false,\n                scrollable: true,\n                position: {},\n                content: null,\n                visible: null,\n                height: null,\n                width: null,\n                appendTo: 'body',\n                isMaximized: false,\n                isMinimized: false\n            },\n            _closable: function () {\n                return $.inArray('close', $.map(this.options.actions, function (x) {\n                    return x.toLowerCase();\n                })) > -1;\n            },\n            _keydown: function (e) {\n                var that = this, options = that.options, keys = kendo.keys, keyCode = e.keyCode, wrapper = that.wrapper, offset, handled, distance = 10, isMaximized = that.options.isMaximized, newWidth, newHeight, w, h;\n                if (keyCode == keys.ESC && that._closable()) {\n                    that._close(false);\n                }\n                if (e.target != e.currentTarget || that._closing) {\n                    return;\n                }\n                if (options.draggable && !e.ctrlKey && !isMaximized) {\n                    offset = kendo.getOffset(wrapper);\n                    if (keyCode == keys.UP) {\n                        handled = wrapper.css('top', offset.top - distance);\n                    } else if (keyCode == keys.DOWN) {\n                        handled = wrapper.css('top', offset.top + distance);\n                    } else if (keyCode == keys.LEFT) {\n                        handled = wrapper.css('left', offset.left - distance);\n                    } else if (keyCode == keys.RIGHT) {\n                        handled = wrapper.css('left', offset.left + distance);\n                    }\n                }\n                if (options.resizable && e.ctrlKey && !isMaximized) {\n                    if (keyCode == keys.UP) {\n                        handled = true;\n                        newHeight = wrapper.height() - distance;\n                    } else if (keyCode == keys.DOWN) {\n                        handled = true;\n                        newHeight = wrapper.height() + distance;\n                    }\n                    if (keyCode == keys.LEFT) {\n                        handled = true;\n                        newWidth = wrapper.width() - distance;\n                    } else if (keyCode == keys.RIGHT) {\n                        handled = true;\n                        newWidth = wrapper.width() + distance;\n                    }\n                    if (handled) {\n                        w = constrain(newWidth, options.minWidth, options.maxWidth);\n                        h = constrain(newHeight, options.minHeight, options.maxHeight);\n                        if (!isNaN(w)) {\n                            wrapper.width(w);\n                            that.options.width = w + 'px';\n                        }\n                        if (!isNaN(h)) {\n                            wrapper.height(h);\n                            that.options.height = h + 'px';\n                        }\n                        that.resize();\n                    }\n                }\n                if (handled) {\n                    e.preventDefault();\n                }\n            },\n            _overlay: function (visible) {\n                var overlay = this.appendTo.children(KOVERLAY), wrapper = this.wrapper;\n                if (!overlay.length) {\n                    overlay = $('<div class=\\'k-overlay\\' />');\n                }\n                overlay.insertBefore(wrapper[0]).toggle(visible).css(ZINDEX, parseInt(wrapper.css(ZINDEX), 10) - 1);\n                return overlay;\n            },\n            _actionForIcon: function (icon) {\n                var iconClass = /\\bk-i(-\\w+)+\\b/.exec(icon[0].className)[0];\n                return {\n                    'k-i-close': '_close',\n                    'k-i-window-maximize': 'maximize',\n                    'k-i-window-minimize': 'minimize',\n                    'k-i-window-restore': 'restore',\n                    'k-i-refresh': 'refresh',\n                    'k-i-pin': 'pin',\n                    'k-i-unpin': 'unpin'\n                }[iconClass];\n            },\n            _windowActionHandler: function (e) {\n                if (this._closing) {\n                    return;\n                }\n                var icon = $(e.target).closest('.k-window-action').find('.k-icon');\n                var action = this._actionForIcon(icon);\n                if (action) {\n                    e.preventDefault();\n                    this[action]();\n                    return false;\n                }\n            },\n            _modals: function () {\n                var that = this;\n                var zStack = $(KWINDOW).filter(function () {\n                    var dom = $(this);\n                    var object = that._object(dom);\n                    var options = object && object.options;\n                    return options && options.modal && options.visible && options.appendTo === that.options.appendTo && dom.is(VISIBLE);\n                }).sort(function (a, b) {\n                    return +$(a).css('zIndex') - +$(b).css('zIndex');\n                });\n                that = null;\n                return zStack;\n            },\n            _object: function (element) {\n                var content = element.children(KWINDOWCONTENT);\n                var widget = kendo.widgetInstance(content);\n                if (widget) {\n                    return widget;\n                }\n                return undefined;\n            },\n            center: function () {\n                var that = this, position = that.options.position, wrapper = that.wrapper, documentWindow = $(window), scrollTop = 0, scrollLeft = 0, newTop, newLeft;\n                if (that.options.isMaximized) {\n                    return that;\n                }\n                if (!that.options.pinned) {\n                    scrollTop = documentWindow.scrollTop();\n                    scrollLeft = documentWindow.scrollLeft();\n                }\n                newLeft = scrollLeft + Math.max(0, (documentWindow.width() - wrapper.width()) / 2);\n                newTop = scrollTop + Math.max(0, (documentWindow.height() - wrapper.height() - parseInt(wrapper.css('paddingTop'), 10)) / 2);\n                wrapper.css({\n                    left: newLeft,\n                    top: newTop\n                });\n                position.top = newTop;\n                position.left = newLeft;\n                return that;\n            },\n            title: function (text) {\n                var that = this, wrapper = that.wrapper, options = that.options, titleBar = wrapper.children(KWINDOWTITLEBAR), title = titleBar.children(KWINDOWTITLE), titleBarHeight;\n                if (!arguments.length) {\n                    return title.html();\n                }\n                if (text === false) {\n                    wrapper.addClass('k-window-titleless');\n                    titleBar.remove();\n                } else {\n                    if (!titleBar.length) {\n                        wrapper.prepend(templates.titlebar(options));\n                        that._actions();\n                        titleBar = wrapper.children(KWINDOWTITLEBAR);\n                    } else {\n                        title.html(kendo.htmlEncode(text));\n                    }\n                    titleBarHeight = parseInt(outerHeight(titleBar), 10);\n                    wrapper.css('padding-top', titleBarHeight);\n                    titleBar.css('margin-top', -titleBarHeight);\n                }\n                that.options.title = text;\n                return that;\n            },\n            content: function (html, data) {\n                var content = this.wrapper.children(KWINDOWCONTENT), scrollContainer = content.children('.km-scroll-container');\n                content = scrollContainer[0] ? scrollContainer : content;\n                if (!defined(html)) {\n                    return content.html();\n                }\n                this.angular('cleanup', function () {\n                    return { elements: content.children() };\n                });\n                kendo.destroy(this.element.children());\n                content.empty().html(html);\n                this.angular('compile', function () {\n                    var a = [];\n                    for (var i = content.length; --i >= 0;) {\n                        a.push({ dataItem: data });\n                    }\n                    return {\n                        elements: content.children(),\n                        data: a\n                    };\n                });\n                return this;\n            },\n            open: function () {\n                var that = this, wrapper = that.wrapper, options = that.options, showOptions = this._animationOptions('open'), contentElement = wrapper.children(KWINDOWCONTENT), overlay, otherModalsVisible, doc = $(document);\n                if (!that.trigger(OPEN)) {\n                    if (that._closing) {\n                        wrapper.kendoStop(true, true);\n                    }\n                    that._closing = false;\n                    that.toFront();\n                    if (options.autoFocus) {\n                        that.element.focus();\n                    }\n                    options.visible = true;\n                    if (options.modal) {\n                        otherModalsVisible = !!that._modals().length;\n                        overlay = that._overlay(otherModalsVisible);\n                        overlay.kendoStop(true, true);\n                        if (showOptions.duration && kendo.effects.Fade && !otherModalsVisible) {\n                            var overlayFx = kendo.fx(overlay).fadeIn();\n                            overlayFx.duration(showOptions.duration || 0);\n                            overlayFx.endValue(0.5);\n                            overlayFx.play();\n                        } else {\n                            overlay.css('opacity', 0.5);\n                        }\n                        overlay.show();\n                        $(window).on('focus', function () {\n                            if (contentElement.data('isFront')) {\n                                that.element.focus();\n                            }\n                        });\n                    }\n                    if (!wrapper.is(VISIBLE)) {\n                        contentElement.css(OVERFLOW, HIDDEN);\n                        wrapper.show().kendoStop().kendoAnimate({\n                            effects: showOptions.effects,\n                            duration: showOptions.duration,\n                            complete: proxy(this._activate, this)\n                        });\n                    }\n                }\n                if (options.isMaximized) {\n                    that._documentScrollTop = doc.scrollTop();\n                    that._documentScrollLeft = doc.scrollLeft();\n                    $('html, body').css(OVERFLOW, HIDDEN);\n                }\n                return that;\n            },\n            _activate: function () {\n                var scrollable = this.options.scrollable !== false;\n                if (this.options.autoFocus) {\n                    this.element.focus();\n                }\n                this.element.css(OVERFLOW, scrollable ? '' : 'hidden');\n                kendo.resize(this.element.children());\n                this.trigger(ACTIVATE);\n            },\n            _removeOverlay: function (suppressAnimation) {\n                var modals = this._modals();\n                var options = this.options;\n                var hideOverlay = options.modal && !modals.length;\n                var overlay = options.modal ? this._overlay(true) : $(undefined);\n                var hideOptions = this._animationOptions('close');\n                if (hideOverlay) {\n                    if (!suppressAnimation && hideOptions.duration && kendo.effects.Fade) {\n                        var overlayFx = kendo.fx(overlay).fadeOut();\n                        overlayFx.duration(hideOptions.duration || 0);\n                        overlayFx.startValue(0.5);\n                        overlayFx.play();\n                    } else {\n                        this._overlay(false).remove();\n                    }\n                } else if (modals.length) {\n                    this._object(modals.last())._overlay(true);\n                }\n            },\n            _close: function (systemTriggered) {\n                var that = this, wrapper = that.wrapper, options = that.options, showOptions = this._animationOptions('open'), hideOptions = this._animationOptions('close'), doc = $(document);\n                if (wrapper.is(VISIBLE) && !that.trigger(CLOSE, { userTriggered: !systemTriggered })) {\n                    if (that._closing) {\n                        return;\n                    }\n                    that._closing = true;\n                    options.visible = false;\n                    $(KWINDOW).each(function (i, element) {\n                        var contentElement = $(element).children(KWINDOWCONTENT);\n                        if (element != wrapper && contentElement.find('> .' + KCONTENTFRAME).length > 0) {\n                            contentElement.children(KOVERLAY).remove();\n                        }\n                    });\n                    this._removeOverlay();\n                    wrapper.kendoStop().kendoAnimate({\n                        effects: hideOptions.effects || showOptions.effects,\n                        reverse: hideOptions.reverse === true,\n                        duration: hideOptions.duration,\n                        complete: proxy(this._deactivate, this)\n                    });\n                }\n                if (that.options.isMaximized) {\n                    $('html, body').css(OVERFLOW, '');\n                    if (that._documentScrollTop && that._documentScrollTop > 0) {\n                        doc.scrollTop(that._documentScrollTop);\n                    }\n                    if (that._documentScrollLeft && that._documentScrollLeft > 0) {\n                        doc.scrollLeft(that._documentScrollLeft);\n                    }\n                }\n            },\n            _deactivate: function () {\n                var that = this;\n                that.wrapper.hide().css('opacity', '');\n                that.trigger(DEACTIVATE);\n                if (that.options.modal) {\n                    var lastModal = that._object(that._modals().last());\n                    if (lastModal) {\n                        lastModal.toFront();\n                    }\n                }\n            },\n            close: function () {\n                this._close(true);\n                return this;\n            },\n            _actionable: function (element) {\n                return $(element).is(TITLEBAR_BUTTONS + ',' + TITLEBAR_BUTTONS + ' .k-icon,:input,a');\n            },\n            _shouldFocus: function (target) {\n                var active = activeElement(), element = this.element;\n                return this.options.autoFocus && !$(active).is(element) && !this._actionable(target) && (!element.find(active).length || !element.find(target).length);\n            },\n            toFront: function (e) {\n                var that = this, wrapper = that.wrapper, currentWindow = wrapper[0], zIndex = +wrapper.css(ZINDEX), originalZIndex = zIndex, target = e && e.target || null;\n                $(KWINDOW).each(function (i, element) {\n                    var windowObject = $(element), zIndexNew = windowObject.css(ZINDEX), contentElement = windowObject.children(KWINDOWCONTENT);\n                    if (!isNaN(zIndexNew)) {\n                        zIndex = Math.max(+zIndexNew, zIndex);\n                    }\n                    contentElement.data('isFront', element == currentWindow);\n                    if (element != currentWindow && contentElement.find('> .' + KCONTENTFRAME).length > 0) {\n                        contentElement.append(templates.overlay);\n                    }\n                });\n                if (!wrapper[0].style.zIndex || originalZIndex < zIndex) {\n                    wrapper.css(ZINDEX, zIndex + 2);\n                }\n                that.element.find('> .k-overlay').remove();\n                if (that._shouldFocus(target)) {\n                    that.element.focus();\n                    var scrollTop = $(window).scrollTop(), windowTop = parseInt(wrapper.position().top, 10);\n                    if (!that.options.pinned && windowTop > 0 && windowTop < scrollTop) {\n                        if (scrollTop > 0) {\n                            $(window).scrollTop(windowTop);\n                        } else {\n                            wrapper.css('top', scrollTop);\n                        }\n                    }\n                }\n                wrapper = null;\n                return that;\n            },\n            toggleMaximization: function () {\n                if (this._closing) {\n                    return this;\n                }\n                return this[this.options.isMaximized ? 'restore' : 'maximize']();\n            },\n            restore: function () {\n                var that = this;\n                var options = that.options;\n                var minHeight = options.minHeight;\n                var restoreOptions = that.restoreOptions;\n                var doc = $(document);\n                if (!options.isMaximized && !options.isMinimized) {\n                    return that;\n                }\n                if (minHeight && minHeight != Infinity) {\n                    that.wrapper.css('min-height', minHeight);\n                }\n                that.wrapper.css({\n                    position: options.pinned ? 'fixed' : 'absolute',\n                    left: restoreOptions.left,\n                    top: restoreOptions.top,\n                    width: restoreOptions.width,\n                    height: restoreOptions.height\n                }).removeClass(MAXIMIZEDSTATE).find('.k-window-content,.k-resize-handle').show().end().find('.k-window-titlebar .k-i-window-restore').parent().remove().end().end().find(MINIMIZE_MAXIMIZE).parent().show().end().end().find(PIN_UNPIN).parent().show();\n                that.options.width = restoreOptions.width;\n                that.options.height = restoreOptions.height;\n                $('html, body').css(OVERFLOW, '');\n                if (this._documentScrollTop && this._documentScrollTop > 0) {\n                    doc.scrollTop(this._documentScrollTop);\n                }\n                if (this._documentScrollLeft && this._documentScrollLeft > 0) {\n                    doc.scrollLeft(this._documentScrollLeft);\n                }\n                options.isMaximized = options.isMinimized = false;\n                that.resize();\n                return that;\n            },\n            _sizingAction: function (actionId, callback) {\n                var that = this, wrapper = that.wrapper, style = wrapper[0].style, options = that.options;\n                if (options.isMaximized || options.isMinimized) {\n                    return that;\n                }\n                that.restoreOptions = {\n                    width: style.width,\n                    height: style.height\n                };\n                wrapper.children(KWINDOWRESIZEHANDLES).hide().end().children(KWINDOWTITLEBAR).find(MINIMIZE_MAXIMIZE).parent().hide().eq(0).before(templates.action({ name: 'window-restore' }));\n                callback.call(that);\n                that.wrapper.children(KWINDOWTITLEBAR).find(PIN_UNPIN).parent().toggle(actionId !== 'maximize');\n                that.trigger(actionId);\n                return that;\n            },\n            maximize: function () {\n                this._sizingAction('maximize', function () {\n                    var that = this, wrapper = that.wrapper, position = wrapper.position(), doc = $(document);\n                    extend(that.restoreOptions, {\n                        left: position.left,\n                        top: position.top\n                    });\n                    wrapper.css({\n                        left: 0,\n                        top: 0,\n                        position: 'fixed'\n                    }).addClass(MAXIMIZEDSTATE);\n                    this._documentScrollTop = doc.scrollTop();\n                    this._documentScrollLeft = doc.scrollLeft();\n                    $('html, body').css(OVERFLOW, HIDDEN);\n                    that.options.isMaximized = true;\n                    that._onDocumentResize();\n                });\n                return this;\n            },\n            isMaximized: function () {\n                return this.options.isMaximized;\n            },\n            minimize: function () {\n                this._sizingAction('minimize', function () {\n                    var that = this;\n                    that.wrapper.css({\n                        height: '',\n                        minHeight: ''\n                    });\n                    that.element.hide();\n                    that.options.isMinimized = true;\n                });\n                return this;\n            },\n            isMinimized: function () {\n                return this.options.isMinimized;\n            },\n            pin: function () {\n                var that = this, win = $(window), wrapper = that.wrapper, top = parseInt(wrapper.css('top'), 10), left = parseInt(wrapper.css('left'), 10);\n                if (!that.options.isMaximized) {\n                    wrapper.css({\n                        position: 'fixed',\n                        top: top - win.scrollTop(),\n                        left: left - win.scrollLeft()\n                    });\n                    wrapper.children(KWINDOWTITLEBAR).find(KPIN).addClass('k-i-unpin').removeClass('k-i-pin');\n                    that.options.pinned = true;\n                    that.options.draggable = false;\n                }\n            },\n            unpin: function () {\n                var that = this, win = $(window), wrapper = that.wrapper, top = parseInt(wrapper.css('top'), 10), left = parseInt(wrapper.css('left'), 10);\n                if (!that.options.isMaximized) {\n                    wrapper.css({\n                        position: '',\n                        top: top + win.scrollTop(),\n                        left: left + win.scrollLeft()\n                    });\n                    wrapper.children(KWINDOWTITLEBAR).find(KUNPIN).addClass('k-i-pin').removeClass('k-i-unpin');\n                    that.options.pinned = false;\n                    that.options.draggable = true;\n                }\n            },\n            _onDocumentResize: function () {\n                var that = this, wrapper = that.wrapper, wnd = $(window), zoomLevel = kendo.support.zoomLevel(), w, h;\n                if (!that.options.isMaximized) {\n                    return;\n                }\n                w = wnd.width() / zoomLevel;\n                h = wnd.height() / zoomLevel - parseInt(wrapper.css('padding-top'), 10);\n                wrapper.css({\n                    width: w,\n                    height: h\n                });\n                that.options.width = w;\n                that.options.height = h;\n                that.resize();\n            },\n            refresh: function (options) {\n                var that = this, initOptions = that.options, element = $(that.element), iframe, showIframe, url;\n                if (!isPlainObject(options)) {\n                    options = { url: options };\n                }\n                options = extend({}, initOptions.content, options);\n                showIframe = defined(initOptions.iframe) ? initOptions.iframe : options.iframe;\n                url = options.url;\n                if (url) {\n                    if (!defined(showIframe)) {\n                        showIframe = !isLocalUrl(url);\n                    }\n                    if (!showIframe) {\n                        that._ajaxRequest(options);\n                    } else {\n                        iframe = element.find('.' + KCONTENTFRAME)[0];\n                        if (iframe) {\n                            iframe.src = url || iframe.src;\n                        } else {\n                            element.html(templates.contentFrame(extend({}, initOptions, { content: options })));\n                        }\n                        element.find('.' + KCONTENTFRAME).unbind('load' + NS).on('load' + NS, proxy(this._triggerRefresh, this));\n                    }\n                } else {\n                    if (options.template) {\n                        that.content(template(options.template)({}));\n                    }\n                    that.trigger(REFRESH);\n                }\n                element.toggleClass('k-window-iframecontent', !!showIframe);\n                return that;\n            },\n            _triggerRefresh: function () {\n                this.trigger(REFRESH);\n            },\n            _ajaxComplete: function () {\n                clearTimeout(this._loadingIconTimeout);\n                this.wrapper.find(REFRESHICON).removeClass(LOADING);\n            },\n            _ajaxError: function (xhr, status) {\n                this.trigger(ERROR, {\n                    status: status,\n                    xhr: xhr\n                });\n            },\n            _ajaxSuccess: function (contentTemplate) {\n                return function (data) {\n                    var html = data;\n                    if (contentTemplate) {\n                        html = template(contentTemplate)(data || {});\n                    }\n                    this.content(html, data);\n                    this.element.prop('scrollTop', 0);\n                    this.trigger(REFRESH);\n                };\n            },\n            _showLoading: function () {\n                this.wrapper.find(REFRESHICON).addClass(LOADING);\n            },\n            _ajaxRequest: function (options) {\n                this._loadingIconTimeout = setTimeout(proxy(this._showLoading, this), 100);\n                $.ajax(extend({\n                    type: 'GET',\n                    dataType: 'html',\n                    cache: false,\n                    error: proxy(this._ajaxError, this),\n                    complete: proxy(this._ajaxComplete, this),\n                    success: proxy(this._ajaxSuccess(options.template), this)\n                }, options));\n            },\n            _destroy: function () {\n                if (this.resizing) {\n                    this.resizing.destroy();\n                }\n                if (this.dragging) {\n                    this.dragging.destroy();\n                }\n                this.wrapper.off(NS).children(KWINDOWCONTENT).off(NS).end().find('.k-resize-handle,.k-window-titlebar').off(NS);\n                $(window).off('resize' + NS + this._marker);\n                clearTimeout(this._loadingIconTimeout);\n                Widget.fn.destroy.call(this);\n                this.unbind(undefined);\n                kendo.destroy(this.wrapper);\n                this._removeOverlay(true);\n            },\n            destroy: function () {\n                this._destroy();\n                this.wrapper.empty().remove();\n                this.wrapper = this.appendTo = this.element = $();\n            },\n            _createWindow: function () {\n                var contentHtml = this.element, options = this.options, iframeSrcAttributes, wrapper, isRtl = kendo.support.isRtl(contentHtml);\n                if (options.scrollable === false) {\n                    contentHtml.css('overflow', 'hidden');\n                }\n                wrapper = $(templates.wrapper(options));\n                iframeSrcAttributes = contentHtml.find('iframe:not(.k-content)').map(function () {\n                    var src = this.getAttribute('src');\n                    this.src = '';\n                    return src;\n                });\n                wrapper.toggleClass('k-rtl', isRtl).appendTo(this.appendTo).append(contentHtml).find('iframe:not(.k-content)').each(function (index) {\n                    this.src = iframeSrcAttributes[index];\n                });\n                wrapper.find('.k-window-title').css(isRtl ? 'left' : 'right', outerWidth(wrapper.find('.k-window-actions')) + 10);\n                contentHtml.css('visibility', '').show();\n                contentHtml.find('[data-role=editor]').each(function () {\n                    var editor = $(this).data('kendoEditor');\n                    if (editor) {\n                        editor.refresh();\n                    }\n                });\n                wrapper = contentHtml = null;\n            }\n        });\n        templates = {\n            wrapper: template('<div class=\\'k-widget k-window\\' />'),\n            action: template('<a role=\\'button\\' href=\\'\\\\#\\' class=\\'k-button k-bare k-button-icon k-window-action\\' aria-label=\\'#= name #\\'>' + '<span class=\\'k-icon k-i-#= name.toLowerCase() #\\'></span>' + '</a>'),\n            titlebar: template('<div class=\\'k-window-titlebar k-header\\'>&nbsp;' + '<span class=\\'k-window-title\\'>#: title #</span>' + '<div class=\\'k-window-actions\\' />' + '</div>'),\n            overlay: '<div class=\\'k-overlay\\' />',\n            contentFrame: template('<iframe frameborder=\\'0\\' title=\\'#= title #\\' class=\\'' + KCONTENTFRAME + '\\' ' + 'src=\\'#= content.url #\\'>' + 'This page requires frames in order to show content' + '</iframe>'),\n            resizeHandle: template('<div class=\\'k-resize-handle k-resize-#= data #\\'></div>')\n        };\n        function WindowResizing(wnd) {\n            var that = this;\n            that.owner = wnd;\n            that._preventDragging = false;\n            that._draggable = new Draggable(wnd.wrapper, {\n                filter: '>' + KWINDOWRESIZEHANDLES,\n                group: wnd.wrapper.id + '-resizing',\n                dragstart: proxy(that.dragstart, that),\n                drag: proxy(that.drag, that),\n                dragend: proxy(that.dragend, that)\n            });\n            that._draggable.userEvents.bind('press', proxy(that.addOverlay, that));\n            that._draggable.userEvents.bind('release', proxy(that.removeOverlay, that));\n        }\n        function getPosition(elem) {\n            var result = {\n                    top: elem.offsetTop,\n                    left: elem.offsetLeft\n                }, parent = elem.offsetParent;\n            while (parent) {\n                result.top += parent.offsetTop;\n                result.left += parent.offsetLeft;\n                var parentOverflowX = $(parent).css('overflowX');\n                var parentOverflowY = $(parent).css('overflowY');\n                if (parentOverflowY === 'auto' || parentOverflowY === 'scroll') {\n                    result.top -= parent.scrollTop;\n                }\n                if (parentOverflowX === 'auto' || parentOverflowX === 'scroll') {\n                    result.left -= parent.scrollLeft;\n                }\n                parent = parent.offsetParent;\n            }\n            return result;\n        }\n        WindowResizing.prototype = {\n            addOverlay: function () {\n                this.owner.wrapper.append(templates.overlay);\n            },\n            removeOverlay: function () {\n                this.owner.wrapper.find(KOVERLAY).remove();\n            },\n            dragstart: function (e) {\n                var that = this;\n                var wnd = that.owner;\n                var wrapper = wnd.wrapper;\n                that._preventDragging = wnd.trigger(RESIZESTART);\n                if (that._preventDragging) {\n                    return;\n                }\n                that.elementPadding = parseInt(wrapper.css('padding-top'), 10);\n                that.initialPosition = kendo.getOffset(wrapper, 'position');\n                that.resizeDirection = e.currentTarget.prop('className').replace('k-resize-handle k-resize-', '');\n                that.initialSize = {\n                    width: wrapper.width(),\n                    height: wrapper.height()\n                };\n                that.containerOffset = kendo.getOffset(wnd.appendTo, 'position');\n                var offsetParent = wrapper.offsetParent();\n                if (offsetParent.is('html')) {\n                    that.containerOffset.top = that.containerOffset.left = 0;\n                } else {\n                    var marginTop = offsetParent.css('margin-top');\n                    var marginLeft = offsetParent.css('margin-left');\n                    var hasMargin = !zero.test(marginTop) || !zero.test(marginLeft);\n                    if (hasMargin) {\n                        var wrapperPosition = getPosition(wrapper[0]);\n                        var relativeElMarginLeft = wrapperPosition.left - that.containerOffset.left - that.initialPosition.left;\n                        var relativeElMarginTop = wrapperPosition.top - that.containerOffset.top - that.initialPosition.top;\n                        that._relativeElMarginLeft = relativeElMarginLeft > 1 ? relativeElMarginLeft : 0;\n                        that._relativeElMarginTop = relativeElMarginTop > 1 ? relativeElMarginTop : 0;\n                        that.initialPosition.left += that._relativeElMarginLeft;\n                        that.initialPosition.top += that._relativeElMarginTop;\n                    }\n                }\n                wrapper.children(KWINDOWRESIZEHANDLES).not(e.currentTarget).hide();\n                $(BODY).css(CURSOR, e.currentTarget.css(CURSOR));\n            },\n            drag: function (e) {\n                if (this._preventDragging) {\n                    return;\n                }\n                var that = this, wnd = that.owner, wrapper = wnd.wrapper, options = wnd.options, direction = that.resizeDirection, containerOffset = that.containerOffset, initialPosition = that.initialPosition, initialSize = that.initialSize, newWidth, newHeight, windowBottom, windowRight, x = Math.max(e.x.location, 0), y = Math.max(e.y.location, 0);\n                if (direction.indexOf('e') >= 0) {\n                    newWidth = x - initialPosition.left - containerOffset.left;\n                    wrapper.width(constrain(newWidth, options.minWidth, options.maxWidth));\n                } else if (direction.indexOf('w') >= 0) {\n                    windowRight = initialPosition.left + initialSize.width + containerOffset.left;\n                    newWidth = constrain(windowRight - x, options.minWidth, options.maxWidth);\n                    wrapper.css({\n                        left: windowRight - newWidth - containerOffset.left - (that._relativeElMarginLeft || 0),\n                        width: newWidth\n                    });\n                }\n                var newWindowTop = y;\n                if (wnd.options.pinned) {\n                    newWindowTop -= $(window).scrollTop();\n                }\n                if (direction.indexOf('s') >= 0) {\n                    newHeight = newWindowTop - initialPosition.top - that.elementPadding - containerOffset.top;\n                    wrapper.height(constrain(newHeight, options.minHeight, options.maxHeight));\n                } else if (direction.indexOf('n') >= 0) {\n                    windowBottom = initialPosition.top + initialSize.height + containerOffset.top;\n                    newHeight = constrain(windowBottom - newWindowTop, options.minHeight, options.maxHeight);\n                    wrapper.css({\n                        top: windowBottom - newHeight - containerOffset.top - (that._relativeElMarginTop || 0),\n                        height: newHeight\n                    });\n                }\n                if (newWidth) {\n                    wnd.options.width = newWidth + 'px';\n                }\n                if (newHeight) {\n                    wnd.options.height = newHeight + 'px';\n                }\n                wnd.resize();\n            },\n            dragend: function (e) {\n                if (this._preventDragging) {\n                    return;\n                }\n                var that = this, wnd = that.owner, wrapper = wnd.wrapper;\n                wrapper.children(KWINDOWRESIZEHANDLES).not(e.currentTarget).show();\n                $(BODY).css(CURSOR, '');\n                if (wnd.touchScroller) {\n                    wnd.touchScroller.reset();\n                }\n                if (e.keyCode == 27) {\n                    wrapper.css(that.initialPosition).css(that.initialSize);\n                }\n                wnd.trigger(RESIZEEND);\n                return false;\n            },\n            destroy: function () {\n                if (this._draggable) {\n                    this._draggable.destroy();\n                }\n                this._draggable = this.owner = null;\n            }\n        };\n        function WindowDragging(wnd, dragHandle) {\n            var that = this;\n            that.owner = wnd;\n            that._preventDragging = false;\n            that._draggable = new Draggable(wnd.wrapper, {\n                filter: dragHandle,\n                group: wnd.wrapper.id + '-moving',\n                dragstart: proxy(that.dragstart, that),\n                drag: proxy(that.drag, that),\n                dragend: proxy(that.dragend, that),\n                dragcancel: proxy(that.dragcancel, that)\n            });\n            that._draggable.userEvents.stopPropagation = false;\n        }\n        WindowDragging.prototype = {\n            dragstart: function (e) {\n                var wnd = this.owner, element = wnd.element, actions = element.find('.k-window-actions'), containerOffset = kendo.getOffset(wnd.appendTo);\n                this._preventDragging = wnd.trigger(DRAGSTART) || !wnd.options.draggable;\n                if (this._preventDragging) {\n                    return;\n                }\n                wnd.initialWindowPosition = kendo.getOffset(wnd.wrapper, 'position');\n                wnd.initialPointerPosition = {\n                    left: e.x.client,\n                    top: e.y.client\n                };\n                wnd.startPosition = {\n                    left: e.x.client - wnd.initialWindowPosition.left,\n                    top: e.y.client - wnd.initialWindowPosition.top\n                };\n                if (actions.length > 0) {\n                    wnd.minLeftPosition = outerWidth(actions) + parseInt(actions.css('right'), 10) - outerWidth(element);\n                } else {\n                    wnd.minLeftPosition = 20 - outerWidth(element);\n                }\n                wnd.minLeftPosition -= containerOffset.left;\n                wnd.minTopPosition = -containerOffset.top;\n                wnd.wrapper.append(templates.overlay).children(KWINDOWRESIZEHANDLES).hide();\n                $(BODY).css(CURSOR, e.currentTarget.css(CURSOR));\n            },\n            drag: function (e) {\n                if (this._preventDragging) {\n                    return;\n                }\n                var wnd = this.owner;\n                var position = wnd.options.position;\n                position.top = Math.max(e.y.client - wnd.startPosition.top, wnd.minTopPosition);\n                position.left = Math.max(e.x.client - wnd.startPosition.left, wnd.minLeftPosition);\n                if (kendo.support.transforms) {\n                    $(wnd.wrapper).css('transform', 'translate(' + (e.x.client - wnd.initialPointerPosition.left) + 'px, ' + (e.y.client - wnd.initialPointerPosition.top) + 'px)');\n                } else {\n                    $(wnd.wrapper).css(position);\n                }\n            },\n            _finishDrag: function () {\n                var wnd = this.owner;\n                wnd.wrapper.children(KWINDOWRESIZEHANDLES).toggle(!wnd.options.isMinimized).end().find(KOVERLAY).remove();\n                $(BODY).css(CURSOR, '');\n            },\n            dragcancel: function (e) {\n                if (this._preventDragging) {\n                    return;\n                }\n                this._finishDrag();\n                e.currentTarget.closest(KWINDOW).css(this.owner.initialWindowPosition);\n            },\n            dragend: function () {\n                if (this._preventDragging) {\n                    return;\n                }\n                $(this.owner.wrapper).css(this.owner.options.position).css('transform', '');\n                this._finishDrag();\n                this.owner.trigger(DRAGEND);\n                return false;\n            },\n            destroy: function () {\n                if (this._draggable) {\n                    this._draggable.destroy();\n                }\n                this._draggable = this.owner = null;\n            }\n        };\n        kendo.ui.plugin(Window);\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.mobile.view', [\n        'kendo.core',\n        'kendo.fx',\n        'kendo.mobile.scroller',\n        'kendo.view'\n    ], f);\n}(function () {\n    var __meta__ = {\n        id: 'mobile.view',\n        name: 'View',\n        category: 'mobile',\n        description: 'Mobile View',\n        depends: [\n            'core',\n            'fx',\n            'mobile.scroller',\n            'view'\n        ],\n        hidden: true\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, mobile = kendo.mobile, ui = mobile.ui, attr = kendo.attr, Widget = ui.Widget, ViewClone = kendo.ViewClone, INIT = 'init', UI_OVERLAY = '<div style=\"height: 100%; width: 100%; position: absolute; top: 0; left: 0; z-index: 20000; display: none\" />', BEFORE_SHOW = 'beforeShow', SHOW = 'show', AFTER_SHOW = 'afterShow', BEFORE_HIDE = 'beforeHide', TRANSITION_END = 'transitionEnd', TRANSITION_START = 'transitionStart', HIDE = 'hide', DESTROY = 'destroy', attrValue = kendo.attrValue, roleSelector = kendo.roleSelector, directiveSelector = kendo.directiveSelector, compileMobileDirective = kendo.compileMobileDirective;\n        function initPopOvers(element) {\n            var popovers = element.find(roleSelector('popover')), idx, length, roles = ui.roles;\n            for (idx = 0, length = popovers.length; idx < length; idx++) {\n                kendo.initWidget(popovers[idx], {}, roles);\n            }\n        }\n        function preventScrollIfNotInput(e) {\n            if (!kendo.triggeredByInput(e)) {\n                e.preventDefault();\n            }\n        }\n        var View = Widget.extend({\n            init: function (element, options) {\n                Widget.fn.init.call(this, element, options);\n                this.params = {};\n                $.extend(this, options);\n                this.transition = this.transition || this.defaultTransition;\n                this._id();\n                if (!this.options.$angular) {\n                    this._layout();\n                    this._overlay();\n                    this._scroller();\n                    this._model();\n                } else {\n                    this._overlay();\n                }\n            },\n            events: [\n                INIT,\n                BEFORE_SHOW,\n                SHOW,\n                AFTER_SHOW,\n                BEFORE_HIDE,\n                HIDE,\n                DESTROY,\n                TRANSITION_START,\n                TRANSITION_END\n            ],\n            options: {\n                name: 'View',\n                title: '',\n                layout: null,\n                getLayout: $.noop,\n                reload: false,\n                transition: '',\n                defaultTransition: '',\n                useNativeScrolling: false,\n                stretch: false,\n                zoom: false,\n                model: null,\n                modelScope: window,\n                scroller: {},\n                initWidgets: true\n            },\n            enable: function (enable) {\n                if (typeof enable == 'undefined') {\n                    enable = true;\n                }\n                if (enable) {\n                    this.overlay.hide();\n                } else {\n                    this.overlay.show();\n                }\n            },\n            destroy: function () {\n                if (this.layout) {\n                    this.layout.detach(this);\n                }\n                this.trigger(DESTROY);\n                Widget.fn.destroy.call(this);\n                if (this.scroller) {\n                    this.scroller.destroy();\n                }\n                if (this.options.$angular) {\n                    this.element.scope().$destroy();\n                }\n                kendo.destroy(this.element);\n            },\n            purge: function () {\n                this.destroy();\n                this.element.remove();\n            },\n            triggerBeforeShow: function () {\n                if (this.trigger(BEFORE_SHOW, { view: this })) {\n                    return false;\n                }\n                return true;\n            },\n            triggerBeforeHide: function () {\n                if (this.trigger(BEFORE_HIDE, { view: this })) {\n                    return false;\n                }\n                return true;\n            },\n            showStart: function () {\n                var element = this.element;\n                element.css('display', '');\n                if (!this.inited) {\n                    this.inited = true;\n                    this.trigger(INIT, { view: this });\n                } else {\n                    this._invokeNgController();\n                }\n                if (this.layout) {\n                    this.layout.attach(this);\n                }\n                this._padIfNativeScrolling();\n                this.trigger(SHOW, { view: this });\n                kendo.resize(element);\n            },\n            showEnd: function () {\n                this.trigger(AFTER_SHOW, { view: this });\n                this._padIfNativeScrolling();\n            },\n            hideEnd: function () {\n                var that = this;\n                that.element.hide();\n                that.trigger(HIDE, { view: that });\n                if (that.layout) {\n                    that.layout.trigger(HIDE, {\n                        view: that,\n                        layout: that.layout\n                    });\n                }\n            },\n            beforeTransition: function (type) {\n                this.trigger(TRANSITION_START, { type: type });\n            },\n            afterTransition: function (type) {\n                this.trigger(TRANSITION_END, { type: type });\n            },\n            _padIfNativeScrolling: function () {\n                if (mobile.appLevelNativeScrolling()) {\n                    var isAndroid = kendo.support.mobileOS && kendo.support.mobileOS.android, skin = mobile.application.skin() || '', isAndroidForced = mobile.application.os.android || skin.indexOf('android') > -1, hasPlatformIndependentSkin = skin === 'flat' || skin.indexOf('material') > -1, topContainer = (isAndroid || isAndroidForced) && !hasPlatformIndependentSkin ? 'footer' : 'header', bottomContainer = (isAndroid || isAndroidForced) && !hasPlatformIndependentSkin ? 'header' : 'footer';\n                    this.content.css({\n                        paddingTop: this[topContainer].height(),\n                        paddingBottom: this[bottomContainer].height()\n                    });\n                }\n            },\n            contentElement: function () {\n                var that = this;\n                return that.options.stretch ? that.content : that.scrollerContent;\n            },\n            clone: function () {\n                return new ViewClone(this);\n            },\n            _scroller: function () {\n                var that = this;\n                if (mobile.appLevelNativeScrolling()) {\n                    return;\n                }\n                if (that.options.stretch) {\n                    that.content.addClass('km-stretched-view');\n                } else {\n                    that.content.kendoMobileScroller($.extend(that.options.scroller, {\n                        zoom: that.options.zoom,\n                        useNative: that.options.useNativeScrolling\n                    }));\n                    that.scroller = that.content.data('kendoMobileScroller');\n                    that.scrollerContent = that.scroller.scrollElement;\n                }\n                if (kendo.support.kineticScrollNeeded) {\n                    $(that.element).on('touchmove', '.km-header', preventScrollIfNotInput);\n                    if (!that.options.useNativeScrolling && !that.options.stretch) {\n                        $(that.element).on('touchmove', '.km-content', preventScrollIfNotInput);\n                    }\n                }\n            },\n            _model: function () {\n                var that = this, element = that.element, model = that.options.model;\n                if (typeof model === 'string') {\n                    model = kendo.getter(model)(that.options.modelScope);\n                }\n                that.model = model;\n                initPopOvers(element);\n                that.element.css('display', '');\n                if (that.options.initWidgets) {\n                    if (model) {\n                        kendo.bind(element, model, ui, kendo.ui, kendo.dataviz.ui);\n                    } else {\n                        mobile.init(element.children());\n                    }\n                }\n                that.element.css('display', 'none');\n            },\n            _id: function () {\n                var element = this.element, idAttrValue = element.attr('id') || '';\n                this.id = attrValue(element, 'url') || '#' + idAttrValue;\n                if (this.id == '#') {\n                    this.id = kendo.guid();\n                    element.attr('id', this.id);\n                }\n            },\n            _layout: function () {\n                var contentSelector = roleSelector('content'), element = this.element;\n                element.addClass('km-view');\n                this.header = element.children(roleSelector('header')).addClass('km-header');\n                this.footer = element.children(roleSelector('footer')).addClass('km-footer');\n                if (!element.children(contentSelector)[0]) {\n                    element.wrapInner('<div ' + attr('role') + '=\"content\"></div>');\n                }\n                this.content = element.children(roleSelector('content')).addClass('km-content');\n                this.element.prepend(this.header).append(this.footer);\n                this.layout = this.options.getLayout(this.layout);\n                if (this.layout) {\n                    this.layout.setup(this);\n                }\n            },\n            _overlay: function () {\n                this.overlay = $(UI_OVERLAY).appendTo(this.element);\n            },\n            _invokeNgController: function () {\n                var controller, scope;\n                if (this.options.$angular) {\n                    controller = this.element.controller();\n                    scope = this.options.$angular[0];\n                    if (controller) {\n                        var callback = $.proxy(this, '_callController', controller, scope);\n                        if (/^\\$(digest|apply)$/.test(scope.$$phase)) {\n                            callback();\n                        } else {\n                            scope.$apply(callback);\n                        }\n                    }\n                }\n            },\n            _callController: function (controller, scope) {\n                this.element.injector().invoke(controller.constructor, controller, { $scope: scope });\n            }\n        });\n        function initWidgets(collection) {\n            collection.each(function () {\n                kendo.initWidget($(this), {}, ui.roles);\n            });\n        }\n        var Layout = Widget.extend({\n            init: function (element, options) {\n                Widget.fn.init.call(this, element, options);\n                element = this.element;\n                this.header = element.children(this._locate('header')).addClass('km-header');\n                this.footer = element.children(this._locate('footer')).addClass('km-footer');\n                this.elements = this.header.add(this.footer);\n                initPopOvers(element);\n                if (!this.options.$angular) {\n                    kendo.mobile.init(this.element.children());\n                }\n                this.element.detach();\n                this.trigger(INIT, { layout: this });\n            },\n            _locate: function (selectors) {\n                return this.options.$angular ? directiveSelector(selectors) : roleSelector(selectors);\n            },\n            options: {\n                name: 'Layout',\n                id: null,\n                platform: null\n            },\n            events: [\n                INIT,\n                SHOW,\n                HIDE\n            ],\n            setup: function (view) {\n                if (!view.header[0]) {\n                    view.header = this.header;\n                }\n                if (!view.footer[0]) {\n                    view.footer = this.footer;\n                }\n            },\n            detach: function (view) {\n                var that = this;\n                if (view.header === that.header && that.header[0]) {\n                    view.element.prepend(that.header.detach()[0].cloneNode(true));\n                }\n                if (view.footer === that.footer && that.footer.length) {\n                    view.element.append(that.footer.detach()[0].cloneNode(true));\n                }\n            },\n            attach: function (view) {\n                var that = this, previousView = that.currentView;\n                if (previousView) {\n                    that.detach(previousView);\n                }\n                if (view.header === that.header) {\n                    that.header.detach();\n                    view.element.children(roleSelector('header')).remove();\n                    view.element.prepend(that.header);\n                }\n                if (view.footer === that.footer) {\n                    that.footer.detach();\n                    view.element.children(roleSelector('footer')).remove();\n                    view.element.append(that.footer);\n                }\n                that.trigger(SHOW, {\n                    layout: that,\n                    view: view\n                });\n                that.currentView = view;\n            }\n        });\n        var Observable = kendo.Observable, bodyRegExp = /<body[^>]*>(([\\u000a\\u000d\\u2028\\u2029]|.)*)<\\/body>/i, LOAD_START = 'loadStart', LOAD_COMPLETE = 'loadComplete', SHOW_START = 'showStart', SAME_VIEW_REQUESTED = 'sameViewRequested', VIEW_SHOW = 'viewShow', VIEW_TYPE_DETERMINED = 'viewTypeDetermined', AFTER = 'after';\n        var ViewEngine = Observable.extend({\n            init: function (options) {\n                var that = this, views, errorMessage, container, collection;\n                Observable.fn.init.call(that);\n                $.extend(that, options);\n                that.sandbox = $('<div />');\n                container = that.container;\n                views = that._hideViews(container);\n                that.rootView = views.first();\n                if (!that.rootView[0] && options.rootNeeded) {\n                    if (container[0] == kendo.mobile.application.element[0]) {\n                        errorMessage = 'Your kendo mobile application element does not contain any direct child elements with data-role=\"view\" attribute set. Make sure that you instantiate the mobile application using the correct container.';\n                    } else {\n                        errorMessage = 'Your pane element does not contain any direct child elements with data-role=\"view\" attribute set.';\n                    }\n                    throw new Error(errorMessage);\n                }\n                that.layouts = {};\n                that.viewContainer = new kendo.ViewContainer(that.container);\n                that.viewContainer.bind('accepted', function (e) {\n                    e.view.params = that.params;\n                });\n                that.viewContainer.bind('complete', function (e) {\n                    that.trigger(VIEW_SHOW, { view: e.view });\n                });\n                that.viewContainer.bind(AFTER, function () {\n                    that.trigger(AFTER);\n                });\n                this.getLayoutProxy = $.proxy(this, '_getLayout');\n                that._setupLayouts(container);\n                collection = container.children(that._locate('modalview drawer'));\n                if (that.$angular) {\n                    that.$angular[0].viewOptions = {\n                        defaultTransition: that.transition,\n                        loader: that.loader,\n                        container: that.container,\n                        getLayout: that.getLayoutProxy\n                    };\n                    collection.each(function (idx, element) {\n                        compileMobileDirective($(element), options.$angular[0]);\n                    });\n                } else {\n                    initWidgets(collection);\n                }\n                this.bind(this.events, options);\n            },\n            events: [\n                SHOW_START,\n                AFTER,\n                VIEW_SHOW,\n                LOAD_START,\n                LOAD_COMPLETE,\n                SAME_VIEW_REQUESTED,\n                VIEW_TYPE_DETERMINED\n            ],\n            destroy: function () {\n                kendo.destroy(this.container);\n                for (var id in this.layouts) {\n                    this.layouts[id].destroy();\n                }\n            },\n            view: function () {\n                return this.viewContainer.view;\n            },\n            showView: function (url, transition, params) {\n                url = url.replace(new RegExp('^' + this.remoteViewURLPrefix), '');\n                if (url === '' && this.remoteViewURLPrefix) {\n                    url = '/';\n                }\n                if (url.replace(/^#/, '') === this.url) {\n                    this.trigger(SAME_VIEW_REQUESTED);\n                    return false;\n                }\n                this.trigger(SHOW_START);\n                var that = this, showClosure = function (view) {\n                        return that.viewContainer.show(view, transition, url);\n                    }, element = that._findViewElement(url), view = kendo.widgetInstance(element);\n                that.url = url.replace(/^#/, '');\n                that.params = params;\n                if (view && view.reload) {\n                    view.purge();\n                    element = [];\n                }\n                this.trigger(VIEW_TYPE_DETERMINED, {\n                    remote: element.length === 0,\n                    url: url\n                });\n                if (element[0]) {\n                    if (!view) {\n                        view = that._createView(element);\n                    }\n                    return showClosure(view);\n                } else {\n                    if (this.serverNavigation) {\n                        location.href = url;\n                    } else {\n                        that._loadView(url, showClosure);\n                    }\n                    return true;\n                }\n            },\n            append: function (html, url) {\n                var sandbox = this.sandbox, urlPath = (url || '').split('?')[0], container = this.container, views, modalViews, view;\n                if (bodyRegExp.test(html)) {\n                    html = RegExp.$1;\n                }\n                sandbox[0].innerHTML = html;\n                container.append(sandbox.children('script, style'));\n                views = this._hideViews(sandbox);\n                view = views.first();\n                if (!view.length) {\n                    views = view = sandbox.wrapInner('<div data-role=view />').children();\n                }\n                if (urlPath) {\n                    view.hide().attr(attr('url'), urlPath);\n                }\n                this._setupLayouts(sandbox);\n                modalViews = sandbox.children(this._locate('modalview drawer'));\n                container.append(sandbox.children(this._locate('layout modalview drawer')).add(views));\n                initWidgets(modalViews);\n                return this._createView(view);\n            },\n            _locate: function (selectors) {\n                return this.$angular ? directiveSelector(selectors) : roleSelector(selectors);\n            },\n            _findViewElement: function (url) {\n                var element, urlPath = url.split('?')[0];\n                if (!urlPath) {\n                    return this.rootView;\n                }\n                element = this.container.children('[' + attr('url') + '=\\'' + urlPath + '\\']');\n                if (!element[0] && urlPath.indexOf('/') === -1) {\n                    element = this.container.children(urlPath.charAt(0) === '#' ? urlPath : '#' + urlPath);\n                }\n                return element;\n            },\n            _createView: function (element) {\n                if (this.$angular) {\n                    return compileMobileDirective(element, this.$angular[0]);\n                } else {\n                    return kendo.initWidget(element, {\n                        defaultTransition: this.transition,\n                        loader: this.loader,\n                        container: this.container,\n                        getLayout: this.getLayoutProxy,\n                        modelScope: this.modelScope,\n                        reload: attrValue(element, 'reload')\n                    }, ui.roles);\n                }\n            },\n            _getLayout: function (name) {\n                if (name === '') {\n                    return null;\n                }\n                return name ? this.layouts[name] : this.layouts[this.layout];\n            },\n            _loadView: function (url, callback) {\n                if (this._xhr) {\n                    this._xhr.abort();\n                }\n                this.trigger(LOAD_START);\n                this._xhr = $.get(kendo.absoluteURL(url, this.remoteViewURLPrefix), 'html').always($.proxy(this, '_xhrComplete', callback, url));\n            },\n            _xhrComplete: function (callback, url, response) {\n                var success = true;\n                if (typeof response === 'object') {\n                    if (response.status === 0) {\n                        if (response.responseText && response.responseText.length > 0) {\n                            success = true;\n                            response = response.responseText;\n                        } else {\n                            return;\n                        }\n                    }\n                }\n                this.trigger(LOAD_COMPLETE);\n                if (success) {\n                    callback(this.append(response, url));\n                }\n            },\n            _hideViews: function (container) {\n                return container.children(this._locate('view splitview')).hide();\n            },\n            _setupLayouts: function (element) {\n                var that = this, layout;\n                element.children(that._locate('layout')).each(function () {\n                    if (that.$angular) {\n                        layout = compileMobileDirective($(this), that.$angular[0]);\n                    } else {\n                        layout = kendo.initWidget($(this), {}, ui.roles);\n                    }\n                    var platform = layout.options.platform;\n                    if (!platform || platform === mobile.application.os.name) {\n                        that.layouts[layout.options.id] = layout;\n                    } else {\n                        layout.destroy();\n                    }\n                });\n            }\n        });\n        kendo.mobile.ViewEngine = ViewEngine;\n        ui.plugin(View);\n        ui.plugin(Layout);\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.mobile.loader', ['kendo.core'], f);\n}(function () {\n    var __meta__ = {\n        id: 'mobile.loader',\n        name: 'Loader',\n        category: 'mobile',\n        description: 'Mobile Loader',\n        depends: ['core'],\n        hidden: true\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, ui = kendo.mobile.ui, Widget = ui.Widget, CAPTURE_EVENTS = $.map(kendo.eventMap, function (value) {\n                return value;\n            }).join(' ').split(' ');\n        var Loader = Widget.extend({\n            init: function (container, options) {\n                var that = this, element = $('<div class=\"km-loader\"><span class=\"km-loading km-spin\"></span><span class=\"km-loading-left\"></span><span class=\"km-loading-right\"></span></div>');\n                Widget.fn.init.call(that, element, options);\n                that.container = container;\n                that.captureEvents = false;\n                that._attachCapture();\n                element.append(that.options.loading).hide().appendTo(container);\n            },\n            options: {\n                name: 'Loader',\n                loading: '<h1>Loading...</h1>',\n                timeout: 100\n            },\n            show: function () {\n                var that = this;\n                clearTimeout(that._loading);\n                if (that.options.loading === false) {\n                    return;\n                }\n                that.captureEvents = true;\n                that._loading = setTimeout(function () {\n                    that.element.show();\n                }, that.options.timeout);\n            },\n            hide: function () {\n                this.captureEvents = false;\n                clearTimeout(this._loading);\n                this.element.hide();\n            },\n            changeMessage: function (message) {\n                this.options.loading = message;\n                this.element.find('>h1').html(message);\n            },\n            transition: function () {\n                this.captureEvents = true;\n                this.container.css('pointer-events', 'none');\n            },\n            transitionDone: function () {\n                this.captureEvents = false;\n                this.container.css('pointer-events', '');\n            },\n            _attachCapture: function () {\n                var that = this;\n                that.captureEvents = false;\n                function capture(e) {\n                    if (that.captureEvents) {\n                        e.preventDefault();\n                    }\n                }\n                for (var i = 0; i < CAPTURE_EVENTS.length; i++) {\n                    that.container[0].addEventListener(CAPTURE_EVENTS[i], capture, true);\n                }\n            }\n        });\n        ui.plugin(Loader);\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.mobile.pane', [\n        'kendo.mobile.view',\n        'kendo.mobile.loader'\n    ], f);\n}(function () {\n    var __meta__ = {\n        id: 'mobile.pane',\n        name: 'Pane',\n        category: 'mobile',\n        description: 'Mobile Pane',\n        depends: [\n            'mobile.view',\n            'mobile.loader'\n        ],\n        hidden: true\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, mobile = kendo.mobile, roleSelector = kendo.roleSelector, ui = mobile.ui, Widget = ui.Widget, ViewEngine = mobile.ViewEngine, View = ui.View, Loader = mobile.ui.Loader, EXTERNAL = 'external', HREF = 'href', DUMMY_HREF = '#!', NAVIGATE = 'navigate', VIEW_SHOW = 'viewShow', SAME_VIEW_REQUESTED = 'sameViewRequested', OS = kendo.support.mobileOS, SKIP_TRANSITION_ON_BACK_BUTTON = OS.ios && !OS.appMode && OS.flatVersion >= 700, WIDGET_RELS = /popover|actionsheet|modalview|drawer/, BACK = '#:back', attrValue = kendo.attrValue;\n        var Pane = Widget.extend({\n            init: function (element, options) {\n                var that = this;\n                Widget.fn.init.call(that, element, options);\n                options = that.options;\n                element = that.element;\n                element.addClass('km-pane');\n                if (that.options.collapsible) {\n                    element.addClass('km-collapsible-pane');\n                }\n                this.history = [];\n                this.historyCallback = function (url, params, backButtonPressed) {\n                    var transition = that.transition;\n                    that.transition = null;\n                    if (SKIP_TRANSITION_ON_BACK_BUTTON && backButtonPressed) {\n                        transition = 'none';\n                    }\n                    return that.viewEngine.showView(url, transition, params);\n                };\n                this._historyNavigate = function (url) {\n                    if (url === BACK) {\n                        if (that.history.length === 1) {\n                            return;\n                        }\n                        that.history.pop();\n                        url = that.history[that.history.length - 1];\n                    } else {\n                        that.history.push(url);\n                    }\n                    that.historyCallback(url, kendo.parseQueryStringParams(url));\n                };\n                this._historyReplace = function (url) {\n                    var params = kendo.parseQueryStringParams(url);\n                    that.history[that.history.length - 1] = url;\n                    that.historyCallback(url, params);\n                };\n                that.loader = new Loader(element, { loading: that.options.loading });\n                that.viewEngine = new ViewEngine({\n                    container: element,\n                    transition: options.transition,\n                    modelScope: options.modelScope,\n                    rootNeeded: !options.initial,\n                    serverNavigation: options.serverNavigation,\n                    remoteViewURLPrefix: options.root || '',\n                    layout: options.layout,\n                    $angular: options.$angular,\n                    loader: that.loader,\n                    showStart: function () {\n                        that.loader.transition();\n                        that.closeActiveDialogs();\n                    },\n                    after: function () {\n                        that.loader.transitionDone();\n                    },\n                    viewShow: function (e) {\n                        that.trigger(VIEW_SHOW, e);\n                    },\n                    loadStart: function () {\n                        that.loader.show();\n                    },\n                    loadComplete: function () {\n                        that.loader.hide();\n                    },\n                    sameViewRequested: function () {\n                        that.trigger(SAME_VIEW_REQUESTED);\n                    },\n                    viewTypeDetermined: function (e) {\n                        if (!e.remote || !that.options.serverNavigation) {\n                            that.trigger(NAVIGATE, { url: e.url });\n                        }\n                    }\n                });\n                this._setPortraitWidth();\n                kendo.onResize(function () {\n                    that._setPortraitWidth();\n                });\n                that._setupAppLinks();\n            },\n            closeActiveDialogs: function () {\n                var dialogs = this.element.find(roleSelector('actionsheet popover modalview')).filter(':visible');\n                dialogs.each(function () {\n                    kendo.widgetInstance($(this), ui).close();\n                });\n            },\n            navigateToInitial: function () {\n                var initial = this.options.initial;\n                if (initial) {\n                    this.navigate(initial);\n                }\n                return initial;\n            },\n            options: {\n                name: 'Pane',\n                portraitWidth: '',\n                transition: '',\n                layout: '',\n                collapsible: false,\n                initial: null,\n                modelScope: window,\n                loading: '<h1>Loading...</h1>'\n            },\n            events: [\n                NAVIGATE,\n                VIEW_SHOW,\n                SAME_VIEW_REQUESTED\n            ],\n            append: function (html) {\n                return this.viewEngine.append(html);\n            },\n            destroy: function () {\n                Widget.fn.destroy.call(this);\n                this.viewEngine.destroy();\n                this.userEvents.destroy();\n            },\n            navigate: function (url, transition) {\n                if (url instanceof View) {\n                    url = url.id;\n                }\n                this.transition = transition;\n                this._historyNavigate(url);\n            },\n            replace: function (url, transition) {\n                if (url instanceof View) {\n                    url = url.id;\n                }\n                this.transition = transition;\n                this._historyReplace(url);\n            },\n            bindToRouter: function (router) {\n                var that = this, history = this.history, viewEngine = this.viewEngine;\n                router.bind('init', function (e) {\n                    var url = e.url, attrUrl = router.pushState ? url : '/';\n                    viewEngine.rootView.attr(kendo.attr('url'), attrUrl);\n                    var length = history.length;\n                    if (url === '/' && length) {\n                        router.navigate(history[length - 1], true);\n                        e.preventDefault();\n                    }\n                });\n                router.bind('routeMissing', function (e) {\n                    if (!that.historyCallback(e.url, e.params, e.backButtonPressed)) {\n                        e.preventDefault();\n                    }\n                });\n                router.bind('same', function () {\n                    that.trigger(SAME_VIEW_REQUESTED);\n                });\n                that._historyNavigate = function (url) {\n                    router.navigate(url);\n                };\n                that._historyReplace = function (url) {\n                    router.replace(url);\n                };\n            },\n            hideLoading: function () {\n                this.loader.hide();\n            },\n            showLoading: function () {\n                this.loader.show();\n            },\n            changeLoadingMessage: function (message) {\n                this.loader.changeMessage(message);\n            },\n            view: function () {\n                return this.viewEngine.view();\n            },\n            _setPortraitWidth: function () {\n                var width, portraitWidth = this.options.portraitWidth;\n                if (portraitWidth) {\n                    width = kendo.mobile.application.element.is('.km-vertical') ? portraitWidth : 'auto';\n                    this.element.css('width', width);\n                }\n            },\n            _setupAppLinks: function () {\n                var that = this, linkRoles = 'tab', pressedButtonSelector = '[data-' + kendo.ns + 'navigate-on-press]', buttonSelectors = $.map([\n                        'button',\n                        'backbutton',\n                        'detailbutton',\n                        'listview-link'\n                    ], function (role) {\n                        return roleSelector(role) + ':not(' + pressedButtonSelector + ')';\n                    }).join(',');\n                this.element.handler(this).on('down', roleSelector(linkRoles) + ',' + pressedButtonSelector, '_mouseup').on('click', roleSelector(linkRoles) + ',' + buttonSelectors + ',' + pressedButtonSelector, '_appLinkClick');\n                this.userEvents = new kendo.UserEvents(this.element, {\n                    fastTap: true,\n                    filter: buttonSelectors,\n                    tap: function (e) {\n                        e.event.currentTarget = e.touch.currentTarget;\n                        that._mouseup(e.event);\n                    }\n                });\n                this.element.css('-ms-touch-action', '');\n            },\n            _appLinkClick: function (e) {\n                var href = $(e.currentTarget).attr('href');\n                var remote = href && href[0] !== '#' && this.options.serverNavigation;\n                if (!remote && attrValue($(e.currentTarget), 'rel') != EXTERNAL) {\n                    e.preventDefault();\n                }\n            },\n            _mouseup: function (e) {\n                if (e.which > 1 || e.isDefaultPrevented()) {\n                    return;\n                }\n                var pane = this, link = $(e.currentTarget), transition = attrValue(link, 'transition'), rel = attrValue(link, 'rel') || '', target = attrValue(link, 'target'), href = link.attr(HREF), delayedTouchEnd = SKIP_TRANSITION_ON_BACK_BUTTON && link[0].offsetHeight === 0, remote = href && href[0] !== '#' && this.options.serverNavigation;\n                if (delayedTouchEnd || remote || rel === EXTERNAL || typeof href === 'undefined' || href === DUMMY_HREF) {\n                    return;\n                }\n                link.attr(HREF, DUMMY_HREF);\n                setTimeout(function () {\n                    link.attr(HREF, href);\n                });\n                if (rel.match(WIDGET_RELS)) {\n                    kendo.widgetInstance($(href), ui).openFor(link);\n                    if (rel === 'actionsheet' || rel === 'drawer') {\n                        e.stopPropagation();\n                    }\n                } else {\n                    if (target === '_top') {\n                        pane = mobile.application.pane;\n                    } else if (target) {\n                        pane = $('#' + target).data('kendoMobilePane');\n                    }\n                    pane.navigate(href, transition);\n                }\n                e.preventDefault();\n            }\n        });\n        Pane.wrap = function (element) {\n            if (!element.is(roleSelector('view'))) {\n                element = element.wrap('<div data-' + kendo.ns + 'role=\"view\" data-stretch=\"true\"></div>').parent();\n            }\n            var paneContainer = element.wrap('<div class=\"km-pane-wrapper\"><div></div></div>').parent(), pane = new Pane(paneContainer);\n            pane.navigate('');\n            return pane;\n        };\n        ui.plugin(Pane);\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.mobile.popover', [\n        'kendo.popup',\n        'kendo.mobile.pane'\n    ], f);\n}(function () {\n    var __meta__ = {\n        id: 'mobile.popover',\n        name: 'PopOver',\n        category: 'mobile',\n        description: 'The mobile PopOver widget represents a transient view which is displayed when the user taps on a navigational widget or area on the screen. ',\n        depends: [\n            'popup',\n            'mobile.pane'\n        ]\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, mobile = kendo.mobile, ui = mobile.ui, HIDE = 'hide', OPEN = 'open', CLOSE = 'close', WRAPPER = '<div class=\"km-popup-wrapper\" />', ARROW = '<div class=\"km-popup-arrow\" />', OVERLAY = '<div class=\"km-popup-overlay\" />', DIRECTION_CLASSES = 'km-up km-down km-left km-right', Widget = ui.Widget, DIRECTIONS = {\n                'down': {\n                    origin: 'bottom center',\n                    position: 'top center'\n                },\n                'up': {\n                    origin: 'top center',\n                    position: 'bottom center'\n                },\n                'left': {\n                    origin: 'center left',\n                    position: 'center right',\n                    collision: 'fit flip'\n                },\n                'right': {\n                    origin: 'center right',\n                    position: 'center left',\n                    collision: 'fit flip'\n                }\n            }, ANIMATION = {\n                animation: {\n                    open: {\n                        effects: 'fade:in',\n                        duration: 0\n                    },\n                    close: {\n                        effects: 'fade:out',\n                        duration: 400\n                    }\n                }\n            }, DIMENSIONS = {\n                'horizontal': {\n                    offset: 'top',\n                    size: 'height'\n                },\n                'vertical': {\n                    offset: 'left',\n                    size: 'width'\n                }\n            }, REVERSE = {\n                'up': 'down',\n                'down': 'up',\n                'left': 'right',\n                'right': 'left'\n            };\n        var Popup = Widget.extend({\n            init: function (element, options) {\n                var that = this, containerPopup = element.closest('.km-modalview-wrapper'), viewport = element.closest('.km-root').children('.km-pane').first(), container = containerPopup[0] ? containerPopup : viewport, popupOptions, axis;\n                if (options.viewport) {\n                    viewport = options.viewport;\n                } else if (!viewport[0]) {\n                    viewport = window;\n                }\n                if (options.container) {\n                    container = options.container;\n                } else if (!container[0]) {\n                    container = document.body;\n                }\n                popupOptions = {\n                    viewport: viewport,\n                    copyAnchorStyles: false,\n                    autosize: true,\n                    open: function () {\n                        that.overlay.show();\n                    },\n                    activate: $.proxy(that._activate, that),\n                    deactivate: function () {\n                        that.overlay.hide();\n                        if (!that._apiCall) {\n                            that.trigger(HIDE);\n                        }\n                        that._apiCall = false;\n                    }\n                };\n                Widget.fn.init.call(that, element, options);\n                element = that.element;\n                options = that.options;\n                element.wrap(WRAPPER).addClass('km-popup').show();\n                axis = that.options.direction.match(/left|right/) ? 'horizontal' : 'vertical';\n                that.dimensions = DIMENSIONS[axis];\n                that.wrapper = element.parent().css({\n                    width: options.width,\n                    height: options.height\n                }).addClass('km-popup-wrapper km-' + options.direction).hide();\n                that.arrow = $(ARROW).prependTo(that.wrapper).hide();\n                that.overlay = $(OVERLAY).appendTo(container).hide();\n                popupOptions.appendTo = that.overlay;\n                if (options.className) {\n                    that.overlay.addClass(options.className);\n                }\n                that.popup = new kendo.ui.Popup(that.wrapper, $.extend(true, popupOptions, ANIMATION, DIRECTIONS[options.direction]));\n            },\n            options: {\n                name: 'Popup',\n                width: 240,\n                height: '',\n                direction: 'down',\n                container: null,\n                viewport: null\n            },\n            events: [HIDE],\n            show: function (target) {\n                this.popup.options.anchor = $(target);\n                this.popup.open();\n            },\n            hide: function () {\n                this._apiCall = true;\n                this.popup.close();\n            },\n            destroy: function () {\n                Widget.fn.destroy.call(this);\n                this.popup.destroy();\n                this.overlay.remove();\n            },\n            target: function () {\n                return this.popup.options.anchor;\n            },\n            _activate: function () {\n                var that = this, direction = that.options.direction, dimensions = that.dimensions, offset = dimensions.offset, popup = that.popup, anchor = popup.options.anchor, anchorOffset = $(anchor).offset(), elementOffset = $(popup.element).offset(), cssClass = popup.flipped ? REVERSE[direction] : direction, min = that.arrow[dimensions.size]() * 2, max = that.element[dimensions.size]() - that.arrow[dimensions.size](), size = $(anchor)[dimensions.size](), offsetAmount = anchorOffset[offset] - elementOffset[offset] + size / 2;\n                if (offsetAmount < min) {\n                    offsetAmount = min;\n                }\n                if (offsetAmount > max) {\n                    offsetAmount = max;\n                }\n                that.wrapper.removeClass(DIRECTION_CLASSES).addClass('km-' + cssClass);\n                that.arrow.css(offset, offsetAmount).show();\n            }\n        });\n        var PopOver = Widget.extend({\n            init: function (element, options) {\n                var that = this, popupOptions;\n                that.initialOpen = false;\n                Widget.fn.init.call(that, element, options);\n                popupOptions = $.extend({\n                    className: 'km-popover-root',\n                    hide: function () {\n                        that.trigger(CLOSE);\n                    }\n                }, this.options.popup);\n                that.popup = new Popup(that.element, popupOptions);\n                that.popup.overlay.on('move', function (e) {\n                    if (e.target == that.popup.overlay[0]) {\n                        e.preventDefault();\n                    }\n                });\n                that.pane = new ui.Pane(that.element, $.extend(this.options.pane, { $angular: this.options.$angular }));\n                kendo.notify(that, ui);\n            },\n            options: {\n                name: 'PopOver',\n                popup: {},\n                pane: {}\n            },\n            events: [\n                OPEN,\n                CLOSE\n            ],\n            open: function (target) {\n                this.popup.show(target);\n                if (!this.initialOpen) {\n                    if (!this.pane.navigateToInitial()) {\n                        this.pane.navigate('');\n                    }\n                    this.popup.popup._position();\n                    this.initialOpen = true;\n                } else {\n                    this.pane.view()._invokeNgController();\n                }\n            },\n            openFor: function (target) {\n                this.open(target);\n                this.trigger(OPEN, { target: this.popup.target() });\n            },\n            close: function () {\n                this.popup.hide();\n            },\n            destroy: function () {\n                Widget.fn.destroy.call(this);\n                this.pane.destroy();\n                this.popup.destroy();\n                kendo.destroy(this.element);\n            }\n        });\n        ui.plugin(Popup);\n        ui.plugin(PopOver);\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.mobile.shim', ['kendo.popup'], f);\n}(function () {\n    var __meta__ = {\n        id: 'mobile.shim',\n        name: 'Shim',\n        category: 'mobile',\n        description: 'Mobile Shim',\n        depends: ['popup'],\n        hidden: true\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, ui = kendo.mobile.ui, Popup = kendo.ui.Popup, SHIM = '<div class=\"km-shim\"/>', HIDE = 'hide', Widget = ui.Widget;\n        var Shim = Widget.extend({\n            init: function (element, options) {\n                var that = this, app = kendo.mobile.application, os = kendo.support.mobileOS, osname = app ? app.os.name : os ? os.name : 'ios', ioswp = osname === 'ios' || osname === 'wp' || (app ? app.os.skin : false), bb = osname === 'blackberry', align = options.align || (ioswp ? 'bottom center' : bb ? 'center right' : 'center center'), position = options.position || (ioswp ? 'bottom center' : bb ? 'center right' : 'center center'), effect = options.effect || (ioswp ? 'slideIn:up' : bb ? 'slideIn:left' : 'fade:in'), shim = $(SHIM).handler(that).hide();\n                Widget.fn.init.call(that, element, options);\n                that.shim = shim;\n                element = that.element;\n                options = that.options;\n                if (options.className) {\n                    that.shim.addClass(options.className);\n                }\n                if (!options.modal) {\n                    that.shim.on('down', '_hide');\n                }\n                (app ? app.element : $(document.body)).append(shim);\n                that.popup = new Popup(that.element, {\n                    anchor: shim,\n                    modal: true,\n                    appendTo: shim,\n                    origin: align,\n                    position: position,\n                    animation: {\n                        open: {\n                            effects: effect,\n                            duration: options.duration\n                        },\n                        close: { duration: options.duration }\n                    },\n                    close: function (e) {\n                        var prevented = false;\n                        if (!that._apiCall) {\n                            prevented = that.trigger(HIDE);\n                        }\n                        if (prevented) {\n                            e.preventDefault();\n                        }\n                        that._apiCall = false;\n                    },\n                    deactivate: function () {\n                        shim.hide();\n                    },\n                    open: function () {\n                        shim.show();\n                    }\n                });\n                kendo.notify(that);\n            },\n            events: [HIDE],\n            options: {\n                name: 'Shim',\n                modal: false,\n                align: undefined,\n                position: undefined,\n                effect: undefined,\n                duration: 200\n            },\n            show: function () {\n                this.popup.open();\n            },\n            hide: function () {\n                this._apiCall = true;\n                this.popup.close();\n            },\n            destroy: function () {\n                Widget.fn.destroy.call(this);\n                this.shim.kendoDestroy();\n                this.popup.destroy();\n                this.shim.remove();\n            },\n            _hide: function (e) {\n                if (!e || !$.contains(this.shim.children().children('.k-popup')[0], e.target)) {\n                    this.popup.close();\n                }\n            }\n        });\n        ui.plugin(Shim);\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.mobile.actionsheet', [\n        'kendo.mobile.popover',\n        'kendo.mobile.shim'\n    ], f);\n}(function () {\n    var __meta__ = {\n        id: 'mobile.actionsheet',\n        name: 'ActionSheet',\n        category: 'mobile',\n        description: 'The mobile ActionSheet widget displays a set of choices related to a task the user initiates.',\n        depends: [\n            'mobile.popover',\n            'mobile.shim'\n        ]\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, support = kendo.support, ui = kendo.mobile.ui, Shim = ui.Shim, Popup = ui.Popup, Widget = ui.Widget, OPEN = 'open', CLOSE = 'close', COMMAND = 'command', BUTTONS = 'li>a', CONTEXT_DATA = 'actionsheetContext', WRAP = '<div class=\"km-actionsheet-wrapper\" />', cancelTemplate = kendo.template('<li class=\"km-actionsheet-cancel\"><a href=\"\\\\#\">#:cancel#</a></li>');\n        var ActionSheet = Widget.extend({\n            init: function (element, options) {\n                var that = this, ShimClass, tablet, type, os = support.mobileOS;\n                Widget.fn.init.call(that, element, options);\n                options = that.options;\n                type = options.type;\n                element = that.element;\n                if (type === 'auto') {\n                    tablet = os && os.tablet;\n                } else {\n                    tablet = type === 'tablet';\n                }\n                ShimClass = tablet ? Popup : Shim;\n                if (options.cancelTemplate) {\n                    cancelTemplate = kendo.template(options.cancelTemplate);\n                }\n                element.addClass('km-actionsheet').append(cancelTemplate({ cancel: that.options.cancel })).wrap(WRAP).on('up', BUTTONS, '_click').on('click', BUTTONS, kendo.preventDefault);\n                that.view().bind('destroy', function () {\n                    that.destroy();\n                });\n                that.wrapper = element.parent().addClass(type ? ' km-actionsheet-' + type : '');\n                that.shim = new ShimClass(that.wrapper, $.extend({\n                    modal: os.ios && os.majorVersion < 7,\n                    className: 'km-actionsheet-root'\n                }, that.options.popup));\n                that._closeProxy = $.proxy(that, '_close');\n                that._shimHideProxy = $.proxy(that, '_shimHide');\n                that.shim.bind('hide', that._shimHideProxy);\n                if (tablet) {\n                    kendo.onResize(that._closeProxy);\n                }\n                kendo.notify(that, ui);\n            },\n            events: [\n                OPEN,\n                CLOSE,\n                COMMAND\n            ],\n            options: {\n                name: 'ActionSheet',\n                cancel: 'Cancel',\n                type: 'auto',\n                popup: { height: 'auto' }\n            },\n            open: function (target, context) {\n                var that = this;\n                that.target = $(target);\n                that.context = context;\n                that.shim.show(target);\n            },\n            close: function () {\n                this.context = this.target = null;\n                this.shim.hide();\n            },\n            openFor: function (target) {\n                var that = this, context = target.data(CONTEXT_DATA);\n                that.open(target, context);\n                that.trigger(OPEN, {\n                    target: target,\n                    context: context\n                });\n            },\n            destroy: function () {\n                Widget.fn.destroy.call(this);\n                kendo.unbindResize(this._closeProxy);\n                this.shim.destroy();\n            },\n            _click: function (e) {\n                if (e.isDefaultPrevented()) {\n                    return;\n                }\n                var currentTarget = $(e.currentTarget);\n                var action = currentTarget.data('action');\n                if (action) {\n                    var actionData = {\n                            target: this.target,\n                            context: this.context\n                        }, $angular = this.options.$angular;\n                    if ($angular) {\n                        this.element.injector().get('$parse')(action)($angular[0])(actionData);\n                    } else {\n                        kendo.getter(action)(window)(actionData);\n                    }\n                }\n                this.trigger(COMMAND, {\n                    target: this.target,\n                    context: this.context,\n                    currentTarget: currentTarget\n                });\n                e.preventDefault();\n                this._close();\n            },\n            _shimHide: function (e) {\n                if (!this.trigger(CLOSE)) {\n                    this.context = this.target = null;\n                } else {\n                    e.preventDefault();\n                }\n            },\n            _close: function (e) {\n                if (!this.trigger(CLOSE)) {\n                    this.close();\n                } else {\n                    e.preventDefault();\n                }\n            }\n        });\n        ui.plugin(ActionSheet);\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.progressbar', ['kendo.core'], f);\n}(function () {\n    var __meta__ = {\n        id: 'progressbar',\n        name: 'ProgressBar',\n        category: 'web',\n        description: 'The ProgressBar offers rich functionality for displaying and tracking progress',\n        depends: ['core']\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, ui = kendo.ui, Widget = ui.Widget, HORIZONTAL = 'horizontal', VERTICAL = 'vertical', DEFAULTMIN = 0, DEFAULTMAX = 100, DEFAULTVALUE = 0, DEFAULTCHUNKCOUNT = 5, KPROGRESSBAR = 'k-progressbar', KPROGRESSBARREVERSE = 'k-progressbar-reverse', KPROGRESSBARINDETERMINATE = 'k-progressbar-indeterminate', KPROGRESSBARCOMPLETE = 'k-complete', KPROGRESSWRAPPER = 'k-state-selected', KPROGRESSSTATUS = 'k-progress-status', KCOMPLETEDCHUNK = 'k-state-selected', KUPCOMINGCHUNK = 'k-state-default', KSTATEDISABLED = 'k-state-disabled', PROGRESSTYPE = {\n                VALUE: 'value',\n                PERCENT: 'percent',\n                CHUNK: 'chunk'\n            }, CHANGE = 'change', COMPLETE = 'complete', BOOLEAN = 'boolean', math = Math, extend = $.extend, proxy = $.proxy, HUNDREDPERCENT = 100, DEFAULTANIMATIONDURATION = 400, PRECISION = 3, templates = { progressStatus: '<span class=\\'k-progress-status-wrap\\'><span class=\\'k-progress-status\\'></span></span>' };\n        var ProgressBar = Widget.extend({\n            init: function (element, options) {\n                var that = this;\n                Widget.fn.init.call(this, element, options);\n                options = that.options;\n                that._progressProperty = options.orientation === HORIZONTAL ? 'width' : 'height';\n                that._fields();\n                options.value = that._validateValue(options.value);\n                that._validateType(options.type);\n                that._wrapper();\n                that._progressAnimation();\n                if (options.value !== options.min && options.value !== false) {\n                    that._updateProgress();\n                }\n            },\n            setOptions: function (options) {\n                var that = this;\n                Widget.fn.setOptions.call(that, options);\n                if (options.hasOwnProperty('reverse')) {\n                    that.wrapper.toggleClass('k-progressbar-reverse', options.reverse);\n                }\n                if (options.hasOwnProperty('enable')) {\n                    that.enable(options.enable);\n                }\n                that._progressAnimation();\n                that._validateValue();\n                that._updateProgress();\n            },\n            events: [\n                CHANGE,\n                COMPLETE\n            ],\n            options: {\n                name: 'ProgressBar',\n                orientation: HORIZONTAL,\n                reverse: false,\n                min: DEFAULTMIN,\n                max: DEFAULTMAX,\n                value: DEFAULTVALUE,\n                enable: true,\n                type: PROGRESSTYPE.VALUE,\n                chunkCount: DEFAULTCHUNKCOUNT,\n                showStatus: true,\n                animation: {}\n            },\n            _fields: function () {\n                var that = this;\n                that._isStarted = false;\n                that.progressWrapper = that.progressStatus = $();\n            },\n            _validateType: function (currentType) {\n                var isValid = false;\n                $.each(PROGRESSTYPE, function (k, type) {\n                    if (type === currentType) {\n                        isValid = true;\n                        return false;\n                    }\n                });\n                if (!isValid) {\n                    throw new Error(kendo.format('Invalid ProgressBar type \\'{0}\\'', currentType));\n                }\n            },\n            _wrapper: function () {\n                var that = this;\n                var container = that.wrapper = that.element;\n                var options = that.options;\n                var orientation = options.orientation;\n                var initialStatusValue;\n                container.addClass('k-widget ' + KPROGRESSBAR);\n                container.addClass(KPROGRESSBAR + '-' + (orientation === HORIZONTAL ? HORIZONTAL : VERTICAL));\n                if (options.enable === false) {\n                    container.addClass(KSTATEDISABLED);\n                }\n                if (options.reverse) {\n                    container.addClass(KPROGRESSBARREVERSE);\n                }\n                if (options.value === false) {\n                    container.addClass(KPROGRESSBARINDETERMINATE);\n                }\n                if (options.type === PROGRESSTYPE.CHUNK) {\n                    that._addChunkProgressWrapper();\n                } else {\n                    if (options.showStatus) {\n                        that.progressStatus = that.wrapper.prepend(templates.progressStatus).find('.' + KPROGRESSSTATUS);\n                        initialStatusValue = options.value !== false ? options.value : options.min;\n                        if (options.type === PROGRESSTYPE.VALUE) {\n                            that.progressStatus.text(initialStatusValue);\n                        } else {\n                            that.progressStatus.text(that._calculatePercentage(initialStatusValue).toFixed() + '%');\n                        }\n                    }\n                }\n            },\n            value: function (value) {\n                return this._value(value);\n            },\n            _value: function (value) {\n                var that = this;\n                var options = that.options;\n                var validated;\n                if (value === undefined) {\n                    return options.value;\n                } else {\n                    if (typeof value !== BOOLEAN) {\n                        value = that._roundValue(value);\n                        if (!isNaN(value)) {\n                            validated = that._validateValue(value);\n                            if (validated !== options.value) {\n                                that.wrapper.removeClass(KPROGRESSBARINDETERMINATE);\n                                options.value = validated;\n                                that._isStarted = true;\n                                that._updateProgress();\n                            }\n                        }\n                    } else if (!value) {\n                        that.wrapper.addClass(KPROGRESSBARINDETERMINATE);\n                        options.value = false;\n                    }\n                }\n            },\n            _roundValue: function (value) {\n                value = parseFloat(value);\n                var power = math.pow(10, PRECISION);\n                return math.floor(value * power) / power;\n            },\n            _validateValue: function (value) {\n                var that = this;\n                var options = that.options;\n                if (value !== false) {\n                    if (value <= options.min || value === true) {\n                        return options.min;\n                    } else if (value >= options.max) {\n                        return options.max;\n                    }\n                } else if (value === false) {\n                    return false;\n                }\n                if (isNaN(that._roundValue(value))) {\n                    return options.min;\n                }\n                return value;\n            },\n            _updateProgress: function () {\n                var that = this;\n                var options = that.options;\n                var percentage = that._calculatePercentage();\n                if (options.type === PROGRESSTYPE.CHUNK) {\n                    that._updateChunks(percentage);\n                    that._onProgressUpdateAlways(options.value);\n                } else {\n                    that._updateProgressWrapper(percentage);\n                }\n            },\n            _updateChunks: function (percentage) {\n                var that = this;\n                var options = that.options;\n                var chunkCount = options.chunkCount;\n                var percentagesPerChunk = parseInt(HUNDREDPERCENT / chunkCount * 100, 10) / 100;\n                var percentageParsed = parseInt(percentage * 100, 10) / 100;\n                var completedChunksCount = math.floor(percentageParsed / percentagesPerChunk);\n                var completedChunks;\n                if (options.orientation === HORIZONTAL && !options.reverse || options.orientation === VERTICAL && options.reverse) {\n                    completedChunks = that.wrapper.find('li.k-item:lt(' + completedChunksCount + ')');\n                } else {\n                    completedChunks = that.wrapper.find('li.k-item:gt(-' + (completedChunksCount + 1) + ')');\n                }\n                that.wrapper.find('.' + KCOMPLETEDCHUNK).removeClass(KCOMPLETEDCHUNK).addClass(KUPCOMINGCHUNK);\n                completedChunks.removeClass(KUPCOMINGCHUNK).addClass(KCOMPLETEDCHUNK);\n            },\n            _updateProgressWrapper: function (percentage) {\n                var that = this;\n                var options = that.options;\n                var progressWrapper = that.wrapper.find('.' + KPROGRESSWRAPPER);\n                var animationDuration = that._isStarted ? that._animation.duration : 0;\n                var animationCssOptions = {};\n                if (progressWrapper.length === 0) {\n                    that._addRegularProgressWrapper();\n                }\n                animationCssOptions[that._progressProperty] = percentage + '%';\n                that.progressWrapper.animate(animationCssOptions, {\n                    duration: animationDuration,\n                    start: proxy(that._onProgressAnimateStart, that),\n                    progress: proxy(that._onProgressAnimate, that),\n                    complete: proxy(that._onProgressAnimateComplete, that, options.value),\n                    always: proxy(that._onProgressUpdateAlways, that, options.value)\n                });\n            },\n            _onProgressAnimateStart: function () {\n                this.progressWrapper.show();\n            },\n            _onProgressAnimate: function (e) {\n                var that = this;\n                var options = that.options;\n                var progressInPercent = parseFloat(e.elem.style[that._progressProperty], 10);\n                var progressStatusWrapSize;\n                if (options.showStatus) {\n                    progressStatusWrapSize = 10000 / parseFloat(that.progressWrapper[0].style[that._progressProperty]);\n                    that.progressWrapper.find('.k-progress-status-wrap').css(that._progressProperty, progressStatusWrapSize + '%');\n                }\n                if (options.type !== PROGRESSTYPE.CHUNK && progressInPercent <= 98) {\n                    that.progressWrapper.removeClass(KPROGRESSBARCOMPLETE);\n                }\n            },\n            _onProgressAnimateComplete: function (currentValue) {\n                var that = this;\n                var options = that.options;\n                var progressWrapperSize = parseFloat(that.progressWrapper[0].style[that._progressProperty]);\n                var progressValue;\n                if (options.type !== PROGRESSTYPE.CHUNK && progressWrapperSize > 98) {\n                    that.progressWrapper.addClass(KPROGRESSBARCOMPLETE);\n                }\n                if (options.showStatus) {\n                    if (options.type === PROGRESSTYPE.VALUE) {\n                        progressValue = currentValue;\n                    } else if (options.type == PROGRESSTYPE.PERCENT) {\n                        progressValue = that._calculatePercentage(currentValue).toFixed() + '%';\n                    } else {\n                        progressValue = math.floor(that._calculatePercentage(currentValue)) + '%';\n                    }\n                    that.progressStatus.text(progressValue);\n                }\n                if (currentValue === options.min) {\n                    that.progressWrapper.hide();\n                }\n            },\n            _onProgressUpdateAlways: function (currentValue) {\n                var that = this;\n                var options = that.options;\n                if (that._isStarted) {\n                    that.trigger(CHANGE, { value: currentValue });\n                }\n                if (currentValue === options.max && that._isStarted) {\n                    that.trigger(COMPLETE, { value: options.max });\n                }\n            },\n            enable: function (enable) {\n                var that = this;\n                var options = that.options;\n                options.enable = typeof enable === 'undefined' ? true : enable;\n                that.wrapper.toggleClass(KSTATEDISABLED, !options.enable);\n            },\n            destroy: function () {\n                var that = this;\n                Widget.fn.destroy.call(that);\n            },\n            _addChunkProgressWrapper: function () {\n                var that = this;\n                var options = that.options;\n                var container = that.wrapper;\n                var chunkSize = HUNDREDPERCENT / options.chunkCount;\n                var html = '';\n                if (options.chunkCount <= 1) {\n                    options.chunkCount = 1;\n                }\n                html += '<ul class=\\'k-reset\\'>';\n                for (var i = options.chunkCount - 1; i >= 0; i--) {\n                    html += '<li class=\\'k-item k-state-default\\'></li>';\n                }\n                html += '</ul>';\n                container.append(html).find('.k-item').css(that._progressProperty, chunkSize + '%').first().addClass('k-first').end().last().addClass('k-last');\n                that._normalizeChunkSize();\n            },\n            _normalizeChunkSize: function () {\n                var that = this;\n                var options = that.options;\n                var lastChunk = that.wrapper.find('.k-item:last');\n                var currentSize = parseFloat(lastChunk[0].style[that._progressProperty]);\n                var difference = HUNDREDPERCENT - options.chunkCount * currentSize;\n                if (difference > 0) {\n                    lastChunk.css(that._progressProperty, currentSize + difference + '%');\n                }\n            },\n            _addRegularProgressWrapper: function () {\n                var that = this;\n                that.progressWrapper = $('<div class=\\'' + KPROGRESSWRAPPER + '\\'></div>').appendTo(that.wrapper);\n                if (that.options.showStatus) {\n                    that.progressWrapper.append(templates.progressStatus);\n                    that.progressStatus = that.wrapper.find('.' + KPROGRESSSTATUS);\n                }\n            },\n            _calculateChunkSize: function () {\n                var that = this;\n                var chunkCount = that.options.chunkCount;\n                var chunkContainer = that.wrapper.find('ul.k-reset');\n                return (parseInt(chunkContainer.css(that._progressProperty), 10) - (chunkCount - 1)) / chunkCount;\n            },\n            _calculatePercentage: function (currentValue) {\n                var that = this;\n                var options = that.options;\n                var value = currentValue !== undefined ? currentValue : options.value;\n                var min = options.min;\n                var max = options.max;\n                that._onePercent = math.abs((max - min) / 100);\n                return math.abs((value - min) / that._onePercent);\n            },\n            _progressAnimation: function () {\n                var that = this;\n                var options = that.options;\n                var animation = options.animation;\n                if (animation === false) {\n                    that._animation = { duration: 0 };\n                } else {\n                    that._animation = extend({ duration: DEFAULTANIMATIONDURATION }, options.animation);\n                }\n            }\n        });\n        kendo.ui.plugin(ProgressBar);\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('pdf/core', [\n        'kendo.core',\n        'kendo.color',\n        'kendo.drawing'\n    ], f);\n}(function () {\n    (function (kendo) {\n        window.kendo.pdf = window.kendo.pdf || {};\n        var support = kendo.support;\n        var supportBrowser = support.browser;\n        var drawing = kendo.drawing;\n        var util = drawing.util;\n        var kendoGeometry = kendo.geometry;\n        var HAS_TYPED_ARRAYS$1 = typeof Uint8Array !== 'undefined';\n        var BASE64 = function () {\n            var keyStr = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';\n            return {\n                decode: function (str) {\n                    var input = str.replace(/[^A-Za-z0-9\\+\\/\\=]/g, ''), i = 0, n = input.length, output = [];\n                    while (i < n) {\n                        var enc1 = keyStr.indexOf(input.charAt(i++));\n                        var enc2 = keyStr.indexOf(input.charAt(i++));\n                        var enc3 = keyStr.indexOf(input.charAt(i++));\n                        var enc4 = keyStr.indexOf(input.charAt(i++));\n                        var chr1 = enc1 << 2 | enc2 >>> 4;\n                        var chr2 = (enc2 & 15) << 4 | enc3 >>> 2;\n                        var chr3 = (enc3 & 3) << 6 | enc4;\n                        output.push(chr1);\n                        if (enc3 != 64) {\n                            output.push(chr2);\n                        }\n                        if (enc4 != 64) {\n                            output.push(chr3);\n                        }\n                    }\n                    return output;\n                },\n                encode: function (bytes) {\n                    var i = 0, n = bytes.length;\n                    var output = '';\n                    while (i < n) {\n                        var chr1 = bytes[i++];\n                        var chr2 = bytes[i++];\n                        var chr3 = bytes[i++];\n                        var enc1 = chr1 >>> 2;\n                        var enc2 = (chr1 & 3) << 4 | chr2 >>> 4;\n                        var enc3 = (chr2 & 15) << 2 | chr3 >>> 6;\n                        var enc4 = chr3 & 63;\n                        if (i - n == 2) {\n                            enc3 = enc4 = 64;\n                        } else if (i - n == 1) {\n                            enc4 = 64;\n                        }\n                        output += keyStr.charAt(enc1) + keyStr.charAt(enc2) + keyStr.charAt(enc3) + keyStr.charAt(enc4);\n                    }\n                    return output;\n                }\n            };\n        }();\n        function BinaryStream(data) {\n            var offset = 0, length = 0;\n            if (data == null) {\n                data = HAS_TYPED_ARRAYS$1 ? new Uint8Array(256) : [];\n            } else {\n                length = data.length;\n            }\n            var ensure = HAS_TYPED_ARRAYS$1 ? function (len) {\n                if (len >= data.length) {\n                    var tmp = new Uint8Array(Math.max(len + 256, data.length * 2));\n                    tmp.set(data, 0);\n                    data = tmp;\n                }\n            } : function () {\n            };\n            var get = HAS_TYPED_ARRAYS$1 ? function () {\n                return new Uint8Array(data.buffer, 0, length);\n            } : function () {\n                return data;\n            };\n            var write = HAS_TYPED_ARRAYS$1 ? function (bytes) {\n                if (typeof bytes == 'string') {\n                    return writeString(bytes);\n                }\n                var len = bytes.length;\n                ensure(offset + len);\n                data.set(bytes, offset);\n                offset += len;\n                if (offset > length) {\n                    length = offset;\n                }\n            } : function (bytes) {\n                if (typeof bytes == 'string') {\n                    return writeString(bytes);\n                }\n                for (var i = 0; i < bytes.length; ++i) {\n                    writeByte(bytes[i]);\n                }\n            };\n            var slice = HAS_TYPED_ARRAYS$1 ? function (start, length) {\n                if (data.buffer.slice) {\n                    return new Uint8Array(data.buffer.slice(start, start + length));\n                } else {\n                    var x = new Uint8Array(length);\n                    x.set(new Uint8Array(data.buffer, start, length));\n                    return x;\n                }\n            } : function (start, length) {\n                return data.slice(start, start + length);\n            };\n            function eof() {\n                return offset >= length;\n            }\n            function readByte() {\n                return offset < length ? data[offset++] : 0;\n            }\n            function writeByte(b) {\n                ensure(offset);\n                data[offset++] = b & 255;\n                if (offset > length) {\n                    length = offset;\n                }\n            }\n            function readShort() {\n                return readByte() << 8 | readByte();\n            }\n            function writeShort(w) {\n                writeByte(w >> 8);\n                writeByte(w);\n            }\n            function readShort_() {\n                var w = readShort();\n                return w >= 32768 ? w - 65536 : w;\n            }\n            function writeShort_(w) {\n                writeShort(w < 0 ? w + 65536 : w);\n            }\n            function readLong() {\n                return readShort() * 65536 + readShort();\n            }\n            function writeLong(w) {\n                writeShort(w >>> 16 & 65535);\n                writeShort(w & 65535);\n            }\n            function readLong_() {\n                var w = readLong();\n                return w >= 2147483648 ? w - 4294967296 : w;\n            }\n            function writeLong_(w) {\n                writeLong(w < 0 ? w + 4294967296 : w);\n            }\n            function readFixed() {\n                return readLong() / 65536;\n            }\n            function writeFixed(f) {\n                writeLong(Math.round(f * 65536));\n            }\n            function readFixed_() {\n                return readLong_() / 65536;\n            }\n            function writeFixed_(f) {\n                writeLong_(Math.round(f * 65536));\n            }\n            function read(len) {\n                return times(len, readByte);\n            }\n            function readString(len) {\n                return String.fromCharCode.apply(String, read(len));\n            }\n            function writeString(str) {\n                for (var i = 0; i < str.length; ++i) {\n                    writeByte(str.charCodeAt(i));\n                }\n            }\n            function times(n, reader) {\n                for (var ret = new Array(n), i = 0; i < n; ++i) {\n                    ret[i] = reader();\n                }\n                return ret;\n            }\n            var stream = {\n                eof: eof,\n                readByte: readByte,\n                writeByte: writeByte,\n                readShort: readShort,\n                writeShort: writeShort,\n                readLong: readLong,\n                writeLong: writeLong,\n                readFixed: readFixed,\n                writeFixed: writeFixed,\n                readShort_: readShort_,\n                writeShort_: writeShort_,\n                readLong_: readLong_,\n                writeLong_: writeLong_,\n                readFixed_: readFixed_,\n                writeFixed_: writeFixed_,\n                read: read,\n                write: write,\n                readString: readString,\n                writeString: writeString,\n                times: times,\n                get: get,\n                slice: slice,\n                offset: function (pos) {\n                    if (pos != null) {\n                        offset = pos;\n                        return stream;\n                    }\n                    return offset;\n                },\n                skip: function (nbytes) {\n                    offset += nbytes;\n                },\n                toString: function () {\n                    throw new Error('FIX CALLER.  BinaryStream is no longer convertible to string!');\n                },\n                length: function () {\n                    return length;\n                },\n                saveExcursion: function (f) {\n                    var pos = offset;\n                    try {\n                        return f();\n                    } finally {\n                        offset = pos;\n                    }\n                },\n                writeBase64: function (base64) {\n                    if (window.atob) {\n                        writeString(window.atob(base64));\n                    } else {\n                        write(BASE64.decode(base64));\n                    }\n                },\n                base64: function () {\n                    return BASE64.encode(get());\n                }\n            };\n            return stream;\n        }\n        function ucs2decode(string) {\n            var output = [], counter = 0, length = string.length, value, extra;\n            while (counter < length) {\n                value = string.charCodeAt(counter++);\n                if (value >= 55296 && value <= 56319 && counter < length) {\n                    extra = string.charCodeAt(counter++);\n                    if ((extra & 64512) == 56320) {\n                        output.push(((value & 1023) << 10) + (extra & 1023) + 65536);\n                    } else {\n                        output.push(value);\n                        counter--;\n                    }\n                } else {\n                    output.push(value);\n                }\n            }\n            return output;\n        }\n        function ucs2encode(array) {\n            return array.map(function (value) {\n                var output = '';\n                if (value > 65535) {\n                    value -= 65536;\n                    output += String.fromCharCode(value >>> 10 & 1023 | 55296);\n                    value = 56320 | value & 1023;\n                }\n                output += String.fromCharCode(value);\n                return output;\n            }).join('');\n        }\n        function hasOwnProperty$1(obj, key) {\n            return Object.prototype.hasOwnProperty.call(obj, key);\n        }\n        function sortedKeys(obj) {\n            return Object.keys(obj).sort(function (a, b) {\n                return a - b;\n            }).map(parseFloat);\n        }\n        function Directory(data) {\n            this.raw = data;\n            this.scalerType = data.readLong();\n            this.tableCount = data.readShort();\n            this.searchRange = data.readShort();\n            this.entrySelector = data.readShort();\n            this.rangeShift = data.readShort();\n            var tables = this.tables = {};\n            for (var i = 0; i < this.tableCount; ++i) {\n                var entry = {\n                    tag: data.readString(4),\n                    checksum: data.readLong(),\n                    offset: data.readLong(),\n                    length: data.readLong()\n                };\n                tables[entry.tag] = entry;\n            }\n        }\n        Directory.prototype = {\n            readTable: function (name, Ctor) {\n                var def = this.tables[name];\n                if (!def) {\n                    throw new Error('Table ' + name + ' not found in directory');\n                }\n                return this[name] = def.table = new Ctor(this, def);\n            },\n            render: function (tables) {\n                var this$1 = this;\n                var tableCount = Object.keys(tables).length;\n                var maxpow2 = Math.pow(2, Math.floor(Math.log(tableCount) / Math.LN2));\n                var searchRange = maxpow2 * 16;\n                var entrySelector = Math.floor(Math.log(maxpow2) / Math.LN2);\n                var rangeShift = tableCount * 16 - searchRange;\n                var out = BinaryStream();\n                out.writeLong(this.scalerType);\n                out.writeShort(tableCount);\n                out.writeShort(searchRange);\n                out.writeShort(entrySelector);\n                out.writeShort(rangeShift);\n                var directoryLength = tableCount * 16;\n                var offset = out.offset() + directoryLength;\n                var headOffset = null;\n                var tableData = BinaryStream();\n                for (var tag in tables) {\n                    if (hasOwnProperty$1(tables, tag)) {\n                        var table = tables[tag];\n                        out.writeString(tag);\n                        out.writeLong(this$1.checksum(table));\n                        out.writeLong(offset);\n                        out.writeLong(table.length);\n                        tableData.write(table);\n                        if (tag == 'head') {\n                            headOffset = offset;\n                        }\n                        offset += table.length;\n                        while (offset % 4) {\n                            tableData.writeByte(0);\n                            offset++;\n                        }\n                    }\n                }\n                out.write(tableData.get());\n                var sum = this.checksum(out.get());\n                var adjustment = 2981146554 - sum;\n                out.offset(headOffset + 8);\n                out.writeLong(adjustment);\n                return out.get();\n            },\n            checksum: function (data) {\n                data = BinaryStream(data);\n                var sum = 0;\n                while (!data.eof()) {\n                    sum += data.readLong();\n                }\n                return sum & 4294967295;\n            }\n        };\n        function deftable(methods) {\n            function Ctor(file, def) {\n                this.definition = def;\n                this.length = def.length;\n                this.offset = def.offset;\n                this.file = file;\n                this.rawData = file.raw;\n                this.parse(file.raw);\n            }\n            Ctor.prototype.raw = function () {\n                return this.rawData.slice(this.offset, this.length);\n            };\n            for (var i in methods) {\n                if (hasOwnProperty$1(methods, i)) {\n                    Ctor[i] = Ctor.prototype[i] = methods[i];\n                }\n            }\n            return Ctor;\n        }\n        var HeadTable = deftable({\n            parse: function (data) {\n                data.offset(this.offset);\n                this.version = data.readLong();\n                this.revision = data.readLong();\n                this.checkSumAdjustment = data.readLong();\n                this.magicNumber = data.readLong();\n                this.flags = data.readShort();\n                this.unitsPerEm = data.readShort();\n                this.created = data.read(8);\n                this.modified = data.read(8);\n                this.xMin = data.readShort_();\n                this.yMin = data.readShort_();\n                this.xMax = data.readShort_();\n                this.yMax = data.readShort_();\n                this.macStyle = data.readShort();\n                this.lowestRecPPEM = data.readShort();\n                this.fontDirectionHint = data.readShort_();\n                this.indexToLocFormat = data.readShort_();\n                this.glyphDataFormat = data.readShort_();\n            },\n            render: function (indexToLocFormat) {\n                var out = BinaryStream();\n                out.writeLong(this.version);\n                out.writeLong(this.revision);\n                out.writeLong(0);\n                out.writeLong(this.magicNumber);\n                out.writeShort(this.flags);\n                out.writeShort(this.unitsPerEm);\n                out.write(this.created);\n                out.write(this.modified);\n                out.writeShort_(this.xMin);\n                out.writeShort_(this.yMin);\n                out.writeShort_(this.xMax);\n                out.writeShort_(this.yMax);\n                out.writeShort(this.macStyle);\n                out.writeShort(this.lowestRecPPEM);\n                out.writeShort_(this.fontDirectionHint);\n                out.writeShort_(indexToLocFormat);\n                out.writeShort_(this.glyphDataFormat);\n                return out.get();\n            }\n        });\n        var LocaTable = deftable({\n            parse: function (data) {\n                data.offset(this.offset);\n                var format = this.file.head.indexToLocFormat;\n                if (format === 0) {\n                    this.offsets = data.times(this.length / 2, function () {\n                        return 2 * data.readShort();\n                    });\n                } else {\n                    this.offsets = data.times(this.length / 4, data.readLong);\n                }\n            },\n            offsetOf: function (id) {\n                return this.offsets[id];\n            },\n            lengthOf: function (id) {\n                return this.offsets[id + 1] - this.offsets[id];\n            },\n            render: function (offsets) {\n                var out = BinaryStream();\n                var needsLongFormat = offsets[offsets.length - 1] > 65535;\n                for (var i = 0; i < offsets.length; ++i) {\n                    if (needsLongFormat) {\n                        out.writeLong(offsets[i]);\n                    } else {\n                        out.writeShort(offsets[i] / 2);\n                    }\n                }\n                return {\n                    format: needsLongFormat ? 1 : 0,\n                    table: out.get()\n                };\n            }\n        });\n        var HheaTable = deftable({\n            parse: function (data) {\n                data.offset(this.offset);\n                this.version = data.readLong();\n                this.ascent = data.readShort_();\n                this.descent = data.readShort_();\n                this.lineGap = data.readShort_();\n                this.advanceWidthMax = data.readShort();\n                this.minLeftSideBearing = data.readShort_();\n                this.minRightSideBearing = data.readShort_();\n                this.xMaxExtent = data.readShort_();\n                this.caretSlopeRise = data.readShort_();\n                this.caretSlopeRun = data.readShort_();\n                this.caretOffset = data.readShort_();\n                data.skip(4 * 2);\n                this.metricDataFormat = data.readShort_();\n                this.numOfLongHorMetrics = data.readShort();\n            },\n            render: function (ids) {\n                var out = BinaryStream();\n                out.writeLong(this.version);\n                out.writeShort_(this.ascent);\n                out.writeShort_(this.descent);\n                out.writeShort_(this.lineGap);\n                out.writeShort(this.advanceWidthMax);\n                out.writeShort_(this.minLeftSideBearing);\n                out.writeShort_(this.minRightSideBearing);\n                out.writeShort_(this.xMaxExtent);\n                out.writeShort_(this.caretSlopeRise);\n                out.writeShort_(this.caretSlopeRun);\n                out.writeShort_(this.caretOffset);\n                out.write([\n                    0,\n                    0,\n                    0,\n                    0,\n                    0,\n                    0,\n                    0,\n                    0\n                ]);\n                out.writeShort_(this.metricDataFormat);\n                out.writeShort(ids.length);\n                return out.get();\n            }\n        });\n        var MaxpTable = deftable({\n            parse: function (data) {\n                data.offset(this.offset);\n                this.version = data.readLong();\n                this.numGlyphs = data.readShort();\n                this.maxPoints = data.readShort();\n                this.maxContours = data.readShort();\n                this.maxComponentPoints = data.readShort();\n                this.maxComponentContours = data.readShort();\n                this.maxZones = data.readShort();\n                this.maxTwilightPoints = data.readShort();\n                this.maxStorage = data.readShort();\n                this.maxFunctionDefs = data.readShort();\n                this.maxInstructionDefs = data.readShort();\n                this.maxStackElements = data.readShort();\n                this.maxSizeOfInstructions = data.readShort();\n                this.maxComponentElements = data.readShort();\n                this.maxComponentDepth = data.readShort();\n            },\n            render: function (glyphIds) {\n                var out = BinaryStream();\n                out.writeLong(this.version);\n                out.writeShort(glyphIds.length);\n                out.writeShort(this.maxPoints);\n                out.writeShort(this.maxContours);\n                out.writeShort(this.maxComponentPoints);\n                out.writeShort(this.maxComponentContours);\n                out.writeShort(this.maxZones);\n                out.writeShort(this.maxTwilightPoints);\n                out.writeShort(this.maxStorage);\n                out.writeShort(this.maxFunctionDefs);\n                out.writeShort(this.maxInstructionDefs);\n                out.writeShort(this.maxStackElements);\n                out.writeShort(this.maxSizeOfInstructions);\n                out.writeShort(this.maxComponentElements);\n                out.writeShort(this.maxComponentDepth);\n                return out.get();\n            }\n        });\n        var HmtxTable = deftable({\n            parse: function (data) {\n                data.offset(this.offset);\n                var dir = this.file, hhea = dir.hhea;\n                this.metrics = data.times(hhea.numOfLongHorMetrics, function () {\n                    return {\n                        advance: data.readShort(),\n                        lsb: data.readShort_()\n                    };\n                });\n                var lsbCount = dir.maxp.numGlyphs - dir.hhea.numOfLongHorMetrics;\n                this.leftSideBearings = data.times(lsbCount, data.readShort_);\n            },\n            forGlyph: function (id) {\n                var metrics = this.metrics;\n                var n = metrics.length;\n                if (id < n) {\n                    return metrics[id];\n                }\n                return {\n                    advance: metrics[n - 1].advance,\n                    lsb: this.leftSideBearings[id - n]\n                };\n            },\n            render: function (glyphIds) {\n                var this$1 = this;\n                var out = BinaryStream();\n                for (var i = 0; i < glyphIds.length; ++i) {\n                    var m = this$1.forGlyph(glyphIds[i]);\n                    out.writeShort(m.advance);\n                    out.writeShort_(m.lsb);\n                }\n                return out.get();\n            }\n        });\n        var GlyfTable = function () {\n            function SimpleGlyph(raw) {\n                this.raw = raw;\n            }\n            SimpleGlyph.prototype = {\n                compound: false,\n                render: function () {\n                    return this.raw.get();\n                }\n            };\n            var ARG_1_AND_2_ARE_WORDS = 1;\n            var WE_HAVE_A_SCALE = 8;\n            var MORE_COMPONENTS = 32;\n            var WE_HAVE_AN_X_AND_Y_SCALE = 64;\n            var WE_HAVE_A_TWO_BY_TWO = 128;\n            function CompoundGlyph(data) {\n                this.raw = data;\n                var ids = this.glyphIds = [];\n                var offsets = this.idOffsets = [];\n                while (true) {\n                    var flags = data.readShort();\n                    offsets.push(data.offset());\n                    ids.push(data.readShort());\n                    if (!(flags & MORE_COMPONENTS)) {\n                        break;\n                    }\n                    data.skip(flags & ARG_1_AND_2_ARE_WORDS ? 4 : 2);\n                    if (flags & WE_HAVE_A_TWO_BY_TWO) {\n                        data.skip(8);\n                    } else if (flags & WE_HAVE_AN_X_AND_Y_SCALE) {\n                        data.skip(4);\n                    } else if (flags & WE_HAVE_A_SCALE) {\n                        data.skip(2);\n                    }\n                }\n            }\n            CompoundGlyph.prototype = {\n                compound: true,\n                render: function (old2new) {\n                    var this$1 = this;\n                    var out = BinaryStream(this.raw.get());\n                    for (var i = 0; i < this.glyphIds.length; ++i) {\n                        var id = this$1.glyphIds[i];\n                        out.offset(this$1.idOffsets[i]);\n                        out.writeShort(old2new[id]);\n                    }\n                    return out.get();\n                }\n            };\n            return deftable({\n                parse: function () {\n                    this.cache = {};\n                },\n                glyphFor: function (id) {\n                    var cache = this.cache;\n                    if (hasOwnProperty$1(cache, id)) {\n                        return cache[id];\n                    }\n                    var loca = this.file.loca;\n                    var length = loca.lengthOf(id);\n                    if (length === 0) {\n                        return cache[id] = null;\n                    }\n                    var data = this.rawData;\n                    var offset = this.offset + loca.offsetOf(id);\n                    var raw = BinaryStream(data.slice(offset, length));\n                    var numberOfContours = raw.readShort_();\n                    var xMin = raw.readShort_();\n                    var yMin = raw.readShort_();\n                    var xMax = raw.readShort_();\n                    var yMax = raw.readShort_();\n                    var glyph = cache[id] = numberOfContours == -1 ? new CompoundGlyph(raw) : new SimpleGlyph(raw);\n                    glyph.numberOfContours = numberOfContours;\n                    glyph.xMin = xMin;\n                    glyph.yMin = yMin;\n                    glyph.xMax = xMax;\n                    glyph.yMax = yMax;\n                    return glyph;\n                },\n                render: function (glyphs, oldIds, old2new) {\n                    var out = BinaryStream(), offsets = [];\n                    for (var i = 0; i < oldIds.length; ++i) {\n                        var id = oldIds[i];\n                        var glyph = glyphs[id];\n                        offsets.push(out.offset());\n                        if (glyph) {\n                            out.write(glyph.render(old2new));\n                        }\n                    }\n                    offsets.push(out.offset());\n                    return {\n                        table: out.get(),\n                        offsets: offsets\n                    };\n                }\n            });\n        }();\n        var NameTable = function () {\n            function NameEntry(text, entry) {\n                this.text = text;\n                this.length = text.length;\n                this.platformID = entry.platformID;\n                this.platformSpecificID = entry.platformSpecificID;\n                this.languageID = entry.languageID;\n                this.nameID = entry.nameID;\n            }\n            return deftable({\n                parse: function (data) {\n                    data.offset(this.offset);\n                    data.readShort();\n                    var count = data.readShort();\n                    var stringOffset = this.offset + data.readShort();\n                    var nameRecords = data.times(count, function () {\n                        return {\n                            platformID: data.readShort(),\n                            platformSpecificID: data.readShort(),\n                            languageID: data.readShort(),\n                            nameID: data.readShort(),\n                            length: data.readShort(),\n                            offset: data.readShort() + stringOffset\n                        };\n                    });\n                    var strings = this.strings = {};\n                    for (var i = 0; i < nameRecords.length; ++i) {\n                        var rec = nameRecords[i];\n                        data.offset(rec.offset);\n                        var text = data.readString(rec.length);\n                        if (!strings[rec.nameID]) {\n                            strings[rec.nameID] = [];\n                        }\n                        strings[rec.nameID].push(new NameEntry(text, rec));\n                    }\n                    this.postscriptEntry = strings[6][0];\n                    this.postscriptName = this.postscriptEntry.text.replace(/[^\\x20-\\x7F]/g, '');\n                },\n                render: function (psName) {\n                    var this$1 = this;\n                    var strings = this.strings;\n                    var strCount = 0;\n                    for (var i in strings) {\n                        if (hasOwnProperty$1(strings, i)) {\n                            strCount += strings[i].length;\n                        }\n                    }\n                    var out = BinaryStream();\n                    var strTable = BinaryStream();\n                    out.writeShort(0);\n                    out.writeShort(strCount);\n                    out.writeShort(6 + 12 * strCount);\n                    for (i in strings) {\n                        if (hasOwnProperty$1(strings, i)) {\n                            var list = i == 6 ? [new NameEntry(psName, this$1.postscriptEntry)] : strings[i];\n                            for (var j = 0; j < list.length; ++j) {\n                                var str = list[j];\n                                out.writeShort(str.platformID);\n                                out.writeShort(str.platformSpecificID);\n                                out.writeShort(str.languageID);\n                                out.writeShort(str.nameID);\n                                out.writeShort(str.length);\n                                out.writeShort(strTable.offset());\n                                strTable.writeString(str.text);\n                            }\n                        }\n                    }\n                    out.write(strTable.get());\n                    return out.get();\n                }\n            });\n        }();\n        var PostTable = function () {\n            var POSTSCRIPT_GLYPHS = '.notdef .null nonmarkingreturn space exclam quotedbl numbersign dollar percent ampersand quotesingle parenleft parenright asterisk plus comma hyphen period slash zero one two three four five six seven eight nine colon semicolon less equal greater question at A B C D E F G H I J K L M N O P Q R S T U V W X Y Z bracketleft backslash bracketright asciicircum underscore grave a b c d e f g h i j k l m n o p q r s t u v w x y z braceleft bar braceright asciitilde Adieresis Aring Ccedilla Eacute Ntilde Odieresis Udieresis aacute agrave acircumflex adieresis atilde aring ccedilla eacute egrave ecircumflex edieresis iacute igrave icircumflex idieresis ntilde oacute ograve ocircumflex odieresis otilde uacute ugrave ucircumflex udieresis dagger degree cent sterling section bullet paragraph germandbls registered copyright trademark acute dieresis notequal AE Oslash infinity plusminus lessequal greaterequal yen mu partialdiff summation product pi integral ordfeminine ordmasculine Omega ae oslash questiondown exclamdown logicalnot radical florin approxequal Delta guillemotleft guillemotright ellipsis nonbreakingspace Agrave Atilde Otilde OE oe endash emdash quotedblleft quotedblright quoteleft quoteright divide lozenge ydieresis Ydieresis fraction currency guilsinglleft guilsinglright fi fl daggerdbl periodcentered quotesinglbase quotedblbase perthousand Acircumflex Ecircumflex Aacute Edieresis Egrave Iacute Icircumflex Idieresis Igrave Oacute Ocircumflex apple Ograve Uacute Ucircumflex Ugrave dotlessi circumflex tilde macron breve dotaccent ring cedilla hungarumlaut ogonek caron Lslash lslash Scaron scaron Zcaron zcaron brokenbar Eth eth Yacute yacute Thorn thorn minus multiply onesuperior twosuperior threesuperior onehalf onequarter threequarters franc Gbreve gbreve Idotaccent Scedilla scedilla Cacute cacute Ccaron ccaron dcroat'.split(/\\s+/g);\n            return deftable({\n                parse: function (data) {\n                    var this$1 = this;\n                    data.offset(this.offset);\n                    this.format = data.readLong();\n                    this.italicAngle = data.readFixed_();\n                    this.underlinePosition = data.readShort_();\n                    this.underlineThickness = data.readShort_();\n                    this.isFixedPitch = data.readLong();\n                    this.minMemType42 = data.readLong();\n                    this.maxMemType42 = data.readLong();\n                    this.minMemType1 = data.readLong();\n                    this.maxMemType1 = data.readLong();\n                    var numberOfGlyphs;\n                    switch (this.format) {\n                    case 65536:\n                    case 196608:\n                        break;\n                    case 131072:\n                        numberOfGlyphs = data.readShort();\n                        this.glyphNameIndex = data.times(numberOfGlyphs, data.readShort);\n                        this.names = [];\n                        var limit = this.offset + this.length;\n                        while (data.offset() < limit) {\n                            this$1.names.push(data.readString(data.readByte()));\n                        }\n                        break;\n                    case 151552:\n                        numberOfGlyphs = data.readShort();\n                        this.offsets = data.read(numberOfGlyphs);\n                        break;\n                    case 262144:\n                        this.map = data.times(this.file.maxp.numGlyphs, data.readShort);\n                        break;\n                    }\n                },\n                glyphFor: function (code) {\n                    switch (this.format) {\n                    case 65536:\n                        return POSTSCRIPT_GLYPHS[code] || '.notdef';\n                    case 131072:\n                        var index = this.glyphNameIndex[code];\n                        if (index < POSTSCRIPT_GLYPHS.length) {\n                            return POSTSCRIPT_GLYPHS[index];\n                        }\n                        return this.names[index - POSTSCRIPT_GLYPHS.length] || '.notdef';\n                    case 151552:\n                    case 196608:\n                        return '.notdef';\n                    case 262144:\n                        return this.map[code] || 65535;\n                    }\n                },\n                render: function (mapping) {\n                    var this$1 = this;\n                    if (this.format == 196608) {\n                        return this.raw();\n                    }\n                    var out = BinaryStream(this.rawData.slice(this.offset, 32));\n                    out.writeLong(131072);\n                    out.offset(32);\n                    var indexes = [];\n                    var strings = [];\n                    for (var i = 0; i < mapping.length; ++i) {\n                        var id = mapping[i];\n                        var post = this$1.glyphFor(id);\n                        var index = POSTSCRIPT_GLYPHS.indexOf(post);\n                        if (index >= 0) {\n                            indexes.push(index);\n                        } else {\n                            indexes.push(POSTSCRIPT_GLYPHS.length + strings.length);\n                            strings.push(post);\n                        }\n                    }\n                    out.writeShort(mapping.length);\n                    for (i = 0; i < indexes.length; ++i) {\n                        out.writeShort(indexes[i]);\n                    }\n                    for (i = 0; i < strings.length; ++i) {\n                        out.writeByte(strings[i].length);\n                        out.writeString(strings[i]);\n                    }\n                    return out.get();\n                }\n            });\n        }();\n        var CmapTable = function () {\n            function CmapEntry(data, offset, codeMap) {\n                var self = this;\n                self.platformID = data.readShort();\n                self.platformSpecificID = data.readShort();\n                self.offset = offset + data.readLong();\n                data.saveExcursion(function () {\n                    var code;\n                    data.offset(self.offset);\n                    self.format = data.readShort();\n                    switch (self.format) {\n                    case 0:\n                        self.length = data.readShort();\n                        self.language = data.readShort();\n                        for (var i = 0; i < 256; ++i) {\n                            codeMap[i] = data.readByte();\n                        }\n                        break;\n                    case 4:\n                        self.length = data.readShort();\n                        self.language = data.readShort();\n                        var segCount = data.readShort() / 2;\n                        data.skip(6);\n                        var endCode = data.times(segCount, data.readShort);\n                        data.skip(2);\n                        var startCode = data.times(segCount, data.readShort);\n                        var idDelta = data.times(segCount, data.readShort_);\n                        var idRangeOffset = data.times(segCount, data.readShort);\n                        var count = (self.length + self.offset - data.offset()) / 2;\n                        var glyphIds = data.times(count, data.readShort);\n                        for (i = 0; i < segCount; ++i) {\n                            var start = startCode[i], end = endCode[i];\n                            for (code = start; code <= end; ++code) {\n                                var glyphId;\n                                if (idRangeOffset[i] === 0) {\n                                    glyphId = code + idDelta[i];\n                                } else {\n                                    var index = idRangeOffset[i] / 2 - (segCount - i) + (code - start);\n                                    glyphId = glyphIds[index] || 0;\n                                    if (glyphId !== 0) {\n                                        glyphId += idDelta[i];\n                                    }\n                                }\n                                codeMap[code] = glyphId & 65535;\n                            }\n                        }\n                        break;\n                    case 6:\n                        self.length = data.readShort();\n                        self.language = data.readShort();\n                        code = data.readShort();\n                        var length = data.readShort();\n                        while (length-- > 0) {\n                            codeMap[code++] = data.readShort();\n                        }\n                        break;\n                    case 12:\n                        data.readShort();\n                        self.length = data.readLong();\n                        self.language = data.readLong();\n                        var ngroups = data.readLong();\n                        while (ngroups-- > 0) {\n                            code = data.readLong();\n                            var endCharCode = data.readLong();\n                            var glyphCode = data.readLong();\n                            while (code <= endCharCode) {\n                                codeMap[code++] = glyphCode++;\n                            }\n                        }\n                        break;\n                    default:\n                        if (window.console) {\n                            window.console.error('Unhandled CMAP format: ' + self.format);\n                        }\n                    }\n                });\n            }\n            function renderCharmap(ncid2ogid, ogid2ngid) {\n                var codes = sortedKeys(ncid2ogid);\n                var startCodes = [];\n                var endCodes = [];\n                var last = null;\n                var diff = null;\n                function new_gid(charcode) {\n                    return ogid2ngid[ncid2ogid[charcode]];\n                }\n                for (var i = 0; i < codes.length; ++i) {\n                    var code = codes[i];\n                    var gid = new_gid(code);\n                    var delta = gid - code;\n                    if (last == null || delta !== diff) {\n                        if (last) {\n                            endCodes.push(last);\n                        }\n                        startCodes.push(code);\n                        diff = delta;\n                    }\n                    last = code;\n                }\n                if (last) {\n                    endCodes.push(last);\n                }\n                endCodes.push(65535);\n                startCodes.push(65535);\n                var segCount = startCodes.length;\n                var segCountX2 = segCount * 2;\n                var searchRange = 2 * Math.pow(2, Math.floor(Math.log(segCount) / Math.LN2));\n                var entrySelector = Math.log(searchRange / 2) / Math.LN2;\n                var rangeShift = segCountX2 - searchRange;\n                var deltas = [];\n                var rangeOffsets = [];\n                var glyphIds = [];\n                for (i = 0; i < segCount; ++i) {\n                    var startCode = startCodes[i];\n                    var endCode = endCodes[i];\n                    if (startCode == 65535) {\n                        deltas.push(0);\n                        rangeOffsets.push(0);\n                        break;\n                    }\n                    var startGlyph = new_gid(startCode);\n                    if (startCode - startGlyph >= 32768) {\n                        deltas.push(0);\n                        rangeOffsets.push(2 * (glyphIds.length + segCount - i));\n                        for (var j = startCode; j <= endCode; ++j) {\n                            glyphIds.push(new_gid(j));\n                        }\n                    } else {\n                        deltas.push(startGlyph - startCode);\n                        rangeOffsets.push(0);\n                    }\n                }\n                var out = BinaryStream();\n                out.writeShort(3);\n                out.writeShort(1);\n                out.writeLong(12);\n                out.writeShort(4);\n                out.writeShort(16 + segCount * 8 + glyphIds.length * 2);\n                out.writeShort(0);\n                out.writeShort(segCountX2);\n                out.writeShort(searchRange);\n                out.writeShort(entrySelector);\n                out.writeShort(rangeShift);\n                endCodes.forEach(out.writeShort);\n                out.writeShort(0);\n                startCodes.forEach(out.writeShort);\n                deltas.forEach(out.writeShort_);\n                rangeOffsets.forEach(out.writeShort);\n                glyphIds.forEach(out.writeShort);\n                return out.get();\n            }\n            return deftable({\n                parse: function (data) {\n                    var self = this;\n                    var offset = self.offset;\n                    data.offset(offset);\n                    self.codeMap = {};\n                    self.version = data.readShort();\n                    var tableCount = data.readShort();\n                    self.tables = data.times(tableCount, function () {\n                        return new CmapEntry(data, offset, self.codeMap);\n                    });\n                },\n                render: function (ncid2ogid, ogid2ngid) {\n                    var out = BinaryStream();\n                    out.writeShort(0);\n                    out.writeShort(1);\n                    out.write(renderCharmap(ncid2ogid, ogid2ngid));\n                    return out.get();\n                }\n            });\n        }();\n        var OS2Table = deftable({\n            parse: function (data) {\n                data.offset(this.offset);\n                this.version = data.readShort();\n                this.averageCharWidth = data.readShort_();\n                this.weightClass = data.readShort();\n                this.widthClass = data.readShort();\n                this.type = data.readShort();\n                this.ySubscriptXSize = data.readShort_();\n                this.ySubscriptYSize = data.readShort_();\n                this.ySubscriptXOffset = data.readShort_();\n                this.ySubscriptYOffset = data.readShort_();\n                this.ySuperscriptXSize = data.readShort_();\n                this.ySuperscriptYSize = data.readShort_();\n                this.ySuperscriptXOffset = data.readShort_();\n                this.ySuperscriptYOffset = data.readShort_();\n                this.yStrikeoutSize = data.readShort_();\n                this.yStrikeoutPosition = data.readShort_();\n                this.familyClass = data.readShort_();\n                this.panose = data.times(10, data.readByte);\n                this.charRange = data.times(4, data.readLong);\n                this.vendorID = data.readString(4);\n                this.selection = data.readShort();\n                this.firstCharIndex = data.readShort();\n                this.lastCharIndex = data.readShort();\n                if (this.version > 0) {\n                    this.ascent = data.readShort_();\n                    this.descent = data.readShort_();\n                    this.lineGap = data.readShort_();\n                    this.winAscent = data.readShort();\n                    this.winDescent = data.readShort();\n                    this.codePageRange = data.times(2, data.readLong);\n                    if (this.version > 1) {\n                        this.xHeight = data.readShort();\n                        this.capHeight = data.readShort();\n                        this.defaultChar = data.readShort();\n                        this.breakChar = data.readShort();\n                        this.maxContext = data.readShort();\n                    }\n                }\n            },\n            render: function () {\n                return this.raw();\n            }\n        });\n        var subsetTag = 100000;\n        function nextSubsetTag() {\n            var ret = '', n = String(subsetTag);\n            for (var i = 0; i < n.length; ++i) {\n                ret += String.fromCharCode(n.charCodeAt(i) - 48 + 65);\n            }\n            ++subsetTag;\n            return ret;\n        }\n        function Subfont(font) {\n            this.font = font;\n            this.subset = {};\n            this.unicodes = {};\n            this.ogid2ngid = { 0: 0 };\n            this.ngid2ogid = { 0: 0 };\n            this.ncid2ogid = {};\n            this.next = this.firstChar = 1;\n            this.nextGid = 1;\n            this.psName = nextSubsetTag() + '+' + this.font.psName;\n        }\n        Subfont.prototype = {\n            use: function (ch) {\n                var self = this;\n                if (typeof ch == 'string') {\n                    return ucs2decode(ch).reduce(function (ret, code) {\n                        return ret + String.fromCharCode(self.use(code));\n                    }, '');\n                }\n                var code = self.unicodes[ch];\n                if (!code) {\n                    code = self.next++;\n                    self.subset[code] = ch;\n                    self.unicodes[ch] = code;\n                    var old_gid = self.font.cmap.codeMap[ch];\n                    if (old_gid) {\n                        self.ncid2ogid[code] = old_gid;\n                        if (self.ogid2ngid[old_gid] == null) {\n                            var new_gid = self.nextGid++;\n                            self.ogid2ngid[old_gid] = new_gid;\n                            self.ngid2ogid[new_gid] = old_gid;\n                        }\n                    }\n                }\n                return code;\n            },\n            encodeText: function (text) {\n                return this.use(text);\n            },\n            glyphIds: function () {\n                return sortedKeys(this.ogid2ngid);\n            },\n            glyphsFor: function (glyphIds, result) {\n                var this$1 = this;\n                if (!result) {\n                    result = {};\n                }\n                for (var i = 0; i < glyphIds.length; ++i) {\n                    var id = glyphIds[i];\n                    if (!result[id]) {\n                        var glyph = result[id] = this$1.font.glyf.glyphFor(id);\n                        if (glyph && glyph.compound) {\n                            this$1.glyphsFor(glyph.glyphIds, result);\n                        }\n                    }\n                }\n                return result;\n            },\n            render: function () {\n                var this$1 = this;\n                var glyphs = this.glyphsFor(this.glyphIds());\n                for (var old_gid in glyphs) {\n                    if (hasOwnProperty$1(glyphs, old_gid)) {\n                        old_gid = parseInt(old_gid, 10);\n                        if (this$1.ogid2ngid[old_gid] == null) {\n                            var new_gid = this$1.nextGid++;\n                            this$1.ogid2ngid[old_gid] = new_gid;\n                            this$1.ngid2ogid[new_gid] = old_gid;\n                        }\n                    }\n                }\n                var new_gid_ids = sortedKeys(this.ngid2ogid);\n                var old_gid_ids = new_gid_ids.map(function (id) {\n                    return this.ngid2ogid[id];\n                }, this);\n                var font = this.font;\n                var glyf = font.glyf.render(glyphs, old_gid_ids, this.ogid2ngid);\n                var loca = font.loca.render(glyf.offsets);\n                this.lastChar = this.next - 1;\n                var tables = {\n                    'cmap': CmapTable.render(this.ncid2ogid, this.ogid2ngid),\n                    'glyf': glyf.table,\n                    'loca': loca.table,\n                    'hmtx': font.hmtx.render(old_gid_ids),\n                    'hhea': font.hhea.render(old_gid_ids),\n                    'maxp': font.maxp.render(old_gid_ids),\n                    'post': font.post.render(old_gid_ids),\n                    'name': font.name.render(this.psName),\n                    'head': font.head.render(loca.format),\n                    'OS/2': font.os2.render()\n                };\n                return this.font.directory.render(tables);\n            },\n            cidToGidMap: function () {\n                var this$1 = this;\n                var out = BinaryStream(), len = 0;\n                for (var cid = this.firstChar; cid < this.next; ++cid) {\n                    while (len < cid) {\n                        out.writeShort(0);\n                        len++;\n                    }\n                    var old_gid = this$1.ncid2ogid[cid];\n                    if (old_gid) {\n                        var new_gid = this$1.ogid2ngid[old_gid];\n                        out.writeShort(new_gid);\n                    } else {\n                        out.writeShort(0);\n                    }\n                    len++;\n                }\n                return out.get();\n            }\n        };\n        function TTFFont(rawData, name) {\n            var self = this;\n            var data = self.contents = BinaryStream(rawData);\n            if (data.readString(4) == 'ttcf') {\n                var offset;\n                var parse = function () {\n                    data.offset(offset);\n                    self.parse();\n                };\n                if (!name) {\n                    throw new Error('Must specify a name for TTC files');\n                }\n                data.readLong();\n                var numFonts = data.readLong();\n                for (var i = 0; i < numFonts; ++i) {\n                    offset = data.readLong();\n                    data.saveExcursion(parse);\n                    if (self.psName == name) {\n                        return;\n                    }\n                }\n                throw new Error('Font ' + name + ' not found in collection');\n            } else {\n                data.offset(0);\n                self.parse();\n            }\n        }\n        TTFFont.prototype = {\n            parse: function () {\n                var dir = this.directory = new Directory(this.contents);\n                this.head = dir.readTable('head', HeadTable);\n                this.loca = dir.readTable('loca', LocaTable);\n                this.hhea = dir.readTable('hhea', HheaTable);\n                this.maxp = dir.readTable('maxp', MaxpTable);\n                this.hmtx = dir.readTable('hmtx', HmtxTable);\n                this.glyf = dir.readTable('glyf', GlyfTable);\n                this.name = dir.readTable('name', NameTable);\n                this.post = dir.readTable('post', PostTable);\n                this.cmap = dir.readTable('cmap', CmapTable);\n                this.os2 = dir.readTable('OS/2', OS2Table);\n                this.psName = this.name.postscriptName;\n                this.ascent = this.os2.ascent || this.hhea.ascent;\n                this.descent = this.os2.descent || this.hhea.descent;\n                this.lineGap = this.os2.lineGap || this.hhea.lineGap;\n                this.scale = 1000 / this.head.unitsPerEm;\n            },\n            widthOfGlyph: function (glyph) {\n                return this.hmtx.forGlyph(glyph).advance * this.scale;\n            },\n            makeSubset: function () {\n                return new Subfont(this);\n            }\n        };\n        var browser = kendo.support.browser;\n        var HAS_TYPED_ARRAYS = typeof Uint8Array !== 'undefined';\n        var NL = '\\n';\n        var RESOURCE_COUNTER = 0;\n        var PAPER_SIZE = {\n            a0: [\n                2383.94,\n                3370.39\n            ],\n            a1: [\n                1683.78,\n                2383.94\n            ],\n            a2: [\n                1190.55,\n                1683.78\n            ],\n            a3: [\n                841.89,\n                1190.55\n            ],\n            a4: [\n                595.28,\n                841.89\n            ],\n            a5: [\n                419.53,\n                595.28\n            ],\n            a6: [\n                297.64,\n                419.53\n            ],\n            a7: [\n                209.76,\n                297.64\n            ],\n            a8: [\n                147.4,\n                209.76\n            ],\n            a9: [\n                104.88,\n                147.4\n            ],\n            a10: [\n                73.7,\n                104.88\n            ],\n            b0: [\n                2834.65,\n                4008.19\n            ],\n            b1: [\n                2004.09,\n                2834.65\n            ],\n            b2: [\n                1417.32,\n                2004.09\n            ],\n            b3: [\n                1000.63,\n                1417.32\n            ],\n            b4: [\n                708.66,\n                1000.63\n            ],\n            b5: [\n                498.9,\n                708.66\n            ],\n            b6: [\n                354.33,\n                498.9\n            ],\n            b7: [\n                249.45,\n                354.33\n            ],\n            b8: [\n                175.75,\n                249.45\n            ],\n            b9: [\n                124.72,\n                175.75\n            ],\n            b10: [\n                87.87,\n                124.72\n            ],\n            c0: [\n                2599.37,\n                3676.54\n            ],\n            c1: [\n                1836.85,\n                2599.37\n            ],\n            c2: [\n                1298.27,\n                1836.85\n            ],\n            c3: [\n                918.43,\n                1298.27\n            ],\n            c4: [\n                649.13,\n                918.43\n            ],\n            c5: [\n                459.21,\n                649.13\n            ],\n            c6: [\n                323.15,\n                459.21\n            ],\n            c7: [\n                229.61,\n                323.15\n            ],\n            c8: [\n                161.57,\n                229.61\n            ],\n            c9: [\n                113.39,\n                161.57\n            ],\n            c10: [\n                79.37,\n                113.39\n            ],\n            executive: [\n                521.86,\n                756\n            ],\n            folio: [\n                612,\n                936\n            ],\n            legal: [\n                612,\n                1008\n            ],\n            letter: [\n                612,\n                792\n            ],\n            tabloid: [\n                792,\n                1224\n            ]\n        };\n        function makeOutput() {\n            var indentLevel = 0, output = BinaryStream();\n            function out() {\n                var arguments$1 = arguments;\n                for (var i = 0; i < arguments.length; ++i) {\n                    var x = arguments$1[i];\n                    if (x === undefined) {\n                        throw new Error('Cannot output undefined to PDF');\n                    } else if (x instanceof PDFValue) {\n                        x.beforeRender(out);\n                        x.render(out);\n                    } else if (isArray(x)) {\n                        renderArray(x, out);\n                    } else if (isDate(x)) {\n                        renderDate(x, out);\n                    } else if (typeof x == 'number') {\n                        if (isNaN(x)) {\n                            throw new Error('Cannot output NaN to PDF');\n                        }\n                        var num = x.toFixed(7);\n                        if (num.indexOf('.') >= 0) {\n                            num = num.replace(/\\.?0+$/, '');\n                        }\n                        if (num == '-0') {\n                            num = '0';\n                        }\n                        output.writeString(num);\n                    } else if (/string|boolean/.test(typeof x)) {\n                        output.writeString(String(x));\n                    } else if (typeof x.get == 'function') {\n                        output.write(x.get());\n                    } else if (typeof x == 'object') {\n                        if (!x) {\n                            output.writeString('null');\n                        } else {\n                            out(new PDFDictionary(x));\n                        }\n                    }\n                }\n            }\n            out.writeData = function (data) {\n                output.write(data);\n            };\n            out.withIndent = function (f) {\n                ++indentLevel;\n                f(out);\n                --indentLevel;\n            };\n            out.indent = function () {\n                out(NL, pad('', indentLevel * 2, '  '));\n                out.apply(null, arguments);\n            };\n            out.offset = function () {\n                return output.offset();\n            };\n            out.toString = function () {\n                throw new Error('FIX CALLER');\n            };\n            out.get = function () {\n                return output.get();\n            };\n            out.stream = function () {\n                return output;\n            };\n            return out;\n        }\n        function wrapObject(value, id) {\n            var beforeRender = value.beforeRender;\n            var renderValue = value.render;\n            value.beforeRender = function () {\n            };\n            value.render = function (out) {\n                out(id, ' 0 R');\n            };\n            value.renderFull = function (out) {\n                value._offset = out.offset();\n                out(id, ' 0 obj ');\n                beforeRender.call(value, out);\n                renderValue.call(value, out);\n                out(' endobj');\n            };\n        }\n        function getPaperOptions(getOption) {\n            if (typeof getOption != 'function') {\n                var options = getOption;\n                getOption = function (key, def) {\n                    return key in options ? options[key] : def;\n                };\n            }\n            var paperSize = getOption('paperSize', PAPER_SIZE.a4);\n            if (!paperSize) {\n                return {};\n            }\n            if (typeof paperSize == 'string') {\n                paperSize = PAPER_SIZE[paperSize.toLowerCase()];\n                if (paperSize == null) {\n                    throw new Error('Unknown paper size');\n                }\n            }\n            paperSize[0] = unitsToPoints(paperSize[0]);\n            paperSize[1] = unitsToPoints(paperSize[1]);\n            if (getOption('landscape', false)) {\n                paperSize = [\n                    Math.max(paperSize[0], paperSize[1]),\n                    Math.min(paperSize[0], paperSize[1])\n                ];\n            }\n            var margin = getOption('margin');\n            if (margin) {\n                if (typeof margin == 'string' || typeof margin == 'number') {\n                    margin = unitsToPoints(margin, 0);\n                    margin = {\n                        left: margin,\n                        top: margin,\n                        right: margin,\n                        bottom: margin\n                    };\n                } else {\n                    margin = {\n                        left: unitsToPoints(margin.left, 0),\n                        top: unitsToPoints(margin.top, 0),\n                        right: unitsToPoints(margin.right, 0),\n                        bottom: unitsToPoints(margin.bottom, 0)\n                    };\n                }\n                if (getOption('addMargin')) {\n                    paperSize[0] += margin.left + margin.right;\n                    paperSize[1] += margin.top + margin.bottom;\n                }\n            }\n            return {\n                paperSize: paperSize,\n                margin: margin\n            };\n        }\n        function PDFDocument(options) {\n            var self = this;\n            var out = makeOutput();\n            var objcount = 0;\n            var objects = [];\n            function getOption(name, defval) {\n                return options && options[name] != null ? options[name] : defval;\n            }\n            self.getOption = getOption;\n            self.attach = function (value) {\n                if (objects.indexOf(value) < 0) {\n                    wrapObject(value, ++objcount);\n                    objects.push(value);\n                }\n                return value;\n            };\n            self.pages = [];\n            self.FONTS = {};\n            self.IMAGES = {};\n            self.GRAD_COL_FUNCTIONS = {};\n            self.GRAD_OPC_FUNCTIONS = {};\n            self.GRAD_COL = {};\n            self.GRAD_OPC = {};\n            var catalog = self.attach(new PDFCatalog());\n            var pageTree = self.attach(new PDFPageTree());\n            catalog.setPages(pageTree);\n            self.addPage = function (options) {\n                var paperOptions = getPaperOptions(function (name, defval) {\n                    return options && options[name] != null ? options[name] : defval;\n                });\n                var paperSize = paperOptions.paperSize;\n                var margin = paperOptions.margin;\n                var contentWidth = paperSize[0];\n                var contentHeight = paperSize[1];\n                if (margin) {\n                    contentWidth -= margin.left + margin.right;\n                    contentHeight -= margin.top + margin.bottom;\n                }\n                var content = new PDFStream(makeOutput(), null, true);\n                var props = {\n                    Contents: self.attach(content),\n                    Parent: pageTree,\n                    MediaBox: [\n                        0,\n                        0,\n                        paperSize[0],\n                        paperSize[1]\n                    ]\n                };\n                var page = new PDFPage(self, props);\n                page._content = content;\n                pageTree.addPage(self.attach(page));\n                page.transform(1, 0, 0, -1, 0, paperSize[1]);\n                if (margin) {\n                    page.translate(margin.left, margin.top);\n                    page.rect(0, 0, contentWidth, contentHeight);\n                    page.clip();\n                }\n                self.pages.push(page);\n                return page;\n            };\n            self.render = function () {\n                var i;\n                out('%PDF-1.4', NL, '%ÂÁÚÏÎ', NL, NL);\n                for (i = 0; i < objects.length; ++i) {\n                    objects[i].renderFull(out);\n                    out(NL, NL);\n                }\n                var xrefOffset = out.offset();\n                out('xref', NL, 0, ' ', objects.length + 1, NL);\n                out('0000000000 65535 f ', NL);\n                for (i = 0; i < objects.length; ++i) {\n                    out(zeropad(objects[i]._offset, 10), ' 00000 n ', NL);\n                }\n                out(NL);\n                out('trailer', NL);\n                out(new PDFDictionary({\n                    Size: objects.length + 1,\n                    Root: catalog,\n                    Info: new PDFDictionary({\n                        Producer: new PDFString(getOption('producer', 'Kendo UI PDF Generator')),\n                        Title: new PDFString(getOption('title', '')),\n                        Author: new PDFString(getOption('author', '')),\n                        Subject: new PDFString(getOption('subject', '')),\n                        Keywords: new PDFString(getOption('keywords', '')),\n                        Creator: new PDFString(getOption('creator', 'Kendo UI PDF Generator')),\n                        CreationDate: getOption('date', new Date())\n                    })\n                }), NL, NL);\n                out('startxref', NL, xrefOffset, NL);\n                out('%%EOF', NL);\n                return out.stream().offset(0);\n            };\n        }\n        var FONT_CACHE = {\n            'Times-Roman': true,\n            'Times-Bold': true,\n            'Times-Italic': true,\n            'Times-BoldItalic': true,\n            'Helvetica': true,\n            'Helvetica-Bold': true,\n            'Helvetica-Oblique': true,\n            'Helvetica-BoldOblique': true,\n            'Courier': true,\n            'Courier-Bold': true,\n            'Courier-Oblique': true,\n            'Courier-BoldOblique': true,\n            'Symbol': true,\n            'ZapfDingbats': true\n        };\n        function loadBinary(url, cont) {\n            function error() {\n                if (window.console) {\n                    if (window.console.error) {\n                        window.console.error('Cannot load URL: %s', url);\n                    } else {\n                        window.console.log('Cannot load URL: %s', url);\n                    }\n                }\n                cont(null);\n            }\n            var req = new XMLHttpRequest();\n            req.open('GET', url, true);\n            if (HAS_TYPED_ARRAYS) {\n                req.responseType = 'arraybuffer';\n            }\n            req.onload = function () {\n                if (req.status == 200 || req.status == 304) {\n                    if (HAS_TYPED_ARRAYS) {\n                        cont(new Uint8Array(req.response));\n                    } else {\n                        cont(new window.VBArray(req.responseBody).toArray());\n                    }\n                } else {\n                    error();\n                }\n            };\n            req.onerror = error;\n            req.send(null);\n        }\n        function loadFont(url, cont) {\n            var font = FONT_CACHE[url];\n            if (font) {\n                cont(font);\n            } else {\n                loadBinary(url, function (data) {\n                    if (data == null) {\n                        throw new Error('Cannot load font from ' + url);\n                    } else {\n                        var font = new TTFFont(data);\n                        FONT_CACHE[url] = font;\n                        cont(font);\n                    }\n                });\n            }\n        }\n        var IMAGE_CACHE = {};\n        function loadImage(url, cont) {\n            var img = IMAGE_CACHE[url], bloburl, blob;\n            if (img) {\n                cont(img);\n            } else {\n                img = new Image();\n                if (!/^data:/i.test(url)) {\n                    img.crossOrigin = 'Anonymous';\n                }\n                if (HAS_TYPED_ARRAYS && !/^data:/i.test(url)) {\n                    var xhr = new XMLHttpRequest();\n                    xhr.onload = function () {\n                        blob = xhr.response;\n                        bloburl = URL.createObjectURL(blob);\n                        _load(bloburl);\n                    };\n                    xhr.onerror = _onerror;\n                    xhr.open('GET', url, true);\n                    xhr.responseType = 'blob';\n                    xhr.send();\n                } else {\n                    _load(url);\n                }\n            }\n            function _load(url) {\n                img.src = url;\n                if (img.complete && !browser.msie) {\n                    _onload();\n                } else {\n                    img.onload = _onload;\n                    img.onerror = _onerror;\n                }\n            }\n            function _onerror() {\n                cont(IMAGE_CACHE[url] = 'TAINTED');\n            }\n            function _onload() {\n                if (blob && /^image\\/jpe?g$/i.test(blob.type)) {\n                    var reader = new FileReader();\n                    reader.onload = function () {\n                        img = new PDFJpegImage(BinaryStream(new Uint8Array(this.result)));\n                        URL.revokeObjectURL(bloburl);\n                        cont(IMAGE_CACHE[url] = img);\n                    };\n                    reader.readAsArrayBuffer(blob);\n                    return;\n                }\n                var canvas = document.createElement('canvas');\n                canvas.width = img.width;\n                canvas.height = img.height;\n                var ctx = canvas.getContext('2d');\n                ctx.drawImage(img, 0, 0);\n                var imgdata;\n                try {\n                    imgdata = ctx.getImageData(0, 0, img.width, img.height);\n                } catch (ex) {\n                    _onerror();\n                    return;\n                } finally {\n                    if (bloburl) {\n                        URL.revokeObjectURL(bloburl);\n                    }\n                }\n                var hasAlpha = false, rgb = BinaryStream(), alpha = BinaryStream();\n                var rawbytes = imgdata.data;\n                var i = 0;\n                while (i < rawbytes.length) {\n                    rgb.writeByte(rawbytes[i++]);\n                    rgb.writeByte(rawbytes[i++]);\n                    rgb.writeByte(rawbytes[i++]);\n                    var a = rawbytes[i++];\n                    if (a < 255) {\n                        hasAlpha = true;\n                    }\n                    alpha.writeByte(a);\n                }\n                if (hasAlpha) {\n                    img = new PDFRawImage(img.width, img.height, rgb, alpha);\n                } else {\n                    var data = canvas.toDataURL('image/jpeg');\n                    data = data.substr(data.indexOf(';base64,') + 8);\n                    var stream = BinaryStream();\n                    stream.writeBase64(data);\n                    img = new PDFJpegImage(stream);\n                }\n                cont(IMAGE_CACHE[url] = img);\n            }\n        }\n        function manyLoader(loadOne) {\n            return function (urls, callback) {\n                var n = urls.length, i = n;\n                if (n === 0) {\n                    return callback();\n                }\n                function next() {\n                    if (--n === 0) {\n                        callback();\n                    }\n                }\n                while (i-- > 0) {\n                    loadOne(urls[i], next);\n                }\n            };\n        }\n        var loadFonts = manyLoader(loadFont);\n        var loadImages = manyLoader(loadImage);\n        PDFDocument.prototype = {\n            loadFonts: loadFonts,\n            loadImages: loadImages,\n            getFont: function (url) {\n                var font = this.FONTS[url];\n                if (!font) {\n                    font = FONT_CACHE[url];\n                    if (!font) {\n                        throw new Error('Font ' + url + ' has not been loaded');\n                    }\n                    if (font === true) {\n                        font = this.attach(new PDFStandardFont(url));\n                    } else {\n                        font = this.attach(new PDFFont(this, font));\n                    }\n                    this.FONTS[url] = font;\n                }\n                return font;\n            },\n            getImage: function (url) {\n                var img = this.IMAGES[url];\n                if (!img) {\n                    img = IMAGE_CACHE[url];\n                    if (!img) {\n                        throw new Error('Image ' + url + ' has not been loaded');\n                    }\n                    if (img === 'TAINTED') {\n                        return null;\n                    }\n                    img = this.IMAGES[url] = this.attach(img.asStream(this));\n                }\n                return img;\n            },\n            getOpacityGS: function (opacity, forStroke) {\n                var id = parseFloat(opacity).toFixed(3);\n                opacity = parseFloat(id);\n                id += forStroke ? 'S' : 'F';\n                var cache = this._opacityGSCache || (this._opacityGSCache = {});\n                var gs = cache[id];\n                if (!gs) {\n                    var props = { Type: _('ExtGState') };\n                    if (forStroke) {\n                        props.CA = opacity;\n                    } else {\n                        props.ca = opacity;\n                    }\n                    gs = this.attach(new PDFDictionary(props));\n                    gs._resourceName = _('GS' + ++RESOURCE_COUNTER);\n                    cache[id] = gs;\n                }\n                return gs;\n            },\n            dict: function (props) {\n                return new PDFDictionary(props);\n            },\n            name: function (str) {\n                return _(str);\n            },\n            stream: function (props, content) {\n                return new PDFStream(content, props);\n            }\n        };\n        function pad(str, len, ch) {\n            while (str.length < len) {\n                str = ch + str;\n            }\n            return str;\n        }\n        function zeropad(n, len) {\n            return pad(String(n), len, '0');\n        }\n        function hasOwnProperty(obj, key) {\n            return Object.prototype.hasOwnProperty.call(obj, key);\n        }\n        var isArray = Array.isArray || function (obj) {\n            return obj instanceof Array;\n        };\n        function isDate(obj) {\n            return obj instanceof Date;\n        }\n        function renderArray(a, out) {\n            out('[');\n            if (a.length > 0) {\n                out.withIndent(function () {\n                    for (var i = 0; i < a.length; ++i) {\n                        if (i > 0 && i % 8 === 0) {\n                            out.indent(a[i]);\n                        } else {\n                            out(' ', a[i]);\n                        }\n                    }\n                });\n            }\n            out(' ]');\n        }\n        function renderDate(date, out) {\n            out('(D:', zeropad(date.getUTCFullYear(), 4), zeropad(date.getUTCMonth() + 1, 2), zeropad(date.getUTCDate(), 2), zeropad(date.getUTCHours(), 2), zeropad(date.getUTCMinutes(), 2), zeropad(date.getUTCSeconds(), 2), 'Z)');\n        }\n        function mm2pt(mm) {\n            return mm * (72 / 25.4);\n        }\n        function cm2pt(cm) {\n            return mm2pt(cm * 10);\n        }\n        function in2pt(inch) {\n            return inch * 72;\n        }\n        function unitsToPoints(x, def) {\n            if (typeof x == 'number') {\n                return x;\n            }\n            if (typeof x == 'string') {\n                var m;\n                m = /^\\s*([0-9.]+)\\s*(mm|cm|in|pt)\\s*$/.exec(x);\n                if (m) {\n                    var num = parseFloat(m[1]);\n                    if (!isNaN(num)) {\n                        if (m[2] == 'pt') {\n                            return num;\n                        }\n                        return {\n                            'mm': mm2pt,\n                            'cm': cm2pt,\n                            'in': in2pt\n                        }[m[2]](num);\n                    }\n                }\n            }\n            if (def != null) {\n                return def;\n            }\n            throw new Error('Can\\'t parse unit: ' + x);\n        }\n        function PDFValue() {\n        }\n        PDFValue.prototype.beforeRender = function () {\n        };\n        function defclass(Ctor, proto, Base) {\n            if (!Base) {\n                Base = PDFValue;\n            }\n            Ctor.prototype = new Base();\n            for (var i in proto) {\n                if (hasOwnProperty(proto, i)) {\n                    Ctor.prototype[i] = proto[i];\n                }\n            }\n            return Ctor;\n        }\n        var PDFString = defclass(function PDFString(value) {\n            this.value = value;\n        }, {\n            render: function (out) {\n                var txt = '', val = this.value;\n                for (var i = 0; i < val.length; ++i) {\n                    txt += String.fromCharCode(val.charCodeAt(i) & 255);\n                }\n                out('(', txt.replace(/([\\(\\)\\\\])/g, '\\\\$1'), ')');\n            },\n            toString: function () {\n                return this.value;\n            }\n        });\n        var PDFHexString = defclass(function PDFHexString(value) {\n            this.value = value;\n        }, {\n            render: function (out) {\n                var this$1 = this;\n                out('<');\n                for (var i = 0; i < this.value.length; ++i) {\n                    out(zeropad(this$1.value.charCodeAt(i).toString(16), 4));\n                }\n                out('>');\n            }\n        }, PDFString);\n        var PDFName = defclass(function PDFName(name) {\n            this.name = name;\n        }, {\n            render: function (out) {\n                out('/' + this.escape());\n            },\n            escape: function () {\n                return this.name.replace(/[^\\x21-\\x7E]/g, function (c) {\n                    return '#' + zeropad(c.charCodeAt(0).toString(16), 2);\n                });\n            },\n            toString: function () {\n                return this.name;\n            }\n        });\n        var PDFName_cache = {};\n        PDFName.get = _;\n        function _(name) {\n            if (hasOwnProperty(PDFName_cache, name)) {\n                return PDFName_cache[name];\n            }\n            return PDFName_cache[name] = new PDFName(name);\n        }\n        var PDFDictionary = defclass(function PDFDictionary(props) {\n            this.props = props;\n        }, {\n            render: function (out) {\n                var props = this.props, empty = true;\n                out('<<');\n                out.withIndent(function () {\n                    for (var i in props) {\n                        if (hasOwnProperty(props, i) && !/^_/.test(i)) {\n                            empty = false;\n                            out.indent(_(i), ' ', props[i]);\n                        }\n                    }\n                });\n                if (!empty) {\n                    out.indent();\n                }\n                out('>>');\n            }\n        });\n        var PDFStream = defclass(function PDFStream(data, props, compress) {\n            if (typeof data == 'string') {\n                var tmp = BinaryStream();\n                tmp.write(data);\n                data = tmp;\n            }\n            this.data = data;\n            this.props = props || {};\n            this.compress = compress;\n        }, {\n            render: function (out) {\n                var data = this.data.get(), props = this.props;\n                if (this.compress && window.pako && typeof window.pako.deflate == 'function') {\n                    if (!props.Filter) {\n                        props.Filter = [];\n                    } else if (!(props.Filter instanceof Array)) {\n                        props.Filter = [props.Filter];\n                    }\n                    props.Filter.unshift(_('FlateDecode'));\n                    data = window.pako.deflate(data);\n                }\n                props.Length = data.length;\n                out(new PDFDictionary(props), ' stream', NL);\n                out.writeData(data);\n                out(NL, 'endstream');\n            }\n        });\n        var PDFCatalog = defclass(function PDFCatalog(props) {\n            props = this.props = props || {};\n            props.Type = _('Catalog');\n        }, {\n            setPages: function (pagesObj) {\n                this.props.Pages = pagesObj;\n            }\n        }, PDFDictionary);\n        var PDFPageTree = defclass(function PDFPageTree() {\n            this.props = {\n                Type: _('Pages'),\n                Kids: [],\n                Count: 0\n            };\n        }, {\n            addPage: function (pageObj) {\n                this.props.Kids.push(pageObj);\n                this.props.Count++;\n            }\n        }, PDFDictionary);\n        var SOF_CODES = [\n            192,\n            193,\n            194,\n            195,\n            197,\n            198,\n            199,\n            201,\n            202,\n            203,\n            205,\n            206,\n            207\n        ];\n        function PDFJpegImage(data) {\n            data.offset(0);\n            var width, height, colorSpace, bitsPerComponent;\n            var soi = data.readShort();\n            if (soi != 65496) {\n                throw new Error('Invalid JPEG image');\n            }\n            while (!data.eof()) {\n                var ff = data.readByte();\n                if (ff != 255) {\n                    throw new Error('Invalid JPEG image');\n                }\n                var marker = data.readByte();\n                var length = data.readShort();\n                if (SOF_CODES.indexOf(marker) >= 0) {\n                    bitsPerComponent = data.readByte();\n                    height = data.readShort();\n                    width = data.readShort();\n                    colorSpace = data.readByte();\n                    break;\n                }\n                data.skip(length - 2);\n            }\n            if (colorSpace == null) {\n                throw new Error('Invalid JPEG image');\n            }\n            var props = {\n                Type: _('XObject'),\n                Subtype: _('Image'),\n                Width: width,\n                Height: height,\n                BitsPerComponent: bitsPerComponent,\n                Filter: _('DCTDecode')\n            };\n            switch (colorSpace) {\n            case 1:\n                props.ColorSpace = _('DeviceGray');\n                break;\n            case 3:\n                props.ColorSpace = _('DeviceRGB');\n                break;\n            case 4:\n                props.ColorSpace = _('DeviceCMYK');\n                props.Decode = [\n                    1,\n                    0,\n                    1,\n                    0,\n                    1,\n                    0,\n                    1,\n                    0\n                ];\n                break;\n            }\n            this.asStream = function () {\n                data.offset(0);\n                var stream = new PDFStream(data, props);\n                stream._resourceName = _('I' + ++RESOURCE_COUNTER);\n                return stream;\n            };\n        }\n        function PDFRawImage(width, height, rgb, alpha) {\n            this.asStream = function (pdf) {\n                var mask = new PDFStream(alpha, {\n                    Type: _('XObject'),\n                    Subtype: _('Image'),\n                    Width: width,\n                    Height: height,\n                    BitsPerComponent: 8,\n                    ColorSpace: _('DeviceGray')\n                }, true);\n                var stream = new PDFStream(rgb, {\n                    Type: _('XObject'),\n                    Subtype: _('Image'),\n                    Width: width,\n                    Height: height,\n                    BitsPerComponent: 8,\n                    ColorSpace: _('DeviceRGB'),\n                    SMask: pdf.attach(mask)\n                }, true);\n                stream._resourceName = _('I' + ++RESOURCE_COUNTER);\n                return stream;\n            };\n        }\n        var PDFStandardFont = defclass(function PDFStandardFont(name) {\n            this.props = {\n                Type: _('Font'),\n                Subtype: _('Type1'),\n                BaseFont: _(name)\n            };\n            this._resourceName = _('F' + ++RESOURCE_COUNTER);\n        }, {\n            encodeText: function (str) {\n                return new PDFString(String(str));\n            }\n        }, PDFDictionary);\n        var PDFFont = defclass(function PDFFont(pdf, font, props) {\n            props = this.props = props || {};\n            props.Type = _('Font');\n            props.Subtype = _('Type0');\n            props.Encoding = _('Identity-H');\n            this._pdf = pdf;\n            this._font = font;\n            this._sub = font.makeSubset();\n            this._resourceName = _('F' + ++RESOURCE_COUNTER);\n            var head = font.head;\n            this.name = font.psName;\n            var scale = this.scale = font.scale;\n            this.bbox = [\n                head.xMin * scale,\n                head.yMin * scale,\n                head.xMax * scale,\n                head.yMax * scale\n            ];\n            this.italicAngle = font.post.italicAngle;\n            this.ascent = font.ascent * scale;\n            this.descent = font.descent * scale;\n            this.lineGap = font.lineGap * scale;\n            this.capHeight = font.os2.capHeight || this.ascent;\n            this.xHeight = font.os2.xHeight || 0;\n            this.stemV = 0;\n            this.familyClass = (font.os2.familyClass || 0) >> 8;\n            this.isSerif = this.familyClass >= 1 && this.familyClass <= 7;\n            this.isScript = this.familyClass == 10;\n            this.flags = (font.post.isFixedPitch ? 1 : 0) | (this.isSerif ? 1 << 1 : 0) | (this.isScript ? 1 << 3 : 0) | (this.italicAngle !== 0 ? 1 << 6 : 0) | 1 << 5;\n        }, {\n            encodeText: function (text) {\n                return new PDFHexString(this._sub.encodeText(String(text)));\n            },\n            getTextWidth: function (fontSize, text) {\n                var this$1 = this;\n                var width = 0, codeMap = this._font.cmap.codeMap;\n                for (var i = 0; i < text.length; ++i) {\n                    var glyphId = codeMap[text.charCodeAt(i)];\n                    width += this$1._font.widthOfGlyph(glyphId || 0);\n                }\n                return width * fontSize / 1000;\n            },\n            beforeRender: function () {\n                var self = this;\n                var sub = self._sub;\n                var data = sub.render();\n                var fontStream = new PDFStream(BinaryStream(data), { Length1: data.length }, true);\n                var descriptor = self._pdf.attach(new PDFDictionary({\n                    Type: _('FontDescriptor'),\n                    FontName: _(self._sub.psName),\n                    FontBBox: self.bbox,\n                    Flags: self.flags,\n                    StemV: self.stemV,\n                    ItalicAngle: self.italicAngle,\n                    Ascent: self.ascent,\n                    Descent: self.descent,\n                    CapHeight: self.capHeight,\n                    XHeight: self.xHeight,\n                    FontFile2: self._pdf.attach(fontStream)\n                }));\n                var cmap = sub.ncid2ogid;\n                var firstChar = sub.firstChar;\n                var lastChar = sub.lastChar;\n                var charWidths = [];\n                (function loop(i, chunk) {\n                    if (i <= lastChar) {\n                        var gid = cmap[i];\n                        if (gid == null) {\n                            loop(i + 1);\n                        } else {\n                            if (!chunk) {\n                                charWidths.push(i, chunk = []);\n                            }\n                            chunk.push(self._font.widthOfGlyph(gid));\n                            loop(i + 1, chunk);\n                        }\n                    }\n                }(firstChar));\n                var descendant = new PDFDictionary({\n                    Type: _('Font'),\n                    Subtype: _('CIDFontType2'),\n                    BaseFont: _(self._sub.psName),\n                    CIDSystemInfo: new PDFDictionary({\n                        Registry: new PDFString('Adobe'),\n                        Ordering: new PDFString('Identity'),\n                        Supplement: 0\n                    }),\n                    FontDescriptor: descriptor,\n                    FirstChar: firstChar,\n                    LastChar: lastChar,\n                    DW: Math.round(self._font.widthOfGlyph(0)),\n                    W: charWidths,\n                    CIDToGIDMap: self._pdf.attach(self._makeCidToGidMap())\n                });\n                var dict = self.props;\n                dict.BaseFont = _(self._sub.psName);\n                dict.DescendantFonts = [self._pdf.attach(descendant)];\n                var unimap = new PDFToUnicodeCmap(firstChar, lastChar, sub.subset);\n                var unimapStream = new PDFStream(makeOutput(), null, true);\n                unimapStream.data(unimap);\n                dict.ToUnicode = self._pdf.attach(unimapStream);\n            },\n            _makeCidToGidMap: function () {\n                return new PDFStream(BinaryStream(this._sub.cidToGidMap()), null, true);\n            }\n        }, PDFDictionary);\n        var PDFToUnicodeCmap = defclass(function PDFUnicodeCMap(firstChar, lastChar, map) {\n            this.firstChar = firstChar;\n            this.lastChar = lastChar;\n            this.map = map;\n        }, {\n            render: function (out) {\n                out.indent('/CIDInit /ProcSet findresource begin');\n                out.indent('12 dict begin');\n                out.indent('begincmap');\n                out.indent('/CIDSystemInfo <<');\n                out.indent('  /Registry (Adobe)');\n                out.indent('  /Ordering (UCS)');\n                out.indent('  /Supplement 0');\n                out.indent('>> def');\n                out.indent('/CMapName /Adobe-Identity-UCS def');\n                out.indent('/CMapType 2 def');\n                out.indent('1 begincodespacerange');\n                out.indent('  <0000><ffff>');\n                out.indent('endcodespacerange');\n                var self = this;\n                out.indent(self.lastChar - self.firstChar + 1, ' beginbfchar');\n                out.withIndent(function () {\n                    for (var code = self.firstChar; code <= self.lastChar; ++code) {\n                        var unicode = self.map[code];\n                        var str = ucs2encode([unicode]);\n                        out.indent('<', zeropad(code.toString(16), 4), '>', '<');\n                        for (var i = 0; i < str.length; ++i) {\n                            out(zeropad(str.charCodeAt(i).toString(16), 4));\n                        }\n                        out('>');\n                    }\n                });\n                out.indent('endbfchar');\n                out.indent('endcmap');\n                out.indent('CMapName currentdict /CMap defineresource pop');\n                out.indent('end');\n                out.indent('end');\n            }\n        });\n        function makeHash(a) {\n            return a.map(function (x) {\n                return isArray(x) ? makeHash(x) : typeof x == 'number' ? (Math.round(x * 1000) / 1000).toFixed(3) : x;\n            }).join(' ');\n        }\n        function cacheColorGradientFunction(pdf, r1, g1, b1, r2, g2, b2) {\n            var hash = makeHash([\n                r1,\n                g1,\n                b1,\n                r2,\n                g2,\n                b2\n            ]);\n            var func = pdf.GRAD_COL_FUNCTIONS[hash];\n            if (!func) {\n                func = pdf.GRAD_COL_FUNCTIONS[hash] = pdf.attach(new PDFDictionary({\n                    FunctionType: 2,\n                    Domain: [\n                        0,\n                        1\n                    ],\n                    Range: [\n                        0,\n                        1,\n                        0,\n                        1,\n                        0,\n                        1\n                    ],\n                    N: 1,\n                    C0: [\n                        r1,\n                        g1,\n                        b1\n                    ],\n                    C1: [\n                        r2,\n                        g2,\n                        b2\n                    ]\n                }));\n            }\n            return func;\n        }\n        function cacheOpacityGradientFunction(pdf, a1, a2) {\n            var hash = makeHash([\n                a1,\n                a2\n            ]);\n            var func = pdf.GRAD_OPC_FUNCTIONS[hash];\n            if (!func) {\n                func = pdf.GRAD_OPC_FUNCTIONS[hash] = pdf.attach(new PDFDictionary({\n                    FunctionType: 2,\n                    Domain: [\n                        0,\n                        1\n                    ],\n                    Range: [\n                        0,\n                        1\n                    ],\n                    N: 1,\n                    C0: [a1],\n                    C1: [a2]\n                }));\n            }\n            return func;\n        }\n        function makeGradientFunctions(pdf, stops) {\n            var hasAlpha = false;\n            var opacities = [];\n            var colors = [];\n            var offsets = [];\n            var encode = [];\n            var i, prev, cur, prevColor, curColor;\n            for (i = 1; i < stops.length; ++i) {\n                prev = stops[i - 1];\n                cur = stops[i];\n                prevColor = prev.color;\n                curColor = cur.color;\n                colors.push(cacheColorGradientFunction(pdf, prevColor.r, prevColor.g, prevColor.b, curColor.r, curColor.g, curColor.b));\n                if (prevColor.a < 1 || curColor.a < 1) {\n                    hasAlpha = true;\n                }\n                offsets.push(cur.offset);\n                encode.push(0, 1);\n            }\n            if (hasAlpha) {\n                for (i = 1; i < stops.length; ++i) {\n                    prev = stops[i - 1];\n                    cur = stops[i];\n                    prevColor = prev.color;\n                    curColor = cur.color;\n                    opacities.push(cacheOpacityGradientFunction(pdf, prevColor.a, curColor.a));\n                }\n            }\n            offsets.pop();\n            return {\n                hasAlpha: hasAlpha,\n                colors: assemble(colors),\n                opacities: hasAlpha ? assemble(opacities) : null\n            };\n            function assemble(funcs) {\n                if (funcs.length == 1) {\n                    return funcs[0];\n                }\n                return {\n                    FunctionType: 3,\n                    Functions: funcs,\n                    Domain: [\n                        0,\n                        1\n                    ],\n                    Bounds: offsets,\n                    Encode: encode\n                };\n            }\n        }\n        function cacheColorGradient(pdf, isRadial, stops, coords, funcs, box) {\n            var shading, hash;\n            if (!box) {\n                var a = [isRadial].concat(coords);\n                stops.forEach(function (x) {\n                    a.push(x.offset, x.color.r, x.color.g, x.color.b);\n                });\n                hash = makeHash(a);\n                shading = pdf.GRAD_COL[hash];\n            }\n            if (!shading) {\n                shading = new PDFDictionary({\n                    Type: _('Shading'),\n                    ShadingType: isRadial ? 3 : 2,\n                    ColorSpace: _('DeviceRGB'),\n                    Coords: coords,\n                    Domain: [\n                        0,\n                        1\n                    ],\n                    Function: funcs,\n                    Extend: [\n                        true,\n                        true\n                    ]\n                });\n                pdf.attach(shading);\n                shading._resourceName = 'S' + ++RESOURCE_COUNTER;\n                if (hash) {\n                    pdf.GRAD_COL[hash] = shading;\n                }\n            }\n            return shading;\n        }\n        function cacheOpacityGradient(pdf, isRadial, stops, coords, funcs, box) {\n            var opacity, hash;\n            if (!box) {\n                var a = [isRadial].concat(coords);\n                stops.forEach(function (x) {\n                    a.push(x.offset, x.color.a);\n                });\n                hash = makeHash(a);\n                opacity = pdf.GRAD_OPC[hash];\n            }\n            if (!opacity) {\n                opacity = new PDFDictionary({\n                    Type: _('ExtGState'),\n                    AIS: false,\n                    CA: 1,\n                    ca: 1,\n                    SMask: {\n                        Type: _('Mask'),\n                        S: _('Luminosity'),\n                        G: pdf.attach(new PDFStream('/a0 gs /s0 sh', {\n                            Type: _('XObject'),\n                            Subtype: _('Form'),\n                            FormType: 1,\n                            BBox: box ? [\n                                box.left,\n                                box.top + box.height,\n                                box.left + box.width,\n                                box.top\n                            ] : [\n                                0,\n                                1,\n                                1,\n                                0\n                            ],\n                            Group: {\n                                Type: _('Group'),\n                                S: _('Transparency'),\n                                CS: _('DeviceGray'),\n                                I: true\n                            },\n                            Resources: {\n                                ExtGState: {\n                                    a0: {\n                                        CA: 1,\n                                        ca: 1\n                                    }\n                                },\n                                Shading: {\n                                    s0: {\n                                        ColorSpace: _('DeviceGray'),\n                                        Coords: coords,\n                                        Domain: [\n                                            0,\n                                            1\n                                        ],\n                                        ShadingType: isRadial ? 3 : 2,\n                                        Function: funcs,\n                                        Extend: [\n                                            true,\n                                            true\n                                        ]\n                                    }\n                                }\n                            }\n                        }))\n                    }\n                });\n                pdf.attach(opacity);\n                opacity._resourceName = 'O' + ++RESOURCE_COUNTER;\n                if (hash) {\n                    pdf.GRAD_OPC[hash] = opacity;\n                }\n            }\n            return opacity;\n        }\n        function cacheGradient(pdf, gradient, box) {\n            var isRadial = gradient.type == 'radial';\n            var funcs = makeGradientFunctions(pdf, gradient.stops);\n            var coords = isRadial ? [\n                gradient.start.x,\n                gradient.start.y,\n                gradient.start.r,\n                gradient.end.x,\n                gradient.end.y,\n                gradient.end.r\n            ] : [\n                gradient.start.x,\n                gradient.start.y,\n                gradient.end.x,\n                gradient.end.y\n            ];\n            var shading = cacheColorGradient(pdf, isRadial, gradient.stops, coords, funcs.colors, gradient.userSpace && box);\n            var opacity = funcs.hasAlpha ? cacheOpacityGradient(pdf, isRadial, gradient.stops, coords, funcs.opacities, gradient.userSpace && box) : null;\n            return {\n                hasAlpha: funcs.hasAlpha,\n                shading: shading,\n                opacity: opacity\n            };\n        }\n        var PDFPage = defclass(function PDFPage(pdf, props) {\n            this._pdf = pdf;\n            this._rcount = 0;\n            this._textMode = false;\n            this._fontResources = {};\n            this._gsResources = {};\n            this._xResources = {};\n            this._patResources = {};\n            this._shResources = {};\n            this._opacity = 1;\n            this._matrix = [\n                1,\n                0,\n                0,\n                1,\n                0,\n                0\n            ];\n            this._annotations = [];\n            this._font = null;\n            this._fontSize = null;\n            this._contextStack = [];\n            props = this.props = props || {};\n            props.Type = _('Page');\n            props.ProcSet = [\n                _('PDF'),\n                _('Text'),\n                _('ImageB'),\n                _('ImageC'),\n                _('ImageI')\n            ];\n            props.Resources = new PDFDictionary({\n                Font: new PDFDictionary(this._fontResources),\n                ExtGState: new PDFDictionary(this._gsResources),\n                XObject: new PDFDictionary(this._xResources),\n                Pattern: new PDFDictionary(this._patResources),\n                Shading: new PDFDictionary(this._shResources)\n            });\n            props.Annots = this._annotations;\n        }, {\n            _out: function () {\n                this._content.data.apply(null, arguments);\n            },\n            transform: function (a, b, c, d, e, f) {\n                if (!isIdentityMatrix(arguments)) {\n                    this._matrix = mmul(arguments, this._matrix);\n                    this._out(a, ' ', b, ' ', c, ' ', d, ' ', e, ' ', f, ' cm');\n                    this._out(NL);\n                }\n            },\n            translate: function (dx, dy) {\n                this.transform(1, 0, 0, 1, dx, dy);\n            },\n            scale: function (sx, sy) {\n                this.transform(sx, 0, 0, sy, 0, 0);\n            },\n            rotate: function (angle) {\n                var cos = Math.cos(angle), sin = Math.sin(angle);\n                this.transform(cos, sin, -sin, cos, 0, 0);\n            },\n            beginText: function () {\n                this._textMode = true;\n                this._out('BT', NL);\n            },\n            endText: function () {\n                this._textMode = false;\n                this._out('ET', NL);\n            },\n            _requireTextMode: function () {\n                if (!this._textMode) {\n                    throw new Error('Text mode required; call page.beginText() first');\n                }\n            },\n            _requireFont: function () {\n                if (!this._font) {\n                    throw new Error('No font selected; call page.setFont() first');\n                }\n            },\n            setFont: function (font, size) {\n                this._requireTextMode();\n                if (font == null) {\n                    font = this._font;\n                } else if (!(font instanceof PDFFont)) {\n                    font = this._pdf.getFont(font);\n                }\n                if (size == null) {\n                    size = this._fontSize;\n                }\n                this._fontResources[font._resourceName] = font;\n                this._font = font;\n                this._fontSize = size;\n                this._out(font._resourceName, ' ', size, ' Tf', NL);\n            },\n            setTextLeading: function (size) {\n                this._requireTextMode();\n                this._out(size, ' TL', NL);\n            },\n            setTextRenderingMode: function (mode) {\n                this._requireTextMode();\n                this._out(mode, ' Tr', NL);\n            },\n            showText: function (text, requestedWidth) {\n                this._requireFont();\n                if (text.length > 1 && requestedWidth && this._font instanceof PDFFont) {\n                    var outputWidth = this._font.getTextWidth(this._fontSize, text);\n                    var scale = requestedWidth / outputWidth * 100;\n                    this._out(scale, ' Tz ');\n                }\n                this._out(this._font.encodeText(text), ' Tj', NL);\n            },\n            showTextNL: function (text) {\n                this._requireFont();\n                this._out(this._font.encodeText(text), ' \\'', NL);\n            },\n            addLink: function (uri, box) {\n                var ll = this._toPage({\n                    x: box.left,\n                    y: box.bottom\n                });\n                var ur = this._toPage({\n                    x: box.right,\n                    y: box.top\n                });\n                this._annotations.push(new PDFDictionary({\n                    Type: _('Annot'),\n                    Subtype: _('Link'),\n                    Rect: [\n                        ll.x,\n                        ll.y,\n                        ur.x,\n                        ur.y\n                    ],\n                    Border: [\n                        0,\n                        0,\n                        0\n                    ],\n                    A: new PDFDictionary({\n                        Type: _('Action'),\n                        S: _('URI'),\n                        URI: new PDFString(uri)\n                    })\n                }));\n            },\n            setStrokeColor: function (r, g, b) {\n                this._out(r, ' ', g, ' ', b, ' RG', NL);\n            },\n            setOpacity: function (opacity) {\n                this.setFillOpacity(opacity);\n                this.setStrokeOpacity(opacity);\n                this._opacity *= opacity;\n            },\n            setStrokeOpacity: function (opacity) {\n                if (opacity < 1) {\n                    var gs = this._pdf.getOpacityGS(this._opacity * opacity, true);\n                    this._gsResources[gs._resourceName] = gs;\n                    this._out(gs._resourceName, ' gs', NL);\n                }\n            },\n            setFillColor: function (r, g, b) {\n                this._out(r, ' ', g, ' ', b, ' rg', NL);\n            },\n            setFillOpacity: function (opacity) {\n                if (opacity < 1) {\n                    var gs = this._pdf.getOpacityGS(this._opacity * opacity, false);\n                    this._gsResources[gs._resourceName] = gs;\n                    this._out(gs._resourceName, ' gs', NL);\n                }\n            },\n            gradient: function (gradient, box) {\n                this.save();\n                this.rect(box.left, box.top, box.width, box.height);\n                this.clip();\n                if (!gradient.userSpace) {\n                    this.transform(box.width, 0, 0, box.height, box.left, box.top);\n                }\n                var g = cacheGradient(this._pdf, gradient, box);\n                var sname = g.shading._resourceName, oname;\n                this._shResources[sname] = g.shading;\n                if (g.hasAlpha) {\n                    oname = g.opacity._resourceName;\n                    this._gsResources[oname] = g.opacity;\n                    this._out('/' + oname + ' gs ');\n                }\n                this._out('/' + sname + ' sh', NL);\n                this.restore();\n            },\n            setDashPattern: function (dashArray, dashPhase) {\n                this._out(dashArray, ' ', dashPhase, ' d', NL);\n            },\n            setLineWidth: function (width) {\n                this._out(width, ' w', NL);\n            },\n            setLineCap: function (lineCap) {\n                this._out(lineCap, ' J', NL);\n            },\n            setLineJoin: function (lineJoin) {\n                this._out(lineJoin, ' j', NL);\n            },\n            setMitterLimit: function (mitterLimit) {\n                this._out(mitterLimit, ' M', NL);\n            },\n            save: function () {\n                this._contextStack.push(this._context());\n                this._out('q', NL);\n            },\n            restore: function () {\n                this._out('Q', NL);\n                this._context(this._contextStack.pop());\n            },\n            moveTo: function (x, y) {\n                this._out(x, ' ', y, ' m', NL);\n            },\n            lineTo: function (x, y) {\n                this._out(x, ' ', y, ' l', NL);\n            },\n            bezier: function (x1, y1, x2, y2, x3, y3) {\n                this._out(x1, ' ', y1, ' ', x2, ' ', y2, ' ', x3, ' ', y3, ' c', NL);\n            },\n            bezier1: function (x1, y1, x3, y3) {\n                this._out(x1, ' ', y1, ' ', x3, ' ', y3, ' y', NL);\n            },\n            bezier2: function (x2, y2, x3, y3) {\n                this._out(x2, ' ', y2, ' ', x3, ' ', y3, ' v', NL);\n            },\n            close: function () {\n                this._out('h', NL);\n            },\n            rect: function (x, y, w, h) {\n                this._out(x, ' ', y, ' ', w, ' ', h, ' re', NL);\n            },\n            ellipse: function (x, y, rx, ry) {\n                function _X(v) {\n                    return x + v;\n                }\n                function _Y(v) {\n                    return y + v;\n                }\n                var k = 0.5522847498307936;\n                this.moveTo(_X(0), _Y(ry));\n                this.bezier(_X(rx * k), _Y(ry), _X(rx), _Y(ry * k), _X(rx), _Y(0));\n                this.bezier(_X(rx), _Y(-ry * k), _X(rx * k), _Y(-ry), _X(0), _Y(-ry));\n                this.bezier(_X(-rx * k), _Y(-ry), _X(-rx), _Y(-ry * k), _X(-rx), _Y(0));\n                this.bezier(_X(-rx), _Y(ry * k), _X(-rx * k), _Y(ry), _X(0), _Y(ry));\n            },\n            circle: function (x, y, r) {\n                this.ellipse(x, y, r, r);\n            },\n            stroke: function () {\n                this._out('S', NL);\n            },\n            nop: function () {\n                this._out('n', NL);\n            },\n            clip: function () {\n                this._out('W n', NL);\n            },\n            clipStroke: function () {\n                this._out('W S', NL);\n            },\n            closeStroke: function () {\n                this._out('s', NL);\n            },\n            fill: function () {\n                this._out('f', NL);\n            },\n            fillStroke: function () {\n                this._out('B', NL);\n            },\n            drawImage: function (url) {\n                var img = this._pdf.getImage(url);\n                if (img) {\n                    this._xResources[img._resourceName] = img;\n                    this._out(img._resourceName, ' Do', NL);\n                }\n            },\n            comment: function (txt) {\n                var self = this;\n                txt.split(/\\r?\\n/g).forEach(function (line) {\n                    self._out('% ', line, NL);\n                });\n            },\n            _context: function (val) {\n                if (val != null) {\n                    this._opacity = val.opacity;\n                    this._matrix = val.matrix;\n                } else {\n                    return {\n                        opacity: this._opacity,\n                        matrix: this._matrix\n                    };\n                }\n            },\n            _toPage: function (p) {\n                var m = this._matrix;\n                var a = m[0], b = m[1], c = m[2], d = m[3], e = m[4], f = m[5];\n                return {\n                    x: a * p.x + c * p.y + e,\n                    y: b * p.x + d * p.y + f\n                };\n            }\n        }, PDFDictionary);\n        function unquote(str) {\n            return str.replace(/^\\s*(['\"])(.*)\\1\\s*$/, '$2');\n        }\n        function parseFontDef(fontdef) {\n            var rx = /^\\s*((normal|italic)\\s+)?((normal|small-caps)\\s+)?((normal|bold|\\d+)\\s+)?(([0-9.]+)(px|pt))(\\/(([0-9.]+)(px|pt)|normal))?\\s+(.*?)\\s*$/i;\n            var m = rx.exec(fontdef);\n            if (!m) {\n                return {\n                    fontSize: 12,\n                    fontFamily: 'sans-serif'\n                };\n            }\n            var fontSize = m[8] ? parseInt(m[8], 10) : 12;\n            return {\n                italic: m[2] && m[2].toLowerCase() == 'italic',\n                variant: m[4],\n                bold: m[6] && /bold|700/i.test(m[6]),\n                fontSize: fontSize,\n                lineHeight: m[12] ? m[12] == 'normal' ? fontSize : parseInt(m[12], 10) : null,\n                fontFamily: m[14].split(/\\s*,\\s*/g).map(unquote)\n            };\n        }\n        function getFontURL(style) {\n            function mkFamily(name) {\n                if (style.bold) {\n                    name += '|bold';\n                }\n                if (style.italic) {\n                    name += '|italic';\n                }\n                return name.toLowerCase();\n            }\n            var fontFamily = style.fontFamily;\n            var name, url;\n            if (fontFamily instanceof Array) {\n                for (var i = 0; i < fontFamily.length; ++i) {\n                    name = mkFamily(fontFamily[i]);\n                    url = FONT_MAPPINGS[name];\n                    if (url) {\n                        break;\n                    }\n                }\n            } else {\n                url = FONT_MAPPINGS[fontFamily.toLowerCase()];\n            }\n            while (typeof url == 'function') {\n                url = url();\n            }\n            if (!url) {\n                url = 'Times-Roman';\n            }\n            return url;\n        }\n        var FONT_MAPPINGS = {\n            'serif': 'Times-Roman',\n            'serif|bold': 'Times-Bold',\n            'serif|italic': 'Times-Italic',\n            'serif|bold|italic': 'Times-BoldItalic',\n            'sans-serif': 'Helvetica',\n            'sans-serif|bold': 'Helvetica-Bold',\n            'sans-serif|italic': 'Helvetica-Oblique',\n            'sans-serif|bold|italic': 'Helvetica-BoldOblique',\n            'monospace': 'Courier',\n            'monospace|bold': 'Courier-Bold',\n            'monospace|italic': 'Courier-Oblique',\n            'monospace|bold|italic': 'Courier-BoldOblique',\n            'zapfdingbats': 'ZapfDingbats',\n            'zapfdingbats|bold': 'ZapfDingbats',\n            'zapfdingbats|italic': 'ZapfDingbats',\n            'zapfdingbats|bold|italic': 'ZapfDingbats'\n        };\n        function fontAlias(alias, name) {\n            alias = alias.toLowerCase();\n            FONT_MAPPINGS[alias] = function () {\n                return FONT_MAPPINGS[name];\n            };\n            FONT_MAPPINGS[alias + '|bold'] = function () {\n                return FONT_MAPPINGS[name + '|bold'];\n            };\n            FONT_MAPPINGS[alias + '|italic'] = function () {\n                return FONT_MAPPINGS[name + '|italic'];\n            };\n            FONT_MAPPINGS[alias + '|bold|italic'] = function () {\n                return FONT_MAPPINGS[name + '|bold|italic'];\n            };\n        }\n        fontAlias('Times New Roman', 'serif');\n        fontAlias('Courier New', 'monospace');\n        fontAlias('Arial', 'sans-serif');\n        fontAlias('Helvetica', 'sans-serif');\n        fontAlias('Verdana', 'sans-serif');\n        fontAlias('Tahoma', 'sans-serif');\n        fontAlias('Georgia', 'sans-serif');\n        fontAlias('Monaco', 'monospace');\n        fontAlias('Andale Mono', 'monospace');\n        function defineFont(name, url) {\n            if (arguments.length == 1) {\n                for (var i in name) {\n                    if (hasOwnProperty(name, i)) {\n                        defineFont(i, name[i]);\n                    }\n                }\n            } else {\n                name = name.toLowerCase();\n                FONT_MAPPINGS[name] = url;\n                switch (name) {\n                case 'dejavu sans':\n                    FONT_MAPPINGS['sans-serif'] = url;\n                    break;\n                case 'dejavu sans|bold':\n                    FONT_MAPPINGS['sans-serif|bold'] = url;\n                    break;\n                case 'dejavu sans|italic':\n                    FONT_MAPPINGS['sans-serif|italic'] = url;\n                    break;\n                case 'dejavu sans|bold|italic':\n                    FONT_MAPPINGS['sans-serif|bold|italic'] = url;\n                    break;\n                case 'dejavu serif':\n                    FONT_MAPPINGS['serif'] = url;\n                    break;\n                case 'dejavu serif|bold':\n                    FONT_MAPPINGS['serif|bold'] = url;\n                    break;\n                case 'dejavu serif|italic':\n                    FONT_MAPPINGS['serif|italic'] = url;\n                    break;\n                case 'dejavu serif|bold|italic':\n                    FONT_MAPPINGS['serif|bold|italic'] = url;\n                    break;\n                case 'dejavu mono':\n                    FONT_MAPPINGS['monospace'] = url;\n                    break;\n                case 'dejavu mono|bold':\n                    FONT_MAPPINGS['monospace|bold'] = url;\n                    break;\n                case 'dejavu mono|italic':\n                    FONT_MAPPINGS['monospace|italic'] = url;\n                    break;\n                case 'dejavu mono|bold|italic':\n                    FONT_MAPPINGS['monospace|bold|italic'] = url;\n                    break;\n                }\n            }\n        }\n        function mmul(a, b) {\n            var a1 = a[0], b1 = a[1], c1 = a[2], d1 = a[3], e1 = a[4], f1 = a[5];\n            var a2 = b[0], b2 = b[1], c2 = b[2], d2 = b[3], e2 = b[4], f2 = b[5];\n            return [\n                a1 * a2 + b1 * c2,\n                a1 * b2 + b1 * d2,\n                c1 * a2 + d1 * c2,\n                c1 * b2 + d1 * d2,\n                e1 * a2 + f1 * c2 + e2,\n                e1 * b2 + f1 * d2 + f2\n            ];\n        }\n        function isIdentityMatrix(m) {\n            return m[0] === 1 && m[1] === 0 && m[2] === 0 && m[3] === 1 && m[4] === 0 && m[5] === 0;\n        }\n        var TEXT_RENDERING_MODE = {\n            fill: 0,\n            stroke: 1,\n            fillAndStroke: 2,\n            invisible: 3,\n            fillAndClip: 4,\n            strokeAndClip: 5,\n            fillStrokeClip: 6,\n            clip: 7\n        };\n        var TEXT_RENDERING_MODE$1 = TEXT_RENDERING_MODE;\n        var DASH_PATTERNS = {\n            dash: [4],\n            dashDot: [\n                4,\n                2,\n                1,\n                2\n            ],\n            dot: [\n                1,\n                2\n            ],\n            longDash: [\n                8,\n                2\n            ],\n            longDashDot: [\n                8,\n                2,\n                1,\n                2\n            ],\n            longDashDotDot: [\n                8,\n                2,\n                1,\n                2,\n                1,\n                2\n            ],\n            solid: []\n        };\n        var LINE_CAP = {\n            butt: 0,\n            round: 1,\n            square: 2\n        };\n        var LINE_JOIN = {\n            miter: 0,\n            round: 1,\n            bevel: 2\n        };\n        function render(group, callback) {\n            var fonts = [], images = [], options = group.options;\n            function getOption(name, defval, hash) {\n                if (!hash) {\n                    hash = options;\n                }\n                if (hash.pdf && hash.pdf[name] != null) {\n                    return hash.pdf[name];\n                }\n                return defval;\n            }\n            var multiPage = getOption('multiPage');\n            group.traverse(function (element) {\n                dispatch({\n                    Image: function (element) {\n                        if (images.indexOf(element.src()) < 0) {\n                            images.push(element.src());\n                        }\n                    },\n                    Text: function (element) {\n                        var style = parseFontDef(element.options.font);\n                        var url = getFontURL(style);\n                        if (fonts.indexOf(url) < 0) {\n                            fonts.push(url);\n                        }\n                    }\n                }, element);\n            });\n            function doIt() {\n                if (--count > 0) {\n                    return;\n                }\n                var pdf = new PDFDocument({\n                    producer: getOption('producer'),\n                    title: getOption('title'),\n                    author: getOption('author'),\n                    subject: getOption('subject'),\n                    keywords: getOption('keywords'),\n                    creator: getOption('creator'),\n                    date: getOption('date')\n                });\n                function drawPage(group) {\n                    var options = group.options;\n                    var tmp = optimize(group);\n                    var bbox = tmp.bbox;\n                    group = tmp.root;\n                    var paperSize = getOption('paperSize', getOption('paperSize', 'auto'), options), addMargin = false;\n                    if (paperSize == 'auto') {\n                        if (bbox) {\n                            var size = bbox.getSize();\n                            paperSize = [\n                                size.width,\n                                size.height\n                            ];\n                            addMargin = true;\n                            var origin = bbox.getOrigin();\n                            tmp = new drawing.Group();\n                            tmp.transform(new kendoGeometry.Matrix(1, 0, 0, 1, -origin.x, -origin.y));\n                            tmp.append(group);\n                            group = tmp;\n                        } else {\n                            paperSize = 'A4';\n                        }\n                    }\n                    var page;\n                    page = pdf.addPage({\n                        paperSize: paperSize,\n                        margin: getOption('margin', getOption('margin'), options),\n                        addMargin: addMargin,\n                        landscape: getOption('landscape', getOption('landscape', false), options)\n                    });\n                    drawElement(group, page, pdf);\n                }\n                if (multiPage) {\n                    group.children.forEach(drawPage);\n                } else {\n                    drawPage(group);\n                }\n                callback(pdf.render(), pdf);\n            }\n            var count = 2;\n            loadFonts(fonts, doIt);\n            loadImages(images, doIt);\n        }\n        function toDataURL(group, callback) {\n            render(group, function (data) {\n                callback('data:application/pdf;base64,' + data.base64());\n            });\n        }\n        function toBlob(group, callback) {\n            render(group, function (data) {\n                callback(new window.Blob([data.get()], { type: 'application/pdf' }));\n            });\n        }\n        function saveAs$1(group, filename, proxy, callback) {\n            if (window.Blob && !supportBrowser.safari) {\n                toBlob(group, function (blob) {\n                    kendo.saveAs({\n                        dataURI: blob,\n                        fileName: filename\n                    });\n                    if (callback) {\n                        callback(blob);\n                    }\n                });\n            } else {\n                toDataURL(group, function (dataURL) {\n                    kendo.saveAs({\n                        dataURI: dataURL,\n                        fileName: filename,\n                        proxyURL: proxy\n                    });\n                    if (callback) {\n                        callback(dataURL);\n                    }\n                });\n            }\n        }\n        function dispatch(handlers, element) {\n            var handler = handlers[element.nodeType];\n            if (handler) {\n                return handler.call.apply(handler, arguments);\n            }\n            return element;\n        }\n        function drawElement(element, page, pdf) {\n            if (element.options._pdfDebug) {\n                page.comment('BEGIN: ' + element.options._pdfDebug);\n            }\n            var transform = element.transform();\n            var opacity = element.opacity();\n            page.save();\n            if (opacity != null && opacity < 1) {\n                page.setOpacity(opacity);\n            }\n            setStrokeOptions(element, page, pdf);\n            setFillOptions(element, page, pdf);\n            if (transform) {\n                var m = transform.matrix();\n                page.transform(m.a, m.b, m.c, m.d, m.e, m.f);\n            }\n            setClipping(element, page, pdf);\n            dispatch({\n                Path: drawPath,\n                MultiPath: drawMultiPath,\n                Circle: drawCircle,\n                Arc: drawArc,\n                Text: drawText,\n                Image: drawImage,\n                Group: drawGroup,\n                Rect: drawRect\n            }, element, page, pdf);\n            page.restore();\n            if (element.options._pdfDebug) {\n                page.comment('END: ' + element.options._pdfDebug);\n            }\n        }\n        function setStrokeOptions(element, page) {\n            var stroke = element.stroke && element.stroke();\n            if (!stroke) {\n                return;\n            }\n            var color = stroke.color;\n            if (color) {\n                color = parseColor$1(color);\n                if (color == null) {\n                    return;\n                }\n                page.setStrokeColor(color.r, color.g, color.b);\n                if (color.a != 1) {\n                    page.setStrokeOpacity(color.a);\n                }\n            }\n            var width = stroke.width;\n            if (width != null) {\n                if (width === 0) {\n                    return;\n                }\n                page.setLineWidth(width);\n            }\n            var dashType = stroke.dashType;\n            if (dashType) {\n                page.setDashPattern(DASH_PATTERNS[dashType], 0);\n            }\n            var lineCap = stroke.lineCap;\n            if (lineCap) {\n                page.setLineCap(LINE_CAP[lineCap]);\n            }\n            var lineJoin = stroke.lineJoin;\n            if (lineJoin) {\n                page.setLineJoin(LINE_JOIN[lineJoin]);\n            }\n            var opacity = stroke.opacity;\n            if (opacity != null) {\n                page.setStrokeOpacity(opacity);\n            }\n        }\n        function setFillOptions(element, page) {\n            var fill = element.fill && element.fill();\n            if (!fill) {\n                return;\n            }\n            if (fill instanceof drawing.Gradient) {\n                return;\n            }\n            var color = fill.color;\n            if (color) {\n                color = parseColor$1(color);\n                if (color == null) {\n                    return;\n                }\n                page.setFillColor(color.r, color.g, color.b);\n                if (color.a != 1) {\n                    page.setFillOpacity(color.a);\n                }\n            }\n            var opacity = fill.opacity;\n            if (opacity != null) {\n                page.setFillOpacity(opacity);\n            }\n        }\n        function setClipping(element, page, pdf) {\n            var clip = element.clip();\n            if (clip) {\n                _drawPath(clip, page, pdf);\n                page.clip();\n            }\n        }\n        function shouldDraw(thing) {\n            return thing && (thing instanceof drawing.Gradient || thing.color && !/^(none|transparent)$/i.test(thing.color) && (thing.width == null || thing.width > 0) && (thing.opacity == null || thing.opacity > 0));\n        }\n        function maybeGradient(element, page, pdf, stroke) {\n            var fill = element.fill();\n            if (fill instanceof drawing.Gradient) {\n                if (stroke) {\n                    page.clipStroke();\n                } else {\n                    page.clip();\n                }\n                var isRadial = fill instanceof drawing.RadialGradient;\n                var start, end;\n                if (isRadial) {\n                    start = {\n                        x: fill.center().x,\n                        y: fill.center().y,\n                        r: 0\n                    };\n                    end = {\n                        x: fill.center().x,\n                        y: fill.center().y,\n                        r: fill.radius()\n                    };\n                } else {\n                    start = {\n                        x: fill.start().x,\n                        y: fill.start().y\n                    };\n                    end = {\n                        x: fill.end().x,\n                        y: fill.end().y\n                    };\n                }\n                var stops = fill.stops.elements().map(function (stop) {\n                    var offset = stop.offset();\n                    if (/%$/.test(offset)) {\n                        offset = parseFloat(offset) / 100;\n                    } else {\n                        offset = parseFloat(offset);\n                    }\n                    var color = parseColor$1(stop.color());\n                    color.a *= stop.opacity();\n                    return {\n                        offset: offset,\n                        color: color\n                    };\n                });\n                stops.unshift(stops[0]);\n                stops.push(stops[stops.length - 1]);\n                var gradient = {\n                    userSpace: fill.userSpace(),\n                    type: isRadial ? 'radial' : 'linear',\n                    start: start,\n                    end: end,\n                    stops: stops\n                };\n                var box = element.rawBBox();\n                var tl = box.topLeft(), size = box.getSize();\n                box = {\n                    left: tl.x,\n                    top: tl.y,\n                    width: size.width,\n                    height: size.height\n                };\n                page.gradient(gradient, box);\n                return true;\n            }\n        }\n        function maybeFillStroke(element, page, pdf) {\n            if (shouldDraw(element.fill()) && shouldDraw(element.stroke())) {\n                if (!maybeGradient(element, page, pdf, true)) {\n                    page.fillStroke();\n                }\n            } else if (shouldDraw(element.fill())) {\n                if (!maybeGradient(element, page, pdf, false)) {\n                    page.fill();\n                }\n            } else if (shouldDraw(element.stroke())) {\n                page.stroke();\n            } else {\n                page.nop();\n            }\n        }\n        function maybeDrawRect(path, page) {\n            var segments = path.segments;\n            if (segments.length == 4 && path.options.closed) {\n                var a = [];\n                for (var i = 0; i < segments.length; ++i) {\n                    if (segments[i].controlIn()) {\n                        return false;\n                    }\n                    a[i] = segments[i].anchor();\n                }\n                var isRect = a[0].y == a[1].y && a[1].x == a[2].x && a[2].y == a[3].y && a[3].x == a[0].x || a[0].x == a[1].x && a[1].y == a[2].y && a[2].x == a[3].x && a[3].y == a[0].y;\n                if (isRect) {\n                    page.rect(a[0].x, a[0].y, a[2].x - a[0].x, a[2].y - a[0].y);\n                    return true;\n                }\n            }\n        }\n        function _drawPath(element, page, pdf) {\n            var segments = element.segments;\n            if (segments.length === 0) {\n                return;\n            }\n            if (!maybeDrawRect(element, page, pdf)) {\n                for (var prev, i = 0; i < segments.length; ++i) {\n                    var seg = segments[i];\n                    var anchor = seg.anchor();\n                    if (!prev) {\n                        page.moveTo(anchor.x, anchor.y);\n                    } else {\n                        var prevOut = prev.controlOut();\n                        var controlIn = seg.controlIn();\n                        if (prevOut && controlIn) {\n                            page.bezier(prevOut.x, prevOut.y, controlIn.x, controlIn.y, anchor.x, anchor.y);\n                        } else {\n                            page.lineTo(anchor.x, anchor.y);\n                        }\n                    }\n                    prev = seg;\n                }\n                if (element.options.closed) {\n                    page.close();\n                }\n            }\n        }\n        function drawPath(element, page, pdf) {\n            _drawPath(element, page, pdf);\n            maybeFillStroke(element, page, pdf);\n        }\n        function drawMultiPath(element, page, pdf) {\n            var paths = element.paths;\n            for (var i = 0; i < paths.length; ++i) {\n                _drawPath(paths[i], page, pdf);\n            }\n            maybeFillStroke(element, page, pdf);\n        }\n        function drawCircle(element, page, pdf) {\n            var g = element.geometry();\n            page.circle(g.center.x, g.center.y, g.radius);\n            maybeFillStroke(element, page, pdf);\n        }\n        function drawArc(element, page, pdf) {\n            var points = element.geometry().curvePoints();\n            page.moveTo(points[0].x, points[0].y);\n            for (var i = 1; i < points.length;) {\n                page.bezier(points[i].x, points[i++].y, points[i].x, points[i++].y, points[i].x, points[i++].y);\n            }\n            maybeFillStroke(element, page, pdf);\n        }\n        function drawText(element, page) {\n            var style = parseFontDef(element.options.font);\n            var pos = element._position;\n            var mode;\n            if (element.fill() && element.stroke()) {\n                mode = TEXT_RENDERING_MODE$1.fillAndStroke;\n            } else if (element.fill()) {\n                mode = TEXT_RENDERING_MODE$1.fill;\n            } else if (element.stroke()) {\n                mode = TEXT_RENDERING_MODE$1.stroke;\n            }\n            page.transform(1, 0, 0, -1, pos.x, pos.y + style.fontSize);\n            page.beginText();\n            page.setFont(getFontURL(style), style.fontSize);\n            page.setTextRenderingMode(mode);\n            page.showText(element.content(), element._pdfRect ? element._pdfRect.width() : null);\n            page.endText();\n        }\n        function drawGroup(element, page, pdf) {\n            if (element._pdfLink) {\n                page.addLink(element._pdfLink.url, element._pdfLink);\n            }\n            var children = element.children;\n            for (var i = 0; i < children.length; ++i) {\n                drawElement(children[i], page, pdf);\n            }\n        }\n        function drawImage(element, page) {\n            var url = element.src();\n            if (!url) {\n                return;\n            }\n            var rect = element.rect();\n            var tl = rect.getOrigin();\n            var sz = rect.getSize();\n            page.transform(sz.width, 0, 0, -sz.height, tl.x, tl.y + sz.height);\n            page.drawImage(url);\n        }\n        function drawRect(element, page, pdf) {\n            var geometry = element.geometry();\n            page.rect(geometry.origin.x, geometry.origin.y, geometry.size.width, geometry.size.height);\n            maybeFillStroke(element, page, pdf);\n        }\n        function parseColor$1(value) {\n            var color = kendo.parseColor(value, true);\n            return color ? color.toRGB() : null;\n        }\n        function optimize(root) {\n            var clipbox = false;\n            var matrix = kendoGeometry.Matrix.unit();\n            var currentBox = null;\n            var changed;\n            do {\n                changed = false;\n                root = opt(root);\n            } while (root && changed);\n            return {\n                root: root,\n                bbox: currentBox\n            };\n            function change(newShape) {\n                changed = true;\n                return newShape;\n            }\n            function visible(shape) {\n                return shape.visible() && shape.opacity() > 0 && (shouldDraw(shape.fill()) || shouldDraw(shape.stroke()));\n            }\n            function optArray(a) {\n                var b = [];\n                for (var i = 0; i < a.length; ++i) {\n                    var el = opt(a[i]);\n                    if (el != null) {\n                        b.push(el);\n                    }\n                }\n                return b;\n            }\n            function withClipping(shape, f) {\n                var saveclipbox = clipbox;\n                var savematrix = matrix;\n                if (shape.transform()) {\n                    matrix = matrix.multiplyCopy(shape.transform().matrix());\n                }\n                var clip = shape.clip();\n                if (clip) {\n                    clip = clip.bbox();\n                    if (clip) {\n                        clip = clip.bbox(matrix);\n                        clipbox = clipbox ? kendoGeometry.Rect.intersect(clipbox, clip) : clip;\n                    }\n                }\n                try {\n                    return f();\n                } finally {\n                    clipbox = saveclipbox;\n                    matrix = savematrix;\n                }\n            }\n            function inClipbox(shape) {\n                if (clipbox == null) {\n                    return false;\n                }\n                var box = shape.rawBBox().bbox(matrix);\n                if (clipbox && box) {\n                    box = kendoGeometry.Rect.intersect(box, clipbox);\n                }\n                return box;\n            }\n            function opt(shape) {\n                return withClipping(shape, function () {\n                    if (!(shape instanceof drawing.Group || shape instanceof drawing.MultiPath)) {\n                        var box = inClipbox(shape);\n                        if (!box) {\n                            return change(null);\n                        }\n                        currentBox = currentBox ? kendoGeometry.Rect.union(currentBox, box) : box;\n                    }\n                    return dispatch({\n                        Path: function (shape) {\n                            if (shape.segments.length === 0 || !visible(shape)) {\n                                return change(null);\n                            }\n                            return shape;\n                        },\n                        MultiPath: function (shape) {\n                            if (!visible(shape)) {\n                                return change(null);\n                            }\n                            var el = new drawing.MultiPath(shape.options);\n                            el.paths = optArray(shape.paths);\n                            if (el.paths.length === 0) {\n                                return change(null);\n                            }\n                            return el;\n                        },\n                        Circle: function (shape) {\n                            if (!visible(shape)) {\n                                return change(null);\n                            }\n                            return shape;\n                        },\n                        Arc: function (shape) {\n                            if (!visible(shape)) {\n                                return change(null);\n                            }\n                            return shape;\n                        },\n                        Text: function (shape) {\n                            if (!/\\S/.test(shape.content()) || !visible(shape)) {\n                                return change(null);\n                            }\n                            return shape;\n                        },\n                        Image: function (shape) {\n                            if (!(shape.visible() && shape.opacity() > 0)) {\n                                return change(null);\n                            }\n                            return shape;\n                        },\n                        Group: function (shape) {\n                            var el = new drawing.Group(shape.options);\n                            el.children = optArray(shape.children);\n                            el._pdfLink = shape._pdfLink;\n                            if (shape !== root && el.children.length === 0 && !shape._pdfLink) {\n                                return change(null);\n                            }\n                            return el;\n                        },\n                        Rect: function (shape) {\n                            if (!visible(shape)) {\n                                return change(null);\n                            }\n                            return shape;\n                        }\n                    }, shape);\n                });\n            }\n        }\n        function exportPDF(group, options) {\n            var promise = util.createPromise();\n            for (var i in options) {\n                if (i == 'margin' && group.options.pdf && group.options.pdf._ignoreMargin) {\n                    continue;\n                }\n                group.options.set('pdf.' + i, options[i]);\n            }\n            toDataURL(group, promise.resolve);\n            return promise;\n        }\n        kendo.deepExtend(kendo.pdf, {\n            Document: PDFDocument,\n            BinaryStream: BinaryStream,\n            defineFont: defineFont,\n            parseFontDef: parseFontDef,\n            getFontURL: getFontURL,\n            loadFonts: loadFonts,\n            loadImages: loadImages,\n            getPaperOptions: getPaperOptions,\n            TEXT_RENDERING_MODE: TEXT_RENDERING_MODE,\n            exportPDF: exportPDF,\n            saveAs: saveAs$1,\n            toDataURL: toDataURL,\n            toBlob: toBlob,\n            render: render\n        });\n        kendo.drawing.exportPDF = kendo.pdf.exportPDF;\n        kendo.drawing.pdf = kendo.pdf;\n    }(kendo));\n    return kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('pdf/mixins', ['pdf/core'], f);\n}(function () {\n    (function ($, undefined) {\n        kendo.PDFMixin = {\n            extend: function (proto) {\n                proto.events.push('pdfExport');\n                proto.options.pdf = this.options;\n                proto.saveAsPDF = this.saveAsPDF;\n                proto._drawPDF = this._drawPDF;\n                proto._drawPDFShadow = this._drawPDFShadow;\n            },\n            options: {\n                fileName: 'Export.pdf',\n                proxyURL: '',\n                paperSize: 'auto',\n                allPages: false,\n                landscape: false,\n                margin: null,\n                title: null,\n                author: null,\n                subject: null,\n                keywords: null,\n                creator: 'Kendo UI PDF Generator v.' + kendo.version,\n                date: null\n            },\n            saveAsPDF: function () {\n                var progress = new $.Deferred();\n                var promise = progress.promise();\n                var args = { promise: promise };\n                if (this.trigger('pdfExport', args)) {\n                    return;\n                }\n                var options = this.options.pdf;\n                options.multiPage = options.multiPage || options.allPages;\n                this._drawPDF(progress).then(function (root) {\n                    return kendo.drawing.exportPDF(root, options);\n                }).done(function (dataURI) {\n                    kendo.saveAs({\n                        dataURI: dataURI,\n                        fileName: options.fileName,\n                        proxyURL: options.proxyURL,\n                        forceProxy: options.forceProxy,\n                        proxyTarget: options.proxyTarget\n                    });\n                    progress.resolve();\n                }).fail(function (err) {\n                    progress.reject(err);\n                });\n                return promise;\n            },\n            _drawPDF: function (progress) {\n                var promise = new $.Deferred();\n                kendo.drawing.drawDOM(this.wrapper).done(function (group) {\n                    var args = {\n                        page: group,\n                        pageNumber: 1,\n                        progress: 1,\n                        totalPages: 1\n                    };\n                    progress.notify(args);\n                    promise.resolve(args.page);\n                }).fail(function (err) {\n                    promise.reject(err);\n                });\n                return promise;\n            },\n            _drawPDFShadow: function (settings, drawOptions) {\n                settings = settings || {};\n                var wrapper = this.wrapper;\n                var shadow = $('<div class=\\'k-pdf-export-shadow\\'>');\n                if (settings.width) {\n                    shadow.css({\n                        width: settings.width,\n                        overflow: 'visible'\n                    });\n                }\n                wrapper.before(shadow);\n                shadow.append(settings.content || wrapper.clone(true, true));\n                var defer = $.Deferred();\n                setTimeout(function () {\n                    var promise = kendo.drawing.drawDOM(shadow, drawOptions);\n                    promise.always(function () {\n                        shadow.remove();\n                    }).then(function () {\n                        defer.resolve.apply(defer, arguments);\n                    }).fail(function () {\n                        defer.reject.apply(defer, arguments);\n                    }).progress(function () {\n                        defer.progress.apply(defer, arguments);\n                    });\n                }, 15);\n                return defer.promise();\n            }\n        };\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.pdf', [\n        'kendo.core',\n        'kendo.drawing',\n        'pdf/core',\n        'pdf/mixins'\n    ], f);\n}(function () {\n    var __meta__ = {\n        id: 'pdf',\n        name: 'PDF export',\n        description: 'PDF Generation framework',\n        mixin: true,\n        category: 'framework',\n        depends: [\n            'core',\n            'drawing'\n        ]\n    };\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.grid', [\n        'kendo.data',\n        'kendo.columnsorter',\n        'kendo.editable',\n        'kendo.window',\n        'kendo.filtermenu',\n        'kendo.columnmenu',\n        'kendo.groupable',\n        'kendo.pager',\n        'kendo.selectable',\n        'kendo.sortable',\n        'kendo.reorderable',\n        'kendo.resizable',\n        'kendo.mobile.actionsheet',\n        'kendo.mobile.pane',\n        'kendo.ooxml',\n        'kendo.excel',\n        'kendo.progressbar',\n        'kendo.pdf'\n    ], f);\n}(function () {\n    var __meta__ = {\n        id: 'grid',\n        name: 'Grid',\n        category: 'web',\n        description: 'The Grid widget displays tabular data and offers rich support for interacting with data,including paging, sorting, grouping, and selection.',\n        depends: [\n            'data',\n            'columnsorter'\n        ],\n        features: [\n            {\n                id: 'grid-editing',\n                name: 'Editing',\n                description: 'Support for record editing',\n                depends: [\n                    'editable',\n                    'window'\n                ]\n            },\n            {\n                id: 'grid-filtering',\n                name: 'Filtering',\n                description: 'Support for record filtering',\n                depends: ['filtermenu']\n            },\n            {\n                id: 'grid-columnmenu',\n                name: 'Column menu',\n                description: 'Support for header column menu',\n                depends: ['columnmenu']\n            },\n            {\n                id: 'grid-grouping',\n                name: 'Grouping',\n                description: 'Support for grid grouping',\n                depends: ['groupable']\n            },\n            {\n                id: 'grid-filtercell',\n                name: 'Row filter',\n                description: 'Support for grid header filtering',\n                depends: ['filtercell']\n            },\n            {\n                id: 'grid-paging',\n                name: 'Paging',\n                description: 'Support for grid paging',\n                depends: ['pager']\n            },\n            {\n                id: 'grid-selection',\n                name: 'Selection',\n                description: 'Support for row selection',\n                depends: ['selectable']\n            },\n            {\n                id: 'grid-column-reorder',\n                name: 'Column reordering',\n                description: 'Support for column reordering',\n                depends: ['reorderable']\n            },\n            {\n                id: 'grid-column-resize',\n                name: 'Column resizing',\n                description: 'Support for column resizing',\n                depends: ['resizable']\n            },\n            {\n                id: 'grid-mobile',\n                name: 'Grid adaptive rendering',\n                description: 'Support for adaptive rendering',\n                depends: [\n                    'mobile.actionsheet',\n                    'mobile.pane'\n                ]\n            },\n            {\n                id: 'grid-excel-export',\n                name: 'Excel export',\n                description: 'Export grid data as Excel spreadsheet',\n                depends: ['excel']\n            },\n            {\n                id: 'grid-pdf-export',\n                name: 'PDF export',\n                description: 'Export grid data as PDF',\n                depends: [\n                    'pdf',\n                    'drawing',\n                    'progressbar'\n                ]\n            }\n        ]\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, ui = kendo.ui, DataSource = kendo.data.DataSource, tbodySupportsInnerHtml = kendo.support.tbodyInnerHtml, activeElement = kendo._activeElement, Widget = ui.Widget, outerWidth = kendo._outerWidth, outerHeight = kendo._outerHeight, keys = kendo.keys, isPlainObject = $.isPlainObject, extend = $.extend, map = $.map, grep = $.grep, isArray = $.isArray, inArray = $.inArray, push = Array.prototype.push, proxy = $.proxy, isFunction = kendo.isFunction, isEmptyObject = $.isEmptyObject, math = Math, PROGRESS = 'progress', ERROR = 'error', DATA_CELL = ':not(.k-group-cell):not(.k-hierarchy-cell):visible', SELECTION_CELL_SELECTOR = 'tbody>tr:not(.k-grouping-row):not(.k-detail-row):not(.k-group-footer) > td:not(.k-group-cell):not(.k-hierarchy-cell)', NAVROW = 'tr:not(.k-footer-template):visible', NAVCELL = ':not(.k-group-cell):not(.k-hierarchy-cell):visible', ITEMROW = 'tr:not(.k-grouping-row):not(.k-detail-row):not(.k-footer-template):not(.k-group-footer):visible', FIRSTNAVITEM = NAVROW + ':first>' + NAVCELL + ':first', HEADERCELLS = 'th.k-header:not(.k-group-cell):not(.k-hierarchy-cell)', NS = '.kendoGrid', EDIT = 'edit', BEFOREEDIT = 'beforeEdit', SAVE = 'save', REMOVE = 'remove', DETAILINIT = 'detailInit', FILTERMENUINIT = 'filterMenuInit', COLUMNMENUINIT = 'columnMenuInit', FILTERMENUOPEN = 'filterMenuOpen', COLUMNMENUOPEN = 'columnMenuOpen', CELLCLOSE = 'cellClose', CHANGE = 'change', COLUMNHIDE = 'columnHide', COLUMNSHOW = 'columnShow', SAVECHANGES = 'saveChanges', DATABOUND = 'dataBound', DETAILEXPAND = 'detailExpand', DETAILCOLLAPSE = 'detailCollapse', FOCUSED = 'k-state-focused', SELECTED = 'k-state-selected', CHECKBOX = 'k-checkbox', CHECKBOXINPUT = 'input[data-role=\\'checkbox\\'].' + CHECKBOX, NORECORDSCLASS = 'k-grid-norecords', COLUMNRESIZE = 'columnResize', COLUMNREORDER = 'columnReorder', COLUMNLOCK = 'columnLock', COLUMNUNLOCK = 'columnUnlock', NAVIGATE = 'navigate', CLICK = 'click', HEIGHT = 'height', TABINDEX = 'tabIndex', FUNCTION = 'function', STRING = 'string', DELETECONFIRM = 'Are you sure you want to delete this record?', NORECORDS = 'No records available.', CONFIRMDELETE = 'Delete', CANCELDELETE = 'Cancel', COLLAPSE = 'Collapse', EXPAND = 'Expand', ARIALABEL = 'aria-label', formatRegExp = /(\\}|\\#)/gi, templateHashRegExp = /#/gi, whitespaceRegExp = '[\\\\x20\\\\t\\\\r\\\\n\\\\f]', nonDataCellsRegExp = new RegExp('(^|' + whitespaceRegExp + ')' + '(k-group-cell|k-hierarchy-cell)' + '(' + whitespaceRegExp + '|$)'), filterRowRegExp = new RegExp('(^|' + whitespaceRegExp + ')' + '(k-filter-row)' + '(' + whitespaceRegExp + '|$)'), COMMANDBUTTONTMPL = '# if (iconClass) {#' + '<a role=\"button\" class=\"k-button k-button-icontext #=className#\" #=attr# href=\"\\\\#\"><span class=\"#=iconClass# #=imageClass#\"></span>#=text#</a>' + '# } else { #' + '<a role=\"button\" class=\"k-button k-button-icontext #=className#\" #=attr# href=\"\\\\#\">#=text#</a>' + '# } #', SELECTCOLUMNTMPL = '<input class=\"' + CHECKBOX + '\" data-role=\"checkbox\" aria-label=\"Select row\" aria-checked=\"false\" type=\"checkbox\"><label class=\"k-checkbox-label k-no-text\">&\\\\#8203;</label>', SELECTCOLUMNHEADERTMPL = '<input class=\"' + CHECKBOX + '\" data-role=\"checkbox\" aria-label=\"Select all rows\" aria-checked=\"false\" type=\"checkbox\"><label class=\"k-checkbox-label k-no-text\">&#8203;</label>', isRtl = false, browser = kendo.support.browser, isIE7 = browser.msie && browser.version == 7, isIE8 = browser.msie && browser.version == 8;\n        var VirtualScrollable = Widget.extend({\n            init: function (element, options) {\n                var that = this;\n                Widget.fn.init.call(that, element, options);\n                that._refreshHandler = proxy(that.refresh, that);\n                that.setDataSource(options.dataSource);\n                that.wrap();\n            },\n            setDataSource: function (dataSource) {\n                var that = this;\n                if (that.dataSource) {\n                    that.dataSource.unbind(CHANGE, that._refreshHandler);\n                }\n                that.dataSource = dataSource;\n                that.dataSource.bind(CHANGE, that._refreshHandler);\n            },\n            options: {\n                name: 'VirtualScrollable',\n                itemHeight: $.noop,\n                prefetch: true\n            },\n            destroy: function () {\n                var that = this;\n                Widget.fn.destroy.call(that);\n                that.dataSource.unbind(CHANGE, that._refreshHandler);\n                that.wrapper.add(that.verticalScrollbar).off(NS);\n                if (that.drag) {\n                    that.drag.destroy();\n                    that.drag = null;\n                }\n                that.wrapper = that.element = that.verticalScrollbar = null;\n                that._refreshHandler = null;\n            },\n            wrap: function () {\n                var that = this, scrollbar = kendo.support.scrollbar() + 1, element = that.element, wrapper;\n                element.css({\n                    width: 'auto',\n                    overflow: 'hidden'\n                }).css(isRtl ? 'padding-left' : 'padding-right', scrollbar);\n                that.content = element.children().first();\n                wrapper = that.wrapper = that.content.wrap('<div class=\"k-virtual-scrollable-wrap\"/>').parent().bind('DOMMouseScroll' + NS + ' mousewheel' + NS, proxy(that._wheelScroll, that));\n                if (kendo.support.kineticScrollNeeded) {\n                    that.drag = new kendo.UserEvents(that.wrapper, {\n                        global: true,\n                        start: function (e) {\n                            e.sender.capture();\n                        },\n                        move: function (e) {\n                            that.verticalScrollbar.scrollTop(that.verticalScrollbar.scrollTop() - e.y.delta);\n                            wrapper.scrollLeft(wrapper.scrollLeft() - e.x.delta);\n                            e.preventDefault();\n                        }\n                    });\n                }\n                that.verticalScrollbar = $('<div class=\"k-scrollbar k-scrollbar-vertical\" />').css({ width: scrollbar }).appendTo(element).bind('scroll' + NS, proxy(that._scroll, that));\n            },\n            _wheelScroll: function (e) {\n                if (e.ctrlKey) {\n                    return;\n                }\n                var scrollbar = this.verticalScrollbar, scrollTop = scrollbar.scrollTop(), delta = kendo.wheelDeltaY(e);\n                if (delta && !(delta > 0 && scrollTop === 0) && !(delta < 0 && scrollTop + scrollbar[0].clientHeight == scrollbar[0].scrollHeight)) {\n                    e.preventDefault();\n                    this.verticalScrollbar.scrollTop(scrollTop + -delta);\n                }\n            },\n            _scroll: function (e) {\n                var that = this, delayLoading = !that.options.prefetch, scrollTop = e.currentTarget.scrollTop, dataSource = that.dataSource, rowHeight = that.itemHeight, skip = dataSource.skip() || 0, start = that._rangeStart || skip, height = that.element.innerHeight(), isScrollingUp = !!(that._scrollbarTop && that._scrollbarTop > scrollTop), firstItemIndex = math.max(math.floor(scrollTop / rowHeight), 0), lastItemIndex = math.max(firstItemIndex + math.floor(height / rowHeight), 0);\n                that._scrollTop = scrollTop - start * rowHeight;\n                that._scrollbarTop = scrollTop;\n                that._scrolling = delayLoading;\n                if (!that._fetch(firstItemIndex, lastItemIndex, isScrollingUp)) {\n                    that.wrapper[0].scrollTop = that._scrollTop;\n                }\n                if (delayLoading) {\n                    if (that._scrollingTimeout) {\n                        clearTimeout(that._scrollingTimeout);\n                    }\n                    that._scrollingTimeout = setTimeout(function () {\n                        that._scrolling = false;\n                        that._page(that._rangeStart, that.dataSource.take());\n                    }, 100);\n                }\n            },\n            itemIndex: function (rowIndex) {\n                var rangeStart = this._rangeStart || this.dataSource.skip() || 0;\n                return rangeStart + rowIndex;\n            },\n            position: function (index) {\n                var rangeStart = this._rangeStart || this.dataSource.skip() || 0;\n                var pageSize = this.dataSource.pageSize();\n                var result;\n                if (index > rangeStart) {\n                    result = index - rangeStart + 1;\n                } else {\n                    result = rangeStart - index - 1;\n                }\n                return result > pageSize ? pageSize : result;\n            },\n            scrollIntoView: function (row) {\n                var container = this.wrapper[0];\n                var containerHeight = container.clientHeight;\n                var containerScroll = this._scrollTop || container.scrollTop;\n                var elementOffset = row[0].offsetTop;\n                var elementHeight = row[0].offsetHeight;\n                if (containerScroll > elementOffset) {\n                    this.verticalScrollbar[0].scrollTop -= containerHeight / 2;\n                } else if (elementOffset + elementHeight >= containerScroll + containerHeight) {\n                    this.verticalScrollbar[0].scrollTop += containerHeight / 2;\n                }\n            },\n            _fetch: function (firstItemIndex, lastItemIndex, scrollingUp) {\n                var that = this, dataSource = that.dataSource, itemHeight = that.itemHeight, take = dataSource.take(), rangeStart = that._rangeStart || dataSource.skip() || 0, currentSkip = math.floor(firstItemIndex / take) * take, fetching = false, prefetchAt = 0.33;\n                if (firstItemIndex < rangeStart) {\n                    fetching = true;\n                    rangeStart = math.max(0, lastItemIndex - take);\n                    that._scrollTop = (firstItemIndex - rangeStart) * itemHeight;\n                    that._page(rangeStart, take);\n                } else if (lastItemIndex >= rangeStart + take && !scrollingUp) {\n                    fetching = true;\n                    rangeStart = firstItemIndex;\n                    that._scrollTop = itemHeight;\n                    that._page(rangeStart, take);\n                } else if (!that._fetching && that.options.prefetch) {\n                    if (firstItemIndex < currentSkip + take - take * prefetchAt && firstItemIndex > take) {\n                        dataSource.prefetch(currentSkip - take, take, $.noop);\n                    }\n                    if (lastItemIndex > currentSkip + take * prefetchAt) {\n                        dataSource.prefetch(currentSkip + take, take, $.noop);\n                    }\n                }\n                return fetching;\n            },\n            fetching: function () {\n                return this._fetching;\n            },\n            _page: function (skip, take) {\n                var that = this, delayLoading = !that.options.prefetch, dataSource = that.dataSource;\n                clearTimeout(that._timeout);\n                that._fetching = true;\n                that._rangeStart = skip;\n                if (dataSource.inRange(skip, take)) {\n                    dataSource.range(skip, take);\n                } else {\n                    if (!delayLoading) {\n                        kendo.ui.progress(that.wrapper.parent(), true);\n                    }\n                    that._timeout = setTimeout(function () {\n                        if (!that._scrolling) {\n                            if (delayLoading) {\n                                kendo.ui.progress(that.wrapper.parent(), true);\n                            }\n                            dataSource.range(skip, take);\n                        }\n                    }, 100);\n                }\n            },\n            repaintScrollbar: function () {\n                var that = this, html = '', maxHeight = 250000, dataSource = that.dataSource, scrollbar = !kendo.support.kineticScrollNeeded ? kendo.support.scrollbar() : 0, wrapperElement = that.wrapper[0], totalHeight, idx, itemHeight;\n                itemHeight = that.itemHeight = that.options.itemHeight() || 0;\n                var addScrollBarHeight = wrapperElement.scrollWidth > wrapperElement.offsetWidth ? scrollbar : 0;\n                totalHeight = dataSource.total() * itemHeight + addScrollBarHeight;\n                for (idx = 0; idx < math.floor(totalHeight / maxHeight); idx++) {\n                    html += '<div style=\"width:1px;height:' + maxHeight + 'px\"></div>';\n                }\n                if (totalHeight % maxHeight) {\n                    html += '<div style=\"width:1px;height:' + totalHeight % maxHeight + 'px\"></div>';\n                }\n                that.verticalScrollbar.html(html);\n                wrapperElement.scrollTop = that._scrollTop;\n            },\n            refresh: function () {\n                var that = this, dataSource = that.dataSource, rangeStart = that._rangeStart;\n                kendo.ui.progress(that.wrapper.parent(), false);\n                clearTimeout(that._timeout);\n                that.repaintScrollbar();\n                if (that.drag) {\n                    that.drag.cancel();\n                }\n                if (rangeStart && !that._fetching) {\n                    that._rangeStart = dataSource.skip();\n                    if (dataSource.page() === 1) {\n                        that.verticalScrollbar[0].scrollTop = 0;\n                    }\n                }\n                that._fetching = false;\n            }\n        });\n        function groupCells(count) {\n            return new Array(count + 1).join('<td class=\"k-group-cell\">&nbsp;</td>');\n        }\n        function stringifyAttributes(attributes) {\n            var attr, result = ' ';\n            if (attributes) {\n                if (typeof attributes === STRING) {\n                    return attributes;\n                }\n                for (attr in attributes) {\n                    result += attr + '=\"' + attributes[attr] + '\"';\n                }\n            }\n            return result;\n        }\n        var defaultCommands = {\n            create: {\n                text: 'Add new record',\n                imageClass: 'k-i-plus',\n                className: 'k-grid-add',\n                iconClass: 'k-icon'\n            },\n            cancel: {\n                text: 'Cancel changes',\n                imageClass: 'k-i-cancel',\n                className: 'k-grid-cancel-changes',\n                iconClass: 'k-icon'\n            },\n            save: {\n                text: 'Save changes',\n                imageClass: 'k-i-check',\n                className: 'k-grid-save-changes',\n                iconClass: 'k-icon'\n            },\n            destroy: {\n                text: 'Delete',\n                imageClass: 'k-i-close',\n                className: 'k-grid-delete',\n                iconClass: 'k-icon'\n            },\n            edit: {\n                text: 'Edit',\n                imageClass: 'k-i-edit',\n                className: 'k-grid-edit',\n                iconClass: 'k-icon'\n            },\n            update: {\n                text: 'Update',\n                imageClass: 'k-i-check',\n                className: 'k-primary k-grid-update',\n                iconClass: 'k-icon'\n            },\n            canceledit: {\n                text: 'Cancel',\n                imageClass: 'k-i-cancel',\n                className: 'k-grid-cancel',\n                iconClass: 'k-icon'\n            },\n            excel: {\n                text: 'Export to Excel',\n                imageClass: 'k-i-file-excel',\n                className: 'k-grid-excel',\n                iconClass: 'k-icon'\n            },\n            pdf: {\n                text: 'Export to PDF',\n                imageClass: 'k-i-file-pdf',\n                className: 'k-grid-pdf',\n                iconClass: 'k-icon'\n            }\n        };\n        function cursor(context, value) {\n            $('th, th .k-grid-filter, th .k-link', context).add(document.body).css('cursor', value);\n        }\n        function reorder(selector, source, dest, before, count) {\n            var sourceIndex = source;\n            source = $();\n            count = count || 1;\n            for (var idx = 0; idx < count; idx++) {\n                source = source.add(selector.eq(sourceIndex + idx));\n            }\n            if (typeof dest == 'number') {\n                source[before ? 'insertBefore' : 'insertAfter'](selector.eq(dest));\n            } else {\n                source.appendTo(dest);\n            }\n        }\n        function elements(lockedContent, content, filter) {\n            return $(lockedContent).add(content).find(filter);\n        }\n        function attachCustomCommandEvent(context, container, commands) {\n            var idx, length, command, commandName;\n            commands = !isArray(commands) ? [commands] : commands;\n            for (idx = 0, length = commands.length; idx < length; idx++) {\n                command = commands[idx];\n                if (isPlainObject(command) && command.click) {\n                    commandName = command.name || command.text;\n                    container.on(CLICK + NS, 'a.k-grid-' + (commandName || '').replace(/\\s/g, ''), { commandName: commandName }, proxy(command.click, context));\n                }\n            }\n        }\n        function normalizeColumns(columns, encoded, hide) {\n            return map(columns, function (column) {\n                column = typeof column === STRING ? { field: column } : column;\n                var hidden;\n                if (!isVisible(column) || hide) {\n                    column.attributes = addHiddenStyle(column.attributes);\n                    column.footerAttributes = addHiddenStyle(column.footerAttributes);\n                    column.headerAttributes = addHiddenStyle(column.headerAttributes);\n                    hidden = true;\n                }\n                if (column.columns) {\n                    column.columns = normalizeColumns(column.columns, encoded, hidden);\n                }\n                var uid = kendo.guid();\n                column.headerAttributes = extend({ id: uid }, column.headerAttributes);\n                return extend({\n                    encoded: encoded,\n                    hidden: hidden\n                }, column);\n            });\n        }\n        function columnParent(column, columns) {\n            var parents = [];\n            columnParents(column, columns, parents);\n            return parents[parents.length - 1];\n        }\n        function columnParents(column, columns, parents) {\n            parents = parents || [];\n            for (var idx = 0; idx < columns.length; idx++) {\n                if (column === columns[idx]) {\n                    return true;\n                } else if (columns[idx].columns) {\n                    var inserted = parents.length;\n                    parents.push(columns[idx]);\n                    if (!columnParents(column, columns[idx].columns, parents)) {\n                        parents.splice(inserted, parents.length - inserted);\n                    } else {\n                        return true;\n                    }\n                }\n            }\n            return false;\n        }\n        function setColumnVisibility(column, visible) {\n            var method = visible ? removeHiddenStyle : addHiddenStyle;\n            column.hidden = !visible;\n            column.attributes = method(column.attributes);\n            column.footerAttributes = method(column.footerAttributes);\n            column.headerAttributes = method(column.headerAttributes);\n        }\n        function isCellVisible() {\n            return this.style.display !== 'none';\n        }\n        function isVisible(column) {\n            return visibleColumns([column]).length > 0;\n        }\n        function visibleColumns(columns) {\n            return grep(columns, function (column) {\n                var result = !column.hidden;\n                if (result && column.columns) {\n                    result = visibleColumns(column.columns).length > 0;\n                }\n                return result;\n            });\n        }\n        function toJQuery(elements) {\n            return $(elements).map(function () {\n                return this.toArray();\n            });\n        }\n        function updateCellRowSpan(cell, columns, sourceLockedColumnsCount) {\n            var lockedColumnDepth = depth(lockedColumns(columns));\n            var nonLockedColumnDepth = depth(nonLockedColumns(columns));\n            var rowSpan = cell.rowSpan;\n            if (sourceLockedColumnsCount) {\n                if (lockedColumnDepth > nonLockedColumnDepth) {\n                    cell.rowSpan = rowSpan - (lockedColumnDepth - nonLockedColumnDepth) || 1;\n                } else {\n                    cell.rowSpan = rowSpan + (nonLockedColumnDepth - lockedColumnDepth);\n                }\n            } else {\n                if (lockedColumnDepth > nonLockedColumnDepth) {\n                    cell.rowSpan = rowSpan + (lockedColumnDepth - nonLockedColumnDepth);\n                } else {\n                    cell.rowSpan = rowSpan - (nonLockedColumnDepth - lockedColumnDepth) || 1;\n                }\n            }\n        }\n        function moveCellsBetweenContainers(sources, target, leafs, columns, container, destination, groups) {\n            var sourcesDepth = depth(sources);\n            var targetDepth = depth([target]);\n            if (sourcesDepth > targetDepth) {\n                var groupCells = new Array(groups + 1).join('<th class=\"k-group-cell k-header\" scope=\"col\">&nbsp;</th>');\n                var rows = destination.children(':not(.k-filter-row)');\n                $(new Array(sourcesDepth - targetDepth + 1).join('<tr>' + groupCells + '</tr>')).insertAfter(rows.last());\n            }\n            addRowSpanValue(destination, sourcesDepth - targetDepth);\n            moveCells(leafs, columns, container, destination);\n        }\n        function updateCellIndex(thead, columns, offset) {\n            offset = offset || 0;\n            var position;\n            var cell;\n            var allColumns = columns;\n            columns = leafColumns(columns);\n            var cells = {};\n            var rows = thead.find('>tr:not(.k-filter-row)');\n            var filter = function () {\n                var el = $(this);\n                return !el.hasClass('k-group-cell') && !el.hasClass('k-hierarchy-cell');\n            };\n            for (var idx = 0, length = columns.length; idx < length; idx++) {\n                position = columnPosition(columns[idx], allColumns);\n                if (!cells[position.row]) {\n                    cells[position.row] = rows.eq(position.row).find('.k-header').filter(filter);\n                }\n                cell = cells[position.row].eq(position.cell);\n                cell.attr(kendo.attr('index'), offset + idx);\n            }\n            return columns.length;\n        }\n        function depth(columns) {\n            var result = 1;\n            var max = 0;\n            for (var idx = 0; idx < columns.length; idx++) {\n                if (columns[idx].columns) {\n                    var temp = depth(columns[idx].columns);\n                    if (temp > max) {\n                        max = temp;\n                    }\n                }\n            }\n            return result + max;\n        }\n        function moveCells(leafs, columns, container, destination) {\n            var sourcePosition = columnVisiblePosition(leafs[0], columns);\n            var ths = container.find('>tr:not(.k-filter-row):eq(' + sourcePosition.row + ')>th.k-header');\n            var t = $();\n            var sourceIndex = sourcePosition.cell;\n            var idx;\n            for (idx = 0; idx < leafs.length; idx++) {\n                t = t.add(ths.eq(sourceIndex + idx));\n            }\n            destination.find('>tr:not(.k-filter-row)').eq(sourcePosition.row).append(t);\n            var children = [];\n            for (idx = 0; idx < leafs.length; idx++) {\n                if (leafs[idx].columns) {\n                    children = children.concat(leafs[idx].columns);\n                }\n            }\n            if (children.length) {\n                moveCells(children, columns, container, destination);\n            }\n        }\n        function columnPosition(column, columns, row, cellCounts) {\n            var result;\n            var idx;\n            row = row || 0;\n            cellCounts = cellCounts || {};\n            cellCounts[row] = cellCounts[row] || 0;\n            for (idx = 0; idx < columns.length; idx++) {\n                if (columns[idx] == column) {\n                    result = {\n                        cell: cellCounts[row],\n                        row: row\n                    };\n                    break;\n                } else if (columns[idx].columns) {\n                    result = columnPosition(column, columns[idx].columns, row + 1, cellCounts);\n                    if (result) {\n                        break;\n                    }\n                }\n                cellCounts[row]++;\n            }\n            return result;\n        }\n        function findParentColumnWithChildren(columns, index, source, rtl) {\n            var target;\n            var locked = source.locked;\n            do {\n                target = columns[index];\n                index += rtl ? 1 : -1;\n            } while (target && index > -1 && index < columns.length && target != source && !target.columns && target.locked == locked);\n            return target;\n        }\n        function findReorderTarget(columns, target, source, before) {\n            if (target.columns) {\n                target = target.columns;\n                return target[before ? 0 : target.length - 1];\n            } else {\n                var parent = columnParent(target, columns);\n                var parentColumns;\n                if (parent) {\n                    parentColumns = parent.columns;\n                } else {\n                    parentColumns = columns;\n                }\n                var index = inArray(target, parentColumns);\n                if (index === 0 && before) {\n                    index++;\n                } else if (index == parentColumns.length - 1 && !before) {\n                    index--;\n                } else if (index > 0 || index === 0 && !before) {\n                    index += before ? -1 : 1;\n                }\n                var sourceIndex = inArray(source, parentColumns);\n                target = findParentColumnWithChildren(parentColumns, index, source, sourceIndex > index);\n                if (target && target != source && target.columns) {\n                    return findReorderTarget(columns, target, source, before);\n                }\n            }\n            return null;\n        }\n        function columnVisiblePosition(column, columns, row, cellCounts) {\n            var result;\n            var idx;\n            row = row || 0;\n            cellCounts = cellCounts || {};\n            cellCounts[row] = cellCounts[row] || 0;\n            for (idx = 0; idx < columns.length; idx++) {\n                if (columns[idx] == column) {\n                    result = {\n                        cell: cellCounts[row],\n                        row: row\n                    };\n                    break;\n                } else if (columns[idx].columns) {\n                    result = columnVisiblePosition(column, columns[idx].columns, row + 1, cellCounts);\n                    if (result) {\n                        break;\n                    }\n                }\n                if (!columns[idx].hidden) {\n                    cellCounts[row]++;\n                }\n            }\n            return result;\n        }\n        function flatColumnsInDomOrder(columns) {\n            var result = flatColumns(lockedColumns(columns));\n            return result.concat(flatColumns(nonLockedColumns(columns)));\n        }\n        function flatColumns(columns) {\n            var result = [];\n            var children = [];\n            for (var idx = 0; idx < columns.length; idx++) {\n                result.push(columns[idx]);\n                if (columns[idx].columns) {\n                    children = children.concat(columns[idx].columns);\n                }\n            }\n            if (children.length) {\n                result = result.concat(flatColumns(children));\n            }\n            return result;\n        }\n        function hiddenLeafColumnsCount(columns) {\n            var counter = 0;\n            var column;\n            for (var idx = 0; idx < columns.length; idx++) {\n                column = columns[idx];\n                if (column.columns) {\n                    counter += hiddenLeafColumnsCount(column.columns);\n                } else if (column.hidden) {\n                    counter++;\n                }\n            }\n            return counter;\n        }\n        function columnsWidth(cols) {\n            var colWidth, width = 0;\n            for (var idx = 0, length = cols.length; idx < length; idx++) {\n                colWidth = cols[idx].style.width;\n                if (colWidth && colWidth.indexOf('%') == -1) {\n                    width += parseInt(colWidth, 10);\n                }\n            }\n            return width;\n        }\n        function removeRowSpanValue(container, count) {\n            var cells = container.find('tr:not(.k-filter-row) th:not(.k-group-cell,.k-hierarchy-cell)');\n            var rowSpan;\n            for (var idx = 0; idx < cells.length; idx++) {\n                rowSpan = cells[idx].rowSpan;\n                if (rowSpan > 1) {\n                    cells[idx].rowSpan = rowSpan - count || 1;\n                }\n            }\n        }\n        function addRowSpanValue(container, count) {\n            var cells = container.find('tr:not(.k-filter-row) th:not(.k-group-cell,.k-hierarchy-cell)');\n            for (var idx = 0; idx < cells.length; idx++) {\n                cells[idx].rowSpan += count;\n            }\n        }\n        function removeEmptyRows(container) {\n            var rows = container.find('tr:not(.k-filter-row)');\n            var emptyRowsCount = rows.filter(function () {\n                return !$(this).children().length;\n            }).remove().length;\n            var cells = rows.find('th:not(.k-group-cell,.k-hierarchy-cell)');\n            for (var idx = 0; idx < cells.length; idx++) {\n                if (cells[idx].rowSpan > 1) {\n                    cells[idx].rowSpan -= emptyRowsCount;\n                }\n            }\n            return rows.length - emptyRowsCount;\n        }\n        function mapColumnToCellRows(columns, cells, rows, rowIndex, offset) {\n            var idx, row, length, children = [];\n            for (idx = 0, length = columns.length; idx < length; idx++) {\n                row = rows[rowIndex] || [];\n                row.push(cells.eq(offset + idx));\n                rows[rowIndex] = row;\n                if (columns[idx].columns) {\n                    children = children.concat(columns[idx].columns);\n                }\n            }\n            if (children.length) {\n                mapColumnToCellRows(children, cells, rows, rowIndex + 1, offset + columns.length);\n            }\n        }\n        function lockedColumns(columns) {\n            return grep(columns, function (column) {\n                return column.locked;\n            });\n        }\n        function nonLockedColumns(columns) {\n            return grep(columns, function (column) {\n                return !column.locked;\n            });\n        }\n        function visibleNonLockedColumns(columns) {\n            return grep(columns, function (column) {\n                return !column.locked && isVisible(column);\n            });\n        }\n        function visibleLockedColumns(columns) {\n            return grep(columns, function (column) {\n                return column.locked && isVisible(column);\n            });\n        }\n        function visibleLeafColumns(columns) {\n            var result = [];\n            for (var idx = 0; idx < columns.length; idx++) {\n                if (columns[idx].hidden) {\n                    continue;\n                }\n                if (columns[idx].columns) {\n                    result = result.concat(visibleLeafColumns(columns[idx].columns));\n                } else {\n                    result.push(columns[idx]);\n                }\n            }\n            return result;\n        }\n        function leafColumns(columns) {\n            var result = [];\n            for (var idx = 0; idx < columns.length; idx++) {\n                if (!columns[idx].columns) {\n                    result.push(columns[idx]);\n                    continue;\n                }\n                result = result.concat(leafColumns(columns[idx].columns));\n            }\n            return result;\n        }\n        function leafDataCells(container) {\n            var rows = container.find('>tr:not(.k-filter-row)');\n            var filter = function () {\n                var el = $(this);\n                return !el.hasClass('k-group-cell') && !el.hasClass('k-hierarchy-cell');\n            };\n            var cells = $();\n            if (rows.length > 1) {\n                cells = rows.find('th').filter(filter).filter(function () {\n                    return this.rowSpan > 1;\n                });\n            }\n            cells = cells.add(rows.last().find('th').filter(filter));\n            var indexAttr = kendo.attr('index');\n            cells.sort(function (a, b) {\n                a = $(a);\n                b = $(b);\n                var indexA = a.attr(indexAttr);\n                var indexB = b.attr(indexAttr);\n                if (indexA === undefined) {\n                    indexA = $(a).index();\n                }\n                if (indexB === undefined) {\n                    indexB = $(b).index();\n                }\n                indexA = parseInt(indexA, 10);\n                indexB = parseInt(indexB, 10);\n                return indexA > indexB ? 1 : indexA < indexB ? -1 : 0;\n            });\n            return cells;\n        }\n        function parentColumnsCells(cell) {\n            var container = cell.closest('table');\n            var result = $().add(cell);\n            var row = cell.closest('tr');\n            var headerRows = container.find('tr:not(.k-filter-row)');\n            var level = headerRows.index(row);\n            if (level > 0) {\n                var parent = headerRows.eq(level - 1);\n                var parentCellsWithChildren = parent.find('th:not(.k-group-cell,.k-hierarchy-cell)').filter(function () {\n                    return !$(this).attr('rowspan');\n                });\n                var offset = 0;\n                var index = row.find('th:not(.k-group-cell,.k-hierarchy-cell)').index(cell);\n                var prevCells = cell.prevAll(':not(.k-group-cell,.k-hierarchy-cell)').filter(function () {\n                    return this.colSpan > 1;\n                });\n                for (var idx = 0; idx < prevCells.length; idx++) {\n                    offset += prevCells[idx].colSpan || 1;\n                }\n                index += Math.max(offset - 1, 0);\n                offset = 0;\n                for (idx = 0; idx < parentCellsWithChildren.length; idx++) {\n                    var parentCell = parentCellsWithChildren.eq(idx);\n                    if (parentCell.attr('colSpan')) {\n                        offset += parentCell[0].colSpan;\n                    } else {\n                        offset += 1;\n                    }\n                    if (index >= idx && index < offset) {\n                        result = parentColumnsCells(parentCell).add(result);\n                        break;\n                    }\n                }\n            }\n            return result;\n        }\n        function childColumnsCells(cell) {\n            var container = cell.closest('thead');\n            var result = $().add(cell);\n            var row = cell.closest('tr');\n            var headerRows = container.find('tr:not(.k-filter-row)');\n            var level = headerRows.index(row) + cell[0].rowSpan;\n            var colSpanAttr = kendo.attr('colspan');\n            if (level <= headerRows.length - 1) {\n                var child = row.next();\n                var prevCells = cell.prevAll(':not(.k-group-cell,.k-hierarchy-cell)');\n                var idx;\n                prevCells = prevCells.filter(function () {\n                    return !this.rowSpan || this.rowSpan === 1;\n                });\n                var offset = 0;\n                for (idx = 0; idx < prevCells.length; idx++) {\n                    offset += parseInt(prevCells.eq(idx).attr(colSpanAttr), 10) || 1;\n                }\n                var cells = child.find('th:not(.k-group-cell,.k-hierarchy-cell)');\n                var colSpan = parseInt(cell.attr(colSpanAttr), 10) || 1;\n                idx = 0;\n                while (idx < colSpan) {\n                    child = cells.eq(idx + offset);\n                    result = result.add(childColumnsCells(child));\n                    var value = parseInt(child.attr(colSpanAttr), 10);\n                    if (value > 1) {\n                        colSpan -= value - 1;\n                    }\n                    idx++;\n                }\n            }\n            return result;\n        }\n        function appendContent(tbody, table, html, empty) {\n            var placeholder, tmp = tbody;\n            if (empty) {\n                tbody.empty();\n            }\n            if (tbodySupportsInnerHtml) {\n                tbody[0].innerHTML = html;\n            } else {\n                placeholder = document.createElement('div');\n                placeholder.innerHTML = '<table><tbody>' + html + '</tbody></table>';\n                tbody = placeholder.firstChild.firstChild;\n                table[0].replaceChild(tbody, tmp[0]);\n                tbody = $(tbody);\n            }\n            return tbody;\n        }\n        function addHiddenStyle(attr) {\n            attr = attr || {};\n            var style = attr.style;\n            if (!style) {\n                style = 'display:none';\n            } else {\n                style = style.replace(/((.*)?display)(.*)?:([^;]*)/i, '$1:none');\n                if (style === attr.style) {\n                    style = style.replace(/(.*)?/i, 'display:none;$1');\n                }\n            }\n            return extend({}, attr, { style: style });\n        }\n        function removeHiddenStyle(attr) {\n            attr = attr || {};\n            var style = attr.style;\n            if (style) {\n                attr.style = style.replace(/(display\\s*:\\s*none\\s*;?)*/gi, '');\n            }\n            return attr;\n        }\n        function normalizeCols(table, visibleColumns, hasDetails, groups) {\n            var colgroup = table.find('>colgroup'), width, cols = map(visibleColumns, function (column) {\n                    width = column.width;\n                    if (width && parseInt(width, 10) !== 0) {\n                        return kendo.format('<col style=\"width:{0}\"/>', typeof width === STRING ? width : width + 'px');\n                    }\n                    return '<col />';\n                });\n            if (hasDetails || colgroup.find('.k-hierarchy-col').length) {\n                cols.splice(0, 0, '<col class=\"k-hierarchy-col\" />');\n            }\n            if (colgroup.length) {\n                colgroup.remove();\n            }\n            colgroup = $(new Array(groups + 1).join('<col class=\"k-group-col\">') + cols.join(''));\n            if (!colgroup.is('colgroup')) {\n                colgroup = $('<colgroup/>').append(colgroup);\n            }\n            table.prepend(colgroup);\n            if (browser.msie && browser.version == 8) {\n                table.css('display', 'inline-table');\n                window.setTimeout(function () {\n                    table.css('display', '');\n                }, 1);\n            }\n        }\n        function normalizeHeaderCells(container, columns) {\n            var lastIndex = 0;\n            var idx, len;\n            var th = container.find('th:not(.k-group-cell)');\n            for (idx = 0, len = columns.length; idx < len; idx++) {\n                if (columns[idx].locked) {\n                    th.eq(idx).insertBefore(th.eq(lastIndex));\n                    th = container.find('th:not(.k-group-cell)');\n                    lastIndex++;\n                }\n            }\n        }\n        function convertToObject(array) {\n            var result = {}, item, idx, length;\n            for (idx = 0, length = array.length; idx < length; idx++) {\n                item = array[idx];\n                result[item.value] = item.text;\n            }\n            return result;\n        }\n        function formatGroupValue(value, format, columnValues, encoded) {\n            var isForeignKey = columnValues && columnValues.length && isPlainObject(columnValues[0]) && 'value' in columnValues[0], groupValue = isForeignKey ? convertToObject(columnValues)[value] : value;\n            groupValue = groupValue != null ? groupValue : '';\n            return format ? kendo.format(format, groupValue) : encoded === false ? groupValue : kendo.htmlEncode(groupValue);\n        }\n        function setCellVisibility(cells, index, visible) {\n            var pad = 0, state, cell = cells[pad];\n            while (cell) {\n                state = visible ? true : cell.style.display !== 'none';\n                if (state && !nonDataCellsRegExp.test(cell.className) && --index < 0) {\n                    cell.style.display = visible ? '' : 'none';\n                    break;\n                }\n                cell = cells[++pad];\n            }\n        }\n        function hideColumnCells(rows, columnIndex) {\n            var idx = 0, length = rows.length, cell, row;\n            for (; idx < length; idx += 1) {\n                row = rows.eq(idx);\n                if (row.is('.k-grouping-row,.k-detail-row')) {\n                    cell = row.children(':not(.k-group-cell):first,.k-detail-cell').last();\n                    cell.attr('colspan', parseInt(cell.attr('colspan'), 10) - 1);\n                } else {\n                    if (row.hasClass('k-grid-edit-row') && (cell = row.children('.k-edit-container')[0])) {\n                        cell = $(cell);\n                        cell.attr('colspan', parseInt(cell.attr('colspan'), 10) - 1);\n                        cell.find('col').eq(columnIndex).remove();\n                        row = cell.find('tr:first');\n                    }\n                    setCellVisibility(row[0].cells, columnIndex, false);\n                }\n            }\n        }\n        function groupRows(data) {\n            var result = [];\n            var item;\n            for (var idx = 0; idx < data.length; idx++) {\n                item = data[idx];\n                if (!('field' in item && 'value' in item && 'items' in item)) {\n                    break;\n                }\n                result.push(item);\n                if (item.hasSubgroups) {\n                    result = result.concat(groupRows(item.items));\n                }\n            }\n            return result;\n        }\n        function groupFooters(data) {\n            var result = [];\n            var item;\n            for (var idx = 0; idx < data.length; idx++) {\n                item = data[idx];\n                if (!('field' in item && 'value' in item && 'items' in item)) {\n                    break;\n                }\n                if (item.hasSubgroups) {\n                    result = result.concat(groupFooters(item.items));\n                }\n                result.push(item.aggregates);\n            }\n            return result;\n        }\n        function showColumnCells(rows, columnIndex) {\n            var idx = 0, length = rows.length, cell, row, columns;\n            for (; idx < length; idx += 1) {\n                row = rows.eq(idx);\n                if (row.is('.k-grouping-row,.k-detail-row')) {\n                    cell = row.children(':not(.k-group-cell):first,.k-detail-cell').last();\n                    cell.attr('colspan', parseInt(cell.attr('colspan'), 10) + 1);\n                } else {\n                    if (row.hasClass('k-grid-edit-row') && (cell = row.children('.k-edit-container')[0])) {\n                        cell = $(cell);\n                        cell.attr('colspan', parseInt(cell.attr('colspan'), 10) + 1);\n                        normalizeCols(cell.find('>form>table'), visibleColumns(columns), false, 0);\n                        row = cell.find('tr:first');\n                    }\n                    setCellVisibility(row[0].cells, columnIndex, true);\n                }\n            }\n        }\n        function updateColspan(toAdd, toRemove, num) {\n            num = num || 1;\n            var item, idx, length;\n            for (idx = 0, length = toAdd.length; idx < length; idx++) {\n                item = toAdd.eq(idx).children().last();\n                item.attr('colspan', parseInt(item.attr('colspan'), 10) + num);\n                item = toRemove.eq(idx).children().last();\n                item.attr('colspan', parseInt(item.attr('colspan'), 10) - num);\n            }\n        }\n        function tableWidth(table) {\n            var idx, length, width = 0;\n            var cols = table.find('>colgroup>col');\n            for (idx = 0, length = cols.length; idx < length; idx += 1) {\n                width += parseInt(cols[idx].style.width, 10);\n            }\n            return width;\n        }\n        var Grid = kendo.ui.DataBoundWidget.extend({\n            init: function (element, options, events) {\n                var that = this;\n                options = isArray(options) ? { dataSource: options } : options;\n                Widget.fn.init.call(that, element, options);\n                if (events) {\n                    that._events = events;\n                }\n                isRtl = kendo.support.isRtl(element);\n                that._element();\n                that._aria();\n                that._columns(that.options.columns);\n                that._dataSource();\n                that._tbody();\n                that._pageable();\n                that._thead();\n                that._groupable();\n                that._toolbar();\n                that._setContentHeight();\n                that._templates();\n                that._navigatable();\n                that._selectable();\n                that._clipboard();\n                that._details();\n                that._editable();\n                that._attachCustomCommandsEvent();\n                that._minScreenSupport();\n                if (that.options.autoBind) {\n                    that.dataSource.fetch();\n                } else {\n                    that._group = that._groups() > 0;\n                    that._footer();\n                }\n                if (that.lockedContent) {\n                    that.wrapper.addClass('k-grid-lockedcolumns');\n                    that._resizeHandler = function () {\n                        that.resize();\n                    };\n                    $(window).on('resize' + NS, that._resizeHandler);\n                }\n                kendo.notify(that);\n            },\n            events: [\n                CHANGE,\n                'dataBinding',\n                'cancel',\n                DATABOUND,\n                DETAILEXPAND,\n                DETAILCOLLAPSE,\n                DETAILINIT,\n                FILTERMENUINIT,\n                FILTERMENUOPEN,\n                COLUMNMENUINIT,\n                COLUMNMENUOPEN,\n                EDIT,\n                BEFOREEDIT,\n                SAVE,\n                REMOVE,\n                SAVECHANGES,\n                CELLCLOSE,\n                COLUMNRESIZE,\n                COLUMNREORDER,\n                COLUMNSHOW,\n                COLUMNHIDE,\n                COLUMNLOCK,\n                COLUMNUNLOCK,\n                NAVIGATE,\n                'page',\n                'sort',\n                'filter',\n                'group'\n            ],\n            setDataSource: function (dataSource) {\n                var that = this;\n                var scrollable = that.options.scrollable;\n                that.options.dataSource = dataSource;\n                that._dataSource();\n                that._pageable();\n                that._thead();\n                if (scrollable) {\n                    if (scrollable.virtual) {\n                        that.content.find('>.k-virtual-scrollable-wrap').scrollLeft(0);\n                    } else {\n                        that.content.scrollLeft(0);\n                    }\n                }\n                if (that.options.groupable) {\n                    that._groupable();\n                }\n                if (that.virtualScrollable) {\n                    that.virtualScrollable.setDataSource(that.options.dataSource);\n                }\n                if (that.options.navigatable) {\n                    that._navigatable();\n                }\n                if (that.options.selectable) {\n                    that._selectable();\n                }\n                if (that.options.autoBind) {\n                    dataSource.fetch();\n                }\n            },\n            options: {\n                name: 'Grid',\n                columns: [],\n                toolbar: null,\n                autoBind: true,\n                filterable: false,\n                scrollable: true,\n                sortable: false,\n                selectable: false,\n                allowCopy: false,\n                navigatable: false,\n                pageable: false,\n                persistSelection: false,\n                editable: false,\n                groupable: false,\n                rowTemplate: '',\n                altRowTemplate: '',\n                noRecords: false,\n                dataSource: {},\n                height: null,\n                resizable: false,\n                reorderable: false,\n                columnMenu: false,\n                detailTemplate: null,\n                columnResizeHandleWidth: 3,\n                mobile: '',\n                messages: {\n                    editable: {\n                        cancelDelete: CANCELDELETE,\n                        confirmation: DELETECONFIRM,\n                        confirmDelete: CONFIRMDELETE\n                    },\n                    commands: {\n                        create: defaultCommands.create.text,\n                        cancel: defaultCommands.cancel.text,\n                        save: defaultCommands.save.text,\n                        destroy: defaultCommands.destroy.text,\n                        edit: defaultCommands.edit.text,\n                        update: defaultCommands.update.text,\n                        canceledit: defaultCommands.canceledit.text,\n                        excel: defaultCommands.excel.text,\n                        pdf: defaultCommands.pdf.text\n                    },\n                    noRecords: NORECORDS,\n                    expandCollapseColumnHeader: ''\n                }\n            },\n            destroy: function () {\n                var that = this, element;\n                that._angularItems('cleanup');\n                that._destroyColumnAttachments();\n                Widget.fn.destroy.call(that);\n                this._navigatableTables = null;\n                if (that._resizeHandler) {\n                    $(window).off('resize' + NS, that._resizeHandler);\n                }\n                if (that.pager && that.pager.element) {\n                    that.pager.destroy();\n                }\n                that.pager = null;\n                if (that.groupable && that.groupable.element) {\n                    that.groupable.element.kendoGroupable('destroy');\n                }\n                that.groupable = null;\n                if (that.options.reorderable) {\n                    that.wrapper.data('kendoReorderable').destroy();\n                }\n                if (that.selectable && that.selectable.element) {\n                    that.selectable.destroy();\n                    that.clearArea();\n                    if (that.options.persistSelection === true) {\n                        that._selectedIds = null;\n                    }\n                    if (that.copyHandler) {\n                        that.wrapper.off('keydown', that.copyHandler);\n                        that.unbind(that.copyHandler);\n                    }\n                    if (that.updateClipBoardState) {\n                        that.unbind(that.updateClipBoardState);\n                        that.updateClipBoardState = null;\n                    }\n                    if (that.clearAreaHandler) {\n                        that.wrapper.off('keyup', that.clearAreaHandler);\n                    }\n                }\n                that.selectable = null;\n                if (that.resizable) {\n                    that.resizable.destroy();\n                    if (that._resizeUserEvents) {\n                        if (that._resizeHandleDocumentClickHandler) {\n                            $(document).off('click', that._resizeHandleDocumentClickHandler);\n                        }\n                        that._resizeUserEvents.destroy();\n                        that._resizeUserEvents = null;\n                    }\n                    that.resizable = null;\n                }\n                if (that.virtualScrollable && that.virtualScrollable.element) {\n                    that.virtualScrollable.destroy();\n                }\n                that.virtualScrollable = null;\n                that._destroyEditable();\n                if (that.dataSource) {\n                    that.dataSource.unbind(CHANGE, that._refreshHandler).unbind(PROGRESS, that._progressHandler).unbind(ERROR, that._errorHandler);\n                    that._refreshHandler = that._progressHandler = that._errorHandler = null;\n                }\n                element = that.element.add(that.wrapper).add(that.table).add(that.thead).add(that.wrapper.find('>.k-grid-toolbar'));\n                if (that.content) {\n                    element = element.add(that.content).add(that.content.find('>.k-virtual-scrollable-wrap'));\n                }\n                if (that.lockedHeader) {\n                    that._removeLockedContainers();\n                }\n                if (that.pane) {\n                    that.pane.destroy();\n                }\n                if (that.minScreenResizeHandler) {\n                    $(window).off('resize', that.minScreenResizeHandler);\n                }\n                if (that._draggableInstance && that._draggableInstance.element) {\n                    that._draggableInstance.destroy();\n                }\n                that._draggableInstance = null;\n                element.off(NS);\n                kendo.destroy(that.wrapper);\n                that.rowTemplate = that.altRowTemplate = that.lockedRowTemplate = that.lockedAltRowTemplate = that.detailTemplate = that.footerTemplate = that.groupFooterTemplate = that.lockedGroupFooterTemplate = that.noRecordsTemplate = null;\n                that.scrollables = that.thead = that.tbody = that.element = that.table = that.content = that.footer = that.wrapper = that.lockedTable = that.lockedContent = that.lockedHeader = that.lockedFooter = that._groupableClickHandler = that._setContentWidthHandler = null;\n            },\n            getOptions: function () {\n                var options = this.options;\n                options.dataSource = null;\n                var result = extend(true, {}, this.options);\n                result.columns = kendo.deepExtend([], this.columns);\n                var dataSource = this.dataSource;\n                var initialData = dataSource.options.data && dataSource._data;\n                dataSource.options.data = null;\n                result.dataSource = $.extend(true, {}, dataSource.options);\n                dataSource.options.data = initialData;\n                result.dataSource.data = initialData;\n                result.dataSource.page = dataSource.page();\n                result.dataSource.filter = dataSource.filter();\n                result.dataSource.pageSize = dataSource.pageSize();\n                result.dataSource.sort = dataSource.sort();\n                result.dataSource.group = dataSource.group();\n                result.dataSource.aggregate = dataSource.aggregate();\n                if (result.dataSource.transport) {\n                    result.dataSource.transport.dataSource = null;\n                }\n                if (result.pageable && result.pageable.pageSize) {\n                    result.pageable.pageSize = dataSource.pageSize();\n                }\n                result.$angular = undefined;\n                return result;\n            },\n            setOptions: function (options) {\n                var currentOptions = this.getOptions();\n                kendo.deepExtend(currentOptions, options);\n                if (!options.dataSource) {\n                    currentOptions.dataSource = this.dataSource;\n                }\n                var wrapper = this.wrapper;\n                var events = this._events;\n                var element = this.element;\n                this.destroy();\n                this.options = null;\n                if (this._isMobile) {\n                    var mobileWrapper = wrapper.closest(kendo.roleSelector('pane')).parent();\n                    mobileWrapper.after(wrapper);\n                    mobileWrapper.remove();\n                    wrapper.removeClass('k-grid-mobile');\n                }\n                if (wrapper[0] !== element[0]) {\n                    wrapper.before(element);\n                    wrapper.remove();\n                }\n                element.empty();\n                this.init(element, currentOptions, events);\n                this._setEvents(currentOptions);\n            },\n            items: function () {\n                if (this.lockedContent) {\n                    return this._items(this.tbody).add(this._items(this.lockedTable.children('tbody')));\n                } else {\n                    return this._items(this.tbody);\n                }\n            },\n            _items: function (container) {\n                return container.children().filter(function () {\n                    var tr = $(this);\n                    return !tr.hasClass('k-grouping-row') && !tr.hasClass('k-detail-row') && !tr.hasClass('k-group-footer');\n                });\n            },\n            dataItems: function () {\n                var dataItems = kendo.ui.DataBoundWidget.fn.dataItems.call(this);\n                if (this.lockedContent) {\n                    var n = dataItems.length, tmp = new Array(2 * n);\n                    for (var i = n; --i >= 0;) {\n                        tmp[i] = tmp[i + n] = dataItems[i];\n                    }\n                    dataItems = tmp;\n                }\n                return dataItems;\n            },\n            _destroyColumnAttachments: function () {\n                var that = this;\n                that.resizeHandle = null;\n                if (!that.thead) {\n                    return;\n                }\n                this.angular('cleanup', function () {\n                    return { elements: that.thead.get() };\n                });\n                that.thead.add(that.lockedHeader).find('th').each(function () {\n                    var th = $(this), filterMenu = th.data('kendoFilterMenu'), sortable = th.data('kendoColumnSorter'), columnMenu = th.data('kendoColumnMenu');\n                    if (filterMenu) {\n                        filterMenu.destroy();\n                    }\n                    if (sortable) {\n                        sortable.destroy();\n                    }\n                    if (columnMenu) {\n                        columnMenu.destroy();\n                    }\n                });\n            },\n            _attachCustomCommandsEvent: function () {\n                var that = this, columns = leafColumns(that.columns || []), command, idx, length;\n                for (idx = 0, length = columns.length; idx < length; idx++) {\n                    command = columns[idx].command;\n                    if (command) {\n                        attachCustomCommandEvent(that, that.wrapper, command);\n                    }\n                }\n            },\n            _aria: function () {\n                var id = this.element.attr('id') || 'aria';\n                if (id) {\n                    this._cellId = id + '_active_cell';\n                }\n            },\n            _element: function () {\n                var that = this, table = that.element;\n                if (!table.is('table')) {\n                    if (that.options.scrollable) {\n                        table = that.element.find('> .k-grid-content > table');\n                    } else {\n                        table = that.element.children('table');\n                    }\n                    if (!table.length) {\n                        table = $('<table />').appendTo(that.element);\n                    }\n                }\n                if (isIE7) {\n                    table.attr('cellspacing', 0);\n                }\n                that.table = table.attr('role', that._hasDetails() ? 'treegrid' : 'grid');\n                that._wrapper();\n            },\n            _createResizeHandle: function (container, th) {\n                var that = this;\n                var indicatorWidth = that.options.columnResizeHandleWidth;\n                var scrollable = that.options.scrollable;\n                var resizeHandle = that.resizeHandle;\n                var groups = this._groups();\n                var left;\n                if (resizeHandle && that.lockedContent && resizeHandle.data('th')[0] !== th[0]) {\n                    resizeHandle.off(NS).remove();\n                    resizeHandle = null;\n                }\n                if (!resizeHandle) {\n                    resizeHandle = that.resizeHandle = $('<div class=\"k-resize-handle\"><div class=\"k-resize-handle-inner\"></div></div>');\n                    container.append(resizeHandle);\n                }\n                if (!isRtl) {\n                    left = th[0].offsetWidth;\n                    var cells = leafDataCells(th.closest('thead')).filter(':visible');\n                    for (var idx = 0; idx < cells.length; idx++) {\n                        if (cells[idx] == th[0]) {\n                            break;\n                        }\n                        left += cells[idx].offsetWidth;\n                    }\n                    if (groups > 0) {\n                        left += outerWidth(container.find('.k-group-cell:first')) * groups;\n                    }\n                    if (that._hasDetails()) {\n                        left += outerWidth(container.find('.k-hierarchy-cell:first'));\n                    }\n                } else {\n                    left = th.position().left;\n                    if (scrollable) {\n                        var headerWrap = th.closest('.k-grid-header-wrap, .k-grid-header-locked'), ieCorrection = browser.msie ? headerWrap.scrollLeft() : 0, webkitCorrection = browser.webkit ? headerWrap[0].scrollWidth - headerWrap[0].offsetWidth - headerWrap.scrollLeft() : 0, firefoxCorrection = browser.mozilla ? headerWrap[0].scrollWidth - headerWrap[0].offsetWidth - (headerWrap[0].scrollWidth - headerWrap[0].offsetWidth - headerWrap.scrollLeft()) : 0;\n                        left -= webkitCorrection - firefoxCorrection + ieCorrection;\n                    }\n                }\n                resizeHandle.css({\n                    top: th.position().top,\n                    left: left - indicatorWidth,\n                    height: outerHeight(th),\n                    width: indicatorWidth * 3\n                }).data('th', th).show();\n                resizeHandle.off('dblclick' + NS).on('dblclick' + NS, function () {\n                    that._autoFitLeafColumn(th.data('index'));\n                });\n            },\n            _positionColumnResizeHandle: function () {\n                var that = this, indicatorWidth = that.options.columnResizeHandleWidth, lockedHead = that.lockedHeader ? that.lockedHeader.find('thead:first') : $();\n                that.thead.add(lockedHead).on('mousemove' + NS, 'th', function (e) {\n                    var th = $(this);\n                    if (th.hasClass('k-group-cell') || th.hasClass('k-hierarchy-cell')) {\n                        return;\n                    }\n                    function getPageZoomStyle() {\n                        var docZoom = parseFloat($(document.documentElement).css('zoom'));\n                        if (isNaN(docZoom)) {\n                            docZoom = 1;\n                        }\n                        var bodyZoom = parseFloat($(document.body).css('zoom'));\n                        if (isNaN(bodyZoom)) {\n                            bodyZoom = 1;\n                        }\n                        return docZoom * bodyZoom;\n                    }\n                    var clientX = e.clientX / getPageZoomStyle(), winScrollLeft = $(window).scrollLeft(), position = th.offset().left + (!isRtl ? this.offsetWidth : 0);\n                    if (clientX + winScrollLeft > position - indicatorWidth && clientX + winScrollLeft < position + indicatorWidth) {\n                        that._createResizeHandle(th.closest('div'), th);\n                    } else if (that.resizeHandle) {\n                        that.resizeHandle.hide();\n                    } else {\n                        cursor(that.wrapper, '');\n                    }\n                });\n            },\n            _resizeHandleDocumentClick: function (e) {\n                if ($(e.target).closest('.k-column-active').length) {\n                    return;\n                }\n                $(document).off(e);\n                this._hideResizeHandle();\n            },\n            _hideResizeHandle: function () {\n                if (this.resizeHandle) {\n                    this.resizeHandle.data('th').removeClass('k-column-active');\n                    if (this.lockedContent && !this._isMobile) {\n                        this.resizeHandle.off(NS).remove();\n                        this.resizeHandle = null;\n                    } else {\n                        this.resizeHandle.hide();\n                    }\n                }\n            },\n            _positionColumnResizeHandleTouch: function () {\n                var that = this, lockedHead = that.lockedHeader ? that.lockedHeader.find('thead:first') : $();\n                that._resizeUserEvents = new kendo.UserEvents(lockedHead.add(that.thead), {\n                    filter: 'th:not(.k-group-cell):not(.k-hierarchy-cell)',\n                    threshold: 10,\n                    hold: function (e) {\n                        var th = $(e.target);\n                        e.preventDefault();\n                        th.addClass('k-column-active');\n                        that._createResizeHandle(th.closest('div'), th);\n                        if (!that._resizeHandleDocumentClickHandler) {\n                            that._resizeHandleDocumentClickHandler = proxy(that._resizeHandleDocumentClick, that);\n                        }\n                        $(document).on('click', that._resizeHandleDocumentClickHandler);\n                    }\n                });\n            },\n            _resizable: function () {\n                var that = this, options = that.options, container, columnStart, columnWidth, columnMinWidth, gridWidth, isMobile = this._isMobile, scrollbar = !kendo.support.mobileOS ? kendo.support.scrollbar() : 0, isLocked, col, th;\n                if (options.resizable) {\n                    container = options.scrollable ? that.wrapper.find('.k-grid-header-wrap:first') : that.wrapper;\n                    if (isMobile) {\n                        that._positionColumnResizeHandleTouch(container);\n                    } else {\n                        that._positionColumnResizeHandle(container);\n                    }\n                    if (that.resizable) {\n                        that.resizable.destroy();\n                    }\n                    that.resizable = new ui.Resizable(container.add(that.lockedHeader), {\n                        handle: (!!options.scrollable ? '' : '>') + '.k-resize-handle',\n                        hint: function (handle) {\n                            return $('<div class=\"k-grid-resize-indicator\" />').css({ height: outerHeight(handle.data('th')) + that.tbody.attr('clientHeight') });\n                        },\n                        start: function (e) {\n                            th = $(e.currentTarget).data('th');\n                            if (isMobile) {\n                                that._hideResizeHandle();\n                            }\n                            var header = th.closest('table'), index = $.inArray(th[0], leafDataCells(th.closest('thead')).filter(':visible'));\n                            isLocked = header.parent().hasClass('k-grid-header-locked');\n                            var contentTable = isLocked ? that.lockedTable : that.table, footer = that.footer || $();\n                            if (that.footer && that.lockedContent) {\n                                footer = isLocked ? that.footer.children('.k-grid-footer-locked') : that.footer.children('.k-grid-footer-wrap');\n                            }\n                            cursor(that.wrapper, 'col-resize');\n                            if (options.scrollable) {\n                                col = header.find('col:not(.k-group-col):not(.k-hierarchy-col):eq(' + index + ')').add(contentTable.children('colgroup').find('col:not(.k-group-col):not(.k-hierarchy-col):eq(' + index + ')')).add(footer.find('colgroup').find('col:not(.k-group-col):not(.k-hierarchy-col):eq(' + index + ')'));\n                            } else {\n                                col = contentTable.children('colgroup').find('col:not(.k-group-col):not(.k-hierarchy-col):eq(' + index + ')');\n                            }\n                            columnStart = e.x.location;\n                            columnWidth = outerWidth(th);\n                            columnMinWidth = leafColumns(that.columns)[index].minResizableWidth || 10;\n                            gridWidth = isLocked ? outerWidth(contentTable.children('tbody')) : outerWidth(that.tbody);\n                            if (browser.webkit) {\n                                that.wrapper.addClass('k-grid-column-resizing');\n                            }\n                        },\n                        resize: function (e) {\n                            var rtlMultiplier = isRtl ? -1 : 1, currentWidth = columnWidth + e.x.location * rtlMultiplier - columnStart * rtlMultiplier;\n                            if (options.scrollable) {\n                                var footer;\n                                if (isLocked && that.lockedFooter) {\n                                    footer = that.lockedFooter.children('table');\n                                } else if (that.footer) {\n                                    footer = that.footer.find('>.k-grid-footer-wrap>table');\n                                }\n                                if (!footer || !footer[0]) {\n                                    footer = $();\n                                }\n                                var header = th.closest('table');\n                                var contentTable = isLocked ? that.lockedTable : that.table;\n                                var constrain = false;\n                                var totalWidth = that.wrapper.width() - scrollbar;\n                                var width = currentWidth;\n                                if (isLocked && gridWidth - columnWidth + width > totalWidth) {\n                                    width = columnWidth + (totalWidth - gridWidth - scrollbar * 2);\n                                    if (width < 0) {\n                                        width = currentWidth;\n                                    }\n                                    constrain = true;\n                                }\n                                if (width > 10 && width >= columnMinWidth) {\n                                    col.css('width', width);\n                                    if (gridWidth) {\n                                        if (constrain) {\n                                            width = totalWidth - scrollbar * 2;\n                                        } else {\n                                            width = gridWidth + e.x.location * rtlMultiplier - columnStart * rtlMultiplier;\n                                        }\n                                        contentTable.add(header).add(footer).css('width', width);\n                                        if (!isLocked) {\n                                            that._footerWidth = width;\n                                        }\n                                    }\n                                }\n                            } else if (currentWidth > 10 && currentWidth >= columnMinWidth) {\n                                col.css('width', currentWidth);\n                            }\n                        },\n                        resizeend: function () {\n                            var newWidth = outerWidth(th), column, header;\n                            cursor(that.wrapper, '');\n                            if (browser.webkit) {\n                                that.wrapper.removeClass('k-grid-column-resizing');\n                            }\n                            if (columnWidth != newWidth) {\n                                header = that.lockedHeader ? that.lockedHeader.find('thead:first tr:first').add(that.thead.find('tr:first')) : th.parent();\n                                var index = th.attr(kendo.attr('index'));\n                                if (!index) {\n                                    index = header.find('th:not(.k-group-cell):not(.k-hierarchy-cell)').index(th);\n                                }\n                                column = leafColumns(that.columns)[index];\n                                column.width = newWidth;\n                                that.trigger(COLUMNRESIZE, {\n                                    column: column,\n                                    oldWidth: columnWidth,\n                                    newWidth: newWidth\n                                });\n                                that._applyLockedContainersWidth();\n                                that._syncLockedContentHeight();\n                                that._syncLockedHeaderHeight();\n                            }\n                            that._hideResizeHandle();\n                            th = null;\n                        }\n                    });\n                }\n            },\n            _draggable: function () {\n                var that = this;\n                if (that.options.reorderable) {\n                    if (that._draggableInstance) {\n                        that._draggableInstance.destroy();\n                    }\n                    var header = that.wrapper.children('.k-grid-header');\n                    that._draggableInstance = that.wrapper.kendoDraggable({\n                        group: kendo.guid(),\n                        autoScroll: true,\n                        filter: that.content ? '.k-grid-header:first ' + HEADERCELLS : 'table:first>.k-grid-header ' + HEADERCELLS,\n                        dragstart: function () {\n                            header.children('.k-grid-header-wrap').unbind('scroll' + NS + 'scrolling').bind('scroll' + NS + 'scrolling', function (e) {\n                                if (that.virtualScrollable) {\n                                    that.content.find('>.k-virtual-scrollable-wrap').scrollLeft(this.scrollLeft);\n                                } else {\n                                    that.scrollables.not(e.currentTarget).scrollLeft(this.scrollLeft);\n                                }\n                            });\n                        },\n                        dragend: function () {\n                            header.children('.k-grid-header-wrap').unbind('scroll' + NS + 'scrolling');\n                        },\n                        drag: function () {\n                            that._hideResizeHandle();\n                        },\n                        hint: function (target) {\n                            var title = target.attr(kendo.attr('title'));\n                            if (title) {\n                                title = kendo.htmlEncode(title);\n                            }\n                            return $('<div class=\"k-header k-drag-clue\" />').css({\n                                width: target.width(),\n                                paddingLeft: target.css('paddingLeft'),\n                                paddingRight: target.css('paddingRight'),\n                                lineHeight: target.height() + 'px',\n                                paddingTop: target.css('paddingTop'),\n                                paddingBottom: target.css('paddingBottom')\n                            }).html(title || target.attr(kendo.attr('field')) || target.text()).prepend('<span class=\"k-icon k-drag-status k-i-cancel\" />');\n                        }\n                    }).data('kendoDraggable');\n                }\n            },\n            _reorderable: function () {\n                var that = this;\n                if (that.options.reorderable) {\n                    if (that.wrapper.data('kendoReorderable')) {\n                        that.wrapper.data('kendoReorderable').destroy();\n                    }\n                    var targetParentContainerIndex = function (columns, sourceIndex, targetIndex) {\n                        var column = columns[sourceIndex];\n                        var target = columns[targetIndex];\n                        var parent = columnParent(column, that.columns);\n                        columns = parent ? parent.columns : that.columns;\n                        return inArray(target, columns);\n                    };\n                    that.wrapper.kendoReorderable({\n                        draggable: that._draggableInstance,\n                        dragOverContainers: function (sourceIndex, targetIndex) {\n                            var columns = flatColumnsInDomOrder(that.columns);\n                            return columns[sourceIndex].lockable !== false && targetParentContainerIndex(columns, sourceIndex, targetIndex) > -1;\n                        },\n                        inSameContainer: function (e) {\n                            return $(e.source).parent()[0] === $(e.target).parent()[0] && targetParentContainerIndex(flatColumnsInDomOrder(that.columns), e.sourceIndex, e.targetIndex) > -1;\n                        },\n                        change: function (e) {\n                            var columns = flatColumnsInDomOrder(that.columns);\n                            var column = columns[e.oldIndex];\n                            var newIndex = targetParentContainerIndex(columns, e.oldIndex, e.newIndex);\n                            that.trigger(COLUMNREORDER, {\n                                newIndex: newIndex,\n                                oldIndex: inArray(column, columns),\n                                column: column\n                            });\n                            that.reorderColumn(newIndex, column, e.position === 'before');\n                        }\n                    });\n                }\n            },\n            _reorderHeader: function (sources, target, before) {\n                var that = this;\n                var sourcePosition = columnPosition(sources[0], that.columns);\n                var destPosition = columnPosition(target, that.columns);\n                var leafs = [];\n                for (var idx = 0; idx < sources.length; idx++) {\n                    if (sources[idx].columns) {\n                        leafs = leafs.concat(sources[idx].columns);\n                    }\n                }\n                var ths = elements(that.lockedHeader, that.thead, 'tr:eq(' + sourcePosition.row + ')>th.k-header:not(.k-group-cell,.k-hierarchy-cell)');\n                var sourceLockedColumns = lockedColumns(sources).length;\n                var targetLockedColumns = lockedColumns([target]).length;\n                if (leafs.length) {\n                    if (sourceLockedColumns > 0 && targetLockedColumns === 0) {\n                        moveCellsBetweenContainers(sources, target, leafs, that.columns, that.lockedHeader.find('thead'), that.thead, this._groups());\n                    } else if (sourceLockedColumns === 0 && targetLockedColumns > 0) {\n                        moveCellsBetweenContainers(sources, target, leafs, that.columns, that.thead, that.lockedHeader.find('thead'), this._groups());\n                    }\n                    if (target.columns || sourcePosition.cell - destPosition.cell > 1 || destPosition.cell - sourcePosition.cell > 1) {\n                        target = findReorderTarget(that.columns, target, sources[0], before);\n                        if (target) {\n                            that._reorderHeader(leafs, target, before);\n                        }\n                    }\n                } else if (sourceLockedColumns !== targetLockedColumns) {\n                    updateCellRowSpan(ths[sourcePosition.cell], that.columns, sourceLockedColumns);\n                }\n                reorder(ths, sourcePosition.cell, destPosition.cell, before, sources.length);\n            },\n            _reorderContent: function (sources, destination, before) {\n                var that = this;\n                var lockedRows = $();\n                var source = sources[0];\n                var visibleSources = visibleColumns(sources);\n                var sourceIndex = inArray(source, leafColumns(that.columns));\n                var destIndex = inArray(destination, leafColumns(that.columns));\n                var colSourceIndex = inArray(source, visibleLeafColumns(that.columns));\n                var colDest = inArray(destination, visibleLeafColumns(that.columns));\n                var lockedCount = lockedColumns(that.columns).length;\n                var isLocked = !!destination.locked;\n                var footer = that.footer || that.wrapper.find('.k-grid-footer');\n                var headerCol, footerCol;\n                headerCol = footerCol = colDest;\n                if (destination.hidden) {\n                    if (isLocked) {\n                        colDest = that.lockedTable.find('colgroup');\n                        headerCol = that.lockedHeader.find('colgroup');\n                        footerCol = $(that.lockedFooter).find('>table>colgroup');\n                    } else {\n                        colDest = that.tbody.prev();\n                        headerCol = that.thead.prev();\n                        footerCol = footer.find('.k-grid-footer-wrap').find('>table>colgroup');\n                    }\n                }\n                if (that._hasFilterRow()) {\n                    reorder(that.wrapper.find('.k-filter-row th:not(.k-group-cell,.k-hierarchy-cell)'), sourceIndex, destIndex, before, sources.length);\n                }\n                reorder(elements(that.lockedHeader, that.thead.prev(), 'col:not(.k-group-col,.k-hierarchy-col)'), colSourceIndex, headerCol, before, visibleSources.length);\n                if (that.options.scrollable) {\n                    reorder(elements(that.lockedTable, that.tbody.prev(), 'col:not(.k-group-col,.k-hierarchy-col)'), colSourceIndex, colDest, before, visibleSources.length);\n                }\n                if (footer && footer.length) {\n                    reorder(elements(that.lockedFooter, footer.find('.k-grid-footer-wrap'), '>table>colgroup>col:not(.k-group-col,.k-hierarchy-col)'), colSourceIndex, footerCol, before, visibleSources.length);\n                    reorder(footer.find('.k-footer-template>td:not(.k-group-cell,.k-hierarchy-cell)'), sourceIndex, destIndex, before, sources.length);\n                }\n                var rows = that.tbody.children(':not(.k-grouping-row,.k-detail-row)');\n                if (that.lockedTable) {\n                    if (lockedCount > destIndex) {\n                        if (lockedCount <= sourceIndex) {\n                            updateColspan(that.lockedTable.find('>tbody>tr.k-grouping-row'), that.table.find('>tbody>tr.k-grouping-row'), sources.length);\n                        }\n                    } else if (lockedCount > sourceIndex) {\n                        updateColspan(that.table.find('>tbody>tr.k-grouping-row'), that.lockedTable.find('>tbody>tr.k-grouping-row'), sources.length);\n                    }\n                    lockedRows = that.lockedTable.find('>tbody>tr:not(.k-grouping-row,.k-detail-row)');\n                }\n                for (var idx = 0, length = rows.length; idx < length; idx += 1) {\n                    reorder(elements(lockedRows[idx], rows[idx], '>td:not(.k-group-cell,.k-hierarchy-cell)'), sourceIndex, destIndex, before, sources.length);\n                }\n            },\n            _autoFitLeafColumn: function (leafIndex) {\n                this.autoFitColumn(leafColumns(this.columns)[leafIndex]);\n            },\n            autoFitColumn: function (column) {\n                var that = this, options = that.options, columns = that.columns, index, th, headerTable, isLocked, visibleLocked = that.lockedHeader ? leafDataCells(that.lockedHeader.find('>table>thead')).filter(isCellVisible).length : 0, col, contentDiv, scrollLeft, notGroupOrHierarchyCol = 'col:not(.k-group-col):not(.k-hierarchy-col)', notGroupOrHierarchyVisibleCell = 'td:visible:not(.k-group-cell):not(.k-hierarchy-cell)';\n                if (typeof column == 'number') {\n                    column = columns[column];\n                } else if (isPlainObject(column)) {\n                    column = grep(flatColumns(columns), function (item) {\n                        return item === column;\n                    })[0];\n                } else {\n                    column = grep(flatColumns(columns), function (item) {\n                        return item.field === column;\n                    })[0];\n                }\n                if (!column || !isVisible(column)) {\n                    return;\n                }\n                index = inArray(column, leafColumns(columns));\n                isLocked = column.locked;\n                if (isLocked) {\n                    headerTable = that.lockedHeader.children('table');\n                } else {\n                    headerTable = that.thead.parent();\n                }\n                th = headerTable.find('[data-index=\\'' + index + '\\']');\n                var contentTable = isLocked ? that.lockedTable : that.table, footer = that.footer || $();\n                if (that.footer && that.lockedContent) {\n                    footer = isLocked ? that.footer.children('.k-grid-footer-locked') : that.footer.children('.k-grid-footer-wrap');\n                }\n                var footerTable = footer.find('table').first();\n                if (that.lockedHeader && !isLocked) {\n                    index -= visibleLocked;\n                }\n                for (var j = 0; j < columns.length; j++) {\n                    if (columns[j] === column) {\n                        break;\n                    } else {\n                        if (columns[j].hidden) {\n                            index--;\n                        }\n                    }\n                }\n                if (options.scrollable) {\n                    col = headerTable.find(notGroupOrHierarchyCol).eq(index).add(contentTable.children('colgroup').find(notGroupOrHierarchyCol).eq(index)).add(footerTable.find('colgroup').find(notGroupOrHierarchyCol).eq(index));\n                    if (!isLocked) {\n                        contentDiv = contentTable.parent();\n                        scrollLeft = contentDiv.scrollLeft();\n                    }\n                } else {\n                    col = contentTable.children('colgroup').find(notGroupOrHierarchyCol).eq(index);\n                }\n                var tables = headerTable.add(contentTable).add(footerTable);\n                var oldColumnWidth = outerWidth(th);\n                col.width('');\n                tables.css('table-layout', 'fixed');\n                col.width('auto');\n                tables.addClass('k-autofitting');\n                tables.css('table-layout', '');\n                var newColumnWidth = Math.ceil(Math.max(outerWidth(th), outerWidth(contentTable.find('tr:not(.k-grouping-row)').eq(0).children(notGroupOrHierarchyVisibleCell).eq(index)), outerWidth(footerTable.find('tr').eq(0).children(notGroupOrHierarchyVisibleCell).eq(index)))) + 1;\n                col.width(newColumnWidth);\n                column.width = newColumnWidth;\n                if (options.scrollable) {\n                    var cols = headerTable.find('col'), colWidth, totalWidth = 0;\n                    for (var idx = 0, length = cols.length; idx < length; idx += 1) {\n                        colWidth = cols[idx].style.width;\n                        if (colWidth && colWidth.indexOf('%') == -1) {\n                            totalWidth += parseInt(colWidth, 10);\n                        } else {\n                            totalWidth = 0;\n                            break;\n                        }\n                    }\n                    if (totalWidth) {\n                        tables.each(function () {\n                            this.style.width = totalWidth + 'px';\n                        });\n                    }\n                }\n                if (browser.msie && browser.version == 8) {\n                    tables.css('display', 'inline-table');\n                    setTimeout(function () {\n                        tables.css('display', 'table');\n                    }, 1);\n                }\n                tables.removeClass('k-autofitting');\n                if (scrollLeft) {\n                    contentDiv.scrollLeft(scrollLeft);\n                }\n                that.trigger(COLUMNRESIZE, {\n                    column: column,\n                    oldWidth: oldColumnWidth,\n                    newWidth: newColumnWidth\n                });\n                that._applyLockedContainersWidth();\n                that._syncLockedContentHeight();\n                that._syncLockedHeaderHeight();\n            },\n            reorderColumn: function (destIndex, column, before) {\n                var that = this, parent = columnParent(column, that.columns), columns = parent ? parent.columns : that.columns, sourceIndex = inArray(column, columns), destColumn = columns[destIndex], lockChanged, isLocked = !!destColumn.locked, lockedCount = lockedColumns(that.columns).length;\n                if (sourceIndex === destIndex) {\n                    return;\n                }\n                if (!column.locked && isLocked && nonLockedColumns(that.columns).length == 1) {\n                    return;\n                }\n                if (column.locked && !isLocked && lockedCount == 1) {\n                    return;\n                }\n                that._hideResizeHandle();\n                if (before === undefined) {\n                    before = destIndex < sourceIndex;\n                }\n                var sourceColumns = [column];\n                that._reorderHeader(sourceColumns, destColumn, before);\n                if (that.lockedHeader) {\n                    removeEmptyRows(that.thead);\n                    removeEmptyRows(that.lockedHeader);\n                }\n                if (destColumn.columns) {\n                    destColumn = leafColumns(destColumn.columns);\n                    destColumn = destColumn[before ? 0 : destColumn.length - 1];\n                }\n                if (column.columns) {\n                    sourceColumns = leafColumns(column.columns);\n                }\n                that._reorderContent(sourceColumns, destColumn, before);\n                lockChanged = !!column.locked;\n                lockChanged = lockChanged != isLocked;\n                column.locked = isLocked;\n                columns.splice(before ? destIndex : destIndex + 1, 0, column);\n                columns.splice(sourceIndex < destIndex ? sourceIndex : sourceIndex + 1, 1);\n                that._templates();\n                that._updateColumnCellIndex();\n                that._updateTablesWidth();\n                that._applyLockedContainersWidth();\n                that._syncLockedHeaderHeight();\n                that._syncLockedContentHeight();\n                that._updateFirstColumnClass();\n                if (!lockChanged) {\n                    return;\n                }\n                if (isLocked) {\n                    that.trigger(COLUMNLOCK, { column: column });\n                } else {\n                    that.trigger(COLUMNUNLOCK, { column: column });\n                }\n            },\n            _updateColumnCellIndex: function () {\n                var header;\n                var offset = 0;\n                if (this.lockedHeader) {\n                    header = this.lockedHeader.find('thead');\n                    offset = updateCellIndex(header, lockedColumns(this.columns));\n                }\n                updateCellIndex(this.thead, nonLockedColumns(this.columns), offset);\n            },\n            lockColumn: function (column) {\n                var columns = this.columns;\n                if (typeof column == 'number') {\n                    column = columns[column];\n                } else {\n                    column = grep(columns, function (item) {\n                        return item.field === column;\n                    })[0];\n                }\n                if (!column || column.locked || column.hidden) {\n                    return;\n                }\n                var index = lockedColumns(columns).length - 1;\n                this.reorderColumn(index, column, false);\n            },\n            unlockColumn: function (column) {\n                var columns = this.columns;\n                if (typeof column == 'number') {\n                    column = columns[column];\n                } else {\n                    column = grep(columns, function (item) {\n                        return item.field === column;\n                    })[0];\n                }\n                if (!column || !column.locked || column.hidden) {\n                    return;\n                }\n                var index = lockedColumns(columns).length;\n                this.reorderColumn(index, column, true);\n            },\n            cellIndex: function (td) {\n                var lockedColumnOffset = 0;\n                if (this.lockedTable && !$.contains(this.lockedTable[0], td[0])) {\n                    lockedColumnOffset = leafColumns(lockedColumns(this.columns)).length;\n                }\n                return $(td).parent().children('td:not(.k-group-cell,.k-hierarchy-cell)').index(td) + lockedColumnOffset;\n            },\n            _modelForContainer: function (container) {\n                container = $(container);\n                if (!container.is('tr') && this._editMode() !== 'popup') {\n                    container = container.closest('tr');\n                }\n                var id = container.attr(kendo.attr('uid'));\n                return this.dataSource.getByUid(id);\n            },\n            _editable: function () {\n                var that = this, selectable = that.selectable && that.selectable.options.multiple, editable = that.options.editable, handler = function () {\n                        var target = activeElement(), cell = that._editContainer;\n                        if (cell && !$.contains(cell[0], target) && cell[0] !== target && !$(target).closest('.k-animation-container').length) {\n                            if (that.editable.end()) {\n                                that.closeCell();\n                            }\n                        }\n                    };\n                if (editable) {\n                    this.wrapper.addClass('k-editable');\n                    var mode = that._editMode();\n                    if (mode === 'incell') {\n                        if (editable.update !== false) {\n                            that.wrapper.on(CLICK + NS, 'tr:not(.k-grouping-row) > td', function (e) {\n                                var td = $(this), isLockedCell = that.lockedTable && td.closest('table')[0] === that.lockedTable[0];\n                                if (td.hasClass('k-hierarchy-cell') || td.hasClass('k-detail-cell') || td.hasClass('k-group-cell') || td.hasClass('k-edit-cell') || td.has('a.k-grid-delete').length || td.has('button.k-grid-delete').length || td.closest('tbody')[0] !== that.tbody[0] && !isLockedCell || $(e.target).is(':input')) {\n                                    return;\n                                }\n                                if (that.editable) {\n                                    if (that.editable.end()) {\n                                        if (selectable) {\n                                            $(activeElement()).blur();\n                                        }\n                                        that.closeCell();\n                                        that.editCell(td);\n                                    }\n                                } else {\n                                    that.editCell(td);\n                                }\n                            }).on('focusin' + NS, function () {\n                                if (!$.contains(this, activeElement())) {\n                                    clearTimeout(that.timer);\n                                    that.timer = null;\n                                }\n                            }).on('focusout' + NS, function () {\n                                that.timer = setTimeout(handler, 1);\n                            });\n                        }\n                    } else {\n                        if (editable.update !== false) {\n                            that.wrapper.on(CLICK + NS, 'tbody>tr:not(.k-detail-row,.k-grouping-row):visible a.k-grid-edit', function (e) {\n                                e.preventDefault();\n                                that.editRow($(this).closest('tr'));\n                            });\n                        }\n                    }\n                    if (editable.destroy !== false) {\n                        that.wrapper.on(CLICK + NS, 'tbody>tr:not(.k-detail-row,.k-grouping-row):visible .k-grid-delete', function (e) {\n                            e.preventDefault();\n                            e.stopPropagation();\n                            that.removeRow($(this).closest('tr'));\n                        });\n                    } else {\n                        that.wrapper.on(CLICK + NS, 'tbody>tr:not(.k-detail-row,.k-grouping-row):visible button.k-grid-delete', function (e) {\n                            e.stopPropagation();\n                            if (!that._confirmation()) {\n                                e.preventDefault();\n                            }\n                        });\n                    }\n                }\n            },\n            editCell: function (cell) {\n                cell = $(cell);\n                var that = this, column = leafColumns(that.columns)[that.cellIndex(cell)], model = that._modelForContainer(cell);\n                that.closeCell();\n                if (model && isColumnEditable(column, model) && !column.command) {\n                    if (that.trigger(BEFOREEDIT, { model: model })) {\n                        return;\n                    }\n                    that._attachModelChange(model);\n                    that._editContainer = cell;\n                    that.editable = cell.addClass('k-edit-cell').kendoEditable({\n                        fields: {\n                            field: column.field,\n                            format: column.format,\n                            editor: column.editor,\n                            values: column.values\n                        },\n                        model: model,\n                        target: that,\n                        change: function (e) {\n                            if (that.trigger(SAVE, {\n                                    values: e.values,\n                                    container: cell,\n                                    model: model\n                                })) {\n                                e.preventDefault();\n                            }\n                        }\n                    }).data('kendoEditable');\n                    var tr = cell.parent().addClass('k-grid-edit-row');\n                    if (that.lockedContent) {\n                        adjustRowHeight(tr[0], that._relatedRow(tr).addClass('k-grid-edit-row')[0]);\n                    }\n                    that.trigger(EDIT, {\n                        container: cell,\n                        model: model\n                    });\n                }\n            },\n            _adjustLockedHorizontalScrollBar: function () {\n                var table = this.table, content = table.parent();\n                var scrollbar = table[0].offsetWidth > content[0].clientWidth ? kendo.support.scrollbar() : 0;\n                this.lockedContent.height(content.height() - scrollbar);\n            },\n            _syncLockedContentHeight: function () {\n                if (this.lockedTable) {\n                    if (!this.touchScroller) {\n                        this._adjustLockedHorizontalScrollBar();\n                    }\n                    this._adjustRowsHeight(this.table, this.lockedTable);\n                }\n            },\n            _syncLockedHeaderHeight: function () {\n                if (this.lockedHeader) {\n                    var lockedTable = this.lockedHeader.children('table');\n                    var table = this.thead.parent();\n                    this._adjustRowsHeight(lockedTable, table);\n                    syncTableHeight(lockedTable, table);\n                }\n            },\n            _syncLockedFooterHeight: function () {\n                if (this.lockedFooter && this.footer && this.footer.length) {\n                    this._adjustRowsHeight(this.lockedFooter.children('table'), this.footer.find('.k-grid-footer-wrap > table'));\n                }\n            },\n            _destroyEditable: function () {\n                var that = this;\n                var destroy = function () {\n                    if (that.editable) {\n                        var container = that.editView ? that.editView.element : that._editContainer;\n                        if (container) {\n                            container.off(CLICK + NS, 'a.k-grid-cancel', that._editCancelClickHandler);\n                            container.off(CLICK + NS, 'a.k-grid-update', that._editUpdateClickHandler);\n                        }\n                        that._detachModelChange();\n                        that.editable.destroy();\n                        that.editable = null;\n                        that._editContainer = null;\n                        that._destroyEditView();\n                    }\n                };\n                if (that.editable) {\n                    if (that._editMode() === 'popup' && !that._isMobile) {\n                        that._editContainer.data('kendoWindow').bind('deactivate', destroy).close();\n                    } else {\n                        destroy();\n                    }\n                }\n                if (that._actionSheet) {\n                    that._actionSheet.destroy();\n                    that._actionSheet = null;\n                }\n            },\n            _destroyEditView: function () {\n                if (this.editView) {\n                    this.editView.purge();\n                    this.editView = null;\n                    this.pane.navigate('');\n                }\n            },\n            _attachModelChange: function (model) {\n                var that = this;\n                that._modelChangeHandler = function (e) {\n                    that._modelChange({\n                        field: e.field,\n                        model: this\n                    });\n                };\n                model.bind('change', that._modelChangeHandler);\n            },\n            _detachModelChange: function () {\n                var that = this, container = that._editContainer, model = that._modelForContainer(container);\n                if (model) {\n                    model.unbind(CHANGE, that._modelChangeHandler);\n                }\n            },\n            closeCell: function (isCancel) {\n                var that = this, cell = that._editContainer, id, column, tr, model;\n                if (!cell) {\n                    return;\n                }\n                id = cell.closest('tr').attr(kendo.attr('uid'));\n                model = that.dataSource.getByUid(id);\n                if (isCancel && that.trigger('cancel', {\n                        container: cell,\n                        model: model\n                    })) {\n                    return;\n                }\n                that.trigger(CELLCLOSE, {\n                    type: isCancel ? 'cancel' : 'save',\n                    model: model,\n                    container: cell\n                });\n                cell.removeClass('k-edit-cell');\n                column = leafColumns(that.columns)[that.cellIndex(cell)];\n                tr = cell.parent().removeClass('k-grid-edit-row');\n                that._destroyEditable();\n                that._displayCell(cell, column, model);\n                if (cell.hasClass('k-dirty-cell')) {\n                    $('<span class=\"k-dirty\"/>').prependTo(cell);\n                }\n                that.trigger('itemChange', {\n                    item: tr,\n                    data: model,\n                    ns: ui\n                });\n                if (that.lockedContent) {\n                    adjustRowHeight(tr.css('height', '')[0], that._relatedRow(tr).css('height', '')[0]);\n                }\n            },\n            _displayCell: function (cell, column, dataItem) {\n                var that = this, state = {\n                        storage: {},\n                        count: 0\n                    }, settings = extend({}, kendo.Template, that.options.templateSettings), tmpl = kendo.template(that._cellTmpl(column, state), settings);\n                if (state.count > 0) {\n                    tmpl = proxy(tmpl, state.storage);\n                }\n                cell.empty().html(tmpl(dataItem));\n                that.angular('compile', function () {\n                    return {\n                        elements: cell,\n                        data: [{ dataItem: dataItem }]\n                    };\n                });\n            },\n            removeRow: function (row) {\n                if (!this._confirmation(row)) {\n                    return;\n                }\n                this._removeRow(row);\n            },\n            _removeRow: function (row) {\n                var that = this, model, mode = that._editMode();\n                if (mode !== 'incell') {\n                    that.cancelRow();\n                }\n                row = $(row);\n                if (that.lockedContent) {\n                    row = row.add(that._relatedRow(row));\n                }\n                row = row.hide();\n                model = that._modelForContainer(row);\n                if (model && !that.trigger(REMOVE, {\n                        row: row,\n                        model: model\n                    })) {\n                    that.dataSource.remove(model);\n                    if (mode === 'inline' || mode === 'popup') {\n                        that.dataSource.sync();\n                    }\n                } else if (mode === 'incell') {\n                    that._destroyEditable();\n                }\n            },\n            _editMode: function () {\n                var mode = 'incell', editable = this.options.editable;\n                if (editable !== true) {\n                    if (typeof editable == 'string') {\n                        mode = editable;\n                    } else {\n                        mode = editable.mode || mode;\n                    }\n                }\n                return mode;\n            },\n            editRow: function (row) {\n                var model;\n                var that = this;\n                if (row instanceof kendo.data.ObservableObject) {\n                    model = row;\n                } else {\n                    row = $(row);\n                    model = that._modelForContainer(row);\n                }\n                var mode = that._editMode();\n                var container;\n                that.cancelRow();\n                if (model) {\n                    row = that.tbody.children('[' + kendo.attr('uid') + '=' + model.uid + ']');\n                    that._attachModelChange(model);\n                    if (mode === 'popup') {\n                        that._createPopupEditor(model);\n                    } else if (mode === 'inline') {\n                        that._createInlineEditor(row, model);\n                    } else if (mode === 'incell') {\n                        $(row).children(DATA_CELL).each(function () {\n                            var cell = $(this);\n                            var column = leafColumns(that.columns)[that.cellIndex(cell)];\n                            model = that._modelForContainer(cell);\n                            if (model && (!model.editable || model.editable(column.field)) && column.field && !column.selectable) {\n                                that.editCell(cell);\n                                return false;\n                            }\n                        });\n                    }\n                    container = that.editView ? that.editView.element : that._editContainer;\n                    if (container) {\n                        if (!this._editCancelClickHandler) {\n                            this._editCancelClickHandler = proxy(this._editCancelClick, this);\n                        }\n                        container.on(CLICK + NS, 'a.k-grid-cancel', this._editCancelClickHandler);\n                        if (!this._editUpdateClickHandler) {\n                            this._editUpdateClickHandler = proxy(this._editUpdateClick, this);\n                        }\n                        container.on(CLICK + NS, 'a.k-grid-update', this._editUpdateClickHandler);\n                    }\n                }\n            },\n            _editUpdateClick: function (e) {\n                e.preventDefault();\n                e.stopPropagation();\n                this.saveRow();\n            },\n            _editCancelClick: function (e) {\n                var that = this;\n                var navigatable = that.options.navigatable;\n                var model = that.editable.options.model;\n                var container = that.editView ? that.editView.element : that._editContainer;\n                e.preventDefault();\n                e.stopPropagation();\n                if (that.trigger('cancel', {\n                        container: container,\n                        model: model\n                    })) {\n                    return;\n                }\n                var currentIndex = that.items().index($(that.current()).parent());\n                that.cancelRow();\n                if (navigatable) {\n                    that._setCurrent(that.items().eq(currentIndex).children().filter(NAVCELL).first());\n                    focusTable(that.table, true);\n                }\n            },\n            _createPopupEditor: function (model) {\n                var that = this;\n                var html = '<div ' + kendo.attr('uid') + '=\"' + model.uid + '\" class=\"k-popup-edit-form' + (that._isMobile ? ' k-mobile-list' : '') + '\"><div class=\"k-edit-form-container\">';\n                var column;\n                var command;\n                var fields = [];\n                var idx;\n                var length;\n                var tmpl;\n                var updateText;\n                var cancelText;\n                var tempCommand;\n                var columns = leafColumns(that.columns);\n                var attr;\n                var editable = that.options.editable;\n                var template = editable.template;\n                var options = isPlainObject(editable) ? editable.window : {};\n                var settings = extend({}, kendo.Template, that.options.templateSettings);\n                if (that.trigger(BEFOREEDIT, { model: model })) {\n                    return;\n                }\n                options = options || {};\n                if (template) {\n                    if (typeof template === STRING) {\n                        template = window.unescape(template);\n                    }\n                    html += kendo.template(template, settings)(model);\n                    for (idx = 0, length = columns.length; idx < length; idx++) {\n                        column = columns[idx];\n                        if (column.command) {\n                            tempCommand = getCommand(column.command, 'edit');\n                            if (tempCommand) {\n                                command = tempCommand;\n                            }\n                        }\n                    }\n                } else {\n                    for (idx = 0, length = columns.length; idx < length; idx++) {\n                        column = columns[idx];\n                        if (column.selectable) {\n                            continue;\n                        }\n                        if (!column.command) {\n                            html += '<div class=\"k-edit-label\"><label for=\"' + column.field + '\">' + (column.title || column.field || '') + '</label></div>';\n                            if (isColumnEditable(column, model)) {\n                                fields.push({\n                                    field: column.field,\n                                    format: column.format,\n                                    editor: column.editor,\n                                    values: column.values\n                                });\n                                html += '<div ' + kendo.attr('container-for') + '=\"' + column.field + '\" class=\"k-edit-field\"></div>';\n                            } else {\n                                var state = {\n                                    storage: {},\n                                    count: 0\n                                };\n                                tmpl = kendo.template(that._cellTmpl(column, state), settings);\n                                if (state.count > 0) {\n                                    tmpl = proxy(tmpl, state.storage);\n                                }\n                                html += '<div class=\"k-edit-field\">' + tmpl(model) + '</div>';\n                            }\n                        } else if (column.command) {\n                            tempCommand = getCommand(column.command, 'edit');\n                            if (tempCommand) {\n                                command = tempCommand;\n                            }\n                        }\n                    }\n                }\n                if (command) {\n                    if (isPlainObject(command)) {\n                        if (command.text && isPlainObject(command.text)) {\n                            updateText = command.text.update;\n                            cancelText = command.text.cancel;\n                        }\n                        if (command.attr) {\n                            attr = command.attr;\n                        }\n                    }\n                }\n                var container;\n                if (!that._isMobile) {\n                    html += '<div class=\"k-edit-buttons k-state-default\">';\n                    html += that._createButton({\n                        name: 'update',\n                        text: updateText,\n                        attr: attr\n                    }) + that._createButton({\n                        name: 'canceledit',\n                        text: cancelText,\n                        attr: attr\n                    });\n                    html += '</div></div></div>';\n                    container = that._editContainer = $(html).appendTo(that.wrapper).eq(0).kendoWindow(extend({\n                        modal: true,\n                        resizable: false,\n                        draggable: true,\n                        title: 'Edit',\n                        visible: false,\n                        close: function (e) {\n                            if (e.userTriggered) {\n                                e.sender.element.focus();\n                                if (that.trigger('cancel', {\n                                        container: container,\n                                        model: model\n                                    })) {\n                                    e.preventDefault();\n                                    return;\n                                }\n                                var currentIndex = that.items().index($(that.current()).parent());\n                                that.cancelRow();\n                                if (that.options.navigatable) {\n                                    that._setCurrent(that.items().eq(currentIndex).children().filter(NAVCELL).first());\n                                    focusTable(that.table, true);\n                                }\n                            }\n                        }\n                    }, options));\n                } else {\n                    html += '</div></div>';\n                    that.editView = that.pane.append('<div data-' + kendo.ns + 'role=\"view\" data-' + kendo.ns + 'use-native-scrolling=\"true\" data-' + kendo.ns + 'init-widgets=\"false\" class=\"k-grid-edit-form\">' + '<div data-' + kendo.ns + 'role=\"header\" class=\"k-header\">' + that._createButton({\n                        name: 'update',\n                        text: updateText,\n                        attr: attr\n                    }) + (options.title || 'Edit') + that._createButton({\n                        name: 'canceledit',\n                        text: cancelText,\n                        attr: attr\n                    }) + '</div>' + html + '</div>');\n                    container = that._editContainer = that.editView.element.find('.k-popup-edit-form');\n                }\n                that.editable = that._editContainer.kendoEditable({\n                    fields: fields,\n                    model: model,\n                    clearContainer: false,\n                    target: that\n                }).data('kendoEditable');\n                if (that._isMobile) {\n                    container.find('input[type=checkbox],input[type=radio]').parent('.k-edit-field').addClass('k-check').prev('.k-edit-label').addClass('k-check').click(function () {\n                        $(this).next().children('input').click();\n                    });\n                }\n                that._openPopUpEditor();\n                that.trigger(EDIT, {\n                    container: container,\n                    model: model\n                });\n            },\n            _openPopUpEditor: function () {\n                if (!this._isMobile) {\n                    this._editContainer.data('kendoWindow').center().open();\n                } else {\n                    this.pane.navigate(this.editView, this._editAnimation);\n                }\n            },\n            _createInlineEditor: function (row, model) {\n                var that = this;\n                var column;\n                var cell;\n                var command;\n                var fields = [];\n                if (that.trigger(BEFOREEDIT, { model: model })) {\n                    return;\n                }\n                if (that.lockedContent) {\n                    row = row.add(that._relatedRow(row));\n                }\n                row.children(':not(.k-group-cell,.k-hierarchy-cell)').each(function () {\n                    cell = $(this);\n                    column = leafColumns(that.columns)[that.cellIndex(cell)];\n                    if (!column.command && isColumnEditable(column, model)) {\n                        fields.push({\n                            field: column.field,\n                            format: column.format,\n                            editor: column.editor,\n                            values: column.values\n                        });\n                        cell.attr(kendo.attr('container-for'), column.field);\n                        cell.empty();\n                    } else if (column.command) {\n                        command = getCommand(column.command, 'edit');\n                        if (command) {\n                            cell.empty();\n                            var updateText, cancelText, attr;\n                            if (isPlainObject(command)) {\n                                if (command.text && isPlainObject(command.text)) {\n                                    updateText = command.text.update;\n                                    cancelText = command.text.cancel;\n                                }\n                                if (command.attr) {\n                                    attr = command.attr;\n                                }\n                            }\n                            $(that._createButton({\n                                name: 'update',\n                                text: updateText,\n                                attr: attr\n                            }) + that._createButton({\n                                name: 'canceledit',\n                                text: cancelText,\n                                attr: attr\n                            })).appendTo(cell);\n                        }\n                    }\n                });\n                that._editContainer = row;\n                that.editable = new kendo.ui.Editable(row.addClass('k-grid-edit-row'), {\n                    target: that,\n                    fields: fields,\n                    model: model,\n                    clearContainer: false\n                });\n                if (row.length > 1) {\n                    adjustRowHeight(row[0], row[1]);\n                    that._applyLockedContainersWidth();\n                }\n                that.trigger(EDIT, {\n                    container: row,\n                    model: model\n                });\n            },\n            cancelRow: function (notify) {\n                var that = this, container = that._editContainer, model;\n                if (container) {\n                    model = that._modelForContainer(container);\n                    if (notify && that.trigger('cancel', {\n                            container: container,\n                            model: model\n                        })) {\n                        return;\n                    }\n                    that._destroyEditable();\n                    that.dataSource.cancelChanges(model);\n                    if (that._editMode() !== 'popup') {\n                        that._displayRow(container);\n                    } else {\n                        that._displayRow(that.tbody.find('[' + kendo.attr('uid') + '=' + model.uid + ']'));\n                    }\n                }\n            },\n            saveRow: function () {\n                var container = this._editContainer;\n                var model = this._modelForContainer(container);\n                var deferred = $.Deferred();\n                if (!container || !this.editable) {\n                    return deferred.resolve().promise();\n                }\n                if (!this.editable.end() || this.trigger(SAVE, {\n                        container: container,\n                        model: model\n                    })) {\n                    return deferred.reject().promise();\n                }\n                return this.dataSource.sync();\n            },\n            _displayRow: function (row) {\n                var that = this, model = that._modelForContainer(row), related, newRow, nextRow, isSelected = row.hasClass('k-state-selected'), isAlt = row.hasClass('k-alt');\n                if (model) {\n                    if (that.lockedContent) {\n                        related = $((isAlt ? that.lockedAltRowTemplate : that.lockedRowTemplate)(model));\n                        that._relatedRow(row.last()).replaceWith(related);\n                    }\n                    that.angular('cleanup', function () {\n                        return { elements: row.get() };\n                    });\n                    newRow = $((isAlt ? that.altRowTemplate : that.rowTemplate)(model));\n                    row.replaceWith(newRow);\n                    that.trigger('itemChange', {\n                        item: newRow,\n                        data: model,\n                        ns: ui\n                    });\n                    if (related && related.length) {\n                        that.trigger('itemChange', {\n                            item: related,\n                            data: model,\n                            ns: ui\n                        });\n                    }\n                    var angularElements = newRow;\n                    var angularData = [{ dataItem: model }];\n                    if (related && related.length) {\n                        angularElements = newRow.add(related);\n                        angularData.push({ dataItem: model });\n                    }\n                    that.angular('compile', function () {\n                        return {\n                            elements: angularElements.get(),\n                            data: angularData\n                        };\n                    });\n                    if (isSelected && (that.options.selectable || !!$.grep(leafColumns(that.columns), function (col) {\n                            return col.selectable;\n                        }).length)) {\n                        that.select(newRow.add(related));\n                    }\n                    if (related) {\n                        adjustRowHeight(newRow[0], related[0]);\n                    }\n                    nextRow = newRow.next();\n                    if (nextRow.hasClass('k-detail-row') && nextRow.is(':visible')) {\n                        newRow.find('.k-hierarchy-cell .k-icon').removeClass('k-i-expand').addClass('k-i-collapse');\n                    }\n                }\n            },\n            _showMessage: function (messages, row) {\n                var that = this;\n                if (!that._isMobile) {\n                    return window.confirm(messages.title);\n                }\n                var template = kendo.template('<ul>' + '<li class=\"km-actionsheet-title\">#:title#</li>' + '<li><a href=\"\\\\#\" class=\"k-button k-grid-delete\">#:confirmDelete#</a></li>' + '</ul>');\n                var html = $(template(messages)).appendTo(that.view.element);\n                var actionSheet = that._actionSheet = new kendo.mobile.ui.ActionSheet(html, {\n                    cancel: messages.cancelDelete,\n                    cancelTemplate: '<li class=\"km-actionsheet-cancel\"><a class=\"k-button\" href=\"\\\\#\">#:cancel#</a></li>',\n                    close: function () {\n                        this.destroy();\n                    },\n                    command: function (e) {\n                        var item = $(e.currentTarget).parent();\n                        if (!item.hasClass('km-actionsheet-cancel')) {\n                            that._removeRow(row);\n                        }\n                    },\n                    popup: that._actionSheetPopupOptions\n                });\n                actionSheet.open(row);\n                return false;\n            },\n            _confirmation: function (row) {\n                var that = this, editable = that.options.editable, confirmation = editable === true || typeof editable === STRING ? that.options.messages.editable.confirmation : editable.confirmation;\n                if (isPlainObject(editable) && typeof editable.mode === STRING && typeof confirmation !== STRING && confirmation !== false) {\n                    confirmation = that.options.messages.editable.confirmation;\n                }\n                if (confirmation !== false && confirmation != null) {\n                    if (typeof confirmation === FUNCTION) {\n                        confirmation = confirmation(that._modelForContainer(row));\n                    }\n                    return that._showMessage({\n                        confirmDelete: editable.confirmDelete || that.options.messages.editable.confirmDelete,\n                        cancelDelete: editable.cancelDelete || that.options.messages.editable.cancelDelete,\n                        title: confirmation === true ? that.options.messages.editable.confirmation : confirmation\n                    }, row);\n                }\n                return true;\n            },\n            cancelChanges: function () {\n                this.dataSource.cancelChanges();\n            },\n            saveChanges: function () {\n                var that = this;\n                if ((that.editable && that.editable.end() || !that.editable) && !that.trigger(SAVECHANGES)) {\n                    that.dataSource.sync();\n                }\n            },\n            addRow: function () {\n                var that = this, index, dataSource = that.dataSource, mode = that._editMode(), createAt = that.options.editable.createAt || '', pageSize = dataSource.pageSize(), view = dataSource.view() || [];\n                if (that.editable && that.editable.end() || !that.editable) {\n                    if (mode != 'incell') {\n                        that.cancelRow();\n                    }\n                    index = dataSource.indexOf(view[0]);\n                    if (createAt.toLowerCase() == 'bottom') {\n                        index += view.length;\n                        if (pageSize && !dataSource.options.serverPaging && pageSize <= view.length) {\n                            index -= 1;\n                        }\n                    }\n                    if (index < 0) {\n                        if (dataSource.page() > dataSource.totalPages()) {\n                            index = (dataSource.page() - 1) * pageSize;\n                        } else {\n                            index = 0;\n                        }\n                    }\n                    var model = dataSource.insert(index, {}), id = model.uid, table = that.lockedContent ? that.lockedTable : that.table, row = table.find('tr[' + kendo.attr('uid') + '=' + id + ']'), cell = row.children('td:not(.k-group-cell,.k-hierarchy-cell)').eq(that._firstEditableColumnIndex(row));\n                    if (mode === 'inline' && row.length) {\n                        that.editRow(row);\n                    } else if (mode === 'popup') {\n                        that.editRow(model);\n                    } else if (cell.length) {\n                        that.editCell(cell);\n                    }\n                    if (createAt.toLowerCase() == 'bottom' && that.lockedContent) {\n                        that.lockedContent[0].scrollTop = that.content[0].scrollTop = that.table[0].offsetHeight;\n                    }\n                }\n            },\n            _firstEditableColumnIndex: function (container) {\n                var that = this, column, columns = leafColumns(that.columns), idx, length, model = that._modelForContainer(container);\n                for (idx = 0, length = columns.length; idx < length; idx++) {\n                    column = columns[idx];\n                    if (model && (!model.editable || model.editable(column.field)) && !column.command && column.field && column.hidden !== true) {\n                        return idx;\n                    }\n                }\n                return -1;\n            },\n            _toolbar: function () {\n                var that = this, wrapper = that.wrapper, toolbar = that.options.toolbar, editable = that.options.editable, container;\n                if (toolbar) {\n                    container = that.wrapper.find('.k-grid-toolbar');\n                    if (!container.length) {\n                        if (!isFunction(toolbar)) {\n                            toolbar = typeof toolbar === STRING ? toolbar : that._toolbarTmpl(toolbar).replace(templateHashRegExp, '\\\\#');\n                            toolbar = proxy(kendo.template(toolbar), that);\n                        }\n                        container = $('<div class=\"k-header k-grid-toolbar\" />').html(toolbar({})).prependTo(wrapper);\n                        that.angular('compile', function () {\n                            return { elements: container.get() };\n                        });\n                    }\n                    if (editable && editable.create !== false) {\n                        container.on(CLICK + NS, '.k-grid-add', function (e) {\n                            e.preventDefault();\n                            that.addRow();\n                        }).on(CLICK + NS, '.k-grid-cancel-changes', function (e) {\n                            e.preventDefault();\n                            that.cancelChanges();\n                        }).on(CLICK + NS, '.k-grid-save-changes', function (e) {\n                            e.preventDefault();\n                            that.saveChanges();\n                        });\n                    }\n                    container.on(CLICK + NS, '.k-grid-excel', function (e) {\n                        e.preventDefault();\n                        that.saveAsExcel();\n                    });\n                    container.on(CLICK + NS, '.k-grid-pdf', function (e) {\n                        e.preventDefault();\n                        that.saveAsPDF();\n                    });\n                }\n            },\n            _toolbarTmpl: function (commands) {\n                var that = this, idx, length, html = '';\n                if (isArray(commands)) {\n                    for (idx = 0, length = commands.length; idx < length; idx++) {\n                        html += that._createButton(commands[idx]);\n                    }\n                }\n                return html;\n            },\n            _createButton: function (command) {\n                var template = command.template || COMMANDBUTTONTMPL, commandName = typeof command === STRING ? command : command.name || command.text, className = defaultCommands[commandName] ? defaultCommands[commandName].className : 'k-grid-' + (commandName || '').replace(/\\s/g, ''), options = {\n                        className: className,\n                        text: commandName,\n                        imageClass: '',\n                        attr: '',\n                        iconClass: ''\n                    }, messages = this.options.messages.commands, attributeClassMatch;\n                if (!commandName && !(isPlainObject(command) && command.template)) {\n                    throw new Error('Custom commands should have name specified');\n                }\n                if (isPlainObject(command)) {\n                    command = extend(true, {}, command);\n                    if (command.className && inArray(options.className, command.className.split(' ')) < 0) {\n                        command.className += ' ' + options.className;\n                    } else if (command.className === undefined) {\n                        command.className = options.className;\n                    }\n                    if (commandName === 'edit' && isPlainObject(command.text)) {\n                        command = extend(true, {}, command);\n                        command.text = command.text.edit;\n                    }\n                    if (command.attr) {\n                        if (isPlainObject(command.attr)) {\n                            command.attr = stringifyAttributes(command.attr);\n                        }\n                        if (typeof command.attr === STRING) {\n                            attributeClassMatch = command.attr.match(/class=\"(.+?)\"/);\n                            if (attributeClassMatch && inArray(attributeClassMatch[1], command.className.split(' ')) < 0) {\n                                command.className += ' ' + attributeClassMatch[1];\n                            }\n                        }\n                    }\n                    options = extend(true, options, defaultCommands[commandName], { text: messages[commandName] }, command);\n                } else {\n                    options = extend(true, options, defaultCommands[commandName], { text: messages[commandName] });\n                }\n                return kendo.template(template)(options);\n            },\n            _hasFooters: function () {\n                return !!this.footerTemplate || !!this.groupFooterTemplate || this.footer && this.footer.length > 0 || this.wrapper.find('.k-grid-footer').length > 0;\n            },\n            _groupable: function () {\n                var that = this;\n                if (that._groupableClickHandler) {\n                    that.table.add(that.lockedTable).off(CLICK + NS, that._groupableClickHandler);\n                } else {\n                    that._groupableClickHandler = function (e) {\n                        var element = $(this), group = element.closest('tr');\n                        if (element.hasClass('k-i-collapse')) {\n                            that.collapseGroup(group);\n                        } else {\n                            that.expandGroup(group);\n                        }\n                        e.preventDefault();\n                        e.stopPropagation();\n                    };\n                }\n                if (that._isLocked()) {\n                    that.lockedTable.on(CLICK + NS, '.k-grouping-row .k-i-expand, .k-grouping-row .k-i-collapse', that._groupableClickHandler);\n                } else {\n                    that.table.on(CLICK + NS, '.k-grouping-row .k-i-expand, .k-grouping-row .k-i-collapse', that._groupableClickHandler);\n                }\n                that._attachGroupable();\n            },\n            _attachGroupable: function () {\n                var that = this, wrapper = that.wrapper, groupable = that.options.groupable, draggables = HEADERCELLS + '[' + kendo.attr('field') + ']', filter = that.content ? '.k-grid-header:first ' + draggables : 'table:first>.k-grid-header ' + draggables;\n                if (groupable && groupable.enabled !== false) {\n                    if (!wrapper.has('div.k-grouping-header')[0]) {\n                        $('<div>&nbsp;</div>').addClass('k-grouping-header').prependTo(wrapper);\n                    }\n                    if (that.groupable) {\n                        that.groupable.destroy();\n                    }\n                    that.groupable = new ui.Groupable(wrapper, extend({}, groupable, {\n                        draggable: that._draggableInstance,\n                        groupContainer: '>div.k-grouping-header',\n                        dataSource: that.dataSource,\n                        draggableElements: filter,\n                        filter: filter,\n                        allowDrag: that.options.reorderable,\n                        change: function (e) {\n                            if (that.trigger('group', { groups: e.groups })) {\n                                e.preventDefault();\n                            }\n                        }\n                    }));\n                }\n            },\n            _continuousItems: function (filter, cell) {\n                if (!this.lockedContent) {\n                    return;\n                }\n                var that = this;\n                var elements = that.table.add(that.lockedTable);\n                var lockedItems = $(filter, elements[0]);\n                var nonLockedItems = $(filter, elements[1]);\n                var columns = cell ? lockedColumns(that.columns).length : 1;\n                var nonLockedColumns = cell ? that.columns.length - columns : 1;\n                var result = [];\n                for (var idx = 0; idx < lockedItems.length; idx += columns) {\n                    push.apply(result, lockedItems.slice(idx, idx + columns));\n                    push.apply(result, nonLockedItems.splice(0, nonLockedColumns));\n                }\n                return result;\n            },\n            _selectable: function () {\n                var that = this, multi, cell, notString = [], isLocked = that._isLocked(), selectable = that.options.selectable, dataSourceOptions = that.dataSource.options;\n                if (selectable) {\n                    if (that.selectable) {\n                        that.selectable.destroy();\n                    }\n                    if (that.options.persistSelection === true) {\n                        if (!dataSourceOptions.schema || !dataSourceOptions.schema.model || !dataSourceOptions.schema.model.id) {\n                            throw new Error('Selection persistence requires a data source with a model that has e defined id');\n                        }\n                        that._selectedIds = {};\n                    }\n                    selectable = kendo.ui.Selectable.parseOptions(selectable);\n                    multi = selectable.multiple;\n                    cell = selectable.cell;\n                    if (that._hasDetails()) {\n                        notString[notString.length] = '.k-detail-row';\n                    }\n                    if (that.options.groupable || that._hasFooters()) {\n                        notString[notString.length] = '.k-grouping-row,.k-group-footer';\n                    }\n                    notString = notString.join(',');\n                    if (notString !== '') {\n                        notString = ':not(' + notString + ')';\n                    }\n                    var elements = that.table;\n                    if (isLocked) {\n                        elements = elements.add(that.lockedTable);\n                    }\n                    var filter = '>' + (cell ? SELECTION_CELL_SELECTOR : 'tbody>tr' + notString);\n                    that.selectable = new kendo.ui.Selectable(elements, {\n                        filter: filter,\n                        aria: true,\n                        multiple: multi,\n                        change: function () {\n                            if (that.options.persistSelection && !cell) {\n                                that._persistSelectedRows();\n                            }\n                            that.trigger(CHANGE);\n                        },\n                        useAllItems: isLocked && multi && cell,\n                        relatedTarget: function (items) {\n                            if (cell || !isLocked) {\n                                return;\n                            }\n                            var related;\n                            var result = $();\n                            for (var idx = 0, length = items.length; idx < length; idx++) {\n                                related = that._relatedRow(items[idx]);\n                                if (inArray(related[0], items) < 0) {\n                                    result = result.add(related);\n                                }\n                            }\n                            return result;\n                        },\n                        continuousItems: function () {\n                            return that._continuousItems(filter, cell);\n                        }\n                    });\n                    if (that.options.navigatable) {\n                        elements.on('keydown' + NS, function (e) {\n                            var current = that.current();\n                            var target = e.target;\n                            if (e.keyCode === keys.SPACEBAR && !e.shiftKey && $.inArray(target, elements) > -1 && !current.is('.k-edit-cell,.k-header') && current.parent().is(':not(.k-grouping-row,.k-detail-row,.k-group-footer)')) {\n                                e.preventDefault();\n                                e.stopPropagation();\n                                current = cell ? current : current.parent();\n                                if (isLocked && !cell) {\n                                    current = current.add(that._relatedRow(current));\n                                }\n                                if (multi) {\n                                    if (!e.ctrlKey) {\n                                        that.selectable.clear();\n                                    } else {\n                                        if (current.hasClass(SELECTED)) {\n                                            current.removeClass(SELECTED);\n                                            that.trigger(CHANGE);\n                                            return;\n                                        }\n                                    }\n                                } else {\n                                    that.selectable.clear();\n                                }\n                                if (!cell) {\n                                    that.selectable._lastActive = current;\n                                }\n                                that.selectable.value(current);\n                            } else if (!cell && (e.shiftKey && e.keyCode == keys.LEFT || e.shiftKey && e.keyCode == keys.RIGHT || e.shiftKey && e.keyCode == keys.UP || e.shiftKey && e.keyCode == keys.DOWN || e.keyCode === keys.SPACEBAR && e.shiftKey)) {\n                                e.preventDefault();\n                                e.stopPropagation();\n                                current = current.parent();\n                                if (isLocked) {\n                                    current = current.add(that._relatedRow(current));\n                                }\n                                if (multi) {\n                                    if (!that.selectable._lastActive) {\n                                        that.selectable._lastActive = current;\n                                    }\n                                    that.selectable.selectRange(that.selectable._firstSelectee(), current);\n                                } else {\n                                    that.selectable.clear();\n                                    that.selectable.value(current);\n                                }\n                            }\n                        });\n                    }\n                }\n            },\n            _clipboard: function () {\n                var options = this.options;\n                var selectable = options.selectable;\n                if (selectable && options.allowCopy) {\n                    var grid = this;\n                    if (!options.navigatable) {\n                        grid.table.add(grid.lockedTable).attr('tabindex', 0).on('mousedown' + NS + ' keydown' + NS, '.k-detail-cell', function (e) {\n                            if (e.target !== e.currentTarget) {\n                                e.stopImmediatePropagation();\n                            }\n                        }).on('mousedown' + NS, NAVROW + '>' + NAVCELL, proxy(tableClick, grid));\n                    }\n                    grid.copyHandler = proxy(grid.copySelection, grid);\n                    grid.updateClipBoardState = function () {\n                        if (grid.areaClipBoard) {\n                            grid.areaClipBoard.val(grid.getTSV()).focus().select();\n                        }\n                    };\n                    grid.bind('change', grid.updateClipBoardState);\n                    grid.wrapper.on('keydown', grid.copyHandler);\n                    grid.clearAreaHandler = proxy(grid.clearArea, grid);\n                    grid.wrapper.on('keyup', grid.clearAreaHandler);\n                }\n            },\n            copySelection: function (e) {\n                if (e instanceof jQuery.Event && !(e.ctrlKey || e.metaKey) || $(e.target).is('input:visible,textarea:visible') || window.getSelection && window.getSelection().toString() || document.selection && document.selection.createRange().text) {\n                    return;\n                }\n                if (!this.areaClipBoard) {\n                    this.areaClipBoard = $('<textarea />').css({\n                        position: 'fixed',\n                        top: '50%',\n                        left: '50%',\n                        opacity: 0,\n                        width: 0,\n                        height: 0\n                    }).appendTo(this.wrapper);\n                }\n                this.areaClipBoard.val(this.getTSV()).focus().select();\n            },\n            getTSV: function () {\n                var grid = this;\n                var selected = grid.select();\n                var delimeter = '\\t';\n                var allowCopy = grid.options.allowCopy;\n                var onlyVisible = true;\n                if ($.isPlainObject(allowCopy) && allowCopy.delimeter) {\n                    delimeter = allowCopy.delimeter;\n                }\n                var text = '';\n                if (selected.length) {\n                    if (selected.eq(0).is('tr')) {\n                        selected = selected.find('td:not(.k-group-cell)');\n                    }\n                    if (onlyVisible) {\n                        selected.filter(':visible');\n                    }\n                    var result = [];\n                    var cellsOffset = this.columns.length;\n                    var lockedCols = grid._isLocked() && lockedColumns(grid.columns).length;\n                    var inLockedArea = true;\n                    $.each(selected, function (idx, cell) {\n                        cell = $(cell);\n                        var tr = cell.closest('tr');\n                        var rowIndex = tr.index();\n                        var cellIndex = cell.index();\n                        if (onlyVisible) {\n                            cellIndex -= cell.prevAll(':hidden').length;\n                        }\n                        if (lockedCols && inLockedArea) {\n                            inLockedArea = $.contains(grid.lockedTable[0], cell[0]);\n                        }\n                        if (grid._groups() && inLockedArea) {\n                            cellIndex -= grid._groups();\n                        }\n                        cellIndex = inLockedArea ? cellIndex : cellIndex + lockedCols;\n                        if (cellsOffset > cellIndex) {\n                            cellsOffset = cellIndex;\n                        }\n                        var cellText = cell.text();\n                        if (!result[rowIndex]) {\n                            result[rowIndex] = [];\n                        }\n                        result[rowIndex][cellIndex] = cellText;\n                    });\n                    var rowsOffset = result.length;\n                    result = $.each(result, function (idx, val) {\n                        if (val) {\n                            result[idx] = val.slice(cellsOffset);\n                            if (rowsOffset > idx) {\n                                rowsOffset = idx;\n                            }\n                        }\n                    });\n                    $.each(result.slice(rowsOffset), function (idx, val) {\n                        if (val) {\n                            text += val.join(delimeter) + '\\r\\n';\n                        } else {\n                            text += '\\r\\n';\n                        }\n                    });\n                }\n                return text;\n            },\n            clearArea: function (e) {\n                var table;\n                if (this.areaClipBoard && e && e.target === this.areaClipBoard[0]) {\n                    if (this.options.navigatable) {\n                        table = $(this.current()).closest('table');\n                    } else {\n                        table = this.table;\n                    }\n                    focusTable(table, true);\n                }\n                if (this.areaClipBoard) {\n                    this.areaClipBoard.remove();\n                    this.areaClipBoard = null;\n                }\n            },\n            _minScreenSupport: function () {\n                var any = this.hideMinScreenCols();\n                if (any) {\n                    this.minScreenResizeHandler = proxy(this.hideMinScreenCols, this);\n                    $(window).on('resize', this.minScreenResizeHandler);\n                }\n            },\n            hideMinScreenCols: function () {\n                var cols = this.columns, screenWidth = window.innerWidth > 0 ? window.innerWidth : screen.width;\n                return this._iterateMinScreenCols(cols, screenWidth);\n            },\n            _iterateMinScreenCols: function (cols, screenWidth) {\n                var any = false;\n                for (var i = 0; i < cols.length; i++) {\n                    var col = cols[i];\n                    var minWidth = col.minScreenWidth;\n                    if (minWidth !== undefined && minWidth !== null) {\n                        any = true;\n                        if (minWidth > screenWidth) {\n                            this.hideColumn(col);\n                        } else {\n                            this.showColumn(col);\n                        }\n                    }\n                    if (!col.hidden && col.columns) {\n                        any = this._iterateMinScreenCols(col.columns, screenWidth) || any;\n                    }\n                }\n                return any;\n            },\n            _relatedRow: function (row) {\n                var lockedTable = this.lockedTable;\n                row = $(row);\n                if (!lockedTable) {\n                    return row;\n                }\n                var table = row.closest(this.table.add(this.lockedTable));\n                var index = table.find('>tbody>tr').index(row);\n                table = table[0] === this.table[0] ? lockedTable : this.table;\n                return table.find('>tbody>tr').eq(index);\n            },\n            clearSelection: function () {\n                var that = this;\n                if (that.selectable) {\n                    that.selectable.clear();\n                }\n                if ($.grep(leafColumns(that.columns), function (col) {\n                        return col.selectable;\n                    }).length) {\n                    that._deselectCheckRows(that.select());\n                }\n                if (that.options.persistSelection) {\n                    that._persistSelectedRows();\n                }\n                that.trigger(CHANGE);\n            },\n            select: function (items) {\n                var that = this, selectable = that.selectable;\n                items = that.table.add(that.lockedTable).find(items);\n                if (items.length) {\n                    if (selectable && !selectable.options.multiple) {\n                        selectable.clear();\n                        items = items.first();\n                    }\n                    if (that._isLocked()) {\n                        items = items.add(items.map(function () {\n                            return that._relatedRow(this);\n                        }));\n                    }\n                    if (selectable) {\n                        selectable.value(items);\n                    } else {\n                        items.each(function () {\n                            $(this).addClass(SELECTED).find(CHECKBOXINPUT).prop('checked', true).attr('aria-label', 'Deselect row').attr('aria-checked', true);\n                        });\n                        if (that.select().length === that.items().length) {\n                            that._toggleHeaderCheckState(true);\n                        }\n                        if (that.options.persistSelection) {\n                            that._persistSelectedRows();\n                        }\n                        that.trigger(CHANGE);\n                    }\n                    return;\n                }\n                return selectable ? selectable.value() : that.items().filter('.' + SELECTED);\n            },\n            _toggleHeaderCheckState: function (checked) {\n                var that = this;\n                if (checked) {\n                    that.thead.add(that.lockedHeader).find('tr ' + CHECKBOXINPUT).prop('checked', true).attr('aria-checked', true).attr('aria-label', 'Deselect all rows');\n                } else {\n                    that.thead.add(that.lockedHeader).find('tr ' + CHECKBOXINPUT).prop('checked', false).attr('aria-checked', false).attr('aria-label', 'Select all rows');\n                }\n            },\n            _deselectCheckRows: function (items) {\n                var that = this;\n                items = that.table.add(that.lockedTable).find(items);\n                items.each(function () {\n                    $(this).removeClass(SELECTED).find(CHECKBOXINPUT).attr('aria-checked', false).prop('checked', false).attr('aria-label', 'Select row');\n                });\n                that._toggleHeaderCheckState(false);\n                if (that.options.persistSelection) {\n                    that._persistSelectedRows();\n                }\n                that.trigger(CHANGE);\n            },\n            _persistSelectedRows: function () {\n                var that = this, key, dataItem, allRows = that.items(), dataSourceOptions = that.dataSource.options, modelId = dataSourceOptions.schema.model.id, selectedViewIds = {};\n                that.select().each(function () {\n                    dataItem = that.dataItem(this);\n                    selectedViewIds[dataItem[modelId]] = true;\n                });\n                for (var i = 0; i < allRows.length; i++) {\n                    dataItem = that.dataItem(allRows[i]);\n                    key = dataItem[modelId];\n                    if (selectedViewIds[key]) {\n                        that._selectedIds[key] = true;\n                    } else {\n                        delete that._selectedIds[key];\n                    }\n                }\n            },\n            selectedKeyNames: function () {\n                var that = this, ids = [];\n                for (var property in that._selectedIds) {\n                    ids.push(property);\n                }\n                ids.sort();\n                return ids;\n            },\n            _updateCurrentAttr: function (current, next) {\n                var headerId = $(current).data('headerId');\n                $(current).removeClass(FOCUSED).closest('table').removeAttr('aria-activedescendant');\n                if (headerId) {\n                    headerId = headerId.replace(this._cellId, '');\n                    $(current).attr('id', headerId);\n                } else {\n                    $(current).removeAttr('id');\n                }\n                next.data('headerId', next.attr('id')).attr('id', this._cellId).addClass(FOCUSED).closest('table').attr('aria-activedescendant', this._cellId);\n                this._current = next;\n            },\n            _scrollCurrent: function () {\n                var current = this._current;\n                var scrollable = this.options.scrollable;\n                if (!current || !scrollable) {\n                    return;\n                }\n                var row = current.parent();\n                var tableContainer = row.closest('table').parent();\n                var isInLockedContainer = tableContainer.is('.k-grid-content-locked,.k-grid-header-locked');\n                var isInContent = tableContainer.is('.k-grid-content-locked,.k-grid-content,.k-virtual-scrollable-wrap');\n                var scrollableContainer = $(this.content).find('>.k-virtual-scrollable-wrap').addBack().last()[0];\n                if (isInContent) {\n                    if (scrollable.virtual) {\n                        var rowIndex = Math.max(inArray(row[0], this._items(row.parent())), 0);\n                        this._rowVirtualIndex = this.virtualScrollable.itemIndex(rowIndex);\n                        this.virtualScrollable.scrollIntoView(row);\n                    } else {\n                        this._scrollTo(this._relatedRow(row)[0], scrollableContainer);\n                    }\n                }\n                if (this.lockedContent) {\n                    this.lockedContent[0].scrollTop = scrollableContainer.scrollTop;\n                }\n                if (!isInLockedContainer) {\n                    this._scrollTo(current[0], scrollableContainer);\n                }\n            },\n            current: function (next) {\n                return this._setCurrent(next, true);\n            },\n            _setCurrent: function (next, preventTrigger) {\n                var current = this._current;\n                next = $(next);\n                if (next.length) {\n                    if (!current || current[0] !== next[0]) {\n                        this._updateCurrentAttr(current, next);\n                        this._scrollCurrent();\n                        if (!preventTrigger) {\n                            this.trigger(NAVIGATE, { element: next });\n                        }\n                    }\n                }\n                return this._current;\n            },\n            _removeCurrent: function () {\n                if (this._current) {\n                    this._current.removeClass(FOCUSED);\n                    this._current = null;\n                }\n            },\n            _scrollTo: function (element, container) {\n                var elementToLowercase = element.tagName.toLowerCase();\n                var isHorizontal = elementToLowercase === 'td' || elementToLowercase === 'th';\n                var elementOffset = element[isHorizontal ? 'offsetLeft' : 'offsetTop'];\n                var elementOffsetDir = element[isHorizontal ? 'offsetWidth' : 'offsetHeight'];\n                var containerScroll = container[isHorizontal ? 'scrollLeft' : 'scrollTop'];\n                var containerOffsetDir = container[isHorizontal ? 'clientWidth' : 'clientHeight'];\n                var bottomDistance = elementOffset + elementOffsetDir;\n                var result = 0;\n                var ieCorrection = 0;\n                var firefoxCorrection = 0;\n                if (isRtl && isHorizontal) {\n                    var table = $(element).closest('table')[0];\n                    if (browser.msie) {\n                        ieCorrection = table.offsetLeft;\n                    } else if (browser.mozilla) {\n                        firefoxCorrection = table.offsetLeft - kendo.support.scrollbar();\n                    }\n                }\n                containerScroll = Math.abs(containerScroll + ieCorrection - firefoxCorrection);\n                if (containerScroll > elementOffset) {\n                    result = elementOffset;\n                } else if (bottomDistance > containerScroll + containerOffsetDir) {\n                    if (elementOffsetDir <= containerOffsetDir) {\n                        result = bottomDistance - containerOffsetDir;\n                    } else {\n                        result = elementOffset;\n                    }\n                } else {\n                    result = containerScroll;\n                }\n                result = Math.abs(result + ieCorrection) + firefoxCorrection;\n                container[isHorizontal ? 'scrollLeft' : 'scrollTop'] = result;\n            },\n            _navigatable: function () {\n                var that = this;\n                if (!that.options.navigatable) {\n                    return;\n                }\n                var dataTables = that.table.add(that.lockedTable);\n                var headerTables = that.thead.parent().add($('>table', that.lockedHeader));\n                var tables = dataTables;\n                if (that.options.scrollable) {\n                    tables = tables.add(headerTables);\n                    headerTables.attr(TABINDEX, -1);\n                }\n                this._navigatableTables = tables;\n                tables.off('mousedown' + NS + ' focus' + NS + ' focusout' + NS + ' keydown' + NS);\n                headerTables.on('keydown' + NS, proxy(that._openHeaderMenu, that)).find('a.k-link').attr('tabIndex', -1);\n                dataTables.attr(TABINDEX, math.max(dataTables.attr(TABINDEX) || 0, 0)).on('mousedown' + NS + ' keydown' + NS, '.k-detail-cell', function (e) {\n                    if (e.target !== e.currentTarget) {\n                        e.stopImmediatePropagation();\n                    }\n                });\n                tables.on(kendo.support.touch ? 'touchstart' + NS : 'mousedown' + NS, NAVROW + '>' + NAVCELL, proxy(tableClick, that)).on('focus' + NS, proxy(that._tableFocus, that)).on('focusout' + NS, proxy(that._tableBlur, that)).on('keydown' + NS, proxy(that._tableKeyDown, that));\n            },\n            _openHeaderMenu: function (e) {\n                if (e.altKey && e.keyCode == keys.DOWN) {\n                    this.current().find('.k-grid-filter, .k-header-column-menu').click();\n                    e.stopImmediatePropagation();\n                }\n            },\n            _setTabIndex: function (table) {\n                this._navigatableTables.attr(TABINDEX, -1);\n                table.attr(TABINDEX, 0);\n            },\n            _tableFocus: function (e) {\n                if (kendo.support.touch) {\n                    return;\n                }\n                var current = this.current();\n                var table = $(e.currentTarget);\n                if (current && current.is(':visible')) {\n                    current.addClass(FOCUSED);\n                } else {\n                    this._setCurrent(table.find(FIRSTNAVITEM));\n                }\n                this._setTabIndex(table);\n            },\n            _tableBlur: function () {\n                var current = this.current();\n                if (current) {\n                    current.removeClass(FOCUSED);\n                }\n            },\n            _tableKeyDown: function (e) {\n                var current = this.current();\n                var requestInProgress = this.virtualScrollable && this.virtualScrollable.fetching();\n                var target = $(e.target);\n                var canHandle = !e.isDefaultPrevented() && !target.is(':button,a,:input,a>.k-icon');\n                if (requestInProgress) {\n                    e.preventDefault();\n                    return;\n                }\n                current = current ? current : $(this.lockedTable).add(this.table).find(FIRSTNAVITEM);\n                if (!current.length) {\n                    return;\n                }\n                var handled = false;\n                if (canHandle && e.keyCode == keys.UP) {\n                    handled = this._moveUp(current, e.shiftKey);\n                }\n                if (canHandle && e.keyCode == keys.DOWN) {\n                    handled = this._moveDown(current, e.shiftKey);\n                }\n                if (canHandle && e.keyCode == (isRtl ? keys.LEFT : keys.RIGHT)) {\n                    handled = this._moveRight(current, e.altKey, e.shiftKey, e.currentTarget);\n                }\n                if (canHandle && e.keyCode == (isRtl ? keys.RIGHT : keys.LEFT)) {\n                    handled = this._moveLeft(current, e.altKey, e.shiftKey, e.currentTarget);\n                }\n                if (canHandle && e.keyCode == keys.PAGEDOWN) {\n                    handled = this._handlePageDown();\n                }\n                if (canHandle && e.keyCode == keys.PAGEUP) {\n                    handled = this._handlePageUp();\n                }\n                if (e.keyCode == keys.ENTER || e.keyCode == keys.F2) {\n                    handled = this._handleEnterKey(current, e.currentTarget, target);\n                }\n                if (e.keyCode == keys.ESC) {\n                    handled = this._handleEscKey(current, e.currentTarget);\n                }\n                if (e.keyCode == keys.TAB) {\n                    handled = this._handleTabKey(current, e.currentTarget, e.shiftKey);\n                }\n                if (handled) {\n                    e.preventDefault();\n                    e.stopPropagation();\n                }\n            },\n            _moveLeft: function (current, altKey, shiftKey, currentTable) {\n                var next, index;\n                var row = current.parent();\n                var container = row.parent();\n                if (altKey) {\n                    this.collapseRow(row);\n                } else {\n                    index = container.find(NAVROW).index(row);\n                    next = this._prevHorizontalCell(container, current, index);\n                    if (!next[0]) {\n                        if (shiftKey) {\n                            if (this.lockedTable) {\n                                next = this._relatedRow(row);\n                                if ($.contains(this.lockedTable[0], row[0])) {\n                                    next = next.prevAll(ITEMROW + ':first');\n                                }\n                                next = next.children(DATA_CELL + ':last');\n                            } else {\n                                next = this._tabNext(current, currentTable, true);\n                            }\n                        } else {\n                            container = this._horizontalContainer(container);\n                            next = this._prevHorizontalCell(container, current, index);\n                            if (next[0] !== current[0]) {\n                                focusTable(container.parent(), true);\n                            }\n                        }\n                    }\n                    this._setCurrent(next);\n                }\n                return true;\n            },\n            _moveRight: function (current, altKey, shiftKey, currentTable) {\n                var next, index;\n                var row = current.parent();\n                var container = row.parent();\n                if (altKey) {\n                    this.expandRow(row);\n                } else {\n                    index = container.find(NAVROW).index(row);\n                    next = this._nextHorizontalCell(container, current, index);\n                    if (!next[0]) {\n                        if (shiftKey) {\n                            if (this.lockedTable) {\n                                next = this._relatedRow(row);\n                                if ($.contains(this.table[0], row[0])) {\n                                    next = next.nextAll(ITEMROW + ':first');\n                                }\n                                next = next.children(DATA_CELL + ':first');\n                            } else {\n                                next = this._tabNext(current, currentTable, false);\n                            }\n                        } else {\n                            container = this._horizontalContainer(container, true);\n                            next = this._nextHorizontalCell(container, current, index);\n                            if (next[0] !== current[0]) {\n                                focusTable(container.parent(), true);\n                            }\n                        }\n                    }\n                    this._setCurrent(next);\n                }\n                return true;\n            },\n            _moveUp: function (current, shiftKey) {\n                var container = current.parent().parent();\n                var next;\n                if (shiftKey) {\n                    next = current.parent();\n                    next = next.prevAll(ITEMROW + ':first');\n                    next = current.parent().is(ITEMROW) ? next.children().eq(current.index()) : next.children(DATA_CELL + ':last');\n                } else {\n                    next = this._prevVerticalCell(container, current);\n                    if (!next[0]) {\n                        container = this._verticalContainer(container, true);\n                        next = this._prevVerticalCell(container, current);\n                        if (next[0]) {\n                            focusTable(container.parent(), true);\n                        }\n                    }\n                }\n                this._setCurrent(next);\n                return true;\n            },\n            _moveDown: function (current, shiftKey) {\n                var container = current.parent().parent();\n                var next;\n                if (shiftKey) {\n                    next = current.parent();\n                    next = next.nextAll(ITEMROW + ':first');\n                    next = current.parent().is(ITEMROW) ? next.children().eq(current.index()) : next.children(DATA_CELL + ':first');\n                } else {\n                    next = this._nextVerticalCell(container, current);\n                    if (!next[0]) {\n                        container = this._verticalContainer(container);\n                        next = this._nextVerticalCell(container, current);\n                        if (next[0]) {\n                            focusTable(container.parent(), true);\n                        }\n                    }\n                }\n                this._setCurrent(next);\n                return true;\n            },\n            _handlePageDown: function () {\n                if (!this.options.pageable) {\n                    return false;\n                }\n                this.dataSource.page(this.dataSource.page() + 1);\n                return true;\n            },\n            _handlePageUp: function () {\n                if (!this.options.pageable) {\n                    return false;\n                }\n                this.dataSource.page(this.dataSource.page() - 1);\n                return true;\n            },\n            _handleTabKey: function (current, currentTable, shiftKey) {\n                var isInCell = this.options.editable && this._editMode() == 'incell';\n                var cell;\n                if (!isInCell || current.is('th')) {\n                    return false;\n                }\n                cell = $(activeElement()).closest('.k-edit-cell');\n                if (cell[0] && cell[0] !== current[0]) {\n                    current = cell;\n                }\n                cell = this._tabNext(current, currentTable, shiftKey);\n                if (cell.length) {\n                    this._handleEditing(current, cell, cell.closest('table'));\n                    return true;\n                }\n                return false;\n            },\n            _handleEscKey: function (current, currentTable) {\n                var active = activeElement();\n                var isInCell = this._editMode() == 'incell';\n                if (!isInEdit(current)) {\n                    if (current.has(active).length) {\n                        focusTable(currentTable, true);\n                        return true;\n                    }\n                    return false;\n                }\n                if (isInCell) {\n                    this.closeCell(true);\n                } else {\n                    var currentIndex = $(current).parent().index();\n                    if (active) {\n                        active.blur();\n                    }\n                    this.cancelRow(true);\n                    if (currentIndex >= 0) {\n                        this._setCurrent(this.items().eq(currentIndex).children(NAVCELL).first());\n                    }\n                }\n                if (browser.msie && browser.version < 9) {\n                    document.body.focus();\n                }\n                focusTable(currentTable, true);\n                return true;\n            },\n            _toggleCurrent: function (current, editable) {\n                var row = current.parent();\n                if (row.is('.k-grouping-row')) {\n                    row.find('.k-icon:first').click();\n                    return true;\n                }\n                if (!editable && row.is('.k-master-row')) {\n                    row.find('.k-icon:first').click();\n                    return true;\n                }\n                return false;\n            },\n            _handleEnterKey: function (current, currentTable, target) {\n                var editable = this.options.editable && this.options.editable.update !== false;\n                var container = target.closest('[role=gridcell]');\n                if (!target.is('table') && !$.contains(current[0], target[0])) {\n                    current = container;\n                }\n                if (current.is('th')) {\n                    current.find('.k-link').click();\n                    return true;\n                }\n                if (this._toggleCurrent(current, editable)) {\n                    return true;\n                }\n                var focusable = current.find(':kendoFocusable:first');\n                if (focusable[0] && !current.hasClass('k-edit-cell') && current.hasClass('k-state-focused')) {\n                    focusable.focus();\n                    return true;\n                }\n                if (editable && !target.is(':button,.k-button,textarea')) {\n                    if (!container[0]) {\n                        container = current;\n                    }\n                    this._handleEditing(container, false, currentTable);\n                    return true;\n                }\n                return false;\n            },\n            _nextHorizontalCell: function (table, current, originalIndex) {\n                var cells = current.nextAll(DATA_CELL);\n                if (!cells.length) {\n                    var rows = table.find(NAVROW);\n                    var rowIndex = rows.index(current.parent());\n                    if (rowIndex == -1) {\n                        if (current.hasClass('k-header')) {\n                            var headerRows = [];\n                            mapColumnToCellRows([lockedColumns(this.columns)[0]], childColumnsCells(rows.eq(0).children().first()), headerRows, 0, 0);\n                            if (headerRows[originalIndex]) {\n                                return headerRows[originalIndex][0];\n                            }\n                            return current;\n                        }\n                        if (current.parent().hasClass('k-filter-row')) {\n                            return rows.last().children(DATA_CELL).first();\n                        }\n                        return rows.eq(originalIndex).children(DATA_CELL).first();\n                    }\n                }\n                return cells.first();\n            },\n            _prevHorizontalCell: function (table, current, originalIndex) {\n                var cells = current.prevAll(DATA_CELL);\n                if (!cells.length) {\n                    var rows = table.find(NAVROW);\n                    var rowIndex = rows.index(current.parent());\n                    if (rowIndex == -1) {\n                        if (current.hasClass('k-header')) {\n                            var headerRows = [];\n                            var columns = lockedColumns(this.columns);\n                            mapColumnToCellRows([columns[columns.length - 1]], childColumnsCells(rows.eq(0).children().last()), headerRows, 0, 0);\n                            if (headerRows[originalIndex]) {\n                                return headerRows[originalIndex][0];\n                            }\n                            return current;\n                        }\n                        if (current.parent().hasClass('k-filter-row')) {\n                            return rows.last().children(DATA_CELL).last();\n                        }\n                        return rows.eq(originalIndex).children(DATA_CELL).last();\n                    }\n                }\n                return cells.first();\n            },\n            _currentDataIndex: function (table, current) {\n                var index = current.attr('data-index');\n                if (!index) {\n                    return undefined;\n                }\n                var lockedColumnsCount = lockedColumns(this.columns).length;\n                if (lockedColumnsCount && !table.closest('div').hasClass('k-grid-content-locked')[0]) {\n                    return index - lockedColumnsCount;\n                }\n                return index;\n            },\n            _prevVerticalCell: function (container, current) {\n                var cells;\n                var row = current.parent();\n                var rows = container.children(NAVROW);\n                var rowIndex = rows.index(row);\n                var index = this._currentDataIndex(container, current);\n                if (index || current.hasClass('k-header')) {\n                    cells = parentColumnsCells(current);\n                    return cells.eq(cells.length - 2);\n                }\n                index = row.children(DATA_CELL).index(current);\n                if (row.hasClass('k-filter-row')) {\n                    return leafDataCells(container).eq(index);\n                }\n                if (rowIndex == -1) {\n                    row = container.find('.k-filter-row');\n                    if (!row[0]) {\n                        return leafDataCells(container).eq(index);\n                    }\n                } else {\n                    row = rowIndex === 0 ? $() : rows.eq(rowIndex - 1);\n                }\n                cells = row.children(DATA_CELL);\n                if (cells.length > index) {\n                    return cells.eq(index);\n                }\n                return cells.eq(0);\n            },\n            _nextVerticalCell: function (container, current) {\n                var cells;\n                var row = current.parent();\n                var rows = container.children(NAVROW);\n                var rowIndex = rows.index(row);\n                var index = this._currentDataIndex(container, current);\n                if (rowIndex != -1 && index === undefined && current.hasClass('k-header')) {\n                    return childColumnsCells(current).eq(1);\n                }\n                index = index ? parseInt(index, 10) : row.children(DATA_CELL).index(current);\n                if (rowIndex == -1) {\n                    row = rows.eq(0);\n                } else {\n                    row = rows.eq(rowIndex + current[0].rowSpan);\n                }\n                cells = row.children(DATA_CELL);\n                if (cells.length > index) {\n                    return cells.eq(index);\n                }\n                return cells.eq(0);\n            },\n            _verticalContainer: function (container, up) {\n                var table = container.parent();\n                var length = this._navigatableTables.length;\n                var step = Math.floor(length / 2);\n                var index = inArray(table[0], this._navigatableTables);\n                if (up) {\n                    step *= -1;\n                }\n                index += step;\n                if (index >= 0 || index < length) {\n                    table = this._navigatableTables.eq(index);\n                }\n                return table.find(up ? 'thead' : 'tbody');\n            },\n            _horizontalContainer: function (container, right) {\n                var length = this._navigatableTables.length;\n                if (length <= 2) {\n                    return container;\n                }\n                var table = container.parent();\n                var index = inArray(table[0], this._navigatableTables);\n                index += right ? 1 : -1;\n                if (right && (index == 2 || index == length)) {\n                    return container;\n                }\n                if (!right && (index == 1 || index < 0)) {\n                    return container;\n                }\n                return this._navigatableTables.eq(index).find('thead, tbody');\n            },\n            _tabNext: function (current, currentTable, back) {\n                var switchRow = true;\n                var next = back ? current.prevAll(DATA_CELL + ':first') : current.nextAll(':visible:first');\n                if (!next.length) {\n                    next = current.parent();\n                    if (this.lockedTable) {\n                        switchRow = back && currentTable == this.lockedTable[0] || !back && currentTable == this.table[0];\n                        next = this._relatedRow(next);\n                    }\n                    if (switchRow) {\n                        next = next[back ? 'prevAll' : 'nextAll']('tr:not(.k-grouping-row):not(.k-detail-row):visible:first');\n                    }\n                    next = next.children(DATA_CELL + (back ? ':last' : ':first'));\n                }\n                return next;\n            },\n            _handleEditing: function (current, next, table) {\n                var that = this, active = $(activeElement()), mode = that._editMode(), isIE = browser.msie, oldIE = isIE && browser.version < 9, editContainer = that._editContainer, focusable, editable = that.options.editable && that.options.editable.update !== false, isEdited;\n                table = $(table);\n                if (mode == 'incell') {\n                    isEdited = current.hasClass('k-edit-cell');\n                } else {\n                    isEdited = current.parent().hasClass('k-grid-edit-row');\n                }\n                if (that.editable) {\n                    if ($.contains(editContainer[0], active[0])) {\n                        if (browser.opera || oldIE) {\n                            active.blur().change().triggerHandler('blur');\n                        } else {\n                            active.blur();\n                            if (isIE) {\n                                active.blur();\n                            }\n                        }\n                    }\n                    if (!that.editable) {\n                        focusTable(table);\n                        return;\n                    }\n                    if (that.editable.end()) {\n                        if (mode == 'incell') {\n                            that.closeCell();\n                        } else {\n                            that.saveRow();\n                            isEdited = true;\n                        }\n                    } else {\n                        if (mode == 'incell') {\n                            that._setCurrent(editContainer);\n                        } else {\n                            that._setCurrent(editContainer.children().filter(DATA_CELL).first());\n                        }\n                        focusable = editContainer.find(':kendoFocusable:first')[0];\n                        if (focusable) {\n                            focusable.focus();\n                        }\n                        return;\n                    }\n                }\n                if (next) {\n                    that._setCurrent(next);\n                }\n                if (oldIE) {\n                    document.body.focus();\n                }\n                focusTable(table, true);\n                if (!editable) {\n                    return;\n                }\n                if (!isEdited && !next || next) {\n                    if (mode == 'incell') {\n                        that.editCell(that.current());\n                    } else {\n                        that.editRow(that.current().parent());\n                    }\n                }\n            },\n            _wrapper: function () {\n                var that = this, table = that.table, height = that.options.height, wrapper = that.element;\n                if (!wrapper.is('div')) {\n                    wrapper = wrapper.wrap('<div/>').parent();\n                }\n                that.wrapper = wrapper.addClass('k-grid k-widget k-display-block');\n                if (height) {\n                    that.wrapper.css(HEIGHT, height);\n                    table.css(HEIGHT, 'auto');\n                }\n                that._initMobile();\n            },\n            _initMobile: function () {\n                var options = this.options;\n                var that = this;\n                this._isMobile = options.mobile === true && kendo.support.mobileOS || options.mobile === 'phone' || options.mobile === 'tablet';\n                if (this._isMobile) {\n                    var html = this.wrapper.addClass('k-grid-mobile').wrap('<div data-' + kendo.ns + 'stretch=\"true\" data-' + kendo.ns + 'role=\"view\" ' + 'data-' + kendo.ns + 'init-widgets=\"false\"></div>').parent();\n                    this.pane = kendo.mobile.ui.Pane.wrap(html);\n                    this.view = this.pane.view();\n                    this._actionSheetPopupOptions = $(document.documentElement).hasClass('km-root') ? { modal: false } : {\n                        align: 'bottom center',\n                        position: 'bottom center',\n                        effect: 'slideIn:up'\n                    };\n                    if (options.height) {\n                        this.pane.element.parent().css(HEIGHT, options.height);\n                    }\n                    this._editAnimation = 'slide';\n                    this.view.bind('show', function () {\n                        if (that._isLocked()) {\n                            that._updateTablesWidth();\n                            that._applyLockedContainersWidth();\n                            that._syncLockedContentHeight();\n                            that._syncLockedHeaderHeight();\n                            that._syncLockedFooterHeight();\n                        }\n                    });\n                }\n            },\n            _tbody: function () {\n                var that = this, table = that.table, tbody;\n                tbody = table.find('>tbody');\n                if (!tbody.length) {\n                    tbody = $('<tbody/>').appendTo(table);\n                }\n                that.tbody = tbody.attr('role', 'rowgroup');\n            },\n            _scrollable: function () {\n                var that = this, header, table, options = that.options, scrollable = options.scrollable, hasVirtualScroll = scrollable !== true && scrollable.virtual && !that.virtualScrollable, scrollbar = !kendo.support.kineticScrollNeeded || hasVirtualScroll ? kendo.support.scrollbar() : 0;\n                if (scrollable) {\n                    header = that.wrapper.children('.k-grid-header');\n                    if (!header[0]) {\n                        header = $('<div class=\"k-grid-header\" />').insertBefore(that.table);\n                    }\n                    header.css(isRtl ? 'padding-left' : 'padding-right', scrollable.virtual ? scrollbar + 1 : scrollbar);\n                    table = $('<table role=\"grid\" />');\n                    if (isIE7) {\n                        table.attr('cellspacing', 0);\n                    }\n                    table.width(that.table[0].style.width);\n                    table.append(that.thead);\n                    header.empty().append($('<div class=\"k-grid-header-wrap k-auto-scrollable\" />').append(table));\n                    that.content = that.table.parent();\n                    if (that.content.is('.k-virtual-scrollable-wrap, .km-scroll-container')) {\n                        that.content = that.content.parent();\n                    }\n                    if (!that.content.is('.k-grid-content, .k-virtual-scrollable-wrap')) {\n                        that.content = that.table.wrap('<div class=\"k-grid-content k-auto-scrollable\" />').parent();\n                    }\n                    if (hasVirtualScroll) {\n                        that.virtualScrollable = new VirtualScrollable(that.content, {\n                            dataSource: that.dataSource,\n                            itemHeight: function () {\n                                return that._averageRowHeight();\n                            }\n                        });\n                    }\n                    that.scrollables = header.children('.k-grid-header-wrap').add(that.content);\n                    var footer = that.wrapper.find('.k-grid-footer');\n                    if (footer.length) {\n                        that.scrollables = that.scrollables.add(footer.children('.k-grid-footer-wrap'));\n                    }\n                    if (scrollable.virtual) {\n                        that.content.find('>.k-virtual-scrollable-wrap').unbind('scroll' + NS).bind('scroll' + NS, function () {\n                            that.scrollables.scrollLeft(this.scrollLeft);\n                            if (that.lockedContent) {\n                                that.lockedContent[0].scrollTop = this.scrollTop;\n                            }\n                        });\n                    } else {\n                        that.content.unbind('scroll' + NS).bind('scroll' + NS, function (e) {\n                            that.scrollables.not(e.currentTarget).scrollLeft(this.scrollLeft);\n                            if (that.lockedContent && e.currentTarget == that.content[0]) {\n                                that.lockedContent[0].scrollTop = this.scrollTop;\n                            }\n                        });\n                        var touchScroller = that.content.data('kendoTouchScroller');\n                        if (touchScroller) {\n                            touchScroller.destroy();\n                        }\n                        touchScroller = kendo.touchScroller(that.content);\n                        if (touchScroller && touchScroller.movable) {\n                            that.touchScroller = touchScroller;\n                            touchScroller.movable.bind('change', function (e) {\n                                that.scrollables.scrollLeft(-e.sender.x);\n                                if (that.lockedContent) {\n                                    that.lockedContent.scrollTop(-e.sender.y);\n                                }\n                            });\n                            that.one(DATABOUND, function (e) {\n                                e.sender.wrapper.addClass('k-grid-backface');\n                            });\n                        }\n                    }\n                }\n            },\n            _renderNoRecordsContent: function () {\n                var that = this;\n                if (that.options.noRecords) {\n                    var noRecordsElement = that.table.parent().children('.' + NORECORDSCLASS);\n                    if (noRecordsElement.length) {\n                        that.angular('cleanup', function () {\n                            return { elements: noRecordsElement.get() };\n                        });\n                        noRecordsElement.remove();\n                    }\n                    if (!that.dataSource || !that.dataSource.view().length) {\n                        noRecordsElement = $(that.noRecordsTemplate({})).insertAfter(that.table);\n                        that.angular('compile', function () {\n                            return {\n                                elements: noRecordsElement.get(),\n                                data: [{}]\n                            };\n                        });\n                    }\n                }\n            },\n            _setContentWidth: function (scrollLeft) {\n                var that = this, hiddenDivClass = 'k-grid-content-expander', hiddenDiv = '<div class=\"' + hiddenDivClass + '\"></div>', resizable = that.resizable, expander;\n                if (that.options.scrollable && that.wrapper.is(':visible')) {\n                    expander = that.table.parent().children('.' + hiddenDivClass);\n                    that._setContentWidthHandler = proxy(that._setContentWidth, that);\n                    if (!that.dataSource || !that.dataSource.view().length) {\n                        if (!expander[0]) {\n                            expander = $(hiddenDiv).appendTo(that.table.parent());\n                            if (resizable) {\n                                resizable.bind('resize', that._setContentWidthHandler);\n                            }\n                        }\n                        if (that.thead) {\n                            expander.width(that.thead.width());\n                            if (!isNaN(parseFloat(scrollLeft, 10))) {\n                                that.content.scrollLeft(scrollLeft);\n                            }\n                        }\n                    } else if (expander[0]) {\n                        expander.remove();\n                        if (resizable) {\n                            resizable.unbind('resize', that._setContentWidthHandler);\n                        }\n                    }\n                    that._applyLockedContainersWidth();\n                    if (that.lockedHeader && that.table[0].clientWidth === 0) {\n                        that.table[0].style.width = '1px';\n                    }\n                }\n            },\n            _applyLockedContainersWidth: function () {\n                if (this.options.scrollable && this.lockedHeader) {\n                    var headerTable = this.thead.parent(), headerWrap = headerTable.parent(), contentWidth = this.wrapper[0].clientWidth, groups = this._groups(), scrollbar = kendo.support.scrollbar(), cols = this.lockedHeader.find('>table>colgroup>col:not(.k-group-col, .k-hierarchy-col)'), nonLockedCols = headerTable.find('>colgroup>col:not(.k-group-col, .k-hierarchy-col)'), width = columnsWidth(cols), nonLockedColsWidth = columnsWidth(nonLockedCols), footerWrap;\n                    if (groups > 0) {\n                        width += outerWidth(this.lockedHeader.find('.k-group-cell:first')) * groups;\n                    }\n                    if (width >= contentWidth) {\n                        width = contentWidth - 3 * scrollbar;\n                    }\n                    this.lockedHeader.add(this.lockedContent).width(width);\n                    headerWrap[0].style.width = headerWrap.parent().width() - width - 2 + 'px';\n                    headerTable.add(this.table).width(nonLockedColsWidth);\n                    if (this.virtualScrollable) {\n                        contentWidth -= scrollbar;\n                    }\n                    this.content[0].style.width = contentWidth - width - 2 + 'px';\n                    if (this.lockedFooter && this.lockedFooter.length) {\n                        this.lockedFooter.width(width);\n                        footerWrap = this.footer.find('.k-grid-footer-wrap');\n                        footerWrap[0].style.width = headerWrap[0].clientWidth + 'px';\n                        footerWrap.children().first().width(nonLockedColsWidth);\n                    }\n                }\n            },\n            _setContentHeight: function () {\n                var that = this, options = that.options, height = that.wrapper.innerHeight(), header = that.wrapper.children('.k-grid-header'), scrollbar = kendo.support.scrollbar();\n                if (options.scrollable && that.wrapper.is(':visible')) {\n                    height -= outerHeight(header);\n                    if (that.pager) {\n                        height -= outerHeight(that.pager.element);\n                    }\n                    if (options.groupable) {\n                        height -= outerHeight(that.wrapper.children('.k-grouping-header'));\n                    }\n                    if (options.toolbar) {\n                        height -= outerHeight(that.wrapper.children('.k-grid-toolbar'));\n                    }\n                    if (that.footerTemplate) {\n                        height -= outerHeight(that.wrapper.children('.k-grid-footer'));\n                    }\n                    var isGridHeightSet = function (el) {\n                        var initialHeight, newHeight;\n                        if (el[0].style.height) {\n                            return true;\n                        } else {\n                            initialHeight = el.height();\n                        }\n                        el.height('auto');\n                        newHeight = el.height();\n                        if (initialHeight != newHeight) {\n                            el.height('');\n                            return true;\n                        }\n                        el.height('');\n                        return false;\n                    };\n                    if (isGridHeightSet(that.wrapper)) {\n                        if (height > scrollbar * 2) {\n                            if (that.lockedContent) {\n                                scrollbar = that.table[0].offsetWidth > that.table.parent()[0].clientWidth ? scrollbar : 0;\n                                that.lockedContent.height(height - scrollbar);\n                            }\n                            that.content.height(height);\n                        } else {\n                            that.content.height(scrollbar * 2 + 1);\n                        }\n                    }\n                }\n            },\n            _averageRowHeight: function () {\n                var that = this, itemsCount = that._items(that.tbody).length, rowHeight = that._rowHeight;\n                if (itemsCount === 0) {\n                    return rowHeight;\n                }\n                if (!that._rowHeight) {\n                    that._rowHeight = rowHeight = outerHeight(that.table) / itemsCount;\n                    that._sum = rowHeight;\n                    that._measures = 1;\n                }\n                var currentRowHeight = outerHeight(that.table) / itemsCount;\n                if (rowHeight !== currentRowHeight) {\n                    that._measures++;\n                    that._sum += currentRowHeight;\n                    that._rowHeight = that._sum / that._measures;\n                }\n                return rowHeight;\n            },\n            _dataSource: function () {\n                var that = this, options = that.options, pageable, dataSource = options.dataSource;\n                dataSource = isArray(dataSource) ? { data: dataSource } : dataSource;\n                if (isPlainObject(dataSource)) {\n                    extend(dataSource, {\n                        table: that.table,\n                        fields: that.columns\n                    });\n                    pageable = options.pageable;\n                    if (isPlainObject(pageable) && pageable.pageSize !== undefined) {\n                        dataSource.pageSize = pageable.pageSize;\n                    }\n                }\n                if (that.dataSource && that._refreshHandler) {\n                    that.dataSource.unbind(CHANGE, that._refreshHandler).unbind(PROGRESS, that._progressHandler).unbind(ERROR, that._errorHandler);\n                } else {\n                    that._refreshHandler = proxy(that.refresh, that);\n                    that._progressHandler = proxy(that._requestStart, that);\n                    that._errorHandler = proxy(that._error, that);\n                }\n                that.dataSource = DataSource.create(dataSource).bind(CHANGE, that._refreshHandler).bind(PROGRESS, that._progressHandler).bind(ERROR, that._errorHandler);\n            },\n            _error: function () {\n                this._progress(false);\n            },\n            _requestStart: function () {\n                this._progress(true);\n            },\n            _modelChange: function (e) {\n                var that = this, tbody = that.tbody, model = e.model, row = that.tbody.find('tr[' + kendo.attr('uid') + '=' + model.uid + ']'), relatedRow, cell, column, isAlt = row.hasClass('k-alt'), tmp, idx = that._items(tbody).index(row), isLocked = that.lockedContent, selectable, selectableRow, childCells, originalCells, length;\n                if (isLocked) {\n                    relatedRow = that._relatedRow(row);\n                }\n                if (row.add(relatedRow).children('.k-edit-cell').length && !that.options.rowTemplate) {\n                    row.add(relatedRow).children(':not(.k-group-cell,.k-hierarchy-cell)').each(function () {\n                        cell = $(this);\n                        column = leafColumns(that.columns)[that.cellIndex(cell)];\n                        if (column.field === e.field) {\n                            if (!cell.hasClass('k-edit-cell')) {\n                                that._displayCell(cell, column, model);\n                                $('<span class=\"k-dirty\"/>').prependTo(cell);\n                            } else {\n                                cell.addClass('k-dirty-cell');\n                            }\n                        }\n                    });\n                } else if (!row.hasClass('k-grid-edit-row')) {\n                    selectableRow = $().add(row);\n                    if (isLocked) {\n                        tmp = (isAlt ? that.lockedAltRowTemplate : that.lockedRowTemplate)(model);\n                        selectableRow = selectableRow.add(relatedRow);\n                        relatedRow.replaceWith(tmp);\n                    }\n                    that.angular('cleanup', function () {\n                        return { elements: selectableRow.get() };\n                    });\n                    tmp = (isAlt ? that.altRowTemplate : that.rowTemplate)(model);\n                    row.replaceWith(tmp);\n                    tmp = that._items(tbody).eq(idx);\n                    var angularData = [{ dataItem: model }];\n                    if (isLocked) {\n                        row = row.add(relatedRow);\n                        relatedRow = that._relatedRow(tmp)[0];\n                        adjustRowHeight(tmp[0], relatedRow);\n                        tmp = tmp.add(relatedRow);\n                        angularData.push({ dataItem: model });\n                    }\n                    that.angular('compile', function () {\n                        return {\n                            elements: tmp.get(),\n                            data: angularData\n                        };\n                    });\n                    selectable = that.options.selectable;\n                    if (selectable && row.hasClass('k-state-selected')) {\n                        that.select(tmp);\n                    }\n                    originalCells = selectableRow.children(':not(.k-group-cell,.k-hierarchy-cell)');\n                    childCells = tmp.children(':not(.k-group-cell,.k-hierarchy-cell)');\n                    for (idx = 0, length = that.columns.length; idx < length; idx++) {\n                        column = that.columns[idx];\n                        cell = childCells.eq(idx);\n                        if (selectable && originalCells.eq(idx).hasClass('k-state-selected')) {\n                            cell.addClass('k-state-selected');\n                        }\n                        if (column.field === e.field) {\n                            $('<span class=\"k-dirty\"/>').prependTo(cell);\n                        }\n                    }\n                    that.trigger('itemChange', {\n                        item: tmp,\n                        data: model,\n                        ns: ui\n                    });\n                }\n            },\n            _pageable: function () {\n                var that = this, wrapper, pageable = that.options.pageable;\n                if (pageable) {\n                    wrapper = that.wrapper.children('div.k-grid-pager');\n                    if (!wrapper.length) {\n                        wrapper = $('<div class=\"k-pager-wrap k-grid-pager\"/>').appendTo(that.wrapper);\n                    }\n                    if (that.pager) {\n                        that.pager.destroy();\n                    }\n                    if (typeof pageable === 'object' && pageable instanceof kendo.ui.Pager) {\n                        that.pager = pageable;\n                    } else {\n                        that.pager = new kendo.ui.Pager(wrapper, extend({}, pageable, { dataSource: that.dataSource }));\n                    }\n                    that.pager.bind('pageChange', function (e) {\n                        if (that.trigger('page', { page: e.index })) {\n                            e.preventDefault();\n                        }\n                    });\n                }\n            },\n            _footer: function () {\n                var that = this, aggregates = that.dataSource.aggregates(), html = '', footerTemplate = that.footerTemplate, options = that.options, footerWrap, footer = that.footer || that.wrapper.find('.k-grid-footer');\n                if (footerTemplate) {\n                    html = $(that._wrapFooter(footerTemplate(aggregates)));\n                    if (footer.length) {\n                        var tmp = html;\n                        that.angular('cleanup', function () {\n                            return { elements: footer.get() };\n                        });\n                        footer.replaceWith(tmp);\n                        footer = that.footer = tmp;\n                    } else {\n                        if (options.scrollable) {\n                            footer = that.footer = options.pageable ? html.insertBefore(that.wrapper.children('div.k-grid-pager')) : html.appendTo(that.wrapper);\n                        } else {\n                            footer = that.footer = html.insertBefore(that.tbody);\n                        }\n                    }\n                    that.angular('compile', function () {\n                        return {\n                            elements: footer.find('td:not(.k-group-cell, .k-hierarchy-cell)').get(),\n                            data: map(that.columns, function (col) {\n                                return {\n                                    column: col,\n                                    aggregate: aggregates[col.field]\n                                };\n                            })\n                        };\n                    });\n                } else if (footer && !that.footer) {\n                    that.footer = footer;\n                }\n                if (footer.length) {\n                    if (options.scrollable) {\n                        footerWrap = footer.attr('tabindex', -1).children('.k-grid-footer-wrap');\n                        that.scrollables = $(that.scrollables.filter(function () {\n                            return !$(this).is('.k-grid-footer-wrap');\n                        }).toArray()).add(footerWrap);\n                    }\n                    if (that._footerWidth) {\n                        footer.find('table').css('width', that._footerWidth);\n                    }\n                    if (footerWrap) {\n                        var offset = that.content.scrollLeft();\n                        if (options.scrollable !== true && options.scrollable.virtual) {\n                            offset = that.wrapper.find('.k-virtual-scrollable-wrap').scrollLeft();\n                        }\n                        footerWrap.scrollLeft(offset);\n                    }\n                }\n                if (that.lockedContent) {\n                    that._appendLockedColumnFooter();\n                    that._applyLockedContainersWidth();\n                    that._syncLockedFooterHeight();\n                }\n            },\n            _wrapFooter: function (footerRow) {\n                var that = this, html = '', scrollbar = !kendo.support.mobileOS ? kendo.support.scrollbar() : 0;\n                if (that.options.scrollable) {\n                    html = $('<div class=\"k-grid-footer\"><div class=\"k-grid-footer-wrap\"><table' + (isIE7 ? ' cellspacing=\"0\"' : '') + '><tbody>' + footerRow + '</tbody></table></div></div>');\n                    that._appendCols(html.find('table'));\n                    html.css(isRtl ? 'padding-left' : 'padding-right', scrollbar);\n                    return html;\n                }\n                return '<tfoot class=\"k-grid-footer\">' + footerRow + '</tfoot>';\n            },\n            _columnMenu: function () {\n                var that = this, menu, columns = leafColumns(that.columns), column, options = that.options, columnMenu = options.columnMenu, menuOptions, sortable, filterable, cells, hasMultiColumnHeaders = grep(that.columns, function (item) {\n                        return item.columns !== undefined;\n                    }).length > 0, isMobile = this._isMobile, initCallback = function (e) {\n                        that.trigger(COLUMNMENUINIT, {\n                            field: e.field,\n                            container: e.container\n                        });\n                    }, openCallback = function (e) {\n                        that.trigger(COLUMNMENUOPEN, {\n                            field: e.field,\n                            container: e.container\n                        });\n                    }, closeCallback = function (element) {\n                        focusTable(element.closest('table'), true);\n                    }, sortHandler = function (e) {\n                        if (that.trigger('sort', { sort: e.sort })) {\n                            e.preventDefault();\n                        }\n                    }, filterHandler = function (e) {\n                        if (that.trigger('filter', {\n                                filter: e.filter,\n                                field: e.field\n                            })) {\n                            e.preventDefault();\n                        }\n                    }, $angular = options.$angular;\n                if (columnMenu) {\n                    if (typeof columnMenu == 'boolean') {\n                        columnMenu = {};\n                    }\n                    cells = leafDataCells(that.thead);\n                    for (var idx = 0, length = cells.length; idx < length; idx++) {\n                        column = columns[idx];\n                        var cell = cells.eq(idx);\n                        if (!column.command && (column.field || cell.attr('data-' + kendo.ns + 'field'))) {\n                            menu = cell.data('kendoColumnMenu');\n                            if (menu) {\n                                menu.destroy();\n                            }\n                            sortable = column.sortable !== false && columnMenu.sortable !== false && options.sortable !== false ? extend({}, options.sortable, { compare: (column.sortable || {}).compare }) : false;\n                            filterable = options.filterable && column.filterable !== false && columnMenu.filterable !== false ? extend({ pane: that.pane }, options.filterable, column.filterable) : false;\n                            if (column.filterable && column.filterable.dataSource) {\n                                filterable.forceUnique = false;\n                                filterable.checkSource = column.filterable.dataSource;\n                            }\n                            if (filterable) {\n                                filterable.format = column.format;\n                            }\n                            menuOptions = {\n                                dataSource: that.dataSource,\n                                values: column.values,\n                                columns: columnMenu.columns,\n                                sortable: sortable,\n                                filterable: filterable,\n                                messages: columnMenu.messages,\n                                owner: that,\n                                closeCallback: closeCallback,\n                                init: initCallback,\n                                open: openCallback,\n                                pane: that.pane,\n                                sort: sortHandler,\n                                filtering: filterHandler,\n                                filter: isMobile ? ':not(.k-column-active)' : '',\n                                lockedColumns: !hasMultiColumnHeaders && column.lockable !== false && lockedColumns(columns).length > 0\n                            };\n                            if ($angular) {\n                                menuOptions.$angular = $angular;\n                            }\n                            cell.kendoColumnMenu(menuOptions);\n                        }\n                    }\n                }\n            },\n            _headerCells: function () {\n                return this.thead.find('th').filter(function () {\n                    var th = $(this);\n                    return !th.hasClass('k-group-cell') && !th.hasClass('k-hierarchy-cell');\n                });\n            },\n            _filterable: function () {\n                var that = this, columns = leafColumns(that.columns), filterMenu, cells, cell, filterInit = function (e) {\n                        that.trigger(FILTERMENUINIT, {\n                            field: e.field,\n                            container: e.container\n                        });\n                    }, closeCallback = function (element) {\n                        focusTable(element.closest('table'), true);\n                    }, filterHandler = function (e) {\n                        if (that.trigger('filter', {\n                                filter: e.filter,\n                                field: e.field\n                            })) {\n                            e.preventDefault();\n                        }\n                    }, filterOpen = function (e) {\n                        that.trigger(FILTERMENUOPEN, {\n                            field: e.field,\n                            container: e.container\n                        });\n                    }, filterable = that.options.filterable;\n                if (filterable && typeof filterable.mode == STRING && filterable.mode.indexOf('menu') == -1) {\n                    filterable = false;\n                }\n                if (filterable && !that.options.columnMenu) {\n                    cells = leafDataCells(that.thead);\n                    for (var idx = 0, length = cells.length; idx < length; idx++) {\n                        cell = cells.eq(idx);\n                        if (columns[idx].filterable !== false && !columns[idx].command && (columns[idx].field || cell.attr('data-' + kendo.ns + 'field'))) {\n                            filterMenu = cell.data('kendoFilterMenu');\n                            if (filterMenu) {\n                                filterMenu.destroy();\n                            }\n                            filterMenu = cell.data('kendoFilterMultiCheck');\n                            if (filterMenu) {\n                                filterMenu.destroy();\n                            }\n                            var columnFilterable = columns[idx].filterable;\n                            var options = extend({}, filterable, columnFilterable, {\n                                dataSource: that.dataSource,\n                                values: columns[idx].values,\n                                format: columns[idx].format,\n                                closeCallback: closeCallback,\n                                title: columns[idx].title || columns[idx].field,\n                                init: filterInit,\n                                open: filterOpen,\n                                pane: that.pane,\n                                change: filterHandler\n                            });\n                            if (columnFilterable && columnFilterable.messages) {\n                                options.messages = extend(true, {}, filterable.messages, columnFilterable.messages);\n                            }\n                            if (columnFilterable && columnFilterable.dataSource) {\n                                options.forceUnique = false;\n                                options.checkSource = columnFilterable.dataSource;\n                            }\n                            if (columnFilterable && columnFilterable.multi) {\n                                cell.kendoFilterMultiCheck(options);\n                            } else {\n                                cell.kendoFilterMenu(options);\n                            }\n                        }\n                    }\n                }\n            },\n            _filterRow: function () {\n                var that = this;\n                if (!that._hasFilterRow()) {\n                    return;\n                }\n                var settings;\n                var $angular = that.options.$angular;\n                var columns = leafColumns(that.columns), filterable = that.options.filterable, rowheader = that.thead.find('.k-filter-row'), filterHandler = function (e) {\n                        if (that.trigger('filter', {\n                                filter: e.filter,\n                                field: e.field\n                            })) {\n                            e.preventDefault();\n                        }\n                    };\n                this._updateHeader(this.dataSource.group().length);\n                for (var i = 0; i < columns.length; i++) {\n                    var suggestDataSource, col = columns[i], operators = that.options.filterable.operators, customDataSource = false, th = $('<th/>'), field = col.field;\n                    if (col.hidden) {\n                        th.hide();\n                    }\n                    rowheader.append(th);\n                    if (field && col.filterable !== false) {\n                        var cellOptions = col.filterable && col.filterable.cell || {};\n                        suggestDataSource = that.options.dataSource;\n                        if (suggestDataSource instanceof DataSource) {\n                            suggestDataSource = that.options.dataSource.options;\n                        }\n                        var messages = extend(true, {}, filterable.messages);\n                        if (col.filterable) {\n                            extend(true, messages, col.filterable.messages);\n                        }\n                        if (cellOptions.enabled === false) {\n                            th.html('&nbsp;');\n                            continue;\n                        }\n                        if (cellOptions.dataSource) {\n                            suggestDataSource = cellOptions.dataSource;\n                            customDataSource = true;\n                        }\n                        if (col.filterable && col.filterable.operators) {\n                            operators = col.filterable.operators;\n                        }\n                        settings = {\n                            column: col,\n                            dataSource: that.dataSource,\n                            suggestDataSource: suggestDataSource,\n                            customDataSource: customDataSource,\n                            field: field,\n                            messages: messages,\n                            values: col.values,\n                            template: cellOptions.template,\n                            delay: cellOptions.delay,\n                            inputWidth: cellOptions.inputWidth,\n                            suggestionOperator: cellOptions.suggestionOperator,\n                            minLength: cellOptions.minLength,\n                            dataTextField: cellOptions.dataTextField,\n                            operator: cellOptions.operator,\n                            operators: operators,\n                            showOperators: cellOptions.showOperators,\n                            change: filterHandler\n                        };\n                        if ($angular) {\n                            settings.$angular = $angular;\n                        }\n                        $('<span/>').attr(kendo.attr('field'), field).appendTo(th).kendoFilterCell(settings);\n                    } else {\n                        th.html('&nbsp;');\n                    }\n                }\n            },\n            _sortable: function () {\n                var that = this, columns = leafColumns(that.columns), column, sorterInstance, cell, sortable = that.options.sortable, sortHandler = function (e) {\n                        if (that.trigger('sort', { sort: e.sort })) {\n                            e.preventDefault();\n                        }\n                    };\n                if (sortable) {\n                    var cells = leafDataCells(that.thead);\n                    for (var idx = 0, length = cells.length; idx < length; idx++) {\n                        column = columns[idx];\n                        if (column.sortable !== false && !column.command && column.field) {\n                            cell = cells.eq(idx);\n                            sorterInstance = cell.data('kendoColumnSorter');\n                            if (sorterInstance) {\n                                sorterInstance.destroy();\n                            }\n                            cell.attr('data-' + kendo.ns + 'field', column.field).kendoColumnSorter(extend({}, sortable, column.sortable, {\n                                dataSource: that.dataSource,\n                                aria: true,\n                                filter: ':not(.k-column-active)',\n                                change: sortHandler\n                            }));\n                        }\n                    }\n                    cells = null;\n                }\n            },\n            _columns: function (columns) {\n                var that = this, table = that.table, encoded, cols = table.find('col'), lockedCols, dataSource = that.options.dataSource;\n                columns = columns.length ? columns : map(table.find('th'), function (th, idx) {\n                    th = $(th);\n                    var sortable = th.attr(kendo.attr('sortable')), filterable = th.attr(kendo.attr('filterable')), type = th.attr(kendo.attr('type')), groupable = th.attr(kendo.attr('groupable')), field = th.attr(kendo.attr('field')), title = th.attr(kendo.attr('title')), menu = th.attr(kendo.attr('menu'));\n                    if (!field) {\n                        field = th.text().replace(/\\s|[^A-z0-9]/g, '');\n                    }\n                    return {\n                        field: field,\n                        type: type,\n                        title: title,\n                        sortable: sortable !== 'false',\n                        filterable: filterable !== 'false',\n                        groupable: groupable !== 'false',\n                        menu: menu,\n                        template: th.attr(kendo.attr('template')),\n                        width: cols.eq(idx).css('width')\n                    };\n                });\n                encoded = !(that.table.find('tbody tr').length > 0 && (!dataSource || !dataSource.transport));\n                if (that.options.scrollable) {\n                    var initialColumns = columns;\n                    lockedCols = lockedColumns(columns);\n                    columns = nonLockedColumns(columns);\n                    if (lockedCols.length > 0 && columns.length === 0) {\n                        throw new Error('There should be at least one non locked column');\n                    }\n                    normalizeHeaderCells(that.element.find('tr:has(th):first'), initialColumns);\n                    columns = lockedCols.concat(columns);\n                }\n                that.columns = normalizeColumns(columns, encoded);\n                if ($.grep(leafColumns(that.columns), function (col) {\n                        return col.selectable;\n                    }).length) {\n                    if (that.options.persistSelection) {\n                        that._selectedIds = {};\n                    }\n                    that.wrapper.on(CLICK + NS, 'tbody > tr ' + CHECKBOXINPUT, proxy(that._checkboxClick, that));\n                    that.wrapper.on(CLICK + NS, 'thead > tr ' + CHECKBOXINPUT, proxy(that._headerCheckboxClick, that));\n                }\n            },\n            _headerCheckboxClick: function (e) {\n                var that = this, checkBox = $(e.target), checked = checkBox.prop('checked'), parentGrid = checkBox.closest('.k-grid.k-widget').getKendoGrid();\n                if (that !== parentGrid) {\n                    return;\n                }\n                if (checked) {\n                    that.select(parentGrid.items());\n                } else {\n                    that.clearSelection();\n                }\n            },\n            _checkboxClick: function (e) {\n                var that = this, row = $(e.target).closest('tr'), isSelecting = !row.hasClass(SELECTED);\n                if (that !== row.closest('.k-grid.k-widget').getKendoGrid()) {\n                    return;\n                }\n                if (isSelecting) {\n                    that.select(row);\n                } else {\n                    that._deselectCheckRows(row);\n                }\n            },\n            _groups: function () {\n                var group = this.dataSource.group();\n                return group ? group.length : 0;\n            },\n            _tmpl: function (rowTemplate, columns, alt, skipGroupCells) {\n                var that = this, settings = extend({}, kendo.Template, that.options.templateSettings), idx, length = columns.length, template, state = {\n                        storage: {},\n                        count: 0\n                    }, column, type, hasDetails = that._hasDetails(), className = [], groups = that._groups(), navigatable = that.options.navigatable;\n                if (!rowTemplate) {\n                    rowTemplate = '<tr';\n                    if (alt) {\n                        className.push('k-alt');\n                    }\n                    if (hasDetails) {\n                        className.push('k-master-row');\n                    }\n                    if (className.length) {\n                        rowTemplate += ' class=\"' + className.join(' ') + '\"';\n                    }\n                    if (length) {\n                        rowTemplate += ' ' + kendo.attr('uid') + '=\"#=' + kendo.expr('uid', settings.paramName) + '#\"';\n                    }\n                    rowTemplate += ' role=\\'row\\'>';\n                    if (groups > 0 && !skipGroupCells) {\n                        rowTemplate += groupCells(groups);\n                    }\n                    if (hasDetails) {\n                        rowTemplate += '<td class=\"k-hierarchy-cell\"><a class=\"k-icon k-i-expand\" href=\"\\\\#\" ' + ARIALABEL + '=\"' + EXPAND + '\" tabindex=\"-1\"></a></td>';\n                    }\n                    for (idx = 0; idx < length; idx++) {\n                        column = columns[idx];\n                        template = column.template;\n                        type = typeof template;\n                        rowTemplate += '<td' + stringifyAttributes(column.attributes);\n                        if (navigatable) {\n                            rowTemplate += ' aria-describedby=\\'' + column.headerAttributes.id + '\\'';\n                        }\n                        rowTemplate += ' role=\\'gridcell\\'>';\n                        rowTemplate += that._cellTmpl(column, state);\n                        rowTemplate += '</td>';\n                    }\n                    rowTemplate += '</tr>';\n                }\n                rowTemplate = kendo.template(rowTemplate, settings);\n                if (state.count > 0) {\n                    return proxy(rowTemplate, state.storage);\n                }\n                return rowTemplate;\n            },\n            _headerCellText: function (column) {\n                var that = this, settings = extend({}, kendo.Template, that.options.templateSettings), template = column.headerTemplate, type = typeof template, text = column.title || column.field || '';\n                if (type === FUNCTION) {\n                    text = kendo.template(template, settings)({});\n                } else if (type === STRING) {\n                    text = template;\n                }\n                return text;\n            },\n            _cellTmpl: function (column, state) {\n                var that = this, settings = extend({}, kendo.Template, that.options.templateSettings), template = column.template, paramName = settings.paramName, field = column.field, html = '', idx, length, format = column.format, type = typeof template, columnValues = column.values;\n                if (column.command) {\n                    if (isArray(column.command)) {\n                        for (idx = 0, length = column.command.length; idx < length; idx++) {\n                            if (column.command[idx].visible) {\n                                html += kendo.format('#= {0}(data)? \\'{1}\\':\\'\\' #', column.command[idx].visible, that._createButton(column.command[idx]).replace(templateHashRegExp, '\\\\#'));\n                            } else {\n                                html += that._createButton(column.command[idx]).replace(templateHashRegExp, '\\\\#');\n                            }\n                        }\n                        return html;\n                    }\n                    return that._createButton(column.command).replace(templateHashRegExp, '\\\\#');\n                }\n                if (column.selectable) {\n                    return SELECTCOLUMNTMPL;\n                }\n                if (type === FUNCTION) {\n                    state.storage['tmpl' + state.count] = template;\n                    html += '#=this.tmpl' + state.count + '(' + paramName + ')#';\n                    state.count++;\n                } else if (type === STRING) {\n                    html += template;\n                } else if (columnValues && columnValues.length && isPlainObject(columnValues[0]) && 'value' in columnValues[0] && field) {\n                    html += '#var v =' + kendo.stringify(convertToObject(columnValues)).replace(templateHashRegExp, '\\\\#') + '#';\n                    html += '#var f = v[';\n                    if (!settings.useWithBlock) {\n                        html += paramName + '.';\n                    }\n                    html += field + ']#';\n                    html += '${f != null ? f : \\'\\'}';\n                } else {\n                    html += column.encoded ? '#:' : '#=';\n                    if (format) {\n                        html += 'kendo.format(\"' + format.replace(formatRegExp, '\\\\$1') + '\",';\n                    }\n                    if (field) {\n                        field = kendo.expr(field, paramName);\n                        html += field + '==null?\\'\\':' + field;\n                    } else {\n                        html += '\\'\\'';\n                    }\n                    if (format) {\n                        html += ')';\n                    }\n                    html += '#';\n                }\n                return html;\n            },\n            _templates: function () {\n                var that = this, options = that.options, dataSource = that.dataSource, groups = dataSource.group(), footer = that.footer || that.wrapper.find('.k-grid-footer'), aggregates = dataSource.aggregate(), columnLeafs = leafColumns(that.columns), columnsLocked = leafColumns(lockedColumns(that.columns)), columns = options.scrollable ? leafColumns(nonLockedColumns(that.columns)) : columnLeafs;\n                if (options.scrollable && columnsLocked.length) {\n                    if (options.rowTemplate || options.altRowTemplate) {\n                        throw new Error('Having both row template and locked columns is not supported');\n                    }\n                    that.rowTemplate = that._tmpl(options.rowTemplate, columns, false, true);\n                    that.altRowTemplate = that._tmpl(options.altRowTemplate || options.rowTemplate, columns, true, true);\n                    that.lockedRowTemplate = that._tmpl(options.rowTemplate, columnsLocked);\n                    that.lockedAltRowTemplate = that._tmpl(options.altRowTemplate || options.rowTemplate, columnsLocked, true);\n                } else {\n                    that.rowTemplate = that._tmpl(options.rowTemplate, columns);\n                    that.altRowTemplate = that._tmpl(options.altRowTemplate || options.rowTemplate, columns, true);\n                }\n                if (that._hasDetails()) {\n                    that.detailTemplate = that._detailTmpl(options.detailTemplate || '');\n                }\n                if (that._group && !isEmptyObject(aggregates) || !isEmptyObject(aggregates) && !footer.length || grep(columnLeafs, function (column) {\n                        return column.footerTemplate;\n                    }).length) {\n                    that.footerTemplate = that._footerTmpl(columnLeafs, aggregates, 'footerTemplate', 'k-footer-template');\n                }\n                if (groups && grep(columnLeafs, function (column) {\n                        return column.groupFooterTemplate;\n                    }).length) {\n                    aggregates = $.map(groups, function (g) {\n                        return g.aggregates;\n                    });\n                    that.groupFooterTemplate = that._footerTmpl(columns, aggregates, 'groupFooterTemplate', 'k-group-footer', columnsLocked.length);\n                    if (options.scrollable && columnsLocked.length) {\n                        that.lockedGroupFooterTemplate = that._footerTmpl(columnsLocked, aggregates, 'groupFooterTemplate', 'k-group-footer');\n                    }\n                }\n                if (that.options.noRecords) {\n                    that.noRecordsTemplate = that._noRecordsTmpl();\n                }\n            },\n            _noRecordsTmpl: function () {\n                var wrapper = '<div class=\"{0}\">{1}</div>';\n                var defaultTemplate = '<div class=\"k-grid-norecords-template\"{1}>{0}</div>';\n                var scrollableNoGridHeightStyles = this.options.scrollable && !this.wrapper[0].style.height ? ' style=\"margin:0 auto;position:static;\"' : '';\n                var state = {\n                    storage: {},\n                    count: 0\n                };\n                var settings = $.extend({}, kendo.Template, this.options.templateSettings);\n                var paramName = settings.paramName;\n                var template;\n                var html = '';\n                var type;\n                var tmpl;\n                if (this.options.noRecords.template) {\n                    template = this.options.noRecords.template;\n                } else {\n                    template = kendo.format(defaultTemplate, this.options.messages.noRecords, scrollableNoGridHeightStyles);\n                }\n                type = typeof template;\n                if (type === 'function') {\n                    state.storage['tmpl' + state.count] = template;\n                    html += '#=this.tmpl' + state.count + '(' + paramName + ')#';\n                    state.count++;\n                } else if (type === 'string') {\n                    html += template;\n                }\n                tmpl = kendo.template(kendo.format(wrapper, NORECORDSCLASS, html), settings);\n                if (state.count > 0) {\n                    tmpl = $.proxy(tmpl, state.storage);\n                }\n                return tmpl;\n            },\n            _footerTmpl: function (columns, aggregates, templateName, rowClass, skipGroupCells) {\n                var that = this, settings = extend({}, kendo.Template, that.options.templateSettings), paramName = settings.paramName, html = '', idx, length, template, type, storage = {}, count = 0, scope = {}, groups = that._groups(), fieldsMap = that.dataSource._emptyAggregates(aggregates), column;\n                html += '<tr class=\"' + rowClass + '\">';\n                if (groups > 0 && !skipGroupCells) {\n                    html += groupCells(groups);\n                }\n                if (that._hasDetails()) {\n                    html += '<td class=\"k-hierarchy-cell\">&nbsp;</td>';\n                }\n                for (idx = 0, length = columns.length; idx < length; idx++) {\n                    column = columns[idx];\n                    template = column[templateName];\n                    type = typeof template;\n                    html += '<td' + stringifyAttributes(column.footerAttributes) + '>';\n                    if (template) {\n                        if (type !== FUNCTION) {\n                            scope = fieldsMap[column.field] ? extend({}, settings, { paramName: paramName + '[\\'' + column.field + '\\']' }) : {};\n                            template = kendo.template(template, scope);\n                        }\n                        storage['tmpl' + count] = template;\n                        html += '#=this.tmpl' + count + '(' + paramName + ')#';\n                        count++;\n                    } else {\n                        html += '&nbsp;';\n                    }\n                    html += '</td>';\n                }\n                html += '</tr>';\n                html = kendo.template(html, settings);\n                if (count > 0) {\n                    return proxy(html, storage);\n                }\n                return html;\n            },\n            _detailTmpl: function (template) {\n                var that = this, html = '', settings = extend({}, kendo.Template, that.options.templateSettings), paramName = settings.paramName, templateFunctionStorage = {}, templateFunctionCount = 0, groups = that._groups(), colspan = visibleColumns(leafColumns(that.columns)).length, type = typeof template;\n                html += '<tr class=\"k-detail-row\">';\n                if (groups > 0) {\n                    html += groupCells(groups);\n                }\n                html += '<td class=\"k-hierarchy-cell\"></td><td class=\"k-detail-cell\"' + (colspan ? ' colspan=\"' + colspan + '\"' : '') + '>';\n                if (type === FUNCTION) {\n                    templateFunctionStorage['tmpl' + templateFunctionCount] = template;\n                    html += '#=this.tmpl' + templateFunctionCount + '(' + paramName + ')#';\n                    templateFunctionCount++;\n                } else {\n                    html += template;\n                }\n                html += '</td></tr>';\n                html = kendo.template(html, settings);\n                if (templateFunctionCount > 0) {\n                    return proxy(html, templateFunctionStorage);\n                }\n                return html;\n            },\n            _hasDetails: function () {\n                var that = this;\n                return that.options.detailTemplate !== null || (that._events[DETAILINIT] || []).length;\n            },\n            _hasFilterRow: function () {\n                var filterable = this.options.filterable;\n                var hasFiltering = filterable && typeof filterable.mode == STRING && filterable.mode.indexOf('row') != -1;\n                var columns = this.columns;\n                var columnsWithoutFiltering = $.grep(columns, function (col) {\n                    return col.filterable === false;\n                });\n                if (columns.length && columnsWithoutFiltering.length == columns.length) {\n                    hasFiltering = false;\n                }\n                return hasFiltering;\n            },\n            _details: function () {\n                var that = this;\n                if (that.options.scrollable && that._hasDetails() && lockedColumns(that.columns).length) {\n                    throw new Error('Having both detail template and locked columns is not supported');\n                }\n                that.table.on(CLICK + NS, '.k-hierarchy-cell .k-i-expand, .k-hierarchy-cell .k-i-collapse', function (e) {\n                    var button = $(this), expanding = button.hasClass('k-i-expand'), masterRow = button.closest('tr.k-master-row'), detailRow, detailTemplate = that.detailTemplate, data, hasDetails = that._hasDetails(), ariaLabelText = expanding ? COLLAPSE : EXPAND;\n                    button.toggleClass('k-i-expand', !expanding).toggleClass('k-i-collapse', expanding).attr(ARIALABEL, ariaLabelText);\n                    detailRow = masterRow.next();\n                    if (hasDetails && !detailRow.hasClass('k-detail-row')) {\n                        data = that.dataItem(masterRow);\n                        detailRow = $(detailTemplate(data)).addClass(masterRow.hasClass('k-alt') ? 'k-alt' : '').insertAfter(masterRow);\n                        that.angular('compile', function () {\n                            return {\n                                elements: detailRow.get(),\n                                data: [{ dataItem: data }]\n                            };\n                        });\n                        that.trigger(DETAILINIT, {\n                            masterRow: masterRow,\n                            detailRow: detailRow,\n                            data: data,\n                            detailCell: detailRow.find('.k-detail-cell')\n                        });\n                    }\n                    that.trigger(expanding ? DETAILEXPAND : DETAILCOLLAPSE, {\n                        masterRow: masterRow,\n                        detailRow: detailRow\n                    });\n                    detailRow.toggle(expanding);\n                    if (that._current) {\n                        that._current.attr('aria-expanded', expanding);\n                    }\n                    e.preventDefault();\n                    return false;\n                });\n            },\n            dataItem: function (tr) {\n                tr = $(tr)[0];\n                if (!tr) {\n                    return null;\n                }\n                var rows = this.tbody.children(), classesRegEx = /k-grouping-row|k-detail-row|k-group-footer/, idx = tr.sectionRowIndex, j, correctIdx;\n                correctIdx = idx;\n                for (j = 0; j < idx; j++) {\n                    if (classesRegEx.test(rows[j].className)) {\n                        correctIdx--;\n                    }\n                }\n                return this._data[correctIdx];\n            },\n            expandRow: function (tr) {\n                $(tr).find('> td .k-i-expand').click();\n            },\n            collapseRow: function (tr) {\n                $(tr).find('> td .k-i-collapse').click();\n            },\n            _createHeaderCells: function (columns, rowSpan) {\n                var that = this, idx, th, text, html = '', length, leafs = leafColumns(that.columns), field;\n                for (idx = 0, length = columns.length; idx < length; idx++) {\n                    th = columns[idx].column || columns[idx];\n                    text = that._headerCellText(th);\n                    field = '';\n                    var index = inArray(th, leafs);\n                    if (th.selectable) {\n                        html += '<th scope=\\'col\\'' + stringifyAttributes(th.headerAttributes);\n                        if (rowSpan && !columns[idx].colSpan) {\n                            html += ' rowspan=\\'' + rowSpan + '\\'';\n                        }\n                        if (index > -1) {\n                            html += kendo.attr('index') + '=\\'' + index + '\\'';\n                        }\n                        text = th.headerTemplate ? text : SELECTCOLUMNHEADERTMPL;\n                        html += '>' + text + '</th>';\n                    } else if (th.command) {\n                        html += '<th scope=\\'col\\'' + stringifyAttributes(th.headerAttributes);\n                        if (rowSpan && !columns[idx].colSpan) {\n                            html += ' rowspan=\\'' + rowSpan + '\\'';\n                        }\n                        if (index > -1) {\n                            html += kendo.attr('index') + '=\\'' + index + '\\'';\n                        }\n                        html += '>' + text + '</th>';\n                    } else {\n                        if (th.field) {\n                            field = kendo.attr('field') + '=\\'' + th.field + '\\' ';\n                        }\n                        html += '<th scope=\\'col\\' role=\\'columnheader\\' ' + field;\n                        html += ' aria-haspopup=\\'true\\'';\n                        if (rowSpan && !columns[idx].colSpan) {\n                            html += ' rowspan=\\'' + rowSpan + '\\'';\n                        }\n                        if (columns[idx].colSpan > 1) {\n                            html += 'colspan=\"' + (columns[idx].colSpan - hiddenLeafColumnsCount(th.columns)) + '\" ';\n                            html += kendo.attr('colspan') + '=\\'' + columns[idx].colSpan + '\\'';\n                        }\n                        if (th.title) {\n                            html += kendo.attr('title') + '=\"' + th.title.replace('\"', '&quot;').replace(/'/g, '\\'') + '\" ';\n                        }\n                        if (th.groupable !== undefined) {\n                            html += kendo.attr('groupable') + '=\\'' + th.groupable + '\\' ';\n                        }\n                        if (th.aggregates && th.aggregates.length) {\n                            html += kendo.attr('aggregates') + '=\\'' + th.aggregates + '\\'';\n                        }\n                        if (index > -1) {\n                            html += kendo.attr('index') + '=\\'' + index + '\\'';\n                        }\n                        html += stringifyAttributes(th.headerAttributes);\n                        html += '>' + text + '</th>';\n                    }\n                }\n                return html;\n            },\n            _appendLockedColumnContent: function () {\n                var columns = this.columns, idx, colgroup = this.table.find('colgroup'), cols = colgroup.find('col:not(.k-group-col,.k-hierarchy-col)'), length, lockedCols = $(), skipHiddenCount = 0, container, colSpan, spanIdx, colOffset = 0;\n                for (idx = 0, length = columns.length; idx < length; idx++) {\n                    if (columns[idx].locked) {\n                        if (isVisible(columns[idx])) {\n                            colSpan = 1;\n                            if (columns[idx].columns) {\n                                colSpan = leafColumns(columns[idx].columns).length - hiddenLeafColumnsCount(columns[idx].columns);\n                            }\n                            colSpan = colSpan || 1;\n                            for (spanIdx = 0; spanIdx < colSpan; spanIdx++) {\n                                lockedCols = lockedCols.add(cols.eq(idx + colOffset + spanIdx - skipHiddenCount));\n                            }\n                            colOffset += colSpan - 1;\n                        } else {\n                            skipHiddenCount++;\n                        }\n                    }\n                }\n                container = $('<div class=\"k-grid-content-locked\"><table' + (isIE7 ? ' cellspacing=\"0\"' : '') + '><colgroup/><tbody></tbody></table></div>');\n                colgroup.detach();\n                container.find('colgroup').append(lockedCols);\n                colgroup.insertBefore(this.table.find('tbody'));\n                this.lockedContent = container.insertBefore(this.content);\n                this.lockedTable = container.children('table');\n            },\n            _appendLockedColumnFooter: function () {\n                var that = this;\n                var footer = that.footer;\n                var cells = footer.find('.k-footer-template>td');\n                var cols = footer.find('.k-grid-footer-wrap>table>colgroup>col');\n                var html = $('<div class=\"k-grid-footer-locked\"><table><colgroup /><tbody><tr class=\"k-footer-template\"></tr></tbody></table></div>');\n                var idx, length;\n                var groups = that._groups();\n                var lockedCells = $(), lockedCols = $();\n                lockedCells = lockedCells.add(cells.filter('.k-group-cell'));\n                for (idx = 0, length = leafColumns(lockedColumns(that.columns)).length; idx < length; idx++) {\n                    lockedCells = lockedCells.add(cells.eq(idx + groups));\n                }\n                lockedCols = lockedCols.add(cols.filter('.k-group-col'));\n                for (idx = 0, length = visibleColumns(leafColumns(visibleLockedColumns(that.columns))).length; idx < length; idx++) {\n                    lockedCols = lockedCols.add(cols.eq(idx + groups));\n                }\n                lockedCells.appendTo(html.find('tr'));\n                lockedCols.appendTo(html.find('colgroup'));\n                that.lockedFooter = html.prependTo(footer);\n            },\n            _appendLockedColumnHeader: function (container) {\n                var that = this, columns = this.columns, idx, html, length, colgroup, tr, trFilter, table, header, filtercellCells, rows = [], skipHiddenCount = 0, cols = $(), hasFilterRow = that._hasFilterRow(), filterCellOffset = 0, filterCells = $(), cell, leafColumnsCount = 0, cells = $();\n                colgroup = that.thead.prev().find('col:not(.k-group-col,.k-hierarchy-col)');\n                header = that.thead.find('tr:first .k-header:not(.k-group-cell,.k-hierarchy-cell)');\n                filtercellCells = that.thead.find('.k-filter-row').find('th:not(.k-group-cell,.k-hierarchy-cell)');\n                var colOffset = 0;\n                for (idx = 0, length = columns.length; idx < length; idx++) {\n                    if (columns[idx].locked) {\n                        cell = header.eq(idx);\n                        leafColumnsCount = leafColumns(columns[idx].columns || []).length;\n                        if (isVisible(columns[idx])) {\n                            var colSpan = null;\n                            if (columns[idx].columns) {\n                                colSpan = leafColumnsCount - hiddenLeafColumnsCount(columns[idx].columns);\n                            }\n                            colSpan = colSpan || 1;\n                            for (var spanIdx = 0; spanIdx < colSpan; spanIdx++) {\n                                cols = cols.add(colgroup.eq(idx + colOffset + spanIdx - skipHiddenCount));\n                            }\n                            colOffset += colSpan - 1;\n                        }\n                        mapColumnToCellRows([columns[idx]], childColumnsCells(cell), rows, 0, 0);\n                        leafColumnsCount = leafColumnsCount || 1;\n                        for (var j = 0; j < leafColumnsCount; j++) {\n                            filterCells = filterCells.add(filtercellCells.eq(filterCellOffset + j));\n                        }\n                        filterCellOffset += leafColumnsCount;\n                    }\n                    if (columns[idx].columns) {\n                        skipHiddenCount += hiddenLeafColumnsCount(columns[idx].columns);\n                    }\n                    if (!isVisible(columns[idx])) {\n                        skipHiddenCount++;\n                    }\n                }\n                if (rows.length) {\n                    html = '<div class=\"k-grid-header-locked\" style=\"width:1px\"><table' + (isIE7 ? ' cellspacing=\"0\"' : '') + '><colgroup/><thead>';\n                    html += new Array(rows.length + 1).join('<tr></tr>');\n                    html += (hasFilterRow ? '<tr class=\"k-filter-row\" />' : '') + '</thead></table></div>';\n                    table = $(html);\n                    colgroup = table.find('colgroup');\n                    colgroup.append(that.thead.prev().find('col.k-group-col').add(cols));\n                    tr = table.find('thead tr:not(.k-filter-row)');\n                    for (idx = 0, length = rows.length; idx < length; idx++) {\n                        cells = toJQuery(rows[idx]);\n                        tr.eq(idx).append(that.thead.find('tr:eq(' + idx + ') .k-group-cell').add(cells));\n                    }\n                    var count = removeEmptyRows(this.thead);\n                    if (rows.length < count) {\n                        removeRowSpanValue(table, count - rows.length);\n                    }\n                    trFilter = table.find('.k-filter-row');\n                    trFilter.append(that.thead.find('.k-filter-row .k-group-cell').add(filterCells));\n                    this.lockedHeader = table.prependTo(container);\n                    this.thead.find('.k-group-cell').remove();\n                    return true;\n                }\n                return false;\n            },\n            _removeLockedContainers: function () {\n                var elements = this.lockedHeader.add(this.lockedContent).add(this.lockedFooter);\n                kendo.destroy(elements);\n                elements.off(NS).remove();\n                this.lockedHeader = this.lockedContent = this.lockedFooter = null;\n                this.selectable = null;\n            },\n            _thead: function () {\n                var that = this, columns = that.columns, hasDetails = that._hasDetails() && columns.length, hasFilterRow = that._hasFilterRow(), idx, html = '', thead = that.table.find('>thead'), hasTHead = that.element.find('thead:first').length > 0, tr;\n                if (!thead.length) {\n                    thead = $('<thead/>').insertBefore(that.tbody);\n                }\n                if (that.lockedHeader && that.thead) {\n                    tr = that.thead.find('tr:has(th):not(.k-filter-row)').html('');\n                    tr.remove();\n                    tr = $();\n                    that._removeLockedContainers();\n                } else if (hasTHead) {\n                    tr = that.element.find('thead:first tr:has(th):not(.k-filter-row)');\n                } else {\n                    tr = that.element.find('tr:has(th):first');\n                }\n                if (!tr.length) {\n                    tr = thead.children().first();\n                    if (!tr.length) {\n                        var rows = [{\n                                rowSpan: 1,\n                                cells: [],\n                                index: 0\n                            }];\n                        that._prepareColumns(rows, columns);\n                        for (idx = 0; idx < rows.length; idx++) {\n                            html += '<tr>';\n                            if (hasDetails) {\n                                html += '<th class=\"k-hierarchy-cell\" scope=\"col\">' + that.options.messages.expandCollapseColumnHeader + '</th>';\n                            }\n                            html += that._createHeaderCells(rows[idx].cells, rows[idx].rowSpan);\n                            html += '</tr>';\n                        }\n                        tr = $(html);\n                    }\n                }\n                if (hasFilterRow) {\n                    var filterRow = $('<tr/>');\n                    filterRow.addClass('k-filter-row');\n                    if (hasDetails || tr.find('.k-hierarchy-cell').length) {\n                        filterRow.prepend('<th class=\"k-hierarchy-cell\" scope=\"col\">&nbsp;</th>');\n                    }\n                    var existingFilterRow = (that.thead || thead).find('.k-filter-row');\n                    if (existingFilterRow.length) {\n                        kendo.destroy(existingFilterRow);\n                        existingFilterRow.remove();\n                    }\n                    thead.append(filterRow);\n                }\n                if (!tr.children().length) {\n                    html = '';\n                    if (hasDetails) {\n                        html += '<th class=\"k-hierarchy-cell\" scope=\"col\">&nbsp;</th>';\n                    }\n                    html += that._createHeaderCells(columns);\n                    tr.html(html);\n                } else if (hasDetails && !tr.find('.k-hierarchy-cell')[0]) {\n                    tr.prepend('<th class=\"k-hierarchy-cell\" scope=\"col\">&nbsp;</th>');\n                }\n                tr.attr('role', 'row').find('th').addClass('k-header');\n                if (!that.options.scrollable) {\n                    thead.addClass('k-grid-header');\n                }\n                tr.find('script').remove().end().prependTo(thead);\n                if (that.thead) {\n                    that._destroyColumnAttachments();\n                }\n                this.angular('cleanup', function () {\n                    return { elements: thead.find('th').get() };\n                });\n                this.angular('compile', function () {\n                    return {\n                        elements: thead.find('th').get(),\n                        data: map(columns, function (col) {\n                            return { column: col };\n                        })\n                    };\n                });\n                that.thead = thead.attr('role', 'rowgroup');\n                that._sortable();\n                that._filterable();\n                that._filterRow();\n                that._scrollable();\n                that._updateCols();\n                that._columnMenu();\n                var syncHeight;\n                var hasLockedColumns = this.options.scrollable && lockedColumns(this.columns).length;\n                if (hasLockedColumns) {\n                    syncHeight = that._appendLockedColumnHeader(that.thead.closest('.k-grid-header'));\n                    that._appendLockedColumnContent();\n                    that.lockedContent.bind('DOMMouseScroll' + NS + ' mousewheel' + NS, proxy(that._wheelScroll, that));\n                }\n                that._updateColumnCellIndex();\n                that._updateFirstColumnClass();\n                that._resizable();\n                that._draggable();\n                that._reorderable();\n                that._updateHeader(that._groups());\n                if (hasLockedColumns) {\n                    if (syncHeight) {\n                        that._syncLockedHeaderHeight();\n                    }\n                    that._applyLockedContainersWidth();\n                }\n                if (that.groupable) {\n                    that._attachGroupable();\n                }\n            },\n            _retrieveFirstColumn: function (columns, rows) {\n                var result = $();\n                if (rows.length && columns[0]) {\n                    var column = columns[0];\n                    while (column.columns && column.columns.length) {\n                        column = column.columns[0];\n                        rows = rows.filter(':not(:first())');\n                    }\n                    result = result.add(rows);\n                }\n                return result;\n            },\n            _updateFirstColumnClass: function () {\n                var that = this, columns = that.columns || [], hasDetails = that._hasDetails() && columns.length;\n                if (!hasDetails && !that._groups()) {\n                    var tr = that.thead.find('>tr:not(.k-filter-row):not(:first)');\n                    columns = nonLockedColumns(columns);\n                    var rows = that._retrieveFirstColumn(columns, tr);\n                    if (that._isLocked()) {\n                        tr = that.lockedHeader.find('thead>tr:not(.k-filter-row):not(:first)');\n                        columns = lockedColumns(that.columns);\n                        rows = rows.add(that._retrieveFirstColumn(columns, tr));\n                    }\n                    rows.each(function () {\n                        var ths = $(this).find('th');\n                        ths.removeClass('k-first');\n                        ths.eq(0).addClass('k-first');\n                    });\n                }\n            },\n            _prepareColumns: function (rows, columns, parentCell, parentRow) {\n                var row = parentRow || rows[rows.length - 1];\n                var childRow = rows[row.index + 1];\n                var totalColSpan = 0;\n                for (var idx = 0; idx < columns.length; idx++) {\n                    var cell = {\n                        column: columns[idx],\n                        colSpan: 0\n                    };\n                    row.cells.push(cell);\n                    if (columns[idx].columns && columns[idx].columns.length) {\n                        if (!childRow) {\n                            childRow = {\n                                rowSpan: 0,\n                                cells: [],\n                                index: rows.length\n                            };\n                            rows.push(childRow);\n                        }\n                        cell.colSpan = columns[idx].columns.length;\n                        this._prepareColumns(rows, columns[idx].columns, cell, childRow);\n                        totalColSpan += cell.colSpan - 1;\n                        row.rowSpan = rows.length - row.index;\n                    }\n                }\n                if (parentCell) {\n                    parentCell.colSpan += totalColSpan;\n                }\n            },\n            _wheelScroll: function (e) {\n                if (e.ctrlKey) {\n                    return;\n                }\n                var content = this.content;\n                if (this.options.scrollable.virtual) {\n                    content = this.virtualScrollable.verticalScrollbar;\n                }\n                var scrollTop = content.scrollTop(), delta = kendo.wheelDeltaY(e);\n                if (delta) {\n                    if (content[0].scrollHeight > content[0].clientHeight && (content[0].scrollTop < content[0].scrollHeight - content[0].clientHeight && delta < 0 || content[0].scrollTop > 0 && delta > 0)) {\n                        e.preventDefault();\n                    }\n                    content.scrollTop(scrollTop + -delta);\n                }\n            },\n            _isLocked: function () {\n                return this.lockedHeader != null;\n            },\n            _updateHeaderCols: function () {\n                var table = this.thead.parent().add(this.table);\n                if (this._isLocked()) {\n                    normalizeCols(table, visibleLeafColumns(visibleNonLockedColumns(this.columns)), this._hasDetails(), 0);\n                } else {\n                    normalizeCols(table, visibleLeafColumns(visibleColumns(this.columns)), this._hasDetails(), 0);\n                }\n            },\n            _updateCols: function (table) {\n                table = table || this.thead.parent().add(this.table);\n                this._appendCols(table, this._isLocked());\n            },\n            _updateLockedCols: function (table) {\n                if (this._isLocked()) {\n                    table = table || this.lockedHeader.find('table').add(this.lockedTable);\n                    normalizeCols(table, visibleLeafColumns(visibleLockedColumns(this.columns)), this._hasDetails(), this._groups());\n                }\n            },\n            _appendCols: function (table, locked) {\n                if (locked) {\n                    normalizeCols(table, visibleLeafColumns(visibleNonLockedColumns(this.columns)), this._hasDetails(), 0);\n                } else {\n                    normalizeCols(table, visibleLeafColumns(visibleColumns(this.columns)), this._hasDetails(), this._groups());\n                }\n            },\n            _autoColumns: function (schema) {\n                if (schema && schema.toJSON) {\n                    var that = this, field, encoded;\n                    schema = schema.toJSON();\n                    encoded = !(that.table.find('tbody tr').length > 0 && (!that.dataSource || !that.dataSource.transport));\n                    for (field in schema) {\n                        that.columns.push({\n                            field: field,\n                            encoded: encoded,\n                            headerAttributes: { id: kendo.guid() }\n                        });\n                    }\n                    that._thead();\n                    that._templates();\n                }\n            },\n            _rowsHtml: function (data, templates) {\n                var that = this, html = '', idx, rowTemplate = templates.rowTemplate, altRowTemplate = templates.altRowTemplate, length;\n                for (idx = 0, length = data.length; idx < length; idx++) {\n                    if (idx % 2) {\n                        html += altRowTemplate(data[idx]);\n                    } else {\n                        html += rowTemplate(data[idx]);\n                    }\n                    that._data.push(data[idx]);\n                }\n                return html;\n            },\n            _groupRowHtml: function (group, colspan, level, groupHeaderBuilder, templates, skipColspan) {\n                var that = this, html = '', idx, length, field = group.field, column = grep(leafColumns(that.columns), function (column) {\n                        return column.field == field;\n                    })[0] || {}, template = column.groupHeaderTemplate, text = (column.title || field) + ': ' + formatGroupValue(group.value, column.format, column.values, column.encoded), footerDefaults = that._groupAggregatesDefaultObject || {}, groupItems = group.items, aggregates = extend({}, footerDefaults, group.aggregates), headerData = extend({}, {\n                        field: group.field,\n                        value: group.value,\n                        items: groupItems,\n                        aggregates: aggregates\n                    }, group.aggregates[group.field]), groupFooterTemplate = templates.groupFooterTemplate;\n                if (template) {\n                    text = typeof template === FUNCTION ? template(headerData) : kendo.template(template)(headerData);\n                }\n                html += groupHeaderBuilder(colspan, level, text);\n                if (group.hasSubgroups) {\n                    for (idx = 0, length = groupItems.length; idx < length; idx++) {\n                        html += that._groupRowHtml(groupItems[idx], skipColspan ? colspan : colspan - 1, level + 1, groupHeaderBuilder, templates, skipColspan);\n                    }\n                } else {\n                    html += that._rowsHtml(groupItems, templates);\n                }\n                if (groupFooterTemplate) {\n                    var footerData = {};\n                    for (var aggregate in aggregates) {\n                        footerData[aggregate] = extend({}, aggregates[aggregate], {\n                            group: {\n                                field: group.field,\n                                value: group.value,\n                                items: groupItems\n                            }\n                        });\n                    }\n                    html += groupFooterTemplate(footerData);\n                }\n                return html;\n            },\n            collapseGroup: function (group) {\n                group = $(group);\n                var level, groupable = this.options.groupable, showFooter = groupable.showFooter, footerCount = showFooter ? 0 : 1, offset, relatedGroup = $(), idx, length, tr;\n                if (this._isLocked()) {\n                    if (!group.closest('div').hasClass('k-grid-content-locked')) {\n                        relatedGroup = group.nextAll('tr');\n                        group = this.lockedTable.find('>tbody>tr:eq(' + group.index() + ')');\n                    } else {\n                        relatedGroup = this.tbody.children('tr:eq(' + group.index() + ')').nextAll('tr');\n                    }\n                }\n                level = group.find('.k-group-cell').length;\n                group.find('.k-i-collapse').addClass('k-i-expand').removeClass('k-i-collapse');\n                group.find('td[aria-expanded=\\'true\\']:first').attr('aria-expanded', false).find('a').attr(ARIALABEL, EXPAND);\n                group = group.nextAll('tr');\n                var toHide = [];\n                for (idx = 0, length = group.length; idx < length; idx++) {\n                    tr = group.eq(idx);\n                    offset = tr.find('.k-group-cell').length;\n                    if (tr.hasClass('k-grouping-row')) {\n                        footerCount++;\n                    } else if (tr.hasClass('k-group-footer')) {\n                        footerCount--;\n                    }\n                    if (offset <= level || tr.hasClass('k-group-footer') && footerCount < 0) {\n                        break;\n                    }\n                    if (relatedGroup.length) {\n                        toHide.push(relatedGroup[idx]);\n                    }\n                    toHide.push(tr[0]);\n                }\n                $(toHide).hide();\n            },\n            expandGroup: function (group) {\n                group = $(group);\n                var that = this, showFooter = that.options.groupable.showFooter, level, tr, offset, relatedGroup = $(), idx, length, footersVisibility = [], groupsCount = 1;\n                if (this._isLocked()) {\n                    if (!group.closest('div').hasClass('k-grid-content-locked')) {\n                        relatedGroup = group.nextAll('tr');\n                        group = this.lockedTable.find('>tbody>tr:eq(' + group.index() + ')');\n                    } else {\n                        relatedGroup = this.tbody.children('tr:eq(' + group.index() + ')').nextAll('tr');\n                    }\n                }\n                level = group.find('.k-group-cell').length;\n                group.find('.k-i-expand').addClass('k-i-collapse').removeClass('k-i-expand');\n                group.find('td[aria-expanded=\\'false\\']:first').attr('aria-expanded', true).find('a').attr(ARIALABEL, COLLAPSE);\n                group = group.nextAll('tr');\n                for (idx = 0, length = group.length; idx < length; idx++) {\n                    tr = group.eq(idx);\n                    offset = tr.find('.k-group-cell').length;\n                    if (offset <= level) {\n                        break;\n                    }\n                    if (offset == level + 1 && !tr.hasClass('k-detail-row')) {\n                        tr.show();\n                        relatedGroup.eq(idx).show();\n                        if (tr.hasClass('k-grouping-row') && tr.find('.k-icon').hasClass('k-i-collapse')) {\n                            that.expandGroup(tr);\n                        }\n                        if (tr.hasClass('k-master-row') && tr.find('.k-icon').hasClass('k-i-collapse')) {\n                            tr.next().show();\n                            relatedGroup.eq(idx + 1).show();\n                        }\n                    }\n                    if (tr.hasClass('k-grouping-row')) {\n                        if (showFooter) {\n                            footersVisibility.push(tr.is(':visible'));\n                        }\n                        groupsCount++;\n                    }\n                    if (tr.hasClass('k-group-footer')) {\n                        if (showFooter) {\n                            tr.toggle(footersVisibility.pop());\n                        }\n                        if (groupsCount == 1) {\n                            tr.show();\n                            relatedGroup.eq(idx).show();\n                        } else {\n                            groupsCount--;\n                        }\n                    }\n                }\n            },\n            _updateHeader: function (groups) {\n                var that = this, container = that._isLocked() ? that.lockedHeader.find('thead') : that.thead, filterCells = container.find('tr.k-filter-row').find('th.k-group-cell').length, length = container.find('tr:first').find('th.k-group-cell').length, rows = container.children('tr:not(:first)').filter(function () {\n                        return !$(this).children(':visible').length;\n                    });\n                if (groups > length) {\n                    $(new Array(groups - length + 1).join('<th class=\"k-group-cell k-header\" scope=\"col\">' + that.options.messages.expandCollapseColumnHeader + '</th>')).prependTo(container.children('tr:not(.k-filter-row)'));\n                    if (that.element.is(':visible')) {\n                        rows.find('th.k-group-cell').hide();\n                    }\n                } else if (groups < length) {\n                    container.find('tr').each(function () {\n                        $(this).find('th.k-group-cell').filter(':eq(' + groups + '),' + ':gt(' + groups + ')').remove();\n                    });\n                }\n                if (groups > filterCells) {\n                    $(new Array(groups - filterCells + 1).join('<th class=\"k-group-cell k-header\" scope=\"col\">&nbsp;</th>')).prependTo(container.find('.k-filter-row'));\n                }\n            },\n            _firstDataItem: function (data, grouped) {\n                if (data && grouped) {\n                    if (data.hasSubgroups) {\n                        data = this._firstDataItem(data.items[0], grouped);\n                    } else {\n                        data = data.items[0];\n                    }\n                }\n                return data;\n            },\n            _updateTablesWidth: function () {\n                var that = this, tables;\n                if (!that._isLocked()) {\n                    return;\n                }\n                tables = $('>.k-grid-footer>.k-grid-footer-wrap>table', that.wrapper).add(that.thead.parent()).add(that.table);\n                that._footerWidth = tableWidth(tables.eq(0));\n                tables.width(that._footerWidth);\n                tables = $('>.k-grid-footer>.k-grid-footer-locked>table', that.wrapper).add(that.lockedHeader.find('>table')).add(that.lockedTable);\n                tables.width(tableWidth(tables.eq(0)));\n            },\n            hideColumn: function (column) {\n                var that = this, cell, tables, idx, cols, colWidth, position, width = 0, headerCellIndex, length, footer = that.footer || that.wrapper.find('.k-grid-footer'), columns = that.columns, visibleLocked = that.lockedHeader ? leafDataCells(that.lockedHeader.find('>table>thead')).filter(isCellVisible).length : 0, columnIndex;\n                if (typeof column == 'number') {\n                    column = columns[column];\n                } else if (isPlainObject(column)) {\n                    column = grep(flatColumns(columns), function (item) {\n                        return item === column;\n                    })[0];\n                } else {\n                    column = grep(flatColumns(columns), function (item) {\n                        return item.field === column;\n                    })[0];\n                }\n                if (!column || !isVisible(column)) {\n                    return;\n                }\n                if (column.columns && column.columns.length) {\n                    position = columnVisiblePosition(column, columns);\n                    setColumnVisibility(column, false);\n                    setCellVisibility(elements($('>table>thead', that.lockedHeader), that.thead, '>tr:eq(' + position.row + ')>th'), position.cell, false);\n                    for (idx = 0; idx < column.columns.length; idx++) {\n                        this.hideColumn(column.columns[idx]);\n                    }\n                    that.trigger(COLUMNHIDE, { column: column });\n                    return;\n                }\n                columnIndex = inArray(column, visibleColumns(leafColumns(columns)));\n                setColumnVisibility(column, false);\n                that._setParentsVisibility(column, false);\n                that._templates();\n                that._updateCols();\n                that._updateLockedCols();\n                var container = that.thead;\n                headerCellIndex = columnIndex;\n                if (that.lockedHeader && visibleLocked > columnIndex) {\n                    container = that.lockedHeader.find('>table>thead');\n                } else {\n                    headerCellIndex -= visibleLocked;\n                }\n                cell = leafDataCells(container).filter(isCellVisible).eq(headerCellIndex);\n                cell[0].style.display = 'none';\n                setCellVisibility(elements($('>table>thead', that.lockedHeader), that.thead, '>tr.k-filter-row>th'), columnIndex, false);\n                if (footer[0]) {\n                    that._updateCols(footer.find('>.k-grid-footer-wrap>table'));\n                    that._updateLockedCols(footer.find('>.k-grid-footer-locked>table'));\n                    setCellVisibility(footer.find('.k-footer-template>td'), columnIndex, false);\n                }\n                if (that.lockedTable && visibleLocked > columnIndex) {\n                    hideColumnCells(that.lockedTable.find('>tbody>tr'), columnIndex);\n                } else {\n                    hideColumnCells(that.tbody.children(), columnIndex - visibleLocked);\n                }\n                if (that.lockedTable) {\n                    that._updateTablesWidth();\n                    that._applyLockedContainersWidth();\n                    that._syncLockedContentHeight();\n                    that._syncLockedHeaderHeight();\n                    that._syncLockedFooterHeight();\n                } else {\n                    cols = that.thead.prev().find('col');\n                    for (idx = 0, length = cols.length; idx < length; idx += 1) {\n                        colWidth = cols[idx].style.width;\n                        if (colWidth && colWidth.indexOf('%') == -1) {\n                            width += parseInt(colWidth, 10);\n                        } else {\n                            width = 0;\n                            break;\n                        }\n                    }\n                    tables = $('>.k-grid-header table:first,>.k-grid-footer table:first', that.wrapper).add(that.table);\n                    that._footerWidth = null;\n                    if (width) {\n                        tables.each(function () {\n                            this.style.width = width + 'px';\n                        });\n                        that._footerWidth = width;\n                    }\n                    if (browser.msie && browser.version == 8) {\n                        tables.css('display', 'inline-table');\n                        setTimeout(function () {\n                            tables.css('display', 'table');\n                        }, 1);\n                    }\n                }\n                that._updateFirstColumnClass();\n                that.trigger(COLUMNHIDE, { column: column });\n            },\n            _setParentsVisibility: function (column, visible) {\n                var columns = this.columns;\n                var idx;\n                var parents = [];\n                var parent;\n                var position;\n                var cell;\n                var colSpan;\n                var predicate = visible ? function (p) {\n                    return visibleColumns(p.columns).length && p.hidden;\n                } : function (p) {\n                    return !visibleColumns(p.columns).length && !p.hidden;\n                };\n                if (columnParents(column, columns, parents) && parents.length) {\n                    for (idx = parents.length - 1; idx >= 0; idx--) {\n                        parent = parents[idx];\n                        position = columnPosition(parent, columns);\n                        cell = elements($('>table>thead', this.lockedHeader), this.thead, '>tr:eq(' + position.row + ')>th:not(.k-group-cell):not(.k-hierarchy-cell)').eq(position.cell);\n                        if (predicate(parent)) {\n                            setColumnVisibility(parent, visible);\n                            cell[0].style.display = visible ? '' : 'none';\n                        }\n                        if (cell.filter('[' + kendo.attr('colspan') + ']').length) {\n                            colSpan = parseInt(cell.attr(kendo.attr('colspan')), 10);\n                            cell[0].colSpan = colSpan - hiddenLeafColumnsCount(parent.columns) || 1;\n                        }\n                    }\n                }\n            },\n            showColumn: function (column) {\n                var that = this, idx, length, cell, tables, width, headerCellIndex, position, colWidth, cols, columns = that.columns, footer = that.footer || that.wrapper.find('.k-grid-footer'), lockedColumnsCount = that.lockedHeader ? leafDataCells(that.lockedHeader.find('>table>thead')).length : 0, columnIndex;\n                if (typeof column == 'number') {\n                    column = columns[column];\n                } else if (isPlainObject(column)) {\n                    column = grep(flatColumns(columns), function (item) {\n                        return item === column;\n                    })[0];\n                } else {\n                    column = grep(flatColumns(columns), function (item) {\n                        return item.field === column;\n                    })[0];\n                }\n                if (!column || isVisible(column)) {\n                    return;\n                }\n                if (column.columns && column.columns.length) {\n                    position = columnPosition(column, columns);\n                    setColumnVisibility(column, true);\n                    setCellVisibility(elements($('>table>thead', that.lockedHeader), that.thead, '>tr:eq(' + position.row + ')>th'), position.cell, true);\n                    for (idx = 0; idx < column.columns.length; idx++) {\n                        this.showColumn(column.columns[idx]);\n                    }\n                    that.trigger(COLUMNSHOW, { column: column });\n                    return;\n                }\n                columnIndex = inArray(column, leafColumns(columns));\n                setColumnVisibility(column, true);\n                that._setParentsVisibility(column, true);\n                that._templates();\n                that._updateCols();\n                that._updateLockedCols();\n                var container = that.thead;\n                headerCellIndex = columnIndex;\n                if (that.lockedHeader && lockedColumnsCount > columnIndex) {\n                    container = that.lockedHeader.find('>table>thead');\n                } else {\n                    headerCellIndex -= lockedColumnsCount;\n                }\n                cell = leafDataCells(container).eq(headerCellIndex);\n                cell[0].style.display = '';\n                setCellVisibility(elements($('>table>thead', that.lockedHeader), that.thead, '>tr.k-filter-row>th'), columnIndex, true);\n                if (footer[0]) {\n                    that._updateCols(footer.find('>.k-grid-footer-wrap>table'));\n                    that._updateLockedCols(footer.find('>.k-grid-footer-locked>table'));\n                    setCellVisibility(footer.find('.k-footer-template>td'), columnIndex, true);\n                }\n                if (that.lockedTable && lockedColumnsCount > columnIndex) {\n                    showColumnCells(that.lockedTable.find('>tbody>tr'), columnIndex);\n                } else {\n                    showColumnCells(that.tbody.children(), columnIndex - lockedColumnsCount);\n                }\n                if (that.lockedTable) {\n                    that._updateTablesWidth();\n                    that._applyLockedContainersWidth();\n                    that._syncLockedContentHeight();\n                    that._syncLockedHeaderHeight();\n                } else {\n                    tables = $('>.k-grid-header table:first,>.k-grid-footer table:first', that.wrapper).add(that.table);\n                    if (!column.width) {\n                        tables.width('');\n                    } else {\n                        width = 0;\n                        cols = that.thead.prev().find('col');\n                        for (idx = 0, length = cols.length; idx < length; idx += 1) {\n                            colWidth = cols[idx].style.width;\n                            if (colWidth.indexOf('%') > -1) {\n                                width = 0;\n                                break;\n                            }\n                            width += parseInt(colWidth, 10);\n                        }\n                        that._footerWidth = null;\n                        if (width) {\n                            tables.each(function () {\n                                this.style.width = width + 'px';\n                            });\n                            that._footerWidth = width;\n                        }\n                    }\n                }\n                that._updateFirstColumnClass();\n                that.trigger(COLUMNSHOW, { column: column });\n            },\n            _progress: function (toggle) {\n                var element = this.element;\n                if (this._editContainer && this._editMode() === 'popup') {\n                    element = this._editContainer;\n                } else if (this.lockedContent) {\n                    element = this.wrapper;\n                } else if (this.element.is('table')) {\n                    element = this.element.parent();\n                } else if (this.content && this.content.length) {\n                    element = this.content;\n                }\n                kendo.ui.progress(element, toggle);\n            },\n            _resize: function (size, force) {\n                this._syncLockedContentHeight();\n                this._syncLockedHeaderHeight();\n                if (this.content) {\n                    this._setContentWidth();\n                    this._setContentHeight();\n                }\n                if (this.virtualScrollable && (force || this._rowHeight)) {\n                    if (force) {\n                        this._rowHeight = null;\n                    }\n                    this.virtualScrollable.repaintScrollbar();\n                }\n            },\n            _isActiveInTable: function () {\n                var active = activeElement();\n                if (!active) {\n                    return false;\n                }\n                return this.table[0] === active || $.contains(this.table[0], active) || this._isLocked() && (this.lockedTable[0] === active || $.contains(this.lockedTable[0], active));\n            },\n            refresh: function (e) {\n                var that = this, data = that.dataSource.view(), navigatable = that.options.navigatable, currentIndex, current = $(that.current()), isCurrentInHeader = false, hasCheckBoxColumn = !!$.grep(leafColumns(that.columns), function (col) {\n                        return col.selectable;\n                    }).length, groups = (that.dataSource.group() || []).length, colspan = groups + visibleLeafColumns(visibleColumns(that.columns)).length;\n                if (e && e.action === 'itemchange' && that.editable) {\n                    return;\n                }\n                if (e && e.action === 'remove' && that.editable && that.editable.options.model && inArray(that.editable.options.model, e.items) > -1) {\n                    that.editable.options.model.unbind(CHANGE, that._modelChangeHandler);\n                }\n                e = e || {};\n                if (that.trigger('dataBinding', {\n                        action: e.action || 'rebind',\n                        index: e.index,\n                        items: e.items\n                    })) {\n                    return;\n                }\n                that._angularItems('cleanup');\n                if (navigatable && (that._isActiveInTable() || that._editContainer && that._editContainer.data('kendoWindow'))) {\n                    isCurrentInHeader = current.is('th');\n                    currentIndex = Math.max(that.cellIndex(current), 0);\n                }\n                that._destroyEditable();\n                that._progress(false);\n                that._hideResizeHandle();\n                that._data = [];\n                if (!that.columns.length) {\n                    that._autoColumns(that._firstDataItem(data[0], groups));\n                    colspan = groups + that.columns.length;\n                }\n                that._group = groups > 0 || that._group;\n                if (that._group) {\n                    that._templates();\n                    that._updateCols();\n                    that._updateLockedCols();\n                    that._updateHeader(groups);\n                    that._group = groups > 0;\n                }\n                that._renderContent(data, colspan, groups);\n                that._renderLockedContent(data, colspan, groups);\n                that._footer();\n                that._renderNoRecordsContent();\n                that._setContentHeight();\n                that._setContentWidth(that.content && that.content.scrollLeft());\n                if (that.lockedTable) {\n                    if (that.options.scrollable.virtual) {\n                        that.content.find('>.k-virtual-scrollable-wrap').trigger('scroll');\n                    } else if (that.touchScroller) {\n                        that.touchScroller.movable.trigger('change');\n                    } else {\n                        that.wrapper.one('scroll', function (e) {\n                            e.stopPropagation();\n                        });\n                        that.content.trigger('scroll');\n                    }\n                }\n                that._restoreCurrent(currentIndex, isCurrentInHeader);\n                if (that.touchScroller) {\n                    that.touchScroller.contentResized();\n                }\n                if (that.selectable) {\n                    that.selectable.resetTouchEvents();\n                }\n                that._muteAngularRebind(function () {\n                    that._angularItems('compile');\n                });\n                if (hasCheckBoxColumn) {\n                    that._toggleHeaderCheckState(false);\n                }\n                if (that.options.persistSelection && (that.selectable && !kendo.ui.Selectable.parseOptions(that.options.selectable).cell || hasCheckBoxColumn)) {\n                    that._restoreSelection();\n                }\n                that.trigger(DATABOUND);\n            },\n            _restoreCurrent: function (currentIndex, isCurrentInHeader) {\n                if (currentIndex === undefined || currentIndex < 0) {\n                    return;\n                }\n                this._removeCurrent();\n                if (isCurrentInHeader) {\n                    this._setCurrent(this.thead.find('th:not(.k-group-cell)').eq(currentIndex));\n                } else {\n                    var rowIndex = 0;\n                    if (this._rowVirtualIndex) {\n                        rowIndex = this.virtualScrollable.position(this._rowVirtualIndex);\n                    } else {\n                        currentIndex = 0;\n                    }\n                    var row = $();\n                    if (this.lockedTable) {\n                        row = this.lockedTable.find('>tbody>tr').eq(rowIndex);\n                    }\n                    row = row.add(this.tbody.children().eq(rowIndex));\n                    var td = row.find('>td:not(.k-group-cell):not(.k-hierarchy-cell)').eq(currentIndex);\n                    this._setCurrent(td);\n                }\n                if (this._current) {\n                    focusTable(this._current.closest('table')[0], true);\n                }\n            },\n            _restoreSelection: function () {\n                var that = this, allRows = that.items(), selectedRows;\n                selectedRows = grep(allRows, function (row) {\n                    var dataItemKey = that.dataItem(row)[that.dataSource.options.schema.model.id];\n                    if (that._selectedIds[dataItemKey]) {\n                        return row;\n                    }\n                });\n                that.select(selectedRows);\n            },\n            _angularItems: function (cmd) {\n                kendo.ui.DataBoundWidget.fn._angularItems.call(this, cmd);\n                if (cmd === 'cleanup') {\n                    this._cleanupDetailItems();\n                }\n                this._angularGroupItems(cmd);\n                this._angularGroupFooterItems(cmd);\n            },\n            _cleanupDetailItems: function () {\n                var that = this;\n                if (that._hasDetails()) {\n                    that.angular('cleanup', function () {\n                        return { elements: that.tbody.children('.k-detail-row') };\n                    });\n                    that.tbody.find('.k-detail-cell').empty();\n                }\n            },\n            _angularGroupItems: function (cmd) {\n                var that = this, container = that.tbody;\n                if (that.lockedContent) {\n                    container = that.lockedTable.find('tbody');\n                }\n                if (that._group) {\n                    that.angular(cmd, function () {\n                        return {\n                            elements: container.children('.k-grouping-row'),\n                            data: $.map(groupRows(that.dataSource.view()), function (dataItem) {\n                                return { dataItem: dataItem };\n                            })\n                        };\n                    });\n                }\n            },\n            _angularGroupFooterItems: function (cmd) {\n                var that = this, container = that.tbody;\n                if (that.lockedContent) {\n                    container = that.element;\n                }\n                if (that._group && that.groupFooterTemplate) {\n                    that.angular(cmd, function () {\n                        return {\n                            elements: container.find('.k-group-footer'),\n                            data: $.map(groupFooters(that.dataSource.view()), function (dataItem) {\n                                return { dataItem: dataItem };\n                            })\n                        };\n                    });\n                }\n            },\n            _renderContent: function (data, colspan, groups) {\n                var that = this, idx, length, html = '', isLocked = that.lockedContent != null, templates = {\n                        rowTemplate: that.rowTemplate,\n                        altRowTemplate: that.altRowTemplate,\n                        groupFooterTemplate: that.groupFooterTemplate\n                    };\n                colspan = isLocked ? colspan - visibleLeafColumns(visibleLockedColumns(that.columns)).length : colspan;\n                if (groups > 0) {\n                    colspan = isLocked ? colspan - groups : colspan;\n                    if (that.detailTemplate) {\n                        colspan++;\n                    }\n                    if (that.groupFooterTemplate) {\n                        that._groupAggregatesDefaultObject = that.dataSource.aggregates();\n                    }\n                    for (idx = 0, length = data.length; idx < length; idx++) {\n                        html += that._groupRowHtml(data[idx], colspan, 0, isLocked ? groupRowLockedContentBuilder : groupRowBuilder, templates, isLocked);\n                    }\n                } else {\n                    html += that._rowsHtml(data, templates);\n                }\n                that.tbody = appendContent(that.tbody, that.table, html, this.options.$angular);\n            },\n            _renderLockedContent: function (data, colspan, groups) {\n                var html = '', idx, length, templates = {\n                        rowTemplate: this.lockedRowTemplate,\n                        altRowTemplate: this.lockedAltRowTemplate,\n                        groupFooterTemplate: this.lockedGroupFooterTemplate\n                    };\n                if (this.lockedContent) {\n                    var table = this.lockedTable;\n                    if (groups > 0) {\n                        colspan = colspan - visibleColumns(leafColumns(nonLockedColumns(this.columns))).length;\n                        for (idx = 0, length = data.length; idx < length; idx++) {\n                            html += this._groupRowHtml(data[idx], colspan, 0, groupRowBuilder, templates);\n                        }\n                    } else {\n                        html = this._rowsHtml(data, templates);\n                    }\n                    appendContent(table.children('tbody'), table, html, this.options.$angular);\n                    this._syncLockedContentHeight();\n                }\n            },\n            _adjustRowsHeight: function (table1, table2) {\n                var rows = table1[0].rows, length = rows.length, idx, rows2 = table2[0].rows, containers = table1.add(table2), containersLength = containers.length, heights = [];\n                for (idx = 0; idx < length; idx++) {\n                    if (!rows2[idx]) {\n                        break;\n                    }\n                    if (rows[idx].style.height) {\n                        rows[idx].style.height = rows2[idx].style.height = '';\n                    }\n                }\n                for (idx = 0; idx < length; idx++) {\n                    if (!rows2[idx]) {\n                        break;\n                    }\n                    var offsetHeight1 = rows[idx].offsetHeight;\n                    var offsetHeight2 = rows2[idx].offsetHeight;\n                    var height = 0;\n                    if (offsetHeight1 > offsetHeight2) {\n                        height = offsetHeight1;\n                    } else if (offsetHeight1 < offsetHeight2) {\n                        height = offsetHeight2;\n                    }\n                    heights.push(height);\n                }\n                for (idx = 0; idx < containersLength; idx++) {\n                    containers[idx].style.display = 'none';\n                }\n                for (idx = 0; idx < length; idx++) {\n                    if (heights[idx]) {\n                        rows[idx].style.height = rows2[idx].style.height = heights[idx] + 1 + 'px';\n                    }\n                }\n                for (idx = 0; idx < containersLength; idx++) {\n                    containers[idx].style.display = '';\n                }\n            }\n        });\n        if (kendo.ExcelMixin) {\n            kendo.ExcelMixin.extend(Grid.prototype);\n        }\n        if (kendo.PDFMixin) {\n            kendo.PDFMixin.extend(Grid.prototype);\n            Grid.prototype._drawPDF_autoPageBreak = function (progress) {\n                var grid = this;\n                var result = new $.Deferred();\n                var dataSource = grid.dataSource;\n                var allPages = grid.options.pdf.allPages;\n                var origBody = grid.wrapper.find('table[role=\"grid\"] > tbody');\n                var cont = $('<div>').css({\n                    position: 'absolute',\n                    left: -10000,\n                    top: -10000\n                });\n                var clone = grid.wrapper.clone().css({\n                    height: 'auto',\n                    width: 'auto'\n                }).appendTo(cont);\n                clone.find('.k-grid-content').css({\n                    height: 'auto',\n                    width: 'auto',\n                    overflow: 'visible'\n                });\n                clone.find('table[role=\"grid\"]').css({\n                    height: 'auto',\n                    width: '100%',\n                    overflow: 'visible'\n                });\n                clone.find('.k-grid-pager, .k-grid-toolbar, .k-grouping-header').remove();\n                clone.find('.k-grid-header').css({ paddingRight: 0 });\n                this._initPDFProgress(progress);\n                var body = clone.find('table[role=\"grid\"] > tbody').empty();\n                var startingPage = dataSource.page();\n                function resolve() {\n                    if (allPages && startingPage !== undefined) {\n                        dataSource.one('change', draw);\n                        dataSource.page(startingPage);\n                    } else {\n                        grid.refresh();\n                        draw();\n                    }\n                }\n                function draw() {\n                    cont.appendTo(document.body);\n                    var options = $.extend({}, grid.options.pdf, {\n                        _destructive: true,\n                        progress: function (p) {\n                            progress.notify({\n                                page: p.page,\n                                pageNumber: p.pageNum,\n                                progress: 0.5 + p.pageNum / p.totalPages / 2,\n                                totalPages: p.totalPages\n                            });\n                        }\n                    });\n                    kendo.drawing.drawDOM(clone, options).always(function () {\n                        cont.remove();\n                    }).then(function (group) {\n                        result.resolve(group);\n                    }).fail(function (err) {\n                        result.reject(err);\n                    });\n                }\n                function renderPage() {\n                    var pageNum = dataSource.page();\n                    var totalPages = allPages ? dataSource.totalPages() : 1;\n                    body.append(origBody.find('tr'));\n                    if (pageNum < totalPages) {\n                        dataSource.page(pageNum + 1);\n                    } else {\n                        dataSource.unbind('change', renderPage);\n                        resolve();\n                    }\n                }\n                if (allPages) {\n                    dataSource.bind('change', renderPage);\n                    dataSource.page(1);\n                } else {\n                    renderPage();\n                }\n                return result.promise();\n            };\n            Grid.prototype._drawPDF = function (progress) {\n                var grid = this;\n                if (grid.options.pdf.paperSize && grid.options.pdf.paperSize != 'auto') {\n                    return grid._drawPDF_autoPageBreak(progress);\n                }\n                var result = new $.Deferred();\n                var dataSource = grid.dataSource;\n                var allPages = grid.options.pdf.allPages;\n                this._initPDFProgress(progress);\n                var doc = new kendo.drawing.Group();\n                var startingPage = dataSource.page();\n                function resolve() {\n                    if (allPages && startingPage !== undefined) {\n                        dataSource.unbind('change', exportPage);\n                        dataSource.one('change', function () {\n                            result.resolve(doc);\n                        });\n                        dataSource.page(startingPage);\n                    } else {\n                        result.resolve(doc);\n                    }\n                }\n                function exportPage() {\n                    grid._drawPDFShadow({ width: grid.wrapper.width() }, { avoidLinks: grid.options.pdf.avoidLinks }).done(function (group) {\n                        var pageNum = dataSource.page();\n                        var totalPages = allPages ? dataSource.totalPages() : 1;\n                        var args = {\n                            page: group,\n                            pageNumber: pageNum,\n                            progress: pageNum / totalPages,\n                            totalPages: totalPages\n                        };\n                        progress.notify(args);\n                        doc.append(args.page);\n                        if (pageNum < totalPages) {\n                            dataSource.page(pageNum + 1);\n                        } else {\n                            resolve();\n                        }\n                    }).fail(function (err) {\n                        result.reject(err);\n                    });\n                }\n                if (allPages) {\n                    dataSource.bind('change', exportPage);\n                    dataSource.page(1);\n                } else {\n                    exportPage();\n                }\n                return result.promise();\n            };\n            Grid.prototype._initPDFProgress = function (deferred) {\n                var loading = $('<div class=\\'k-loading-pdf-mask\\'><div class=\\'k-loading-color\\'/></div>');\n                loading.prepend(this.wrapper.clone().css({\n                    position: 'absolute',\n                    top: 0,\n                    left: 0\n                }));\n                this.wrapper.append(loading);\n                var pb = $('<div class=\\'k-loading-pdf-progress\\'>').appendTo(loading).kendoProgressBar({\n                    type: 'chunk',\n                    chunkCount: 10,\n                    min: 0,\n                    max: 1,\n                    value: 0\n                }).data('kendoProgressBar');\n                deferred.progress(function (e) {\n                    pb.value(e.progress);\n                }).always(function () {\n                    kendo.destroy(loading);\n                    loading.remove();\n                });\n            };\n        }\n        function syncTableHeight(table1, table2) {\n            table1 = table1[0];\n            table2 = table2[0];\n            if (table1.rows.length !== table2.rows.length) {\n                var lockedHeigth = table1.offsetHeight;\n                var tableHeigth = table2.offsetHeight;\n                var row;\n                var diff;\n                if (lockedHeigth > tableHeigth) {\n                    row = table2.rows[table2.rows.length - 1];\n                    if (filterRowRegExp.test(row.className)) {\n                        row = table2.rows[table2.rows.length - 2];\n                    }\n                    diff = lockedHeigth - tableHeigth;\n                } else {\n                    row = table1.rows[table1.rows.length - 1];\n                    if (filterRowRegExp.test(row.className)) {\n                        row = table1.rows[table1.rows.length - 2];\n                    }\n                    diff = tableHeigth - lockedHeigth;\n                }\n                row.style.height = row.offsetHeight + diff + 'px';\n            }\n        }\n        function adjustRowHeight(row1, row2) {\n            var height;\n            var offsetHeight1 = row1.offsetHeight;\n            var offsetHeight2 = row2.offsetHeight;\n            if (offsetHeight1 > offsetHeight2) {\n                height = offsetHeight1 + 'px';\n            } else if (offsetHeight1 < offsetHeight2) {\n                height = offsetHeight2 + 'px';\n            }\n            if (height) {\n                row1.style.height = row2.style.height = height;\n            }\n        }\n        function getCommand(commands, name) {\n            var idx, length, command;\n            if (typeof commands === STRING && commands === name) {\n                return commands;\n            }\n            if (isPlainObject(commands) && commands.name === name) {\n                return commands;\n            }\n            if (isArray(commands)) {\n                for (idx = 0, length = commands.length; idx < length; idx++) {\n                    command = commands[idx];\n                    if (typeof command === STRING && command === name || command.name === name) {\n                        return command;\n                    }\n                }\n            }\n            return null;\n        }\n        function focusTable(table, direct) {\n            var msie = browser.msie || browser.edge;\n            if (direct === true) {\n                table = $(table);\n                var scrollTop, scrollLeft;\n                scrollTop = table.parent().scrollTop();\n                scrollLeft = table.parent().scrollLeft();\n                if (msie) {\n                    try {\n                        table[0].setActive();\n                    } catch (e) {\n                        table[0].focus();\n                    }\n                } else {\n                    table[0].focus();\n                }\n                table.parent().scrollTop(scrollTop).scrollLeft(scrollLeft);\n            } else {\n                $(table).one('focusin', function (e) {\n                    e.preventDefault();\n                }).focus();\n            }\n        }\n        function isColumnEditable(column, model) {\n            if (!column.field || column.selectable) {\n                return false;\n            }\n            if (model.editable && !model.editable(column.field)) {\n                return false;\n            }\n            if (column.editable && !column.editable(model)) {\n                return false;\n            }\n            return true;\n        }\n        function isInputElement(element) {\n            return $(element).is(':button,a,:input,a>.k-icon,textarea,span.k-select,span.k-icon,span.k-link,.k-input,.k-multiselect-wrap,.k-tool-icon');\n        }\n        function tableClick(e) {\n            var currentTarget = $(e.currentTarget), isHeader = currentTarget.is('th'), table = this.table.add(this.lockedTable), headerTable = this.thead.parent().add($('>table', this.lockedHeader)), isInput = isInputElement(e.target), currentTable = currentTarget.closest('table')[0];\n            if (kendo.support.touch) {\n                return;\n            }\n            if (isInput && currentTarget.find(kendo.roleSelector('filtercell')).length) {\n                this._setCurrent(currentTarget);\n                return;\n            }\n            if (currentTable !== table[0] && currentTable !== table[1] && currentTable !== headerTable[0] && currentTable !== headerTable[1]) {\n                return;\n            }\n            if ($(e.target).is('a.k-i-expand, a.k-i-collapse')) {\n                return;\n            }\n            if (this.options.navigatable) {\n                this._setCurrent(currentTarget);\n            }\n            if (isHeader || !isInput) {\n                setTimeout(function () {\n                    if (!(isIE8 && $(kendo._activeElement()).hasClass('k-widget'))) {\n                        if (!isInputElement(kendo._activeElement())) {\n                            focusTable(currentTable, true);\n                        }\n                    }\n                });\n            }\n            if (isHeader) {\n                e.preventDefault();\n            }\n        }\n        function isInEdit(cell) {\n            return cell && (cell.hasClass('k-edit-cell') || cell.parent().hasClass('k-grid-edit-row'));\n        }\n        function groupRowBuilder(colspan, level, text) {\n            return '<tr role=\"row\" class=\"k-grouping-row\">' + groupCells(level) + '<td colspan=\"' + colspan + '\" aria-expanded=\"true\">' + '<p class=\"k-reset\">' + '<a class=\"k-icon k-i-collapse\" href=\"#\" tabindex=\"-1\" ' + ARIALABEL + '=\"' + COLLAPSE + '\"></a>' + text + '</p></td></tr>';\n        }\n        function groupRowLockedContentBuilder(colspan) {\n            return '<tr role=\"row\" class=\"k-grouping-row\">' + '<td colspan=\"' + colspan + '\" aria-expanded=\"true\">' + '<p class=\"k-reset\">&nbsp;</p></td></tr>';\n        }\n        ui.plugin(Grid);\n        ui.plugin(VirtualScrollable);\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.listview', [\n        'kendo.data',\n        'kendo.editable',\n        'kendo.selectable'\n    ], f);\n}(function () {\n    var __meta__ = {\n        id: 'listview',\n        name: 'ListView',\n        category: 'web',\n        description: 'The ListView widget offers rich support for interacting with data.',\n        depends: ['data'],\n        features: [\n            {\n                id: 'listview-editing',\n                name: 'Editing',\n                description: 'Support for record editing',\n                depends: ['editable']\n            },\n            {\n                id: 'listview-selection',\n                name: 'Selection',\n                description: 'Support for selection',\n                depends: ['selectable']\n            }\n        ]\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, CHANGE = 'change', CANCEL = 'cancel', DATABOUND = 'dataBound', DATABINDING = 'dataBinding', Widget = kendo.ui.Widget, keys = kendo.keys, FOCUSSELECTOR = '>*:not(.k-loading-mask)', PROGRESS = 'progress', ERROR = 'error', FOCUSED = 'k-state-focused', SELECTED = 'k-state-selected', KEDITITEM = 'k-edit-item', EDIT = 'edit', REMOVE = 'remove', SAVE = 'save', CLICK = 'click', NS = '.kendoListView', proxy = $.proxy, activeElement = kendo._activeElement, progress = kendo.ui.progress, DataSource = kendo.data.DataSource;\n        var ListView = kendo.ui.DataBoundWidget.extend({\n            init: function (element, options) {\n                var that = this;\n                options = $.isArray(options) ? { dataSource: options } : options;\n                Widget.fn.init.call(that, element, options);\n                options = that.options;\n                that.wrapper = element = that.element;\n                if (element[0].id) {\n                    that._itemId = element[0].id + '_lv_active';\n                }\n                that._element();\n                that._dataSource();\n                that._templates();\n                that._navigatable();\n                that._selectable();\n                that._pageable();\n                that._crudHandlers();\n                if (that.options.autoBind) {\n                    that.dataSource.fetch();\n                }\n                kendo.notify(that);\n            },\n            events: [\n                CHANGE,\n                CANCEL,\n                DATABINDING,\n                DATABOUND,\n                EDIT,\n                REMOVE,\n                SAVE\n            ],\n            options: {\n                name: 'ListView',\n                autoBind: true,\n                selectable: false,\n                navigatable: false,\n                template: '',\n                altTemplate: '',\n                editTemplate: ''\n            },\n            setOptions: function (options) {\n                Widget.fn.setOptions.call(this, options);\n                this._templates();\n                if (this.selectable) {\n                    this.selectable.destroy();\n                    this.selectable = null;\n                }\n                this._selectable();\n            },\n            _templates: function () {\n                var options = this.options;\n                this.template = kendo.template(options.template || '');\n                this.altTemplate = kendo.template(options.altTemplate || options.template);\n                this.editTemplate = kendo.template(options.editTemplate || '');\n            },\n            _item: function (action) {\n                return this.element.children()[action]();\n            },\n            items: function () {\n                return this.element.children();\n            },\n            dataItem: function (element) {\n                var attr = kendo.attr('uid');\n                var uid = $(element).closest('[' + attr + ']').attr(attr);\n                return this.dataSource.getByUid(uid);\n            },\n            setDataSource: function (dataSource) {\n                this.options.dataSource = dataSource;\n                this._dataSource();\n                if (this.options.autoBind) {\n                    dataSource.fetch();\n                }\n            },\n            _unbindDataSource: function () {\n                var that = this;\n                that.dataSource.unbind(CHANGE, that._refreshHandler).unbind(PROGRESS, that._progressHandler).unbind(ERROR, that._errorHandler);\n            },\n            _dataSource: function () {\n                var that = this;\n                if (that.dataSource && that._refreshHandler) {\n                    that._unbindDataSource();\n                } else {\n                    that._refreshHandler = proxy(that.refresh, that);\n                    that._progressHandler = proxy(that._progress, that);\n                    that._errorHandler = proxy(that._error, that);\n                }\n                that.dataSource = DataSource.create(that.options.dataSource).bind(CHANGE, that._refreshHandler).bind(PROGRESS, that._progressHandler).bind(ERROR, that._errorHandler);\n            },\n            _progress: function () {\n                progress(this.element, true);\n            },\n            _error: function () {\n                progress(this.element, false);\n            },\n            _element: function () {\n                this.element.addClass('k-widget k-listview').attr('role', 'listbox');\n            },\n            refresh: function (e) {\n                var that = this, view = that.dataSource.view(), data, items, item, html = '', idx, length, template = that.template, altTemplate = that.altTemplate, active = activeElement();\n                e = e || {};\n                if (e.action === 'itemchange') {\n                    if (!that._hasBindingTarget() && !that.editable) {\n                        data = e.items[0];\n                        item = that.items().filter('[' + kendo.attr('uid') + '=' + data.uid + ']');\n                        if (item.length > 0) {\n                            idx = item.index();\n                            that.angular('cleanup', function () {\n                                return { elements: [item] };\n                            });\n                            item.replaceWith(template(data));\n                            item = that.items().eq(idx);\n                            item.attr(kendo.attr('uid'), data.uid);\n                            that.angular('compile', function () {\n                                return {\n                                    elements: [item],\n                                    data: [{ dataItem: data }]\n                                };\n                            });\n                            that.trigger('itemChange', {\n                                item: item,\n                                data: data\n                            });\n                        }\n                    }\n                    return;\n                }\n                if (that.trigger(DATABINDING, {\n                        action: e.action || 'rebind',\n                        items: e.items,\n                        index: e.index\n                    })) {\n                    return;\n                }\n                that._angularItems('cleanup');\n                that._destroyEditable();\n                for (idx = 0, length = view.length; idx < length; idx++) {\n                    if (idx % 2) {\n                        html += altTemplate(view[idx]);\n                    } else {\n                        html += template(view[idx]);\n                    }\n                }\n                that.element.html(html);\n                items = that.items();\n                for (idx = 0, length = view.length; idx < length; idx++) {\n                    items.eq(idx).attr(kendo.attr('uid'), view[idx].uid).attr('role', 'option').attr('aria-selected', 'false');\n                }\n                if (that.element[0] === active && that.options.navigatable) {\n                    that.current(items.eq(0));\n                }\n                that._angularItems('compile');\n                that.trigger(DATABOUND, {\n                    action: e.action || 'rebind',\n                    items: e.items,\n                    index: e.index\n                });\n            },\n            _pageable: function () {\n                var that = this, pageable = that.options.pageable, settings, pagerId;\n                if ($.isPlainObject(pageable)) {\n                    pagerId = pageable.pagerId;\n                    settings = $.extend({}, pageable, {\n                        dataSource: that.dataSource,\n                        pagerId: null\n                    });\n                    that.pager = new kendo.ui.Pager($('#' + pagerId), settings);\n                }\n            },\n            _selectable: function () {\n                var that = this, multi, current, selectable = that.options.selectable, navigatable = that.options.navigatable;\n                if (selectable) {\n                    multi = kendo.ui.Selectable.parseOptions(selectable).multiple;\n                    that.selectable = new kendo.ui.Selectable(that.element, {\n                        aria: true,\n                        multiple: multi,\n                        filter: FOCUSSELECTOR,\n                        change: function () {\n                            that.trigger(CHANGE);\n                        }\n                    });\n                    if (navigatable) {\n                        that.element.on('keydown' + NS, function (e) {\n                            if (e.keyCode === keys.SPACEBAR) {\n                                current = that.current();\n                                if (e.target == e.currentTarget) {\n                                    e.preventDefault();\n                                }\n                                if (multi) {\n                                    if (!e.ctrlKey) {\n                                        that.selectable.clear();\n                                    } else {\n                                        if (current && current.hasClass(SELECTED)) {\n                                            current.removeClass(SELECTED);\n                                            return;\n                                        }\n                                    }\n                                } else {\n                                    that.selectable.clear();\n                                }\n                                that.selectable.value(current);\n                            }\n                        });\n                    }\n                }\n            },\n            current: function (candidate) {\n                var that = this, element = that.element, current = that._current, id = that._itemId;\n                if (candidate === undefined) {\n                    return current;\n                }\n                if (current && current[0]) {\n                    if (current[0].id === id) {\n                        current.removeAttr('id');\n                    }\n                    current.removeClass(FOCUSED);\n                    element.removeAttr('aria-activedescendant');\n                }\n                if (candidate && candidate[0]) {\n                    id = candidate[0].id || id;\n                    that._scrollTo(candidate[0]);\n                    element.attr('aria-activedescendant', id);\n                    candidate.addClass(FOCUSED).attr('id', id);\n                }\n                that._current = candidate;\n            },\n            _scrollTo: function (element) {\n                var that = this, container, UseJQueryoffset = false, SCROLL = 'scroll';\n                if (that.wrapper.css('overflow') == 'auto' || that.wrapper.css('overflow') == SCROLL) {\n                    container = that.wrapper[0];\n                } else {\n                    container = window;\n                    UseJQueryoffset = true;\n                }\n                var scrollDirectionFunc = function (direction, dimension) {\n                    var elementOffset = UseJQueryoffset ? $(element).offset()[direction.toLowerCase()] : element['offset' + direction], elementDimension = element['client' + dimension], containerScrollAmount = $(container)[SCROLL + direction](), containerDimension = $(container)[dimension.toLowerCase()]();\n                    if (elementOffset + elementDimension > containerScrollAmount + containerDimension) {\n                        $(container)[SCROLL + direction](elementOffset + elementDimension - containerDimension);\n                    } else if (elementOffset < containerScrollAmount) {\n                        $(container)[SCROLL + direction](elementOffset);\n                    }\n                };\n                scrollDirectionFunc('Top', 'Height');\n                scrollDirectionFunc('Left', 'Width');\n            },\n            _navigatable: function () {\n                var that = this, navigatable = that.options.navigatable, element = that.element, clickCallback = function (e) {\n                        that.current($(e.currentTarget));\n                        if (!$(e.target).is(':button,a,:input,a>.k-icon,textarea')) {\n                            element.focus();\n                        }\n                    };\n                if (navigatable) {\n                    that._tabindex();\n                    element.on('focus' + NS, function () {\n                        var current = that._current;\n                        if (!current || !current.is(':visible')) {\n                            current = that._item('first');\n                        }\n                        that.current(current);\n                    }).on('focusout' + NS, function () {\n                        if (that._current) {\n                            that._current.removeClass(FOCUSED);\n                        }\n                    }).on('keydown' + NS, function (e) {\n                        var key = e.keyCode, current = that.current(), target = $(e.target), canHandle = !target.is(':button,textarea,a,a>.t-icon,input'), isTextBox = target.is(':text,:password'), preventDefault = kendo.preventDefault, editItem = element.find('.' + KEDITITEM), active = activeElement(), idx;\n                        if (!canHandle && !isTextBox && keys.ESC != key || isTextBox && keys.ESC != key && keys.ENTER != key) {\n                            return;\n                        }\n                        if (keys.UP === key || keys.LEFT === key) {\n                            if (current) {\n                                current = current.prev();\n                            }\n                            that.current(!current || !current[0] ? that._item('last') : current);\n                            preventDefault(e);\n                        } else if (keys.DOWN === key || keys.RIGHT === key) {\n                            if (current) {\n                                current = current.next();\n                            }\n                            that.current(!current || !current[0] ? that._item('first') : current);\n                            preventDefault(e);\n                        } else if (keys.PAGEUP === key) {\n                            that.current(null);\n                            that.dataSource.page(that.dataSource.page() - 1);\n                            preventDefault(e);\n                        } else if (keys.PAGEDOWN === key) {\n                            that.current(null);\n                            that.dataSource.page(that.dataSource.page() + 1);\n                            preventDefault(e);\n                        } else if (keys.HOME === key) {\n                            that.current(that._item('first'));\n                            preventDefault(e);\n                        } else if (keys.END === key) {\n                            that.current(that._item('last'));\n                            preventDefault(e);\n                        } else if (keys.ENTER === key) {\n                            if (editItem.length !== 0 && (canHandle || isTextBox)) {\n                                idx = that.items().index(editItem);\n                                if (active) {\n                                    active.blur();\n                                }\n                                that.save();\n                                var focusAgain = function () {\n                                    that.element.trigger('focus');\n                                    that.current(that.items().eq(idx));\n                                };\n                                that.one('dataBound', focusAgain);\n                            } else if (that.options.editTemplate !== '') {\n                                that.edit(current);\n                            }\n                        } else if (keys.ESC === key) {\n                            editItem = element.find('.' + KEDITITEM);\n                            if (editItem.length === 0) {\n                                return;\n                            }\n                            idx = that.items().index(editItem);\n                            that.cancel();\n                            that.element.trigger('focus');\n                            that.current(that.items().eq(idx));\n                        }\n                    });\n                    element.on('mousedown' + NS + ' touchstart' + NS, FOCUSSELECTOR, proxy(clickCallback, that));\n                }\n            },\n            clearSelection: function () {\n                var that = this;\n                that.selectable.clear();\n                that.trigger(CHANGE);\n            },\n            select: function (items) {\n                var that = this, selectable = that.selectable;\n                items = $(items);\n                if (items.length) {\n                    if (!selectable.options.multiple) {\n                        selectable.clear();\n                        items = items.first();\n                    }\n                    selectable.value(items);\n                    return;\n                }\n                return selectable.value();\n            },\n            _destroyEditable: function () {\n                var that = this;\n                if (that.editable) {\n                    that.editable.destroy();\n                    delete that.editable;\n                }\n            },\n            _modelFromElement: function (element) {\n                var uid = element.attr(kendo.attr('uid'));\n                return this.dataSource.getByUid(uid);\n            },\n            _closeEditable: function () {\n                var that = this, editable = that.editable, data, item, index, template = that.template;\n                if (editable) {\n                    if (editable.element.index() % 2) {\n                        template = that.altTemplate;\n                    }\n                    that.angular('cleanup', function () {\n                        return { elements: [editable.element] };\n                    });\n                    data = that._modelFromElement(editable.element);\n                    that._destroyEditable();\n                    index = editable.element.index();\n                    editable.element.replaceWith(template(data));\n                    item = that.items().eq(index);\n                    item.attr(kendo.attr('uid'), data.uid);\n                    if (that._hasBindingTarget()) {\n                        kendo.bind(item, data);\n                    }\n                    that.angular('compile', function () {\n                        return {\n                            elements: [item],\n                            data: [{ dataItem: data }]\n                        };\n                    });\n                }\n                return true;\n            },\n            edit: function (item) {\n                var that = this, data = that._modelFromElement(item), container, uid = data.uid, index;\n                that.cancel();\n                item = that.items().filter('[' + kendo.attr('uid') + '=' + uid + ']');\n                index = item.index();\n                item.replaceWith(that.editTemplate(data));\n                container = that.items().eq(index).addClass(KEDITITEM).attr(kendo.attr('uid'), data.uid);\n                that.editable = container.kendoEditable({\n                    model: data,\n                    clearContainer: false,\n                    errorTemplate: false,\n                    target: that\n                }).data('kendoEditable');\n                that.trigger(EDIT, {\n                    model: data,\n                    item: container\n                });\n            },\n            save: function () {\n                var that = this, editable = that.editable, model;\n                if (!editable) {\n                    return;\n                }\n                var container = editable.element;\n                model = that._modelFromElement(container);\n                if (editable.end() && !that.trigger(SAVE, {\n                        model: model,\n                        item: container\n                    })) {\n                    that._closeEditable();\n                    that.dataSource.sync();\n                }\n            },\n            remove: function (item) {\n                var that = this, dataSource = that.dataSource, data = that._modelFromElement(item);\n                if (that.editable) {\n                    dataSource.cancelChanges(that._modelFromElement(that.editable.element));\n                    that._closeEditable();\n                }\n                if (!that.trigger(REMOVE, {\n                        model: data,\n                        item: item\n                    })) {\n                    item.hide();\n                    dataSource.remove(data);\n                    dataSource.sync();\n                }\n            },\n            add: function () {\n                var that = this, dataItem, dataSource = that.dataSource, index = dataSource.indexOf((dataSource.view() || [])[0]);\n                if (index < 0) {\n                    index = 0;\n                }\n                that.cancel();\n                dataItem = dataSource.insert(index, {});\n                that.edit(that.element.find('[data-uid=\\'' + dataItem.uid + '\\']'));\n            },\n            cancel: function () {\n                var that = this, dataSource = that.dataSource;\n                if (that.editable) {\n                    var container = that.editable.element;\n                    var model = that._modelFromElement(container);\n                    if (!that.trigger(CANCEL, {\n                            model: model,\n                            container: container\n                        })) {\n                        dataSource.cancelChanges(model);\n                        that._closeEditable();\n                    }\n                }\n            },\n            _crudHandlers: function () {\n                var that = this, clickNS = CLICK + NS;\n                that.element.on(clickNS, '.k-edit-button', function (e) {\n                    var item = $(this).closest('[' + kendo.attr('uid') + ']');\n                    that.edit(item);\n                    e.preventDefault();\n                });\n                that.element.on(clickNS, '.k-delete-button', function (e) {\n                    var item = $(this).closest('[' + kendo.attr('uid') + ']');\n                    that.remove(item);\n                    e.preventDefault();\n                });\n                that.element.on(clickNS, '.k-update-button', function (e) {\n                    that.save();\n                    e.preventDefault();\n                });\n                that.element.on(clickNS, '.k-cancel-button', function (e) {\n                    that.cancel();\n                    e.preventDefault();\n                });\n            },\n            destroy: function () {\n                var that = this;\n                Widget.fn.destroy.call(that);\n                that._unbindDataSource();\n                that._destroyEditable();\n                that.element.off(NS);\n                if (that.pager) {\n                    that.pager.destroy();\n                }\n                kendo.destroy(that.element);\n            }\n        });\n        kendo.ui.plugin(ListView);\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.listbox', [\n        'kendo.draganddrop',\n        'kendo.data',\n        'kendo.selectable'\n    ], f);\n}(function () {\n    var __meta__ = {\n        id: 'listbox',\n        name: 'ListBox',\n        category: 'web',\n        depends: [\n            'draganddrop',\n            'data',\n            'selectable'\n        ]\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo;\n        var kendoAttr = kendo.attr;\n        var data = kendo.data;\n        var keys = kendo.keys;\n        var kendoTemplate = kendo.template;\n        var Widget = kendo.ui.Widget;\n        var DataSource = data.DataSource;\n        var Selectable = kendo.ui.Selectable;\n        var DataBoundWidget = kendo.ui.DataBoundWidget;\n        var Class = kendo.Class;\n        var extend = $.extend;\n        var noop = $.noop;\n        var proxy = $.proxy;\n        var DASH = '-';\n        var DOT = '.';\n        var SPACE = ' ';\n        var HASH = '#';\n        var KENDO_LISTBOX = 'kendoListBox';\n        var NS = DOT + KENDO_LISTBOX;\n        var DISABLED_STATE_CLASS = 'k-state-disabled';\n        var SELECTED_STATE_CLASS = 'k-state-selected';\n        var ENABLED_ITEM_SELECTOR = '.k-item:not(.k-state-disabled)';\n        var ENABLED_ITEMS_SELECTOR = '.k-list:not(.k-state-disabled) >' + ENABLED_ITEM_SELECTOR;\n        var TOOLBAR_CLASS = 'k-listbox-toolbar';\n        var TOOL_SELECTOR = 'li > a.k-button:not(.k-state-disabled)';\n        var FOCUSED_CLASS = 'k-state-focused';\n        var DRAG_CLUE_CLASS = 'k-drag-clue';\n        var DROP_HINT_CLASS = 'k-drop-hint';\n        var LIST_CLASS = 'k-reset k-list';\n        var LIST_SELECTOR = '.k-reset.k-list';\n        var RESET = 'k-reset';\n        var CLICK = 'click' + NS;\n        var KEYDOWN = 'keydown' + NS;\n        var BLUR = 'blur' + NS;\n        var outerWidth = kendo._outerWidth;\n        var outerHeight = kendo._outerHeight;\n        var CHANGE = 'change';\n        var DATABOUND = 'dataBound';\n        var ADD = 'add';\n        var REMOVE = 'remove';\n        var REORDER = 'reorder';\n        var MOVE_UP = 'moveUp';\n        var MOVE_DOWN = 'moveDown';\n        var TRANSFER_TO = 'transferTo';\n        var TRANSFER_FROM = 'transferFrom';\n        var TRANSFER_ALL_TO = 'transferAllTo';\n        var TRANSFER_ALL_FROM = 'transferAllFrom';\n        var DRAGGEDCLASS = 'k-ghost';\n        var UNIQUE_ID = 'uid';\n        var TABINDEX = 'tabindex';\n        var COMMAND = 'command';\n        var MOVE_UP_OFFSET = -1;\n        var MOVE_DOWN_OFFSET = 1;\n        var DRAGSTART = 'dragstart';\n        var DRAG = 'drag';\n        var DROP = 'drop';\n        var DRAGEND = 'dragend';\n        var DEFAULT_FILTER = 'ul.k-reset.k-list>li.k-item';\n        var RIGHT = 'right';\n        var BOTTOM = 'bottom';\n        var TOOLBAR_POSITION_CLASS_NAMES = [\n            TOOLBAR_CLASS + DASH + 'left',\n            TOOLBAR_CLASS + DASH + RIGHT,\n            TOOLBAR_CLASS + DASH + 'top',\n            TOOLBAR_CLASS + DASH + BOTTOM\n        ];\n        function getSortedDomIndices(items) {\n            var indices = $.map(items, function (item) {\n                return $(item).index();\n            });\n            return indices;\n        }\n        function isUndefined(value) {\n            return typeof value === 'undefined';\n        }\n        function defaultHint(element) {\n            return element.clone().removeClass(DRAGGEDCLASS).addClass(kendo.format('{0} {1} {2}', SELECTED_STATE_CLASS, RESET, DRAG_CLUE_CLASS)).width(element.width());\n        }\n        function defaultPlaceholder() {\n            return $('<li>').addClass(DROP_HINT_CLASS);\n        }\n        var ListBox = DataBoundWidget.extend({\n            init: function (element, options) {\n                var that = this;\n                Widget.fn.init.call(that, element, options);\n                that._wrapper();\n                that._list();\n                element = that.element.attr('multiple', 'multiple').hide();\n                if (element[0] && !that.options.dataSource) {\n                    that.options.dataTextField = that.options.dataTextField || 'text';\n                    that.options.dataValueField = that.options.dataValueField || 'value';\n                }\n                that._templates();\n                that._selectable();\n                that._dataSource();\n                that._createToolbar();\n                that._createDraggable();\n                that._createNavigatable();\n            },\n            destroy: function () {\n                var that = this;\n                DataBoundWidget.fn.destroy.call(that);\n                if (!isNaN(that._listTabIndex)) {\n                    that._getList().off();\n                    that._listTabIndex = null;\n                }\n                that._unbindDataSource();\n                that._destroySelectable();\n                that._destroyToolbar();\n                that.wrapper.off(NS);\n                if (that._target) {\n                    that._target = null;\n                }\n                if (that._draggable) {\n                    that._draggable.destroy();\n                    that.placeholder = null;\n                }\n                kendo.destroy(that.element);\n            },\n            events: [\n                CHANGE,\n                DATABOUND,\n                ADD,\n                REMOVE,\n                REORDER,\n                DRAGSTART,\n                DRAG,\n                DROP,\n                DRAGEND\n            ],\n            options: {\n                name: 'ListBox',\n                autoBind: true,\n                template: '',\n                dataTextField: '',\n                dataValueField: '',\n                selectable: 'single',\n                draggable: null,\n                dropSources: [],\n                connectWith: '',\n                navigatable: true,\n                toolbar: {\n                    position: RIGHT,\n                    tools: []\n                },\n                messages: {\n                    tools: {\n                        remove: 'Delete',\n                        moveUp: 'Move Up',\n                        moveDown: 'Move Down',\n                        transferTo: 'Transfer To',\n                        transferFrom: 'Transfer From',\n                        transferAllTo: 'Transfer All To',\n                        transferAllFrom: 'Transfer All From'\n                    }\n                }\n            },\n            add: function (dataItems) {\n                var that = this;\n                var items = dataItems && dataItems.length ? dataItems : [dataItems];\n                var itemsLength = items.length;\n                var i;\n                that._unbindDataSource();\n                for (i = 0; i < itemsLength; i++) {\n                    that._addItem(items[i]);\n                }\n                that._bindDataSource();\n                that._syncElement();\n            },\n            _addItem: function (dataItem) {\n                var that = this;\n                var item = that.templates.itemTemplate({\n                    item: dataItem,\n                    r: that.templates.itemContent\n                });\n                $(item).attr(kendoAttr(UNIQUE_ID), dataItem.uid).appendTo(that._getList());\n                if (typeof dataItem === typeof '') {\n                    that.dataSource._data.push(dataItem);\n                } else {\n                    that.dataSource.add(dataItem);\n                }\n            },\n            _addItemAt: function (dataItem, index) {\n                var that = this;\n                var item = that.templates.itemTemplate({\n                    item: dataItem,\n                    r: that.templates.itemContent\n                });\n                that._unbindDataSource();\n                if (typeof dataItem === typeof '') {\n                    that._insertElementAt(item, index);\n                    that.dataSource._data.push(dataItem);\n                } else {\n                    that._insertElementAt($(item).attr(kendoAttr(UNIQUE_ID), dataItem.uid), index);\n                    that.dataSource.add(dataItem);\n                }\n                that._bindDataSource();\n                that._syncElement();\n            },\n            _insertElementAt: function (item, index) {\n                var that = this;\n                var list = that._getList();\n                if (index > 0) {\n                    $(item).insertAfter(list.children().eq(index - 1));\n                } else {\n                    $(list).prepend(item);\n                }\n            },\n            _createNavigatable: function () {\n                var that = this;\n                var options = that.options;\n                if (options.navigatable) {\n                    that._getList().on(CLICK, ENABLED_ITEM_SELECTOR, proxy(that._click, that)).on(KEYDOWN, proxy(that._keyDown, that)).on(BLUR, proxy(that._blur, that));\n                }\n            },\n            _getTabIndex: function () {\n                var that = this;\n                var tabindex;\n                if (!isNaN(that._listTabIndex)) {\n                    return that._listTabIndex;\n                }\n                tabindex = that.element.attr(TABINDEX);\n                that._listTabIndex = !isNaN(tabindex) ? tabindex : 0;\n                that.element.removeAttr(TABINDEX);\n                return that._listTabIndex;\n            },\n            _blur: function () {\n                if (this._target) {\n                    this._target.removeClass(FOCUSED_CLASS);\n                    this._getList().removeAttr('aria-activedescendant');\n                }\n                this._target = null;\n            },\n            _click: function (e) {\n                var that = this;\n                var target = $(e.currentTarget);\n                var oldTarget = that._target;\n                if (oldTarget) {\n                    oldTarget.removeClass(FOCUSED_CLASS);\n                }\n                that._target = target;\n                target.addClass(FOCUSED_CLASS);\n                that._getList().attr('aria-activedescendant', target.attr('id'));\n                if (that._getList()[0] !== kendo._activeElement()) {\n                    that.focus();\n                }\n            },\n            _getNavigatableItem: function (key) {\n                var that = this;\n                var current;\n                if (!that._target) {\n                    current = that.items().filter(ENABLED_ITEM_SELECTOR).first();\n                } else {\n                    current = that._target;\n                }\n                if (key === keys.UP && that._target) {\n                    current = that._target.prevAll(ENABLED_ITEM_SELECTOR).first();\n                }\n                if (key === keys.DOWN && that._target) {\n                    current = that._target.nextAll(ENABLED_ITEM_SELECTOR).first();\n                }\n                return current.length ? current : null;\n            },\n            _scrollIntoView: function (item) {\n                if (!item) {\n                    return;\n                }\n                if (item[0]) {\n                    item = item[0];\n                }\n                var list = this._getList().parent()[0];\n                var itemOffsetTop = item.offsetTop;\n                var contentScrollTop = list.scrollTop;\n                var contentOffsetHeight = list.clientHeight;\n                var bottomDistance = itemOffsetTop + item.offsetHeight;\n                if (contentScrollTop > itemOffsetTop) {\n                    contentScrollTop = itemOffsetTop;\n                } else if (bottomDistance > contentScrollTop + contentOffsetHeight) {\n                    contentScrollTop = bottomDistance - contentOffsetHeight;\n                }\n                list.scrollTop = contentScrollTop;\n            },\n            _keyDown: function (e) {\n                var that = this;\n                var key = e.keyCode;\n                var current = that._getNavigatableItem(key);\n                var shouldPreventDefault;\n                if (that._target) {\n                    that._target.removeClass(FOCUSED_CLASS);\n                }\n                if (!(e.shiftKey && !e.ctrlKey && (key === keys.DOWN || key === keys.UP))) {\n                    that._shiftSelecting = false;\n                }\n                if (key == keys.DELETE) {\n                    that._executeCommand(REMOVE);\n                    if (that._target) {\n                        that._target.removeClass(FOCUSED_CLASS);\n                        that._getList().removeAttr('aria-activedescendant');\n                        that._target = null;\n                    }\n                    shouldPreventDefault = true;\n                } else if (key === keys.DOWN || key === keys.UP) {\n                    if (!current) {\n                        e.preventDefault();\n                        return;\n                    }\n                    if (e.shiftKey && !e.ctrlKey) {\n                        if (!that._shiftSelecting) {\n                            that.clearSelection();\n                            that._shiftSelecting = true;\n                        }\n                        if (that._target && current.hasClass('k-state-selected')) {\n                            that._target.removeClass(SELECTED_STATE_CLASS);\n                            that.trigger(CHANGE);\n                        } else if (that.options.selectable == 'single') {\n                            that.select(current);\n                        } else {\n                            that.select(current.add(that._target));\n                        }\n                    } else if (e.shiftKey && e.ctrlKey) {\n                        that._executeCommand(key === keys.DOWN ? MOVE_DOWN : MOVE_UP);\n                        that._scrollIntoView(that._target);\n                        e.preventDefault();\n                        return;\n                    } else if (!e.shiftKey && !e.ctrlKey) {\n                        if (that.options.selectable === 'multiple') {\n                            that.clearSelection();\n                        }\n                        that.select(current);\n                    }\n                    that._target = current;\n                    if (that._target) {\n                        that._target.addClass(FOCUSED_CLASS);\n                        that._scrollIntoView(that._target);\n                        that._getList().attr('aria-activedescendant', that._target.attr('id'));\n                    } else {\n                        that._getList().removeAttr('aria-activedescendant');\n                    }\n                    shouldPreventDefault = true;\n                } else if (key == keys.SPACEBAR) {\n                    if (e.ctrlKey && that._target) {\n                        if (that._target.hasClass(SELECTED_STATE_CLASS)) {\n                            that._target.removeClass(SELECTED_STATE_CLASS);\n                            that.trigger(CHANGE);\n                        } else {\n                            that.select(that._target);\n                        }\n                    } else {\n                        that.clearSelection();\n                        that.select(that._target);\n                    }\n                    shouldPreventDefault = true;\n                } else if (e.ctrlKey && key == keys.RIGHT) {\n                    if (e.shiftKey) {\n                        that._executeCommand(TRANSFER_ALL_TO);\n                    } else {\n                        that._executeCommand(TRANSFER_TO);\n                    }\n                    that._target = that.select().length ? that.select() : null;\n                    shouldPreventDefault = true;\n                } else if (e.ctrlKey && key == keys.LEFT) {\n                    if (e.shiftKey) {\n                        that._executeCommand(TRANSFER_ALL_FROM);\n                    } else {\n                        that._executeCommand(TRANSFER_FROM);\n                    }\n                    shouldPreventDefault = true;\n                }\n                if (shouldPreventDefault) {\n                    e.preventDefault();\n                }\n            },\n            focus: function () {\n                this._getList().focus();\n            },\n            _createDraggable: function () {\n                var that = this;\n                var draggable = that.options.draggable;\n                var hint;\n                if (draggable) {\n                    hint = draggable.hint;\n                    if (!that.options.selectable) {\n                        throw new Error('Dragging requires selection to be enabled');\n                    }\n                    if (!hint) {\n                        hint = defaultHint;\n                    }\n                    that._draggable = new kendo.ui.Draggable(that.wrapper, {\n                        filter: draggable.filter ? draggable.filter : DEFAULT_FILTER,\n                        hint: kendo.isFunction(hint) ? hint : $(hint),\n                        dragstart: proxy(that._dragstart, that),\n                        dragcancel: proxy(that._clear, that),\n                        drag: proxy(that._drag, that),\n                        dragend: proxy(that._dragend, that)\n                    });\n                }\n            },\n            _dragstart: function (e) {\n                var that = this;\n                var draggedElement = that.draggedElement = e.currentTarget;\n                var placeholder = that.options.draggable.placeholder;\n                var dataItem = that.dataItem(draggedElement);\n                var eventData = {\n                    dataItems: dataItem,\n                    items: $(draggedElement),\n                    draggableEvent: e\n                };\n                if (that.options.draggable.enabled === false) {\n                    e.preventDefault();\n                    return;\n                }\n                if (!placeholder) {\n                    placeholder = defaultPlaceholder;\n                }\n                that.placeholder = kendo.isFunction(placeholder) ? $(placeholder.call(that, draggedElement)) : $(placeholder);\n                if (draggedElement.is(DOT + DISABLED_STATE_CLASS)) {\n                    e.preventDefault();\n                } else {\n                    if (that.trigger(DRAGSTART, eventData)) {\n                        e.preventDefault();\n                    } else {\n                        that.clearSelection();\n                        that.select(draggedElement);\n                        draggedElement.addClass(DRAGGEDCLASS);\n                    }\n                }\n            },\n            _clear: function () {\n                this.draggedElement.removeClass(DRAGGEDCLASS);\n                this.placeholder.remove();\n            },\n            _findElementUnderCursor: function (e) {\n                var elementUnderCursor = kendo.elementUnderCursor(e);\n                var draggable = e.sender;\n                if ($.contains(draggable.hint[0], elementUnderCursor) || draggable.hint[0] === elementUnderCursor) {\n                    draggable.hint.hide();\n                    elementUnderCursor = kendo.elementUnderCursor(e);\n                    draggable.hint.show();\n                }\n                return elementUnderCursor;\n            },\n            _findTarget: function (e) {\n                var that = this;\n                var element = that._findElementUnderCursor(e);\n                var elementNode = $(element);\n                var list = that._getList();\n                var items;\n                var node;\n                if ($.contains(list[0], element)) {\n                    items = that.items();\n                    element = elementNode.is('li') ? element : elementNode.closest('li')[0];\n                    node = items.filter(element)[0] || items.has(element)[0];\n                    if (node) {\n                        node = $(node);\n                        return !node.hasClass(DISABLED_STATE_CLASS) ? {\n                            element: node,\n                            listBox: that\n                        } : null;\n                    } else {\n                        return null;\n                    }\n                } else if (list[0] == element || list.parent()[0] == element) {\n                    return {\n                        element: $(list),\n                        appendToBottom: true,\n                        listBox: that\n                    };\n                } else {\n                    return that._searchConnectedListBox(elementNode);\n                }\n            },\n            _getElementCenter: function (element) {\n                var center = element.length ? kendo.getOffset(element) : null;\n                if (center) {\n                    center.top += outerHeight(element) / 2;\n                    center.left += outerWidth(element) / 2;\n                }\n                return center;\n            },\n            _searchConnectedListBox: function (element) {\n                var connectedListBox;\n                var items;\n                var node;\n                var originalElement = element;\n                var closestContainer;\n                if (element.hasClass('k-list-scroller k-selectable')) {\n                    closestContainer = element;\n                } else {\n                    closestContainer = element.closest('.k-list-scroller.k-selectable');\n                }\n                if (closestContainer.length) {\n                    connectedListBox = closestContainer.parent().find('[data-role=\\'listbox\\']').getKendoListBox();\n                } else {\n                    return null;\n                }\n                if (connectedListBox && $.inArray(this.element[0].id, connectedListBox.options.dropSources) !== -1) {\n                    items = connectedListBox.items();\n                    element = element.is('li') ? element[0] : element.closest('li')[0];\n                    node = items.filter(element)[0] || items.has(element)[0];\n                    if (node) {\n                        node = $(node);\n                        return !node.hasClass(DISABLED_STATE_CLASS) ? {\n                            element: node,\n                            listBox: connectedListBox\n                        } : null;\n                    } else if (!items.length || originalElement.hasClass('k-list-scroller k-selectable') || originalElement.hasClass('k-reset k-list')) {\n                        return {\n                            element: connectedListBox._getList(),\n                            listBox: connectedListBox,\n                            appendToBottom: true\n                        };\n                    } else {\n                        return null;\n                    }\n                }\n                return null;\n            },\n            _drag: function (e) {\n                var that = this;\n                var draggedElement = that.draggedElement;\n                var target = that._findTarget(e);\n                var cursorOffset = {\n                    left: e.x.location,\n                    top: e.y.location\n                };\n                var dataItem = that.dataItem(draggedElement);\n                var eventData = {\n                    dataItems: [dataItem],\n                    items: $(draggedElement),\n                    draggableEvent: e\n                };\n                var targetCenter;\n                var offsetDelta;\n                var direction;\n                if (that.trigger(DRAG, eventData)) {\n                    e.preventDefault();\n                    return;\n                }\n                if (target) {\n                    targetCenter = this._getElementCenter(target.element);\n                    offsetDelta = {\n                        left: Math.round(cursorOffset.left - targetCenter.left),\n                        top: Math.round(cursorOffset.top - targetCenter.top)\n                    };\n                    if (target.appendToBottom) {\n                        that._movePlaceholder(target, null, draggedElement);\n                        return;\n                    }\n                    if (offsetDelta.top < 0) {\n                        direction = 'prev';\n                    } else if (offsetDelta.top > 0) {\n                        direction = 'next';\n                    }\n                    if (direction) {\n                        if (target.element[0] != that.placeholder[0]) {\n                            that._movePlaceholder(target, direction, draggedElement);\n                        }\n                    }\n                } else if (that.placeholder.parent().length) {\n                    that.placeholder.remove();\n                }\n            },\n            _movePlaceholder: function (target, direction, draggedElement) {\n                var that = this;\n                var placeholder = that.placeholder;\n                var draggableOptions = target.listBox.options.draggable;\n                if (placeholder.parent().length) {\n                    that.placeholder.remove();\n                    if (draggableOptions && draggableOptions.placeholder) {\n                        that.placeholder = kendo.isFunction(draggableOptions.placeholder) ? $(draggableOptions.placeholder.call(that, draggedElement)) : $(draggableOptions.placeholder);\n                    } else {\n                        that.placeholder = $(defaultPlaceholder.call(that, draggedElement));\n                    }\n                }\n                if (!direction) {\n                    target.element.append(that.placeholder);\n                } else if (direction === 'prev') {\n                    target.element.before(that.placeholder);\n                } else if (direction === 'next') {\n                    target.element.after(that.placeholder);\n                }\n            },\n            _dragend: function (e) {\n                var that = this;\n                var draggedItem = that.draggedElement;\n                var items = that.items();\n                var placeholderIndex = items.not(that.draggedElement).index(that.placeholder);\n                var draggedIndex = items.not(that.placeholder).index(that.draggedElement);\n                var dataItem = that.dataItem(draggedItem);\n                var eventData = {\n                    dataItems: [dataItem],\n                    items: $(draggedItem)\n                };\n                var connectedListBox = that.placeholder.closest('.k-widget.k-listbox').find('[data-role=\\'listbox\\']').getKendoListBox();\n                if (that.trigger(DROP, extend({}, eventData, { draggableEvent: e }))) {\n                    e.preventDefault();\n                    this._clear();\n                    return;\n                }\n                if (placeholderIndex >= 0) {\n                    if (placeholderIndex !== draggedIndex && !that.trigger(REORDER, extend({}, eventData, { offset: placeholderIndex - draggedIndex }))) {\n                        draggedItem.removeClass(DRAGGEDCLASS);\n                        that.reorder(draggedItem, placeholderIndex);\n                    }\n                } else if (connectedListBox) {\n                    if (!that.trigger(REMOVE, eventData)) {\n                        that.remove($(draggedItem));\n                    }\n                    if (!connectedListBox.trigger(ADD, eventData)) {\n                        connectedListBox._addItemAt(dataItem, connectedListBox.items().index(that.placeholder));\n                    }\n                }\n                that._clear();\n                that._draggable.dropped = true;\n                that.trigger(DRAGEND, extend({}, eventData, { draggableEvent: e }));\n            },\n            reorder: function (item, index) {\n                var that = this;\n                var dataSource = that.dataSource;\n                var dataItem = that.dataItem(item);\n                var dataItemAtIndex = dataSource.at(index);\n                var itemAtIndex = that.items()[index];\n                var listItem = $(item);\n                if (dataItem && itemAtIndex && dataItemAtIndex) {\n                    that._removeElement(listItem);\n                    that._insertElementAt(listItem, index);\n                    that._updateToolbar();\n                }\n            },\n            remove: function (items) {\n                var that = this;\n                var listItems = that._getItems(items);\n                var itemsLength = listItems.length;\n                var i;\n                that._unbindDataSource();\n                for (i = 0; i < itemsLength; i++) {\n                    that._removeItem($(listItems[i]));\n                }\n                that._bindDataSource();\n                that._syncElement();\n                that._updateToolbar();\n                that._updateAllToolbars();\n            },\n            _removeItem: function (item) {\n                var that = this;\n                var dataSource = that.dataSource;\n                var dataItem = that.dataItem(item);\n                if (!dataItem || !dataSource) {\n                    return;\n                }\n                if (typeof dataItem === typeof '') {\n                    var data = dataSource._data;\n                    for (var i = 0; i < data.length; i++) {\n                        if (dataItem === data[i]) {\n                            data[i] = data[data.length - 1];\n                            data.pop();\n                            break;\n                        }\n                    }\n                } else {\n                    dataSource.remove(dataItem);\n                }\n                that._removeElement(item);\n            },\n            _removeElement: function (item) {\n                kendo.destroy(item);\n                $(item).off().remove();\n            },\n            dataItem: function (element) {\n                var uniqueIdAttr = kendoAttr(UNIQUE_ID);\n                var uid = $(element).attr(uniqueIdAttr) || $(element).closest('[' + uniqueIdAttr + ']').attr(uniqueIdAttr);\n                if (uid) {\n                    return this.dataSource.getByUid(uid);\n                } else {\n                    return $(element).html();\n                }\n            },\n            _dataItems: function (items) {\n                var dataItems = [];\n                var listItems = $(items);\n                var itemsLength = listItems.length;\n                var i;\n                for (i = 0; i < itemsLength; i++) {\n                    dataItems.push(this.dataItem(listItems.eq(i)));\n                }\n                return dataItems;\n            },\n            items: function () {\n                var list = this._getList();\n                return list.children();\n            },\n            select: function (items) {\n                var that = this;\n                var selectable = that.selectable;\n                var enabledItems;\n                if (isUndefined(items)) {\n                    return selectable.value();\n                }\n                enabledItems = that.items().filter(items).filter(ENABLED_ITEMS_SELECTOR);\n                if (!selectable.options.multiple) {\n                    selectable.clear();\n                    enabledItems = enabledItems.first();\n                }\n                return selectable.value(enabledItems);\n            },\n            clearSelection: function () {\n                var that = this;\n                var selectable = that.selectable;\n                if (selectable) {\n                    selectable.clear();\n                }\n            },\n            enable: function (items, enable) {\n                var that = this;\n                var enabled = isUndefined(enable) ? true : !!enable;\n                var listItems = that._getItems(items);\n                var itemsLength = listItems.length;\n                var i;\n                for (i = 0; i < itemsLength; i++) {\n                    that._enableItem($(listItems[i]), enabled);\n                }\n                that._updateAllToolbars();\n            },\n            _enableItem: function (item, enable) {\n                var that = this;\n                var dataItem = that.dataItem(item);\n                if (dataItem) {\n                    if (enable) {\n                        $(item).removeClass(DISABLED_STATE_CLASS);\n                    } else {\n                        $(item).addClass(DISABLED_STATE_CLASS).removeClass(SELECTED_STATE_CLASS);\n                    }\n                }\n            },\n            setDataSource: function (dataSource) {\n                var that = this;\n                that.options.dataSource = dataSource;\n                that._dataSource();\n            },\n            _dataSource: function () {\n                var that = this;\n                var options = that.options;\n                var dataSource = options.dataSource || {};\n                dataSource = $.isArray(dataSource) ? { data: dataSource } : dataSource;\n                dataSource.select = that.element;\n                dataSource.fields = [\n                    { field: options.dataTextField },\n                    { field: options.dataValueField }\n                ];\n                that._unbindDataSource();\n                that.dataSource = DataSource.create(dataSource);\n                that._bindDataSource();\n                if (that.options.autoBind) {\n                    that.dataSource.fetch();\n                }\n            },\n            _bindDataSource: function () {\n                var that = this;\n                var dataSource = that.dataSource;\n                that._dataChangeHandler = proxy(that.refresh, that);\n                if (dataSource) {\n                    dataSource.bind(CHANGE, that._dataChangeHandler);\n                }\n            },\n            _unbindDataSource: function () {\n                var that = this;\n                var dataSource = that.dataSource;\n                if (dataSource) {\n                    dataSource.unbind(CHANGE, that._dataChangeHandler);\n                }\n            },\n            _wrapper: function () {\n                var that = this, element = that.element, wrapper = element.parent('div.k-listbox');\n                if (!wrapper[0]) {\n                    wrapper = element.wrap('<div class=\"k-widget k-listbox\" deselectable=\"on\" />').parent();\n                    wrapper[0].style.cssText = element[0].style.cssText;\n                    wrapper[0].title = element[0].title;\n                    $('<div class=\"k-list-scroller\" />').insertBefore(element);\n                }\n                that.wrapper = wrapper.addClass(element[0].className).css('display', '');\n                that._innerWrapper = $(wrapper[0].firstChild);\n            },\n            _list: function () {\n                var that = this;\n                $('<ul class=\\'' + LIST_CLASS + '\\' role=\\'listbox\\'></ul>').appendTo(that._innerWrapper);\n                if (that.options.navigatable) {\n                    that._getList().attr(TABINDEX, that._getTabIndex());\n                }\n            },\n            _templates: function () {\n                var that = this;\n                var options = this.options;\n                var template;\n                if (options.template && typeof options.template == 'string') {\n                    template = kendo.template(options.template);\n                } else if (!options.template) {\n                    template = kendo.template('${' + kendo.expr(options.dataTextField, 'data') + '}', { useWithBlock: false });\n                } else {\n                    template = options.template;\n                }\n                that.templates = {\n                    itemTemplate: kendo.template('# var item = data.item, r = data.r; # <li class=\\'k-item\\' role=\\'option\\' aria-selected=\\'false\\'>#=r(item)#</li>', { useWithBlock: false }),\n                    itemContent: template,\n                    toolbar: '<div class=\\'' + TOOLBAR_CLASS + '\\'></div>'\n                };\n            },\n            refresh: function () {\n                var that = this;\n                var view = that.dataSource.view();\n                var template = that.templates.itemTemplate;\n                var html = '';\n                for (var idx = 0; idx < view.length; idx++) {\n                    html += template({\n                        item: view[idx],\n                        r: that.templates.itemContent\n                    });\n                }\n                that._getList().html(html);\n                that._setItemIds();\n                that._createToolbar();\n                that._syncElement();\n                that._updateToolbar();\n                that._updateAllToolbars();\n                that.trigger(DATABOUND);\n            },\n            _syncElement: function () {\n                var options = '';\n                var view = this.dataSource.view();\n                for (var idx = 0; idx < view.length; idx++) {\n                    options += this._option(view[idx][this.options.dataValueField] || view[idx], view[idx][this.options.dataTextField] || view[idx], true);\n                }\n                this.element.html(options);\n            },\n            _option: function (dataValue, dataText) {\n                var option = '<option';\n                if (dataValue !== undefined) {\n                    dataValue += '';\n                    if (dataValue.indexOf('\"') !== -1) {\n                        dataValue = dataValue.replace(/\"/g, '&quot;');\n                    }\n                    option += ' value=\"' + dataValue + '\"';\n                }\n                option += ' selected>';\n                if (dataText !== undefined) {\n                    option += kendo.htmlEncode(dataText);\n                }\n                return option += '</option>';\n            },\n            _setItemIds: function () {\n                var that = this;\n                var items = that.items();\n                var view = that.dataSource.view();\n                var viewLength = view.length;\n                var i;\n                for (i = 0; i < viewLength; i++) {\n                    items.eq(i).attr(kendoAttr(UNIQUE_ID), view[i].uid).attr('id', view[i].uid);\n                }\n            },\n            _selectable: function () {\n                var that = this;\n                var selectable = that.options.selectable;\n                var selectableOptions = Selectable.parseOptions(selectable);\n                if (selectableOptions.multiple) {\n                    that.element.attr('aria-multiselectable', 'true');\n                }\n                that.selectable = new Selectable(that._innerWrapper, {\n                    aria: true,\n                    multiple: selectableOptions.multiple,\n                    filter: ENABLED_ITEM_SELECTOR,\n                    change: proxy(that._onSelect, that)\n                });\n            },\n            _onSelect: function () {\n                var that = this;\n                that._updateToolbar();\n                that._updateAllToolbars();\n                that.trigger(CHANGE);\n            },\n            _destroySelectable: function () {\n                var that = this;\n                if (that.selectable) {\n                    that.selectable.destroy();\n                    that.selectable = null;\n                }\n            },\n            _getList: function () {\n                return this.wrapper.find(LIST_SELECTOR);\n            },\n            _getItems: function (items) {\n                return this.items().filter(items);\n            },\n            _createToolbar: function () {\n                var that = this;\n                var toolbarOptions = that.options.toolbar;\n                var position = toolbarOptions.position || RIGHT;\n                var toolbarInsertion = position === BOTTOM ? 'insertAfter' : 'insertBefore';\n                var tools = toolbarOptions.tools || [];\n                var messages = that.options.messages;\n                that._destroyToolbar();\n                that.wrapper.removeClass(TOOLBAR_POSITION_CLASS_NAMES.join(SPACE));\n                if (tools.length && tools.length > 0) {\n                    var toolbarElement = $(that.templates.toolbar)[toolbarInsertion](that._innerWrapper);\n                    that.toolbar = new ToolBar(toolbarElement, extend({}, toolbarOptions, {\n                        listBox: that,\n                        messages: messages\n                    }));\n                    that.wrapper.addClass(TOOLBAR_CLASS + DASH + position);\n                }\n            },\n            _destroyToolbar: function () {\n                var that = this;\n                if (that.toolbar) {\n                    that.toolbar.destroy();\n                    that.toolbar = null;\n                }\n            },\n            _executeCommand: function (commandName) {\n                var that = this;\n                var command = CommandFactory.current.create(commandName, { listBox: that });\n                if (command) {\n                    command.execute();\n                    that._updateToolbar();\n                    that._updateAllToolbars();\n                }\n            },\n            _updateToolbar: function () {\n                var toolbar = this.toolbar;\n                if (toolbar) {\n                    toolbar._updateToolStates();\n                }\n            },\n            _updateAllToolbars: function () {\n                var listBoxElements = $('select[data-role=\\'listbox\\']');\n                var elementsLength = listBoxElements.length;\n                var listBox;\n                var i;\n                for (i = 0; i < elementsLength; i++) {\n                    listBox = $(listBoxElements[i]).data(KENDO_LISTBOX);\n                    if (listBox) {\n                        listBox._updateToolbar();\n                    }\n                }\n            }\n        });\n        kendo.ui.plugin(ListBox);\n        var CommandFactory = Class.extend({\n            init: function () {\n                this._commands = [];\n            },\n            register: function (commandName, commandType) {\n                this._commands.push({\n                    commandName: commandName,\n                    commandType: commandType\n                });\n            },\n            create: function (commandName, options) {\n                var commands = this._commands;\n                var itemsLength = commands.length;\n                var name = commandName ? commandName.toLowerCase() : '';\n                var match;\n                var command;\n                var i;\n                for (i = 0; i < itemsLength; i++) {\n                    command = commands[i];\n                    if (command.commandName.toLowerCase() === name) {\n                        match = command;\n                        break;\n                    }\n                }\n                if (match) {\n                    return new match.commandType(options);\n                }\n            }\n        });\n        CommandFactory.current = new CommandFactory();\n        var ListBoxCommand = Class.extend({\n            init: function (options) {\n                var that = this;\n                that.options = extend({}, that.options, options);\n                that.listBox = that.options.listBox;\n            },\n            options: { listBox: null },\n            getItems: function () {\n                return $(this.listBox.select());\n            },\n            execute: noop,\n            canExecute: noop\n        });\n        var RemoveItemsCommand = ListBoxCommand.extend({\n            execute: function () {\n                var that = this;\n                var listBox = that.listBox;\n                var items = that.getItems();\n                if (!listBox.trigger(REMOVE, {\n                        dataItems: listBox._dataItems(items),\n                        items: items\n                    })) {\n                    listBox.remove(items);\n                }\n            },\n            canExecute: function () {\n                return this.listBox.select().length > 0;\n            }\n        });\n        CommandFactory.current.register(REMOVE, RemoveItemsCommand);\n        var MoveItemsCommand = ListBoxCommand.extend({\n            execute: function () {\n                var that = this;\n                if (that.canExecute()) {\n                    that.moveItems();\n                }\n            },\n            canExecute: noop,\n            moveItems: function () {\n                var that = this;\n                var listBox = that.listBox;\n                var options = that.options;\n                var items = that.getItems();\n                var offset = options.offset;\n                var indecesInDom = getSortedDomIndices(items);\n                var movedItems = $.makeArray(items.sort(that.itemComparer));\n                var moveAction = options.moveAction;\n                var movedItem;\n                if (!listBox.trigger(REORDER, {\n                        dataItems: listBox._dataItems(movedItems),\n                        items: $(movedItems),\n                        offset: offset\n                    })) {\n                    while (movedItems.length > 0 && indecesInDom.length > 0) {\n                        movedItem = movedItems[moveAction]();\n                        listBox.reorder(movedItem, indecesInDom[moveAction]() + offset);\n                    }\n                }\n            },\n            options: {\n                offset: 0,\n                moveAction: 'pop'\n            },\n            itemComparer: function (item1, item2) {\n                var indexItem1 = $(item1).index();\n                var indexItem2 = $(item2).index();\n                if (indexItem1 === indexItem2) {\n                    return 0;\n                } else {\n                    return indexItem1 > indexItem2 ? 1 : -1;\n                }\n            }\n        });\n        var MoveUpItemsCommand = MoveItemsCommand.extend({\n            options: {\n                offset: MOVE_UP_OFFSET,\n                moveAction: 'shift'\n            },\n            canExecute: function () {\n                var items = this.getItems();\n                var domIndices = getSortedDomIndices(items);\n                return domIndices.length > 0 && domIndices[0] > 0;\n            }\n        });\n        CommandFactory.current.register(MOVE_UP, MoveUpItemsCommand);\n        var MoveDownItemsCommand = MoveItemsCommand.extend({\n            options: {\n                offset: MOVE_DOWN_OFFSET,\n                moveAction: 'pop'\n            },\n            canExecute: function () {\n                var that = this;\n                var items = that.getItems();\n                var domIndices = getSortedDomIndices(items);\n                return domIndices.length > 0 && $(domIndices).last()[0] < that.listBox.items().length - 1;\n            }\n        });\n        CommandFactory.current.register(MOVE_DOWN, MoveDownItemsCommand);\n        var TransferItemsCommand = ListBoxCommand.extend({\n            options: { filter: ENABLED_ITEM_SELECTOR },\n            execute: function () {\n                var that = this;\n                var sourceListBox = that.getSourceListBox();\n                var items = that.getItems().filter(that.options.filter);\n                var dataItems = sourceListBox ? sourceListBox._dataItems(items) : [];\n                var destinationListBox = that.getDestinationListBox();\n                var updatedSelection = that.getUpdatedSelection(items);\n                if (destinationListBox && items.length > 0) {\n                    if (!destinationListBox.trigger(ADD, {\n                            dataItems: dataItems,\n                            items: items\n                        })) {\n                        destinationListBox.add(dataItems);\n                    }\n                    if (!sourceListBox.trigger(REMOVE, {\n                            dataItems: dataItems,\n                            items: items\n                        })) {\n                        sourceListBox.remove(items);\n                        that.updateSelection(updatedSelection);\n                    }\n                }\n            },\n            getUpdatedSelection: function (items) {\n                var that = this;\n                var itemFilter = that.options.filter;\n                var sourceListBox = that.getSourceListBox();\n                var lastEnabledItem = sourceListBox ? sourceListBox.items().filter(itemFilter).last() : null;\n                var containsLastItem = $(items).filter(lastEnabledItem).length > 0;\n                var itemToSelect = containsLastItem ? $(items).prevAll(itemFilter)[0] : $(items).nextAll(itemFilter)[0];\n                if ($(items).length === 1 && itemToSelect) {\n                    return itemToSelect;\n                } else {\n                    return null;\n                }\n            },\n            updateSelection: function (item) {\n                var sourceListBox = this.getSourceListBox();\n                if (sourceListBox && item) {\n                    $(sourceListBox.select($(item)));\n                    sourceListBox._scrollIntoView(item);\n                }\n            },\n            getSourceListBox: noop,\n            getDestinationListBox: noop\n        });\n        var TransferItemsToCommand = TransferItemsCommand.extend({\n            canExecute: function () {\n                var sourceListBox = this.getSourceListBox();\n                return sourceListBox ? sourceListBox.select().length > 0 : false;\n            },\n            getSourceListBox: function () {\n                return this.listBox;\n            },\n            getDestinationListBox: function () {\n                var sourceListBox = this.getSourceListBox();\n                return sourceListBox && sourceListBox.options.connectWith ? $(HASH + sourceListBox.options.connectWith).data(KENDO_LISTBOX) : null;\n            },\n            getItems: function () {\n                var sourceListBox = this.getSourceListBox();\n                return sourceListBox ? $(sourceListBox.select()) : $();\n            }\n        });\n        CommandFactory.current.register(TRANSFER_TO, TransferItemsToCommand);\n        var TransferItemsFromCommand = TransferItemsCommand.extend({\n            canExecute: function () {\n                var sourceListBox = this.getSourceListBox();\n                return sourceListBox ? sourceListBox.select().length > 0 : false;\n            },\n            getSourceListBox: function () {\n                var destinationListBox = this.getDestinationListBox();\n                return destinationListBox && destinationListBox.options.connectWith ? $(HASH + destinationListBox.options.connectWith).data(KENDO_LISTBOX) : null;\n            },\n            getDestinationListBox: function () {\n                return this.listBox;\n            },\n            getItems: function () {\n                var sourceListBox = this.getSourceListBox();\n                return sourceListBox ? $(sourceListBox.select()) : $();\n            }\n        });\n        CommandFactory.current.register(TRANSFER_FROM, TransferItemsFromCommand);\n        var TransferAllItemsToCommand = TransferItemsToCommand.extend({\n            canExecute: function () {\n                var sourceListBox = this.getSourceListBox();\n                return sourceListBox ? sourceListBox.items().filter(ENABLED_ITEM_SELECTOR).length > 0 : false;\n            },\n            getItems: function () {\n                var sourceListBox = this.getSourceListBox();\n                return sourceListBox ? sourceListBox.items() : $();\n            },\n            getUpdatedSelection: noop,\n            updateSelection: noop\n        });\n        CommandFactory.current.register(TRANSFER_ALL_TO, TransferAllItemsToCommand);\n        var TransferAllItemsFromCommand = TransferItemsFromCommand.extend({\n            canExecute: function () {\n                var sourceListBox = this.getSourceListBox();\n                return sourceListBox ? sourceListBox.items().filter(ENABLED_ITEM_SELECTOR).length > 0 : false;\n            },\n            getItems: function () {\n                var sourceListBox = this.getSourceListBox();\n                return sourceListBox ? sourceListBox.items() : $();\n            },\n            getUpdatedSelection: noop,\n            updateSelection: noop\n        });\n        CommandFactory.current.register(TRANSFER_ALL_FROM, TransferAllItemsFromCommand);\n        var ToolBar = Class.extend({\n            init: function (element, options) {\n                var that = this;\n                that.element = $(element).addClass(TOOLBAR_CLASS);\n                that.options = extend({}, that.options, options);\n                that.listBox = that.options.listBox;\n                that._initTemplates();\n                that._createTools();\n                that._updateToolStates();\n                that._attachEventHandlers();\n            },\n            destroy: function () {\n                var that = this;\n                that._detachEventHandlers();\n                kendo.destroy(that.element);\n                that.element.remove();\n                that.element = null;\n            },\n            options: {\n                position: RIGHT,\n                tools: []\n            },\n            _initTemplates: function () {\n                this.templates = { tool: kendoTemplate('<li>' + '<a href=\\'\\\\\\\\#\\' class=\\'k-button k-button-icon k-tool\\' data-command=\\'#= command #\\' title=\\'#= text #\\' aria-label=\\'#= text #\\' role=\\'button\\'>' + '<span class=\\'k-icon #= iconClass #\\'></span>' + '</a>' + '</li>') };\n            },\n            _createTools: function () {\n                var that = this;\n                var tools = that.options.tools;\n                var toolsLength = tools.length;\n                var toolsMessages = that.options.messages.tools;\n                var toolList = that._createToolList();\n                var tool;\n                var i;\n                for (i = 0; i < toolsLength; i++) {\n                    tool = extend({}, ToolBar.defaultTools[tools[i]], { text: toolsMessages[tools[i]] });\n                    if (tool) {\n                        toolList.append($(that.templates.tool(tool)));\n                    }\n                }\n                that.element.append(toolList);\n            },\n            _createToolList: function () {\n                return $('<ul class=\\'k-reset\\' />');\n            },\n            _attachEventHandlers: function () {\n                var that = this;\n                that.element.on(CLICK, TOOL_SELECTOR, proxy(that._onToolClick, that));\n            },\n            _detachEventHandlers: function () {\n                this.element.off(NS).find('*').off(NS);\n            },\n            _onToolClick: function (e) {\n                e.preventDefault();\n                this._executeToolCommand($(e.currentTarget).data(COMMAND));\n            },\n            _executeToolCommand: function (command) {\n                var that = this;\n                var listBox = that.listBox;\n                if (listBox) {\n                    listBox._executeCommand(command);\n                }\n            },\n            _updateToolStates: function () {\n                var that = this;\n                var tools = that.options.tools;\n                var toolsLength = tools.length;\n                var i;\n                for (i = 0; i < toolsLength; i++) {\n                    that._updateToolState(tools[i]);\n                }\n            },\n            _updateToolState: function (toolName) {\n                var that = this;\n                var command = CommandFactory.current.create(toolName, { listBox: that.listBox });\n                var toolElement = that.element.find('[data-command=\\'' + toolName + '\\']')[0];\n                if (toolElement && command && command.canExecute) {\n                    if (command.canExecute()) {\n                        $(toolElement).removeClass(DISABLED_STATE_CLASS);\n                    } else {\n                        $(toolElement).addClass(DISABLED_STATE_CLASS);\n                    }\n                }\n            }\n        });\n        ToolBar.defaultTools = {\n            remove: {\n                command: REMOVE,\n                iconClass: 'k-i-x'\n            },\n            moveUp: {\n                command: MOVE_UP,\n                iconClass: 'k-i-arrow-60-up'\n            },\n            moveDown: {\n                command: MOVE_DOWN,\n                iconClass: 'k-i-arrow-60-down'\n            },\n            transferTo: {\n                command: TRANSFER_TO,\n                iconClass: 'k-i-arrow-60-right'\n            },\n            transferFrom: {\n                command: TRANSFER_FROM,\n                iconClass: 'k-i-arrow-60-left'\n            },\n            transferAllTo: {\n                command: TRANSFER_ALL_TO,\n                iconClass: 'k-i-arrow-double-60-right'\n            },\n            transferAllFrom: {\n                command: TRANSFER_ALL_FROM,\n                iconClass: 'k-i-arrow-double-60-left'\n            }\n        };\n        extend(ListBox, { ToolBar: ToolBar });\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.upload', ['kendo.core'], f);\n}(function () {\n    var __meta__ = {\n        id: 'upload',\n        name: 'Upload',\n        category: 'web',\n        description: 'The Upload widget uses progressive enhancement to deliver the best possible uploading experience to users.',\n        depends: ['core']\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, Widget = kendo.ui.Widget, antiForgeryTokens = kendo.antiForgeryTokens, logToConsole = kendo.logToConsole, rFileExtension = /\\.([^\\.]+)$/, NS = '.kendoUpload', SELECT = 'select', UPLOAD = 'upload', SUCCESS = 'success', ERROR = 'error', COMPLETE = 'complete', CANCEL = 'cancel', CLEAR = 'clear', PAUSE = 'pause', RESUME = 'resume', PROGRESS = 'progress', REMOVE = 'remove', VALIDATIONERRORS = 'validationErrors', INVALIDMAXFILESIZE = 'invalidMaxFileSize', INVALIDMINFILESIZE = 'invalidMinFileSize', INVALIDFILEEXTENSION = 'invalidFileExtension', PROGRESSHIDEDELAY = 1000, PROGRESSHIDEDURATION = 2000;\n        var headerStatusIcon = {\n            loading: 'k-i-loading',\n            warning: 'k-i-warning',\n            success: 'k-i-check'\n        };\n        var Upload = Widget.extend({\n            init: function (element, options) {\n                var that = this;\n                Widget.fn.init.call(that, element, options);\n                that.name = element.name;\n                that.multiple = that.options.multiple;\n                that.directory = that.options.directory;\n                that.localization = that.options.localization;\n                var activeInput = that.element;\n                that.wrapper = activeInput.closest('.k-upload');\n                if (that.wrapper.length === 0) {\n                    that.wrapper = that._wrapInput(activeInput);\n                }\n                that._activeInput(activeInput);\n                that.toggle(that.options.enabled);\n                var ns = that._ns = NS + '-' + kendo.guid();\n                activeInput.closest('form').on('submit' + ns, $.proxy(that._onParentFormSubmit, that)).on('reset' + ns, $.proxy(that._onParentFormReset, that));\n                if (that.options.async.saveUrl) {\n                    that._module = that._supportsFormData() ? new formDataUploadModule(that) : new iframeUploadModule(that);\n                    that._async = true;\n                    var initialFiles = that.options.files;\n                    if (initialFiles.length > 0) {\n                        that._renderInitialFiles(initialFiles);\n                    }\n                } else {\n                    that._module = new syncUploadModule(that);\n                }\n                if (that._supportsDrop()) {\n                    if (that.options.dropZone !== '') {\n                        that._setupCustomDropZone();\n                    } else {\n                        that._setupDropZone();\n                    }\n                }\n                that.wrapper.on('click', '.k-upload-action', $.proxy(that._onFileAction, that)).on('click', '.k-clear-selected', $.proxy(that._onClearSelected, that)).on('click', '.k-upload-selected', $.proxy(that._onUploadSelected, that));\n                if (that.element.val()) {\n                    that._onInputChange({ target: that.element });\n                }\n            },\n            events: [\n                SELECT,\n                UPLOAD,\n                SUCCESS,\n                ERROR,\n                COMPLETE,\n                CANCEL,\n                CLEAR,\n                PROGRESS,\n                REMOVE,\n                PAUSE,\n                RESUME\n            ],\n            options: {\n                name: 'Upload',\n                enabled: true,\n                multiple: true,\n                directory: false,\n                showFileList: true,\n                template: '',\n                files: [],\n                async: {\n                    autoRetryAfter: 0,\n                    bufferChunkSize: 10000000,\n                    maxAutoRetries: 1,\n                    removeVerb: 'POST',\n                    autoUpload: true,\n                    withCredentials: true,\n                    accept: '*/*; q=0.5, application/json',\n                    useArrayBuffer: false\n                },\n                localization: {\n                    'select': 'Select files...',\n                    'cancel': 'Cancel',\n                    'retry': 'Retry',\n                    'remove': 'Remove',\n                    'pause': 'Pause',\n                    'resume': 'Resume',\n                    'clearSelectedFiles': 'Clear',\n                    'uploadSelectedFiles': 'Upload',\n                    'dropFilesHere': 'Drop files here to upload',\n                    'invalidFiles': 'Invalid file(s). Please check file upload requirements.',\n                    'statusUploading': 'uploading',\n                    'statusUploaded': 'uploaded',\n                    'statusWarning': 'warning',\n                    'statusFailed': 'failed',\n                    'headerStatusUploading': 'Uploading...',\n                    'headerStatusPaused': 'Paused',\n                    'headerStatusUploaded': 'Done',\n                    'invalidMaxFileSize': 'File size too large.',\n                    'invalidMinFileSize': 'File size too small.',\n                    'invalidFileExtension': 'File type not allowed.'\n                },\n                validation: {\n                    allowedExtensions: [],\n                    maxFileSize: 0,\n                    minFileSize: 0\n                },\n                dropZone: ''\n            },\n            setOptions: function (options) {\n                var that = this, activeInput = that.element;\n                Widget.fn.setOptions.call(that, options);\n                that.multiple = that.options.multiple;\n                that.directory = that.options.directory;\n                activeInput.attr('multiple', that._supportsMultiple() ? that.multiple : false);\n                if (that.directory) {\n                    activeInput.attr('webkitdirectory', that.directory);\n                    activeInput.attr('directory', that.directory);\n                }\n                that.toggle(that.options.enabled);\n            },\n            enable: function (enable) {\n                enable = typeof enable === 'undefined' ? true : enable;\n                this.toggle(enable);\n            },\n            disable: function () {\n                this.toggle(false);\n            },\n            toggle: function (enable) {\n                enable = typeof enable === 'undefined' ? enable : !enable;\n                this.wrapper.toggleClass('k-state-disabled', enable);\n                this.element.prop('disabled', enable);\n            },\n            focus: function () {\n                this.element.focus();\n            },\n            destroy: function () {\n                var that = this;\n                var customDropZone = $(that.options.dropZone);\n                $(document).add($('.k-dropzone', that.wrapper)).add(that.wrapper.closest('form')).off(that._ns);\n                if (customDropZone.length > 0) {\n                    customDropZone.off(that._ns);\n                }\n                $(that.element).off(NS);\n                Widget.fn.destroy.call(that);\n            },\n            pause: function (fileEntry) {\n                this._module.onPause({ target: $(fileEntry, this.wrapper) });\n                var pauseIcon = fileEntry.find('.k-i-pause-sm');\n                pauseIcon.removeClass('k-i-pause-sm').addClass('k-i-play-sm').attr('title', this.localization.resume);\n                $(pauseIcon).parent().attr('aria-label', this.localization.resume);\n            },\n            resume: function (fileEntry) {\n                this._module.onResume({ target: $(fileEntry, this.wrapper) });\n                var playIcon = fileEntry.find('.k-i-play-sm');\n                playIcon.removeClass('k-i-play-sm').addClass('k-i-pause-sm').attr('title', this.localization.pause);\n                $(playIcon).parent().attr('aria-label', this.localization.pause);\n            },\n            upload: function () {\n                var that = this;\n                that._module.onSaveSelected();\n            },\n            getFiles: function () {\n                var that = this;\n                var filesData;\n                var allFiles = [];\n                var listItems = that.wrapper.find('.k-file');\n                for (var i = 0; i < listItems.length; i++) {\n                    filesData = $(listItems[i]).data('fileNames');\n                    if (filesData) {\n                        for (var j = 0; j < filesData.length; j++) {\n                            allFiles.push(filesData[j]);\n                        }\n                    }\n                }\n                return allFiles;\n            },\n            clearAllFiles: function () {\n                var that = this;\n                var files = that.wrapper.find('.k-file');\n                files.each(function (index, file) {\n                    that._removeFileByDomElement(file, false);\n                });\n            },\n            removeAllFiles: function () {\n                var that = this;\n                var files = that.wrapper.find('.k-file');\n                files.each(function (index, file) {\n                    that._removeFileByDomElement(file, true);\n                });\n            },\n            removeFileByUid: function (uid) {\n                this._removeFileByUid(uid, true);\n            },\n            clearFileByUid: function (uid) {\n                this._removeFileByUid(uid, false);\n            },\n            _removeFileByUid: function (uid, shouldSendRemoveRequest) {\n                var that = this;\n                var fileEntry;\n                if (typeof uid !== 'string') {\n                    return;\n                }\n                fileEntry = $('.k-file[' + kendo.attr('uid') + '=\"' + uid + '\"]', that.wrapper);\n                if (fileEntry.length > 0) {\n                    that._removeFileByDomElement(fileEntry, shouldSendRemoveRequest);\n                }\n            },\n            clearFile: function (callback) {\n                this._removeFile(callback, false);\n            },\n            removeFile: function (callback) {\n                this._removeFile(callback, true);\n            },\n            _removeFile: function (callback, shouldSendRemoveRequest) {\n                var that = this;\n                var files = that.wrapper.find('.k-file');\n                var fileData;\n                if (typeof callback === 'function') {\n                    files.each(function (index, file) {\n                        fileData = $(file).data('fileNames');\n                        if (callback(fileData)) {\n                            that._removeFileByDomElement(file, shouldSendRemoveRequest);\n                        }\n                    });\n                }\n            },\n            _removeFileByDomElement: function (fileEntry, shouldSendRemoveRequest) {\n                var that = this;\n                var fileData = { target: $(fileEntry, that.wrapper) };\n                var allFiles;\n                if (that.options.async.saveUrl) {\n                    if ($(fileEntry).hasClass('k-file-progress')) {\n                        that._module.onCancel(fileData);\n                    } else {\n                        that._module.onRemove(fileData, {}, shouldSendRemoveRequest);\n                    }\n                    allFiles = $('.k-file', that.wrapper);\n                    if (allFiles.length === 0) {\n                        that._hideHeaderUploadstatus();\n                    } else {\n                        that._updateHeaderUploadStatus();\n                    }\n                } else {\n                    that._module.onRemove(fileData, {}, shouldSendRemoveRequest);\n                }\n            },\n            _addInput: function (sourceInput) {\n                if (!sourceInput[0].nodeType) {\n                    return;\n                }\n                var that = this, input = sourceInput.clone().val('');\n                input.insertAfter(that.element).data('kendoUpload', that);\n                $(that.element).hide().attr('tabindex', '-1').removeAttr('id').off(NS);\n                that._activeInput(input);\n                that.element.focus();\n            },\n            _activeInput: function (input) {\n                var that = this, wrapper = that.wrapper;\n                that.element = input;\n                if (that.directory) {\n                    input.attr('webkitdirectory', that.directory);\n                    input.attr('directory', that.directory);\n                }\n                input.attr('multiple', that._supportsMultiple() ? that.multiple : false).attr('autocomplete', 'off').on('click' + NS, function (e) {\n                    if (wrapper.hasClass('k-state-disabled')) {\n                        e.preventDefault();\n                    }\n                }).on('focus' + NS, function () {\n                    $(this).parent().addClass('k-state-focused');\n                }).on('blur' + NS, function () {\n                    $(this).parent().removeClass('k-state-focused');\n                }).on('change' + NS, $.proxy(that._onInputChange, that)).on('keydown' + NS, $.proxy(that._onInputKeyDown, that));\n            },\n            _onInputKeyDown: function (e) {\n                var that = this;\n                var firstButton = that.wrapper.find('.k-upload-action:visible:first');\n                if (e.keyCode === kendo.keys.TAB && firstButton.length > 0) {\n                    e.preventDefault();\n                    firstButton.focus();\n                }\n            },\n            _onInputChange: function (e) {\n                var that = this;\n                var input = $(e.target);\n                var files = assignGuidToFiles(that._inputFiles(input), that._isAsyncNonBatch());\n                validateFiles(files, that.options.validation);\n                var prevented = that.trigger(SELECT, { files: files });\n                if (prevented) {\n                    that._addInput(input);\n                    input.remove();\n                } else {\n                    that._module.onSelect({ target: input }, files);\n                }\n            },\n            _readDirectory: function (item) {\n                var deferred = new $.Deferred();\n                var dirReader = item.createReader();\n                dirReader.readEntries(function (entries) {\n                    deferred.resolve(entries);\n                }, deferred.reject);\n                return deferred.promise();\n            },\n            _readFile: function (item) {\n                var that = this;\n                var fullpath = item.fullPath;\n                item.file(function (file) {\n                    file.relativePath = fullpath.slice(1);\n                    that.droppedFolderFiles.push(file);\n                    that.droppedFolderCounter--;\n                    if (that.droppedFolderCounter === 0) {\n                        setTimeout(function () {\n                            if (that.droppedFolderCounter === 0) {\n                                if (that.droppedFolderFiles.length) {\n                                    that._proceedDroppedItems(that.droppedFolderFiles);\n                                    that.droppedFolderFiles = [];\n                                }\n                            }\n                        }, 0);\n                    }\n                }, function () {\n                    logToConsole('File error.');\n                });\n            },\n            _traverseFileTree: function (item, skipCounter) {\n                var that = this;\n                if (!skipCounter) {\n                    that.droppedFolderCounter--;\n                }\n                this._readDirectory(item).then(function (items) {\n                    that.droppedFolderCounter += items.length;\n                    for (var i = 0; i < items.length; i++) {\n                        if (items[i].isFile) {\n                            that._readFile(items[i]);\n                        } else if (items[i].isDirectory) {\n                            that._traverseFileTree(items[i]);\n                        }\n                    }\n                });\n            },\n            _onDrop: function (e) {\n                var dt = e.originalEvent.dataTransfer;\n                var that = this;\n                var droppedFiles = dt.files;\n                var length;\n                stopEvent(e);\n                if (that.options.directoryDrop && dt.items) {\n                    length = dt.items.length;\n                    that.droppedFolderCounter = 0;\n                    that.droppedFolderFiles = [];\n                    for (var i = 0; i < length; i++) {\n                        if (dt.items[i].webkitGetAsEntry) {\n                            var entry = dt.items[i].webkitGetAsEntry();\n                            if (entry.isDirectory) {\n                                that._traverseFileTree(entry, true);\n                            } else if (entry.isFile) {\n                                that.droppedFolderFiles.push(dt.files[i]);\n                            }\n                        } else {\n                            that._proceedDroppedItems(droppedFiles);\n                        }\n                    }\n                } else {\n                    that._proceedDroppedItems(droppedFiles);\n                }\n            },\n            _proceedDroppedItems: function (droppedFiles) {\n                var that = this;\n                var files = assignGuidToFiles(getAllFileInfo(droppedFiles), that._isAsyncNonBatch());\n                if (droppedFiles.length > 0 && !that.wrapper.hasClass('k-state-disabled')) {\n                    if (!that.multiple && files.length > 1) {\n                        files.splice(1, files.length - 1);\n                    }\n                    validateFiles(files, that.options.validation);\n                    var prevented = that.trigger(SELECT, { files: files });\n                    if (!prevented) {\n                        that._module.onSelect({ target: $('.k-dropzone', that.wrapper) }, files);\n                    }\n                }\n            },\n            _filesContainValidationErrors: function (files) {\n                var hasErrors = false;\n                $(files).each(function (index, file) {\n                    if (file[VALIDATIONERRORS] && file[VALIDATIONERRORS].length > 0) {\n                        hasErrors = true;\n                        return false;\n                    }\n                });\n                return hasErrors;\n            },\n            _isAsyncNonBatch: function () {\n                return this._async && !this.options.async.batch || false;\n            },\n            _renderInitialFiles: function (files) {\n                var that = this;\n                var idx = 0;\n                files = assignGuidToFiles(files, true);\n                for (idx = 0; idx < files.length; idx++) {\n                    var currentFile = files[idx];\n                    var fileEntry = that._enqueueFile(currentFile.name, { fileNames: [currentFile] });\n                    fileEntry.addClass('k-file-success').data('files', [files[idx]]);\n                    if (that._supportsRemove()) {\n                        that._fileAction(fileEntry, REMOVE);\n                    }\n                }\n            },\n            _prepareTemplateData: function (name, data) {\n                var filesData = data.fileNames, templateData = {}, totalSize = 0, idx = 0;\n                for (idx = 0; idx < filesData.length; idx++) {\n                    totalSize += filesData[idx].size;\n                }\n                templateData.name = name;\n                templateData.size = totalSize;\n                templateData.files = data.fileNames;\n                return templateData;\n            },\n            _prepareDefaultSingleFileEntryTemplate: function (data) {\n                var that = this;\n                var file = data.fileNames[0];\n                var fileSize = getTotalFilesSizeMessage(data.fileNames);\n                var errors = file[VALIDATIONERRORS];\n                var template = '';\n                if (errors && errors.length > 0) {\n                    template += '<li class=\\'k-file k-file-invalid\\'><span class=\\'k-progress\\'></span>' + '<span class=\\'k-file-invalid-extension-wrapper\\'>' + '<span class=\\'k-file-invalid-icon\\'>!</span>' + '<span class=\\'k-file-state\\'></span>' + '</span>' + '<span class=\\'k-file-name-size-wrapper\\'>' + '<span class=\\'k-file-name k-file-name-invalid\\' title=\\'' + file.name + '\\'>' + file.name + '</span>' + '<span class=\\'k-file-validation-message\\'>' + that.localization[errors[0]] + '</span>' + '</span>';\n                } else {\n                    template += '<li class=\\'k-file\\'><span class=\\'k-progress\\'></span>' + '<span class=\\'k-file-extension-wrapper\\'>' + '<span class=\\'k-file-extension\\'>' + file.extension.substring(1) + '</span>' + '<span class=\\'k-file-state\\'></span>' + '</span>' + '<span class=\\'k-file-name-size-wrapper\\'><span class=\\'k-file-name\\' title=\\'' + file.name + '\\'>' + file.name + '</span>' + '<span class=\\'k-file-size\\'>' + fileSize + '</span></span>';\n                }\n                template += '<strong class=\\'k-upload-status\\'></strong>';\n                return $(template);\n            },\n            _prepareDefaultMultipleFileEntriesTemplate: function (data) {\n                var that = this;\n                var files = data.fileNames;\n                var filesHaveValidationErrors = that._filesContainValidationErrors(files);\n                var totalFileSize = getTotalFilesSizeMessage(files);\n                var template = '';\n                var i, currentFile;\n                if (filesHaveValidationErrors) {\n                    template += '<li class=\\'k-file k-file-invalid\\'><span class=\\'k-progress\\'></span>' + '<span class=\\'k-multiple-files-invalid-extension-wrapper\\'>' + '<span class=\\'k-file-invalid-icon\\'>!</span>';\n                } else {\n                    template += '<li class=\\'k-file\\'><span class=\\'k-progress\\'></span>' + '<span class=\\'k-multiple-files-extension-wrapper\\'>';\n                }\n                template += '<span class=\\'k-file-state\\'></span></span>';\n                files.sort(function (a, b) {\n                    if (a[VALIDATIONERRORS]) {\n                        return -1;\n                    }\n                    if (b[VALIDATIONERRORS]) {\n                        return 1;\n                    }\n                    return 0;\n                });\n                template += '<span class=\\'k-file-name-size-wrapper\\'>';\n                for (i = 0; i < files.length; i++) {\n                    currentFile = files[i];\n                    if (currentFile[VALIDATIONERRORS] && currentFile[VALIDATIONERRORS].length > 0) {\n                        template += '<span class=\\'k-file-name k-file-name-invalid\\' title=\\'' + currentFile.name + '\\'>' + currentFile.name + '</span>';\n                    } else {\n                        template += '<span class=\\'k-file-name\\' title=\\'' + currentFile.name + '\\'>' + currentFile.name + '</span>';\n                    }\n                }\n                if (filesHaveValidationErrors) {\n                    template += '<span class=\\'k-file-validation-message\\'>' + that.localization.invalidFiles + '</span>';\n                } else {\n                    template += '<span class=\\'k-file-information\\'>Total: ' + files.length + ' files, ' + totalFileSize + '</span>';\n                }\n                template += '</span><strong class=\\'k-upload-status\\'></strong>';\n                return $(template);\n            },\n            _enqueueFile: function (name, data) {\n                var that = this;\n                var existingFileEntries;\n                var fileEntry;\n                var fileUid = data.fileNames[0].uid;\n                var fileList = $('.k-upload-files', that.wrapper);\n                var options = that.options;\n                var template = options.template;\n                var templateData;\n                var removeEventArgs;\n                if (fileList.length === 0) {\n                    fileList = $('<ul class=\\'k-upload-files k-reset\\'></ul>').appendTo(that.wrapper);\n                    if (!that.options.showFileList) {\n                        fileList.hide();\n                    }\n                    that.wrapper.removeClass('k-upload-empty');\n                }\n                existingFileEntries = $('.k-file', fileList);\n                if (!template) {\n                    if (data.fileNames.length === 1) {\n                        fileEntry = that._prepareDefaultSingleFileEntryTemplate(data);\n                    } else {\n                        fileEntry = that._prepareDefaultMultipleFileEntriesTemplate(data);\n                    }\n                } else {\n                    templateData = that._prepareTemplateData(name, data);\n                    template = kendo.template(template);\n                    fileEntry = $('<li class=\\'k-file\\'>' + template(templateData) + '</li>');\n                    fileEntry.find('.k-upload-action').addClass('k-button');\n                    that.angular('compile', function () {\n                        return {\n                            elements: fileEntry,\n                            data: [templateData]\n                        };\n                    });\n                }\n                fileEntry.attr(kendo.attr('uid'), fileUid).appendTo(fileList).data(data);\n                if (!that._async) {\n                    $('.k-progress', fileEntry).width('100%');\n                }\n                if (!that.multiple && existingFileEntries.length > 0) {\n                    removeEventArgs = {\n                        files: existingFileEntries.data('fileNames'),\n                        headers: {}\n                    };\n                    if (!that.trigger(REMOVE, removeEventArgs)) {\n                        that._module.onRemove({ target: $(existingFileEntries, that.wrapper) }, removeEventArgs);\n                    }\n                }\n                return fileEntry;\n            },\n            _removeFileEntry: function (fileEntry) {\n                var that = this;\n                var fileList = fileEntry.closest('.k-upload-files');\n                var allFiles, allCompletedFiles, allInvalidFiles;\n                fileEntry.remove();\n                allFiles = $('.k-file', fileList);\n                allCompletedFiles = $('.k-file-success, .k-file-error', fileList);\n                allInvalidFiles = $('.k-file-invalid', fileList);\n                if (allCompletedFiles.length === allFiles.length || allInvalidFiles.length === allFiles.length) {\n                    this._hideUploadButton();\n                }\n                if (allFiles.length === 0) {\n                    fileList.remove();\n                    that.wrapper.addClass('k-upload-empty');\n                    that._hideHeaderUploadstatus();\n                } else {\n                    that._updateHeaderUploadStatus();\n                }\n            },\n            _fileAction: function (fileElement, actionKey, skipClear) {\n                var classDictionary = {\n                    remove: 'k-i-x',\n                    cancel: 'k-i-cancel',\n                    retry: 'k-i-retry',\n                    pause: 'k-i-pause-sm'\n                };\n                var iconsClassDictionary = {\n                    remove: 'k-i-close',\n                    cancel: 'k-i-close',\n                    retry: 'k-i-reload-sm',\n                    pause: 'k-i-pause-sm'\n                };\n                var firstActionButton;\n                if (!classDictionary.hasOwnProperty(actionKey)) {\n                    return;\n                }\n                if (!skipClear) {\n                    this._clearFileAction(fileElement);\n                }\n                if (!this.options.template) {\n                    if (!skipClear) {\n                        fileElement.find('.k-upload-status .k-upload-action').remove();\n                    }\n                    fileElement.find('.k-upload-status').append(this._renderAction(classDictionary[actionKey], this.localization[actionKey], iconsClassDictionary[actionKey]));\n                } else {\n                    firstActionButton = fileElement.find('.k-upload-action').first();\n                    if (!firstActionButton.find('.k-icon').length) {\n                        firstActionButton.addClass('k-button').append('<span class=\\'k-icon ' + iconsClassDictionary[actionKey] + ' ' + classDictionary[actionKey] + '\\' title=\\'' + this.localization[actionKey] + '\\'' + 'aria-label=\\'' + this.localization[actionKey] + '\\'></span>').show();\n                    } else if (firstActionButton.next('.k-upload-action').length) {\n                        firstActionButton.next('.k-upload-action').addClass('k-button').append('<span class=\\'k-icon ' + iconsClassDictionary[actionKey] + ' ' + classDictionary[actionKey] + '\\' title=\\'' + this.localization[actionKey] + '\\'' + 'aria-label=\\'' + this.localization[actionKey] + '\\'></span>').show();\n                    }\n                }\n            },\n            _fileState: function (fileEntry, stateKey) {\n                var localization = this.localization, states = {\n                        uploading: { text: localization.statusUploading },\n                        uploaded: { text: localization.statusUploaded },\n                        failed: { text: localization.statusFailed }\n                    }, currentState = states[stateKey];\n                if (currentState) {\n                    $('span.k-file-state', fileEntry).text(currentState.text);\n                }\n            },\n            _renderAction: function (actionClass, actionText, iconClass) {\n                if (actionClass !== '') {\n                    return $('<button type=\\'button\\' class=\\'k-button k-upload-action\\' aria-label=\\'' + actionText + '\\'>' + '<span class=\\'k-icon ' + iconClass + ' ' + actionClass + '\\' title=\\'' + actionText + '\\'></span>' + '</button>').on('focus', function () {\n                        $(this).addClass('k-state-focused');\n                    }).on('blur', function () {\n                        $(this).removeClass('k-state-focused');\n                    });\n                } else {\n                    return $('<button type=\\'button\\' class=\\'k-button\\'>' + actionText + '</button>');\n                }\n            },\n            _clearFileAction: function (fileElement) {\n                $('.k-upload-action', fileElement).empty().hide();\n            },\n            _onFileAction: function (e) {\n                var that = this;\n                if (!that.wrapper.hasClass('k-state-disabled')) {\n                    var button = $(e.target).closest('.k-upload-action');\n                    var icon = button.find('.k-icon');\n                    var fileEntry = button.closest('.k-file');\n                    var files = fileEntry.data('fileNames');\n                    var hasValidationErrors = that._filesContainValidationErrors(files);\n                    var eventArgs = {\n                        files: files,\n                        headers: {}\n                    };\n                    if (icon.hasClass('k-i-x')) {\n                        if (!that.trigger(REMOVE, eventArgs)) {\n                            that._module.onRemove({ target: $(fileEntry, that.wrapper) }, eventArgs, !hasValidationErrors);\n                        }\n                    } else if (icon.hasClass('k-i-cancel')) {\n                        that.trigger(CANCEL, eventArgs);\n                        that._module.onCancel({ target: $(fileEntry, that.wrapper) });\n                        that._checkAllComplete();\n                        that._updateHeaderUploadStatus();\n                    } else if (icon.hasClass('k-i-pause-sm')) {\n                        that.trigger(PAUSE, eventArgs);\n                        that.pause(fileEntry);\n                        that._updateHeaderUploadStatus();\n                    } else if (icon.hasClass('k-i-play-sm')) {\n                        that.trigger(RESUME, eventArgs);\n                        that.resume(fileEntry);\n                    } else if (icon.hasClass('k-i-retry')) {\n                        $('.k-i-warning', fileEntry).remove();\n                        $('.k-progress', fileEntry).finish().show();\n                        that._module.onRetry({ target: $(fileEntry, that.wrapper) });\n                    }\n                }\n                return false;\n            },\n            _onUploadSelected: function () {\n                var that = this;\n                var wrapper = that.wrapper;\n                if (!wrapper.hasClass('k-state-disabled')) {\n                    this._module.onSaveSelected();\n                }\n                return false;\n            },\n            _onClearSelected: function () {\n                var that = this;\n                var wrapper = that.wrapper;\n                var clearEventArgs = {};\n                if (!wrapper.hasClass('k-state-disabled') && !that.trigger(CLEAR, clearEventArgs)) {\n                    that.clearAllFiles();\n                }\n                return false;\n            },\n            _onFileProgress: function (e, percentComplete) {\n                var progressPct;\n                var warningPct;\n                if (percentComplete > 100) {\n                    percentComplete = 100;\n                }\n                if (!this.options.template) {\n                    progressPct = $('.k-upload-pct', e.target);\n                    warningPct = $('.k-i-warning', e.target);\n                    if (warningPct.length) {\n                        warningPct.removeClass('k-i-warning').removeClass('k-icon').addClass('k-upload-pct');\n                    } else if (progressPct.length === 0) {\n                        $('.k-upload-status', e.target).prepend('<span class=\\'k-upload-pct\\'></span>');\n                    }\n                    if (percentComplete !== 100) {\n                        $('.k-upload-pct', e.target).text(percentComplete + '%');\n                    } else {\n                        $('.k-upload-pct', e.target).remove();\n                    }\n                    $('.k-progress', e.target).width(percentComplete + '%');\n                } else {\n                    $('.k-progress', e.target).width(percentComplete + '%');\n                }\n                this.trigger(PROGRESS, {\n                    files: getFileEntry(e).data('fileNames'),\n                    percentComplete: percentComplete\n                });\n            },\n            _onUploadSuccess: function (e, response, xhr) {\n                var that = this;\n                var fileEntry = getFileEntry(e);\n                var prevented = that.trigger(SUCCESS, {\n                    files: fileEntry.data('fileNames'),\n                    response: response,\n                    operation: 'upload',\n                    XMLHttpRequest: xhr\n                });\n                if (prevented) {\n                    that._setUploadErrorState(fileEntry);\n                } else {\n                    that._fileState(fileEntry, 'uploaded');\n                    fileEntry.removeClass('k-file-progress').addClass('k-file-success');\n                    that._updateHeaderUploadStatus();\n                    if (that._supportsRemove()) {\n                        that._fileAction(fileEntry, REMOVE);\n                    } else {\n                        that._clearFileAction(fileEntry);\n                    }\n                }\n                that._hideUploadProgress(fileEntry);\n                that._checkAllComplete();\n            },\n            _onUploadError: function (e, xhr) {\n                var that = this;\n                var module = that._module;\n                var fileEntry = getFileEntry(e);\n                var fileUid = fileEntry.data('uid');\n                that._setUploadErrorState(fileEntry);\n                that.trigger(ERROR, {\n                    operation: 'upload',\n                    files: fileEntry.data('fileNames'),\n                    XMLHttpRequest: xhr\n                });\n                logToConsole('Server response: ' + xhr.responseText);\n                if (!that.options.async.chunkSize) {\n                    that._hideUploadProgress(fileEntry);\n                } else {\n                    if (module._decreasePosition) {\n                        module._decreasePosition(fileUid);\n                    }\n                }\n                that._checkAllComplete();\n                if (this.options.async.autoRetryAfter) {\n                    this._autoRetryAfter(fileEntry);\n                }\n            },\n            _autoRetryAfter: function (fileEntry) {\n                var that = this;\n                var retries = this._module.retries;\n                if (!retries) {\n                    return;\n                }\n                if (!retries[fileEntry.data('uid')]) {\n                    retries[fileEntry.data('uid')] = 1;\n                }\n                if (retries[fileEntry.data('uid')] <= this.options.async.maxAutoRetries) {\n                    retries[fileEntry.data('uid')]++;\n                    setTimeout(function () {\n                        that._module.performUpload(fileEntry);\n                    }, this.options.async.autoRetryAfter);\n                }\n            },\n            _setUploadErrorState: function (fileEntry) {\n                var that = this;\n                var uploadPercentage;\n                that._fileState(fileEntry, 'failed');\n                fileEntry.removeClass('k-file-progress').addClass('k-file-error');\n                that._updateUploadProgress(fileEntry);\n                uploadPercentage = $('.k-upload-pct', fileEntry);\n                if (uploadPercentage.length > 0) {\n                    if (!uploadPercentage.parent().find('.k-i-warning').length) {\n                        uploadPercentage.removeClass('k-upload-pct').addClass('k-icon k-i-warning');\n                    }\n                    uploadPercentage.empty();\n                } else {\n                    $('.k-upload-status', fileEntry).prepend('<span class=\\'k-icon k-i-warning\\'></span>');\n                }\n                this._updateHeaderUploadStatus();\n                this._fileAction(fileEntry, 'retry');\n                this._fileAction(fileEntry, REMOVE, true);\n            },\n            _updateUploadProgress: function (fileEntry) {\n                var that = this;\n                if (!that.options.async.chunkSize) {\n                    $('.k-progress', fileEntry).width('100%');\n                } else {\n                    var fileUid = fileEntry.data('uid');\n                    if (that._module.metaData) {\n                        var fileMetaData = that._module.metaData[fileUid];\n                        if (fileMetaData) {\n                            var percentComplete = fileMetaData.totalChunks ? Math.round(fileMetaData.chunkIndex / fileMetaData.totalChunks * 100) : 100;\n                            that._onFileProgress({ target: $(fileEntry, that.wrapper) }, percentComplete);\n                        }\n                    }\n                }\n            },\n            _hideUploadProgress: function (fileEntry) {\n                $('.k-progress', fileEntry).delay(PROGRESSHIDEDELAY).fadeOut(PROGRESSHIDEDURATION, function () {\n                    $(this).css('width', '0%');\n                });\n            },\n            _showUploadButton: function () {\n                var that = this;\n                var uploadButton = $('.k-upload-selected', that.wrapper);\n                var clearButton = $('.k-clear-selected', that.wrapper);\n                if (uploadButton.length === 0) {\n                    uploadButton = that._renderAction('', this.localization.uploadSelectedFiles).addClass('k-upload-selected');\n                    clearButton = that._renderAction('', this.localization.clearSelectedFiles).addClass('k-clear-selected');\n                }\n                this.wrapper.append(clearButton, uploadButton);\n            },\n            _hideUploadButton: function () {\n                $('.k-upload-selected, .k-clear-selected', this.wrapper).remove();\n            },\n            _showHeaderUploadStatus: function (isUploading) {\n                var that = this;\n                var localization = that.localization;\n                var dropZone = $('.k-dropzone', that.wrapper);\n                var headerUploadStatus = $('.k-upload-status-total', that.wrapper);\n                if (headerUploadStatus.length !== 0) {\n                    headerUploadStatus.remove();\n                }\n                headerUploadStatus = '<strong class=\"k-upload-status k-upload-status-total\"><span class=\"k-icon\"></span></strong>';\n                if (isUploading) {\n                    headerUploadStatus = $(headerUploadStatus).append(localization.headerStatusUploading);\n                    headerUploadStatus.find('.k-icon').addClass(headerStatusIcon.loading);\n                } else {\n                    headerUploadStatus = $(headerUploadStatus).append(localization.headerStatusUploaded);\n                    headerUploadStatus.find('.k-icon').addClass(headerStatusIcon.warning);\n                }\n                if (dropZone.length > 0) {\n                    dropZone.append(headerUploadStatus);\n                } else {\n                    $('.k-upload-button', that.wrapper).after(headerUploadStatus);\n                }\n            },\n            _updateHeaderUploadStatus: function () {\n                var that = this;\n                var headerUploadStatus = $('.k-upload-status-total', this.wrapper);\n                var currentlyUploading = $('.k-file', that.wrapper).not('.k-file-success, .k-file-error, .k-file-invalid');\n                var currentlyInvalid = $('.k-file-invalid', that.wrapper);\n                var currentlyFailed = $('.k-file-error', that.wrapper);\n                var currentlyPaused = $('.k-file', that.wrapper).find('.k-i-play-sm');\n                var failedUploads, headerUploadStatusIcon;\n                if (currentlyPaused.length && (currentlyPaused.length === currentlyUploading.length || !that.options.async.concurrent)) {\n                    headerUploadStatusIcon = $('.k-icon', headerUploadStatus).removeClass().addClass('k-icon').addClass('k-i-pause-sm');\n                    headerUploadStatus.html(headerUploadStatusIcon).append(that.localization.headerStatusPaused);\n                } else if (currentlyUploading.length === 0 || currentlyInvalid.length > 0 || currentlyFailed.length > 0) {\n                    failedUploads = $('.k-file.k-file-error, .k-file.k-file-invalid', that.wrapper);\n                    headerUploadStatus = $('.k-upload-status-total', that.wrapper);\n                    headerUploadStatusIcon = $('.k-icon', headerUploadStatus).removeClass().addClass('k-icon').addClass(failedUploads.length !== 0 ? headerStatusIcon.warning : headerStatusIcon.success);\n                    headerUploadStatus.html(headerUploadStatusIcon).append(that.localization.headerStatusUploaded);\n                }\n            },\n            _hideHeaderUploadstatus: function () {\n                $('.k-upload-status-total', this.wrapper).remove();\n            },\n            _onParentFormSubmit: function () {\n                var upload = this, element = upload.element;\n                if (typeof this._module.onAbort !== 'undefined') {\n                    this._module.onAbort();\n                }\n                if (!element.value) {\n                    var input = $(element);\n                    input.attr('disabled', 'disabled');\n                    window.setTimeout(function () {\n                        input.removeAttr('disabled');\n                    }, 0);\n                }\n            },\n            _onParentFormReset: function () {\n                $('.k-upload-files', this.wrapper).remove();\n            },\n            _supportsFormData: function () {\n                return typeof FormData != 'undefined';\n            },\n            _supportsMultiple: function () {\n                var windows = this._userAgent().indexOf('Windows') > -1;\n                return !kendo.support.browser.opera && !(kendo.support.browser.safari && windows);\n            },\n            _supportsDrop: function () {\n                var userAgent = this._userAgent().toLowerCase();\n                var isChrome = /chrome/.test(userAgent);\n                var isSafari = !isChrome && /safari/.test(userAgent);\n                var isWindowsSafari = isSafari && /windows/.test(userAgent);\n                return !isWindowsSafari && this._supportsFormData() && this.options.async.saveUrl;\n            },\n            _userAgent: function () {\n                return navigator.userAgent;\n            },\n            _setupDropZone: function () {\n                var that = this;\n                $('.k-upload-button', that.wrapper).wrap('<div class=\\'k-dropzone\\'></div>');\n                var ns = that._ns;\n                var dropZone = $('.k-dropzone', that.wrapper).append($('<em>' + that.localization.dropFilesHere + '</em>')).on('dragenter' + ns, stopEvent).on('dragover' + ns, function (e) {\n                    e.preventDefault();\n                }).on('drop' + ns, $.proxy(that._onDrop, that));\n                bindDragEventWrappers(dropZone, ns, function () {\n                    if (!dropZone.closest('.k-upload').hasClass('k-state-disabled')) {\n                        dropZone.addClass('k-dropzone-hovered');\n                    }\n                }, function () {\n                    dropZone.removeClass('k-dropzone-hovered');\n                });\n                that._bindDocumentDragEventWrappers(dropZone);\n            },\n            _setupCustomDropZone: function () {\n                var that = this;\n                var dropZone = $(that.options.dropZone);\n                $('.k-upload-button', that.wrapper).wrap('<div class=\\'k-dropzone\\'></div>');\n                var ns = that._ns;\n                dropZone.on('dragenter' + ns, stopEvent).on('dragover' + ns, function (e) {\n                    e.preventDefault();\n                }).on('drop' + ns, $.proxy(that._onDrop, that));\n                bindDragEventWrappers(dropZone, ns, function (e) {\n                    if (!that.wrapper.hasClass('k-state-disabled')) {\n                        dropZone.removeClass('k-dropzone-hovered');\n                        $(e.target).addClass('k-dropzone-hovered');\n                    }\n                }, function () {\n                    dropZone.removeClass('k-dropzone-hovered');\n                });\n                that._bindDocumentDragEventWrappers(dropZone);\n            },\n            _bindDocumentDragEventWrappers: function (dropZone) {\n                var that = this;\n                var ns = that._ns;\n                bindDragEventWrappers($(document), ns, function () {\n                    if (!that.wrapper.hasClass('k-state-disabled')) {\n                        dropZone.addClass('k-dropzone-active');\n                        dropZone.closest('.k-upload').removeClass('k-upload-empty');\n                    }\n                }, function () {\n                    dropZone.removeClass('k-dropzone-active');\n                    if ($('li.k-file', dropZone.closest('.k-upload')).length === 0) {\n                        dropZone.closest('.k-upload').addClass('k-upload-empty');\n                    }\n                });\n            },\n            _supportsRemove: function () {\n                return !!this.options.async.removeUrl;\n            },\n            _submitRemove: function (fileNames, eventArgs, onSuccess, onError) {\n                var upload = this, removeField = upload.options.async.removeField || 'fileNames', params = $.extend(eventArgs.data, antiForgeryTokens());\n                params[removeField] = fileNames;\n                jQuery.ajax({\n                    type: this.options.async.removeVerb,\n                    dataType: 'json',\n                    dataFilter: normalizeJSON,\n                    url: this.options.async.removeUrl,\n                    traditional: true,\n                    data: params,\n                    headers: eventArgs.headers,\n                    success: onSuccess,\n                    error: onError,\n                    xhrFields: { withCredentials: this.options.async.withCredentials }\n                });\n            },\n            _wrapInput: function (input) {\n                var that = this;\n                var options = that.options;\n                input.wrap('<div class=\\'k-widget k-upload k-header\\'><div class=\\'k-button k-upload-button\\' aria-label=\\'' + this.localization.select + '\\'></div></div>');\n                if (!options.async.saveUrl) {\n                    input.closest('.k-upload').addClass('k-upload-sync');\n                }\n                input.closest('.k-upload').addClass('k-upload-empty');\n                input.closest('.k-button').append('<span>' + this.localization.select + '</span>');\n                return input.closest('.k-upload');\n            },\n            _checkAllComplete: function () {\n                if ($('.k-file.k-file-progress', this.wrapper).length === 0) {\n                    this.trigger(COMPLETE);\n                }\n            },\n            _inputFiles: function (sourceInput) {\n                return inputFiles(sourceInput);\n            }\n        });\n        var syncUploadModule = function (upload) {\n            this.name = 'syncUploadModule';\n            this.element = upload.wrapper;\n            this.upload = upload;\n            this.element.closest('form').attr('enctype', 'multipart/form-data').attr('encoding', 'multipart/form-data');\n        };\n        syncUploadModule.prototype = {\n            onSelect: function (e, files) {\n                var upload = this.upload;\n                var sourceInput = $(e.target);\n                var filesContainErrors = upload._filesContainValidationErrors(files);\n                upload._addInput(sourceInput);\n                var fileData = { 'fileNames': files };\n                if (filesContainErrors) {\n                    sourceInput.remove();\n                } else {\n                    fileData.relatedInput = sourceInput;\n                }\n                var file = upload._enqueueFile(getFileName(sourceInput), fileData);\n                if (filesContainErrors) {\n                    upload._hideUploadProgress(file);\n                }\n                upload._fileAction(file, REMOVE);\n            },\n            onRemove: function (e) {\n                var fileEntry = getFileEntry(e);\n                var relatedInput = fileEntry.data('relatedInput');\n                if (relatedInput) {\n                    relatedInput.remove();\n                }\n                this.upload._removeFileEntry(fileEntry);\n            }\n        };\n        var iframeUploadModule = function (upload) {\n            this.name = 'iframeUploadModule';\n            this.element = upload.wrapper;\n            this.upload = upload;\n            this.iframes = [];\n        };\n        Upload._frameId = 0;\n        iframeUploadModule.prototype = {\n            onSelect: function (e, files) {\n                var upload = this.upload;\n                var sourceInput = $(e.target);\n                var hasValidationErrors = upload._filesContainValidationErrors(files);\n                var fileEntry = this.prepareUpload(sourceInput, files, hasValidationErrors);\n                if (upload.options.async.autoUpload) {\n                    if (!hasValidationErrors) {\n                        this.performUpload(fileEntry);\n                    } else {\n                        upload._fileAction(fileEntry, REMOVE);\n                        upload._showHeaderUploadStatus(false);\n                    }\n                } else {\n                    upload._fileAction(fileEntry, REMOVE);\n                    if (!hasValidationErrors) {\n                        upload._showUploadButton();\n                    } else {\n                        upload._updateHeaderUploadStatus();\n                    }\n                }\n                if (hasValidationErrors) {\n                    upload._hideUploadProgress(fileEntry);\n                }\n            },\n            prepareUpload: function (sourceInput, files, hasValidationErrors) {\n                var upload = this.upload;\n                var activeInput = $(upload.element);\n                var name = upload.options.async.saveField || sourceInput.attr('name');\n                var fileEntry, fileData, iframe, form;\n                upload._addInput(sourceInput);\n                sourceInput.attr('name', name);\n                if (!hasValidationErrors) {\n                    iframe = this.createFrame(upload.name + '_' + Upload._frameId++);\n                    this.registerFrame(iframe);\n                    form = this.createForm(upload.options.async.saveUrl, iframe.attr('name')).append(activeInput);\n                    fileData = {\n                        'frame': iframe,\n                        'relatedInput': activeInput,\n                        'fileNames': files\n                    };\n                } else {\n                    sourceInput.remove();\n                    fileData = { 'fileNames': files };\n                }\n                fileEntry = upload._enqueueFile(getFileName(sourceInput), fileData);\n                if (iframe) {\n                    iframe.data({\n                        'form': form,\n                        'file': fileEntry\n                    });\n                }\n                return fileEntry;\n            },\n            performUpload: function (fileEntry) {\n                var e = { files: fileEntry.data('fileNames') };\n                var iframe = fileEntry.data('frame');\n                var upload = this.upload;\n                if (!upload.trigger(UPLOAD, e)) {\n                    upload._hideUploadButton();\n                    upload._showHeaderUploadStatus(true);\n                    iframe.appendTo(document.body);\n                    var form = iframe.data('form').attr('action', upload.options.async.saveUrl).appendTo(document.body);\n                    e.data = $.extend({}, e.data, antiForgeryTokens());\n                    for (var key in e.data) {\n                        var dataInput = form.find('input[name=\\'' + key + '\\']');\n                        if (dataInput.length === 0) {\n                            dataInput = $('<input>', {\n                                type: 'hidden',\n                                name: key\n                            }).prependTo(form);\n                        }\n                        dataInput.val(e.data[key]);\n                    }\n                    upload._fileAction(fileEntry, CANCEL);\n                    upload._fileState(fileEntry, 'uploading');\n                    $(fileEntry).removeClass('k-file-error').addClass('k-file-progress');\n                    iframe.one('load', $.proxy(this.onIframeLoad, this));\n                    form[0].submit();\n                } else {\n                    upload._removeFileEntry(iframe.data('file'));\n                    this.cleanupFrame(iframe);\n                    this.unregisterFrame(iframe);\n                }\n            },\n            onSaveSelected: function () {\n                var module = this;\n                var upload = module.upload;\n                $('.k-file', this.element).each(function () {\n                    var fileEntry = $(this);\n                    var started = isFileUploadStarted(fileEntry);\n                    var hasValidationErrors = upload._filesContainValidationErrors(fileEntry.data('fileNames'));\n                    if (!started && !hasValidationErrors) {\n                        module.performUpload(fileEntry);\n                    }\n                });\n            },\n            onIframeLoad: function (e) {\n                var iframe = $(e.target), responseText;\n                try {\n                    responseText = iframe.contents().text();\n                } catch (ex) {\n                    responseText = 'Error trying to get server response: ' + ex;\n                }\n                this.processResponse(iframe, responseText);\n            },\n            processResponse: function (iframe, responseText) {\n                var fileEntry = iframe.data('file'), module = this, fakeXHR = { responseText: responseText };\n                tryParseJSON(responseText, function (jsonResult) {\n                    $.extend(fakeXHR, {\n                        statusText: 'OK',\n                        status: '200'\n                    });\n                    module.upload._onFileProgress({ target: $(fileEntry, module.upload.wrapper) }, 100);\n                    module.upload._onUploadSuccess({ target: $(fileEntry, module.upload.wrapper) }, jsonResult, fakeXHR);\n                    module.cleanupFrame(iframe);\n                    module.unregisterFrame(iframe);\n                }, function () {\n                    $.extend(fakeXHR, {\n                        statusText: 'error',\n                        status: '500'\n                    });\n                    module.upload._onUploadError({ target: $(fileEntry, module.upload.wrapper) }, fakeXHR);\n                });\n            },\n            onCancel: function (e) {\n                var iframe = $(e.target).data('frame');\n                this.stopFrameSubmit(iframe);\n                this.cleanupFrame(iframe);\n                this.unregisterFrame(iframe);\n                this.upload._removeFileEntry(iframe.data('file'));\n            },\n            onRetry: function (e) {\n                var fileEntry = getFileEntry(e);\n                this.performUpload(fileEntry);\n            },\n            onRemove: function (e, eventArgs, shouldSendRemoveRequest) {\n                var module = this;\n                var upload = module.upload;\n                var fileEntry = getFileEntry(e);\n                var iframe = fileEntry.data('frame');\n                if (iframe) {\n                    module.unregisterFrame(iframe);\n                    upload._removeFileEntry(fileEntry);\n                    module.cleanupFrame(iframe);\n                } else {\n                    if (fileEntry.hasClass('k-file-success')) {\n                        removeUploadedFile(fileEntry, upload, eventArgs, shouldSendRemoveRequest);\n                    } else {\n                        upload._removeFileEntry(fileEntry);\n                    }\n                }\n            },\n            onAbort: function () {\n                var element = this.element, module = this;\n                $.each(this.iframes, function () {\n                    $('input', this.data('form')).appendTo(element);\n                    module.stopFrameSubmit(this[0]);\n                    this.data('form').remove();\n                    this.remove();\n                });\n                this.iframes = [];\n            },\n            createFrame: function (id) {\n                return $('<iframe' + ' name=\\'' + id + '\\'' + ' id=\\'' + id + '\\'' + ' style=\\'display:none;\\' />');\n            },\n            createForm: function (action, target) {\n                return $('<form enctype=\\'multipart/form-data\\' method=\\'POST\\'' + ' action=\\'' + action + '\\'' + ' target=\\'' + target + '\\'' + '/>');\n            },\n            stopFrameSubmit: function (frame) {\n                if (typeof frame.stop != 'undefined') {\n                    frame.stop();\n                } else if (frame.document) {\n                    frame.document.execCommand('Stop');\n                }\n            },\n            registerFrame: function (frame) {\n                this.iframes.push(frame);\n            },\n            unregisterFrame: function (frame) {\n                this.iframes = $.grep(this.iframes, function (value) {\n                    return value.attr('name') != frame.attr('name');\n                });\n            },\n            cleanupFrame: function (frame) {\n                var form = frame.data('form');\n                frame.data('file').data('frame', null);\n                setTimeout(function () {\n                    form.remove();\n                    frame.remove();\n                }, 1);\n            }\n        };\n        var formDataUploadModule = function (upload) {\n            this.name = 'formDataUploadModule';\n            this.element = upload.wrapper;\n            this.upload = upload;\n            this.position = {};\n            this.metaData = {};\n            this.cancelled = {};\n            this.resume = {};\n            this.paused = {};\n            this.retries = {};\n        };\n        formDataUploadModule.prototype = {\n            onSelect: function (e, files) {\n                var upload = this.upload;\n                var module = this;\n                var sourceElement = $(e.target);\n                var fileEntries = this.prepareUpload(sourceElement, files);\n                var hasValidationErrors;\n                var prev;\n                $.each(fileEntries, function (index) {\n                    hasValidationErrors = upload._filesContainValidationErrors($(this.data('fileNames')));\n                    if (upload.options.async.autoUpload) {\n                        if (!hasValidationErrors) {\n                            if (upload.options.async.chunkSize) {\n                                module.prepareChunk(this);\n                                prev = this.prev();\n                                if (upload.options.async.concurrent || index === 0 && !prev.length || index === 0 && prev.hasClass('k-file-success')) {\n                                    module.performUpload(this);\n                                }\n                            } else {\n                                module.performUpload(this);\n                            }\n                        } else {\n                            upload._fileAction(this, REMOVE);\n                            upload._showHeaderUploadStatus(false);\n                        }\n                    } else {\n                        upload._fileAction(this, REMOVE);\n                        if (!hasValidationErrors) {\n                            upload._showUploadButton();\n                            this.addClass('k-toupload');\n                        } else {\n                            upload._updateHeaderUploadStatus();\n                        }\n                    }\n                    if (hasValidationErrors) {\n                        upload._hideUploadProgress(this);\n                    }\n                });\n            },\n            prepareUpload: function (sourceElement, files) {\n                var fileEntries = this.enqueueFiles(files);\n                if (sourceElement.is('input')) {\n                    $.each(fileEntries, function () {\n                        $(this).data('relatedInput', sourceElement);\n                    });\n                    sourceElement.data('relatedFileEntries', fileEntries);\n                    this.upload._addInput(sourceElement);\n                }\n                return fileEntries;\n            },\n            enqueueFiles: function (files) {\n                var upload = this.upload;\n                var name;\n                var i;\n                var filesLength = files.length;\n                var currentFile;\n                var fileEntry;\n                var fileEntries = [];\n                if (upload.options.async.batch === true) {\n                    name = $.map(files, function (file) {\n                        return file.name;\n                    }).join(', ');\n                    if (upload.directory || upload.options.directoryDrop) {\n                        $(files).each(function () {\n                            if (this.rawFile.webkitRelativePath || this.rawFile.relativePath) {\n                                this.name = this.rawFile.webkitRelativePath || this.rawFile.relativePath;\n                            }\n                        });\n                    }\n                    fileEntry = upload._enqueueFile(name, { fileNames: files });\n                    fileEntry.data('files', files);\n                    fileEntries.push(fileEntry);\n                } else {\n                    for (i = 0; i < filesLength; i++) {\n                        currentFile = files[i];\n                        name = currentFile.name;\n                        if (upload.directory || upload.options.directoryDrop) {\n                            if (currentFile.rawFile.webkitRelativePath || currentFile.rawFile.relativePath) {\n                                currentFile.name = currentFile.rawFile.webkitRelativePath || currentFile.rawFile.relativePath;\n                            }\n                        }\n                        fileEntry = upload._enqueueFile(name, { fileNames: [currentFile] });\n                        fileEntry.data('files', [currentFile]);\n                        fileEntries.push(fileEntry);\n                    }\n                }\n                return fileEntries;\n            },\n            performUpload: function (fileEntry) {\n                var upload = this.upload, formData = this.createFormData(), xhr = this.createXHR(), e = {\n                        files: fileEntry.data('fileNames'),\n                        XMLHttpRequest: xhr\n                    }, files;\n                if (!upload.trigger(UPLOAD, e)) {\n                    if (fileEntry.find('.k-i-cancel').length === 0) {\n                        if (upload.options.async.chunkSize) {\n                            upload._fileAction(fileEntry, PAUSE);\n                        }\n                        upload._fileAction(fileEntry, CANCEL, upload.options.async.chunkSize);\n                    }\n                    if (!upload.wrapper.find('.k-toupload').length) {\n                        upload._hideUploadButton();\n                    }\n                    upload._showHeaderUploadStatus(true);\n                    if (e.formData) {\n                        formData = e.formData;\n                    } else {\n                        e.data = $.extend({}, e.data, antiForgeryTokens());\n                        for (var key in e.data) {\n                            formData.append(key, e.data[key]);\n                        }\n                        files = fileEntry.data('files');\n                        if (files) {\n                            this.populateFormData(formData, files);\n                        }\n                    }\n                    upload._fileState(fileEntry, 'uploading');\n                    $(fileEntry).removeClass('k-file-error').addClass('k-file-progress');\n                    if (upload.options.async.useArrayBuffer && window.FileReader) {\n                        this._readFile(upload.options.async.saveUrl, formData, fileEntry, xhr);\n                    } else {\n                        this.postFormData(upload.options.async.saveUrl, formData, fileEntry, xhr);\n                    }\n                } else {\n                    this.removeFileEntry(fileEntry);\n                }\n            },\n            _readFile: function (saveUrl, formData, fileEntry, xhr) {\n                var that = this;\n                var upload = that.upload;\n                var file = fileEntry.data('files')[0];\n                var reader = new FileReader();\n                reader.onload = function (e) {\n                    try {\n                        if (!that.fileArrayBuffer) {\n                            that.fileArrayBuffer = e.target.result;\n                        } else {\n                            that.fileArrayBuffer = that._appendBuffer(that.fileArrayBuffer, e.target.result);\n                        }\n                    } catch (err) {\n                        upload._onUploadError({ target: $(fileEntry, upload.wrapper) }, xhr);\n                        return;\n                    }\n                    if (that.position[file.uid] > file.size) {\n                        that.postFormData(upload.options.async.saveUrl, that.fileArrayBuffer, fileEntry, xhr);\n                        that.fileArrayBuffer = null;\n                    } else {\n                        that._readFile(saveUrl, formData, fileEntry, xhr);\n                    }\n                };\n                reader.onerror = function () {\n                    upload._onUploadError({ target: $(fileEntry, upload.wrapper) }, xhr);\n                };\n                reader.readAsArrayBuffer(that._getCurrentChunk(file.rawFile, file.uid));\n            },\n            _appendBuffer: function (buffer1, buffer2) {\n                var tmp = new Uint8Array(buffer1.byteLength + buffer2.byteLength);\n                tmp.set(new Uint8Array(buffer1), 0);\n                tmp.set(new Uint8Array(buffer2), buffer1.byteLength);\n                return tmp.buffer;\n            },\n            onSaveSelected: function () {\n                var module = this;\n                var upload = module.upload;\n                $('.k-toupload', this.element).filter(function () {\n                    var fileEntry = $(this);\n                    var started = isFileUploadStarted(fileEntry);\n                    var hasValidationErrors = upload._filesContainValidationErrors(fileEntry.data('fileNames'));\n                    return !started && !hasValidationErrors;\n                }).each(function (index) {\n                    var fileEntry = $(this);\n                    var prevEntry = fileEntry.prev();\n                    fileEntry.removeClass('k-toupload');\n                    if (upload.options.async.chunkSize) {\n                        module.prepareChunk(fileEntry);\n                        if (upload.options.async.concurrent || index === 0 && !prevEntry.length || (index === 0 && prevEntry.hasClass('k-file-success') || prevEntry.hasClass('k-file-error'))) {\n                            module.performUpload(fileEntry);\n                        }\n                    } else {\n                        module.performUpload(fileEntry);\n                    }\n                });\n            },\n            onCancel: function (e) {\n                var fileEntry = getFileEntry(e);\n                if (this.upload.options.async.chunkSize) {\n                    this.cancelled[fileEntry.data('uid')] = true;\n                }\n                this.stopUploadRequest(fileEntry);\n                this.removeFileEntry(fileEntry);\n            },\n            onPause: function (e) {\n                var fileEntry = getFileEntry(e);\n                var fileUid = fileEntry.data('uid');\n                var async = this.upload.options.async;\n                if (async.chunkSize) {\n                    this.retries[fileUid] = async.maxAutoRetries + 1;\n                    this.paused[fileUid] = true;\n                    this.resume[fileUid] = false;\n                }\n            },\n            onResume: function (e) {\n                var fileEntry = getFileEntry(e);\n                var fileUid = fileEntry.data('uid');\n                if (this.upload.options.async.chunkSize) {\n                    delete this.paused[fileUid];\n                    this.resume[fileUid] = true;\n                    this.retries[fileEntry.data('uid')] = 1;\n                    this._increaseChunkIndex(fileUid);\n                    this.performUpload(fileEntry);\n                }\n            },\n            onRetry: function (e) {\n                var fileEntry = getFileEntry(e);\n                var async = this.upload.options.async;\n                if (async.chunkSize) {\n                    this.retries[fileEntry.data('uid')] = async.maxAutoRetries + 1;\n                    delete this.paused[fileEntry.data('uid')];\n                }\n                this.performUpload(fileEntry);\n            },\n            onRemove: function (e, eventArgs, shouldSendRemoveRequest) {\n                var module = this;\n                var upload = module.upload;\n                var fileEntry = getFileEntry(e);\n                var async = this.upload.options.async;\n                if (async.chunkSize) {\n                    this.retries[fileEntry.data('uid')] = async.maxAutoRetries + 1;\n                }\n                if (fileEntry.hasClass('k-file-success')) {\n                    removeUploadedFile(fileEntry, upload, eventArgs, shouldSendRemoveRequest);\n                } else {\n                    module.removeFileEntry(fileEntry);\n                }\n            },\n            createXHR: function () {\n                return new XMLHttpRequest();\n            },\n            postFormData: function (url, data, fileEntry, xhr) {\n                var module = this;\n                fileEntry.data('request', xhr);\n                xhr.addEventListener('load', function (e) {\n                    module.onRequestSuccess.call(module, e, fileEntry);\n                }, false);\n                xhr.addEventListener(ERROR, function (e) {\n                    module.onRequestError.call(module, e, fileEntry);\n                }, false);\n                xhr.upload.addEventListener('progress', function (e) {\n                    module.onRequestProgress.call(module, e, fileEntry);\n                }, false);\n                xhr.open('POST', url, true);\n                xhr.withCredentials = this.upload.options.async.withCredentials;\n                var accept = this.upload.options.async.accept;\n                if (accept) {\n                    xhr.setRequestHeader('Accept', accept);\n                }\n                xhr.send(data);\n            },\n            createFormData: function () {\n                return new FormData();\n            },\n            populateFormData: function (data, files) {\n                var chunk;\n                var i;\n                var length = files.length;\n                var uid;\n                var upload = this.upload;\n                if (upload.options.async.chunkSize) {\n                    uid = files[0].uid;\n                    chunk = this._getCurrentChunk(files[0].rawFile, uid);\n                    data.append(upload.options.async.saveField || upload.name, chunk);\n                    var serializedMetaData = JSON.stringify(this.metaData[uid]);\n                    data.append('metadata', serializedMetaData);\n                } else {\n                    for (i = 0; i < length; i++) {\n                        data.append(upload.options.async.saveField || upload.name, files[i].rawFile);\n                    }\n                }\n                return data;\n            },\n            onRequestSuccess: function (e, fileEntry) {\n                var xhr = e.target, module = this;\n                function raiseError() {\n                    module.upload._onUploadError({ target: $(fileEntry, module.upload.wrapper) }, xhr);\n                }\n                function parseSuccess(jsonResult) {\n                    var batch = module.upload.options.async.batch;\n                    var chunkSize = module.upload.options.async.chunkSize;\n                    var concurrent = module.upload.options.async.concurrent;\n                    var fileUid = jsonResult.fileUid;\n                    if (module.paused[fileUid] || module.cancelled[fileUid]) {\n                        return;\n                    }\n                    delete module.retries[fileUid];\n                    if (chunkSize && !batch && !jsonResult.uploaded) {\n                        module._increaseChunkIndex(fileUid);\n                        module.performUpload(fileEntry);\n                    } else if (chunkSize && !batch && !concurrent && fileEntry.next().length && !fileEntry.next().hasClass('k-toupload')) {\n                        module.upload._onFileProgress({ target: $(fileEntry, module.upload.wrapper) }, 100);\n                        module._resetChunkIndex(fileUid);\n                        module.upload._onUploadSuccess({ target: $(fileEntry, module.upload.wrapper) }, jsonResult, xhr);\n                        module.performUpload(fileEntry.next());\n                    } else {\n                        module.upload._onFileProgress({ target: $(fileEntry, module.upload.wrapper) }, 100);\n                        module.upload._onUploadSuccess({ target: $(fileEntry, module.upload.wrapper) }, jsonResult, xhr);\n                        module.cleanupFileEntry(fileEntry);\n                    }\n                }\n                if (xhr.status >= 200 && xhr.status <= 299) {\n                    tryParseJSON(xhr.responseText, parseSuccess, raiseError);\n                } else {\n                    raiseError();\n                }\n            },\n            onRequestError: function (e, fileEntry) {\n                var xhr = e.target;\n                this.upload._onUploadError({ target: $(fileEntry, this.upload.wrapper) }, xhr);\n            },\n            cleanupFileEntry: function (fileEntry) {\n                var relatedInput = fileEntry.data('relatedInput'), uploadComplete = true;\n                if (relatedInput) {\n                    $.each(relatedInput.data('relatedFileEntries') || [], function () {\n                        if (this.parent().length > 0 && this[0] != fileEntry[0]) {\n                            uploadComplete = uploadComplete && this.hasClass('k-file-success');\n                        }\n                    });\n                    if (uploadComplete) {\n                        relatedInput.remove();\n                    }\n                }\n            },\n            removeFileEntry: function (fileEntry) {\n                var chunkSize = this.upload.options.async.chunkSize;\n                var concurrent = this.upload.options.async.concurrent;\n                this.cleanupFileEntry(fileEntry);\n                if (chunkSize && !concurrent) {\n                    if (fileEntry.next().length) {\n                        this.performUpload(fileEntry.next());\n                    }\n                }\n                this.upload._removeFileEntry(fileEntry);\n            },\n            onRequestProgress: function (e, fileEntry) {\n                var percentComplete = Math.round(e.loaded * 100 / e.total);\n                var fileUid = fileEntry.data('uid');\n                var fileMetaData;\n                if (this.upload.options.async.chunkSize) {\n                    fileMetaData = this.metaData[fileUid];\n                    percentComplete = fileMetaData.totalChunks ? Math.round(fileMetaData.chunkIndex / fileMetaData.totalChunks * 100) : 100;\n                }\n                this.upload._onFileProgress({ target: $(fileEntry, this.upload.wrapper) }, percentComplete);\n            },\n            stopUploadRequest: function (fileEntry) {\n                fileEntry.data('request').abort();\n            },\n            prepareChunk: function (fileEntry) {\n                var file = fileEntry.data('files')[0].rawFile;\n                var uid = fileEntry.data('files')[0].uid;\n                var chunkSize = this.upload.options.async.chunkSize;\n                this.position[uid] = 0;\n                this.metaData[uid] = {\n                    chunkIndex: 0,\n                    contentType: file.type,\n                    fileName: file.name,\n                    totalFileSize: file.size,\n                    totalChunks: Math.ceil(file.size / chunkSize),\n                    uploadUid: uid\n                };\n            },\n            _decreaseChunkIndex: function (uid) {\n                this.metaData[uid].chunkIndex--;\n            },\n            _increaseChunkIndex: function (uid) {\n                this.metaData[uid].chunkIndex++;\n            },\n            _resetChunkIndex: function (uid) {\n                this.metaData[uid].chunkIndex = 0;\n            },\n            _decreasePosition: function (uid) {\n                this.position[uid] -= this.upload.options.async.chunkSize;\n            },\n            _getCurrentChunk: function (file, uid) {\n                var oldPosition = this.position[uid];\n                var methodToInvoke;\n                var async = this.upload.options.async;\n                var chunkSize = async.chunkSize || async.bufferChunkSize;\n                if (!this.position[uid]) {\n                    this.position[uid] = 0;\n                }\n                this.position[uid] += chunkSize;\n                if (!!(methodToInvoke = this._getChunker(file))) {\n                    return file[methodToInvoke](oldPosition, this.position[uid]);\n                } else {\n                    return file;\n                }\n            },\n            _getChunker: function (file) {\n                if (file.slice) {\n                    return 'slice';\n                } else if (file.mozSlice) {\n                    return 'mozSlice';\n                } else if (file.webkitSlice) {\n                    return 'webkitSlice';\n                } else {\n                    return null;\n                }\n            }\n        };\n        function getFileName(input) {\n            return $.map(inputFiles(input), function (file) {\n                return file.name;\n            }).join(', ');\n        }\n        function inputFiles($input) {\n            var input = $input[0];\n            if (input.files) {\n                return getAllFileInfo(input.files);\n            } else {\n                return [{\n                        name: stripPath(input.value),\n                        extension: getFileExtension(input.value),\n                        size: null\n                    }];\n            }\n        }\n        function getAllFileInfo(rawFiles) {\n            return $.map(rawFiles, function (file) {\n                return getFileInfo(file);\n            });\n        }\n        function getFileInfo(rawFile) {\n            var fileName = rawFile.name || rawFile.fileName;\n            return {\n                name: kendo.htmlEncode(fileName),\n                extension: getFileExtension(fileName),\n                size: typeof rawFile.size == 'number' ? rawFile.size : rawFile.fileSize,\n                rawFile: rawFile\n            };\n        }\n        function getFileExtension(fileName) {\n            var matches = fileName.match(rFileExtension);\n            return matches ? matches[0] : '';\n        }\n        function stripPath(name) {\n            var slashIndex = name.lastIndexOf('\\\\');\n            return slashIndex != -1 ? name.substr(slashIndex + 1) : name;\n        }\n        function assignGuidToFiles(files, unique) {\n            var uid = kendo.guid();\n            return $.map(files, function (file) {\n                file.uid = unique ? kendo.guid() : uid;\n                return file;\n            });\n        }\n        function validateFiles(files, validationInfo) {\n            var allowedExtensions = parseAllowedExtensions(validationInfo.allowedExtensions);\n            var maxFileSize = validationInfo.maxFileSize;\n            var minFileSize = validationInfo.minFileSize;\n            for (var i = 0; i < files.length; i++) {\n                validateFileExtension(files[i], allowedExtensions);\n                validateFileSize(files[i], minFileSize, maxFileSize);\n            }\n        }\n        function parseAllowedExtensions(extensions) {\n            var allowedExtensions = $.map(extensions, function (ext) {\n                var parsedExt = ext.substring(0, 1) === '.' ? ext : '.' + ext;\n                return parsedExt.toLowerCase();\n            });\n            return allowedExtensions;\n        }\n        function validateFileExtension(file, allowedExtensions) {\n            if (allowedExtensions.length > 0) {\n                if (allowedExtensions.indexOf(file.extension.toLowerCase()) < 0) {\n                    file.validationErrors = file.validationErrors || [];\n                    if ($.inArray(INVALIDFILEEXTENSION, file.validationErrors) === -1) {\n                        file.validationErrors.push(INVALIDFILEEXTENSION);\n                    }\n                }\n            }\n        }\n        function validateFileSize(file, minFileSize, maxFileSize) {\n            if (minFileSize !== 0 && file.size < minFileSize) {\n                file.validationErrors = file.validationErrors || [];\n                if ($.inArray(INVALIDMINFILESIZE, file.validationErrors) === -1) {\n                    file.validationErrors.push(INVALIDMINFILESIZE);\n                }\n            }\n            if (maxFileSize !== 0 && file.size > maxFileSize) {\n                file.validationErrors = file.validationErrors || [];\n                if ($.inArray(INVALIDMAXFILESIZE, file.validationErrors) === -1) {\n                    file.validationErrors.push(INVALIDMAXFILESIZE);\n                }\n            }\n        }\n        function getTotalFilesSizeMessage(files) {\n            var totalSize = 0;\n            if (typeof files[0].size == 'number') {\n                for (var i = 0; i < files.length; i++) {\n                    if (files[i].size) {\n                        totalSize += files[i].size;\n                    }\n                }\n            } else {\n                return '';\n            }\n            totalSize /= 1024;\n            if (totalSize < 1024) {\n                return totalSize.toFixed(2) + ' KB';\n            } else {\n                return (totalSize / 1024).toFixed(2) + ' MB';\n            }\n        }\n        function shouldRemoveFileEntry(upload) {\n            return !upload.multiple && $('.k-file', upload.wrapper).length > 1;\n        }\n        function removeUploadedFile(fileEntry, upload, eventArgs, shouldSendRemoveRequest) {\n            if (!upload._supportsRemove()) {\n                if (shouldRemoveFileEntry(upload) || !shouldSendRemoveRequest) {\n                    upload._removeFileEntry(fileEntry);\n                }\n                return;\n            }\n            var files = fileEntry.data('fileNames');\n            var fileNames = $.map(files, function (file) {\n                return file.name;\n            });\n            if (shouldSendRemoveRequest === false) {\n                upload._removeFileEntry(fileEntry);\n                return;\n            }\n            upload._submitRemove(fileNames, eventArgs, function onSuccess(data, textStatus, xhr) {\n                var prevented = upload.trigger(SUCCESS, {\n                    operation: 'remove',\n                    files: files,\n                    response: data,\n                    XMLHttpRequest: xhr\n                });\n                if (!prevented) {\n                    upload._removeFileEntry(fileEntry);\n                }\n            }, function onError(xhr) {\n                if (shouldRemoveFileEntry(upload)) {\n                    upload._removeFileEntry(fileEntry);\n                }\n                upload.trigger(ERROR, {\n                    operation: 'remove',\n                    files: files,\n                    XMLHttpRequest: xhr\n                });\n                logToConsole('Server response: ' + xhr.responseText);\n            });\n        }\n        function tryParseJSON(input, onSuccess, onError) {\n            var success = false, json = '';\n            try {\n                json = $.parseJSON(normalizeJSON(input));\n                success = true;\n            } catch (e) {\n                onError();\n            }\n            if (success) {\n                onSuccess(json);\n            }\n        }\n        function normalizeJSON(input) {\n            if (typeof input === 'undefined' || input === '') {\n                input = '{}';\n            }\n            return input;\n        }\n        function stopEvent(e) {\n            e.stopPropagation();\n            e.preventDefault();\n        }\n        function bindDragEventWrappers(element, namespace, onDragEnter, onDragLeave) {\n            var hideInterval, lastDrag;\n            element.on('dragenter' + namespace, function (e) {\n                onDragEnter(e);\n                lastDrag = new Date();\n                if (!hideInterval) {\n                    hideInterval = setInterval(function () {\n                        var sinceLastDrag = new Date() - lastDrag;\n                        if (sinceLastDrag > 100) {\n                            onDragLeave();\n                            clearInterval(hideInterval);\n                            hideInterval = null;\n                        }\n                    }, 100);\n                }\n            }).on('dragover' + namespace, function () {\n                lastDrag = new Date();\n            });\n        }\n        function isFileUploadStarted(fileEntry) {\n            return fileEntry.is('.k-file-progress, .k-file-success, .k-file-error');\n        }\n        function getFileEntry(e) {\n            return $(e.target).closest('.k-file');\n        }\n        kendo.ui.plugin(Upload);\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.filebrowser', [\n        'kendo.listview',\n        'kendo.dropdownlist',\n        'kendo.upload'\n    ], f);\n}(function () {\n    var __meta__ = {\n        id: 'filebrowser',\n        name: 'FileBrowser',\n        category: 'web',\n        description: '',\n        hidden: true,\n        depends: [\n            'selectable',\n            'listview',\n            'dropdownlist',\n            'upload'\n        ]\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, Widget = kendo.ui.Widget, isPlainObject = $.isPlainObject, proxy = $.proxy, extend = $.extend, placeholderSupported = kendo.support.placeholder, browser = kendo.support.browser, isFunction = kendo.isFunction, trimSlashesRegExp = /(^\\/|\\/$)/g, CHANGE = 'change', APPLY = 'apply', ERROR = 'error', CLICK = 'click', NS = '.kendoFileBrowser', BREADCRUBMSNS = '.kendoBreadcrumbs', SEARCHBOXNS = '.kendoSearchBox', NAMEFIELD = 'name', SIZEFIELD = 'size', TYPEFIELD = 'type', DEFAULTSORTORDER = {\n                field: TYPEFIELD,\n                dir: 'asc'\n            }, EMPTYTILE = kendo.template('<li class=\"k-tile-empty\"><strong>${text}</strong></li>'), TOOLBARTMPL = '<div class=\"k-widget k-filebrowser-toolbar k-header k-floatwrap\">' + '<div class=\"k-toolbar-wrap\">' + '# if (showUpload) { # ' + '<div class=\"k-widget k-upload\"><div class=\"k-button k-button-icontext k-upload-button\">' + '<span class=\"k-icon k-i-plus\"></span>#=messages.uploadFile#<input type=\"file\" name=\"file\" /></div></div>' + '# } #' + '# if (showCreate) { #' + '<button type=\"button\" class=\"k-button k-button-icon\"><span class=\"k-icon k-i-folder-add\" /></button>' + '# } #' + '# if (showDelete) { #' + '<button type=\"button\" class=\"k-button k-button-icon k-state-disabled\"><span class=\"k-icon k-i-close\" /></button>&nbsp;' + '# } #' + '</div>' + '<div class=\"k-tiles-arrange\">' + '<label>#=messages.orderBy#: <select /></label>' + '</div>' + '</div>';\n        extend(true, kendo.data, {\n            schemas: {\n                'filebrowser': {\n                    data: function (data) {\n                        return data.items || data || [];\n                    },\n                    model: {\n                        id: 'name',\n                        fields: {\n                            name: 'name',\n                            size: 'size',\n                            type: 'type'\n                        }\n                    }\n                }\n            }\n        });\n        extend(true, kendo.data, {\n            transports: {\n                'filebrowser': kendo.data.RemoteTransport.extend({\n                    init: function (options) {\n                        kendo.data.RemoteTransport.fn.init.call(this, $.extend(true, {}, this.options, options));\n                    },\n                    _call: function (type, options) {\n                        options.data = $.extend({}, options.data, { path: this.options.path() });\n                        if (isFunction(this.options[type])) {\n                            this.options[type].call(this, options);\n                        } else {\n                            kendo.data.RemoteTransport.fn[type].call(this, options);\n                        }\n                    },\n                    read: function (options) {\n                        this._call('read', options);\n                    },\n                    create: function (options) {\n                        this._call('create', options);\n                    },\n                    destroy: function (options) {\n                        this._call('destroy', options);\n                    },\n                    update: function () {\n                    },\n                    options: {\n                        read: { type: 'POST' },\n                        update: { type: 'POST' },\n                        create: { type: 'POST' },\n                        destroy: { type: 'POST' }\n                    }\n                })\n            }\n        });\n        function bindDragEventWrappers(element, onDragEnter, onDragLeave) {\n            var hideInterval, lastDrag;\n            element.on('dragenter' + NS, function () {\n                onDragEnter();\n                lastDrag = new Date();\n                if (!hideInterval) {\n                    hideInterval = setInterval(function () {\n                        var sinceLastDrag = new Date() - lastDrag;\n                        if (sinceLastDrag > 100) {\n                            onDragLeave();\n                            clearInterval(hideInterval);\n                            hideInterval = null;\n                        }\n                    }, 100);\n                }\n            }).on('dragover' + NS, function () {\n                lastDrag = new Date();\n            });\n        }\n        var offsetTop;\n        if (browser.msie && browser.version < 8) {\n            offsetTop = function (element) {\n                return element.offsetTop;\n            };\n        } else {\n            offsetTop = function (element) {\n                return element.offsetTop - $(element).height();\n            };\n        }\n        function concatPaths(path, name) {\n            if (path === undefined || !path.match(/\\/$/)) {\n                path = (path || '') + '/';\n            }\n            return path + name;\n        }\n        function sizeFormatter(value) {\n            if (!value) {\n                return '';\n            }\n            var suffix = ' bytes';\n            if (value >= 1073741824) {\n                suffix = ' GB';\n                value /= 1073741824;\n            } else if (value >= 1048576) {\n                suffix = ' MB';\n                value /= 1048576;\n            } else if (value >= 1024) {\n                suffix = ' KB';\n                value /= 1024;\n            }\n            return Math.round(value * 100) / 100 + suffix;\n        }\n        function fieldName(fields, name) {\n            var descriptor = fields[name];\n            if (isPlainObject(descriptor)) {\n                return descriptor.from || descriptor.field || name;\n            }\n            return descriptor;\n        }\n        var FileBrowser = Widget.extend({\n            init: function (element, options) {\n                var that = this;\n                options = options || {};\n                Widget.fn.init.call(that, element, options);\n                that.element.addClass('k-filebrowser');\n                that.element.on(CLICK + NS, '.k-filebrowser-toolbar button:not(.k-state-disabled):has(.k-i-close)', proxy(that._deleteClick, that)).on(CLICK + NS, '.k-filebrowser-toolbar button:not(.k-state-disabled):has(.k-i-folder-add)', proxy(that._addClick, that)).on('keydown' + NS, 'li.k-state-selected input', proxy(that._directoryKeyDown, that)).on('blur' + NS, 'li.k-state-selected input', proxy(that._directoryBlur, that));\n                that._dataSource();\n                that.refresh();\n                that.path(that.options.path);\n            },\n            options: {\n                name: 'FileBrowser',\n                messages: {\n                    uploadFile: 'Upload',\n                    orderBy: 'Arrange by',\n                    orderByName: 'Name',\n                    orderBySize: 'Size',\n                    directoryNotFound: 'A directory with this name was not found.',\n                    emptyFolder: 'Empty Folder',\n                    deleteFile: 'Are you sure you want to delete \"{0}\"?',\n                    invalidFileType: 'The selected file \"{0}\" is not valid. Supported file types are {1}.',\n                    overwriteFile: 'A file with name \"{0}\" already exists in the current directory. Do you want to overwrite it?',\n                    dropFilesHere: 'drop file here to upload',\n                    search: 'Search'\n                },\n                transport: {},\n                path: '/',\n                fileTypes: '*.*'\n            },\n            events: [\n                ERROR,\n                CHANGE,\n                APPLY\n            ],\n            destroy: function () {\n                var that = this;\n                Widget.fn.destroy.call(that);\n                that.dataSource.unbind(ERROR, that._errorHandler);\n                that.element.add(that.list).add(that.toolbar).off(NS);\n                kendo.destroy(that.element);\n            },\n            value: function () {\n                var that = this, selected = that._selectedItem(), path, fileUrl = that.options.transport.fileUrl;\n                if (selected && selected.get(TYPEFIELD) === 'f') {\n                    path = concatPaths(that.path(), selected.get(NAMEFIELD)).replace(trimSlashesRegExp, '');\n                    if (fileUrl) {\n                        path = isFunction(fileUrl) ? fileUrl(path) : kendo.format(fileUrl, encodeURIComponent(path));\n                    }\n                    return path;\n                }\n            },\n            _selectedItem: function () {\n                var listView = this.listView, selected = listView.select();\n                if (selected.length) {\n                    return this.dataSource.getByUid(selected.attr(kendo.attr('uid')));\n                }\n            },\n            _toolbar: function () {\n                var that = this, template = kendo.template(TOOLBARTMPL), messages = that.options.messages, arrangeBy = [\n                        {\n                            text: messages.orderByName,\n                            value: 'name'\n                        },\n                        {\n                            text: messages.orderBySize,\n                            value: 'size'\n                        }\n                    ];\n                that.toolbar = $(template({\n                    messages: messages,\n                    showUpload: that.options.transport.uploadUrl,\n                    showCreate: that.options.transport.create,\n                    showDelete: that.options.transport.destroy\n                })).appendTo(that.element).find('.k-upload input').kendoUpload({\n                    multiple: false,\n                    localization: { dropFilesHere: messages.dropFilesHere },\n                    async: {\n                        saveUrl: that.options.transport.uploadUrl,\n                        autoUpload: true\n                    },\n                    upload: proxy(that._fileUpload, that),\n                    error: function (e) {\n                        that._error({\n                            xhr: e.XMLHttpRequest,\n                            status: 'error'\n                        });\n                    }\n                }).end();\n                that.upload = that.toolbar.find('.k-upload input').data('kendoUpload');\n                that.arrangeBy = that.toolbar.find('.k-tiles-arrange select').kendoDropDownList({\n                    dataSource: arrangeBy,\n                    dataTextField: 'text',\n                    dataValueField: 'value',\n                    change: function () {\n                        that.orderBy(this.value());\n                    }\n                }).data('kendoDropDownList');\n                that._attachDropzoneEvents();\n            },\n            _attachDropzoneEvents: function () {\n                var that = this;\n                if (that.options.transport.uploadUrl) {\n                    bindDragEventWrappers($(document.documentElement), $.proxy(that._dropEnter, that), $.proxy(that._dropLeave, that));\n                    that._scrollHandler = proxy(that._positionDropzone, that);\n                }\n            },\n            _dropEnter: function () {\n                this._positionDropzone();\n                $(document).on('scroll' + NS, this._scrollHandler);\n            },\n            _dropLeave: function () {\n                this._removeDropzone();\n                $(document).off('scroll' + NS, this._scrollHandler);\n            },\n            _positionDropzone: function () {\n                var that = this, element = that.element, offset = element.offset();\n                that.toolbar.find('.k-dropzone').addClass('k-filebrowser-dropzone').offset(offset).css({\n                    width: element[0].clientWidth,\n                    height: element[0].clientHeight,\n                    lineHeight: element[0].clientHeight + 'px'\n                });\n            },\n            _removeDropzone: function () {\n                this.toolbar.find('.k-dropzone').removeClass('k-filebrowser-dropzone').css({\n                    width: '',\n                    height: '',\n                    lineHeight: '',\n                    top: '',\n                    left: ''\n                });\n            },\n            _deleteClick: function () {\n                var that = this, item = that.listView.select(), message = kendo.format(that.options.messages.deleteFile, item.find('strong').text());\n                if (item.length && that._showMessage(message, 'confirm')) {\n                    that.listView.remove(item);\n                }\n            },\n            _addClick: function () {\n                this.createDirectory();\n            },\n            _getFieldName: function (name) {\n                return fieldName(this.dataSource.reader.model.fields, name);\n            },\n            _fileUpload: function (e) {\n                var that = this, options = that.options, fileTypes = options.fileTypes, filterRegExp = new RegExp(('(' + fileTypes.split(',').join(')|(') + ')').replace(/\\*\\./g, '.*.'), 'i'), fileName = e.files[0].name, fileNameField = NAMEFIELD, sizeField = SIZEFIELD, file;\n                if (filterRegExp.test(fileName)) {\n                    e.data = { path: that.path() };\n                    file = that._createFile(fileName);\n                    if (!file) {\n                        e.preventDefault();\n                    } else {\n                        that.upload.one('success', function (e) {\n                            var model = that._insertFileToList(file);\n                            model.set(fileNameField, e.response[that._getFieldName(fileNameField)]);\n                            model.set(sizeField, e.response[that._getFieldName(sizeField)]);\n                            that._tiles = that.listView.items().filter('[' + kendo.attr('type') + '=f]');\n                        });\n                    }\n                } else {\n                    e.preventDefault();\n                    that._showMessage(kendo.format(options.messages.invalidFileType, fileName, fileTypes));\n                }\n            },\n            _findFile: function (name) {\n                var data = this.dataSource.data(), idx, result, typeField = TYPEFIELD, nameField = NAMEFIELD, length;\n                name = name.toLowerCase();\n                for (idx = 0, length = data.length; idx < length; idx++) {\n                    if (data[idx].get(typeField) === 'f' && data[idx].get(nameField).toLowerCase() === name) {\n                        result = data[idx];\n                        break;\n                    }\n                }\n                return result;\n            },\n            _createFile: function (fileName) {\n                var that = this, model = {}, typeField = TYPEFIELD, file = that._findFile(fileName);\n                if (file) {\n                    if (!that._showMessage(kendo.format(that.options.messages.overwriteFile, fileName), 'confirm')) {\n                        return null;\n                    } else {\n                        file._override = true;\n                        return file;\n                    }\n                }\n                model[typeField] = 'f';\n                model[NAMEFIELD] = fileName;\n                model[SIZEFIELD] = 0;\n                return model;\n            },\n            _insertFileToList: function (model) {\n                var index;\n                if (model._override) {\n                    return model;\n                }\n                var dataSource = this.dataSource;\n                var view = dataSource.view();\n                for (var i = 0, length = view.length; i < length; i++) {\n                    if (view[i].get(TYPEFIELD) === 'f') {\n                        index = i;\n                        break;\n                    }\n                }\n                return dataSource.insert(++index, model);\n            },\n            createDirectory: function () {\n                var that = this, idx, length, lastDirectoryIdx = 0, typeField = TYPEFIELD, nameField = NAMEFIELD, view = that.dataSource.data(), name = that._nameDirectory(), model = new that.dataSource.reader.model();\n                for (idx = 0, length = view.length; idx < length; idx++) {\n                    if (view[idx].get(typeField) === 'd') {\n                        lastDirectoryIdx = idx;\n                    }\n                }\n                model.set(typeField, 'd');\n                model.set(nameField, name);\n                that.listView.one('dataBound', function () {\n                    var selected = that.listView.items().filter('[' + kendo.attr('uid') + '=' + model.uid + ']'), input = selected.find('input');\n                    if (selected.length) {\n                        this.edit(selected);\n                    }\n                    this.element.scrollTop(selected.attr('offsetTop') - this.element[0].offsetHeight);\n                    setTimeout(function () {\n                        input.select();\n                    });\n                }).one('save', function (e) {\n                    var value = e.model.get(nameField);\n                    if (!value) {\n                        e.model.set(nameField, name);\n                    } else {\n                        e.model.set(nameField, that._nameExists(value, model.uid) ? that._nameDirectory() : value);\n                    }\n                });\n                that.dataSource.insert(++lastDirectoryIdx, model);\n            },\n            _directoryKeyDown: function (e) {\n                if (e.keyCode == 13) {\n                    e.currentTarget.blur();\n                }\n            },\n            _directoryBlur: function () {\n                this.listView.save();\n            },\n            _nameExists: function (name, uid) {\n                var data = this.dataSource.data(), typeField = TYPEFIELD, nameField = NAMEFIELD, idx, length;\n                for (idx = 0, length = data.length; idx < length; idx++) {\n                    if (data[idx].get(typeField) === 'd' && data[idx].get(nameField).toLowerCase() === name.toLowerCase() && data[idx].uid !== uid) {\n                        return true;\n                    }\n                }\n                return false;\n            },\n            _nameDirectory: function () {\n                var name = 'New folder', data = this.dataSource.data(), directoryNames = [], typeField = TYPEFIELD, nameField = NAMEFIELD, candidate, idx, length;\n                for (idx = 0, length = data.length; idx < length; idx++) {\n                    if (data[idx].get(typeField) === 'd' && data[idx].get(nameField).toLowerCase().indexOf(name.toLowerCase()) > -1) {\n                        directoryNames.push(data[idx].get(nameField));\n                    }\n                }\n                if ($.inArray(name, directoryNames) > -1) {\n                    idx = 2;\n                    do {\n                        candidate = name + ' (' + idx + ')';\n                        idx++;\n                    } while ($.inArray(candidate, directoryNames) > -1);\n                    name = candidate;\n                }\n                return name;\n            },\n            orderBy: function (field) {\n                this.dataSource.sort([\n                    {\n                        field: TYPEFIELD,\n                        dir: 'asc'\n                    },\n                    {\n                        field: field,\n                        dir: 'asc'\n                    }\n                ]);\n            },\n            search: function (name) {\n                this.dataSource.filter({\n                    field: NAMEFIELD,\n                    operator: 'contains',\n                    value: name\n                });\n            },\n            _content: function () {\n                var that = this;\n                that.list = $('<ul class=\"k-reset k-floats k-tiles\" />').appendTo(that.element).on('dblclick' + NS, 'li', proxy(that._dblClick, that));\n                that.listView = new kendo.ui.ListView(that.list, {\n                    dataSource: that.dataSource,\n                    template: that._itemTmpl(),\n                    editTemplate: that._editTmpl(),\n                    selectable: true,\n                    autoBind: false,\n                    dataBinding: function (e) {\n                        that.toolbar.find('.k-i-close').parent().addClass('k-state-disabled');\n                        if (e.action === 'remove' || e.action === 'sync') {\n                            e.preventDefault();\n                        }\n                    },\n                    dataBound: function () {\n                        if (that.dataSource.view().length) {\n                            that._tiles = this.items().filter('[' + kendo.attr('type') + '=f]');\n                        } else {\n                            this.wrapper.append(EMPTYTILE({ text: that.options.messages.emptyFolder }));\n                        }\n                    },\n                    change: proxy(that._listViewChange, that)\n                });\n            },\n            _dblClick: function (e) {\n                var that = this, li = $(e.currentTarget);\n                if (li.hasClass('k-edit-item')) {\n                    that._directoryBlur();\n                }\n                if (li.filter('[' + kendo.attr('type') + '=d]').length) {\n                    var folder = that.dataSource.getByUid(li.attr(kendo.attr('uid')));\n                    if (folder) {\n                        that.path(concatPaths(that.path(), folder.get(NAMEFIELD)));\n                        that.breadcrumbs.value(that.path());\n                    }\n                } else if (li.filter('[' + kendo.attr('type') + '=f]').length) {\n                    that.trigger(APPLY);\n                }\n            },\n            _listViewChange: function () {\n                var selected = this._selectedItem();\n                if (selected) {\n                    this.toolbar.find('.k-i-close').parent().removeClass('k-state-disabled');\n                    this.trigger(CHANGE, { selected: selected });\n                }\n            },\n            _dataSource: function () {\n                var that = this, options = that.options, transport = options.transport, typeSortOrder = extend({}, DEFAULTSORTORDER), nameSortOrder = {\n                        field: NAMEFIELD,\n                        dir: 'asc'\n                    }, schema, dataSource = {\n                        type: transport.type || 'filebrowser',\n                        sort: [\n                            typeSortOrder,\n                            nameSortOrder\n                        ]\n                    };\n                if (isPlainObject(transport)) {\n                    transport.path = proxy(that.path, that);\n                    dataSource.transport = transport;\n                }\n                if (isPlainObject(options.schema)) {\n                    dataSource.schema = options.schema;\n                } else if (transport.type && isPlainObject(kendo.data.schemas[transport.type])) {\n                    schema = kendo.data.schemas[transport.type];\n                }\n                if (that.dataSource && that._errorHandler) {\n                    that.dataSource.unbind(ERROR, that._errorHandler);\n                } else {\n                    that._errorHandler = proxy(that._error, that);\n                }\n                that.dataSource = kendo.data.DataSource.create(dataSource).bind(ERROR, that._errorHandler);\n            },\n            _navigation: function () {\n                var that = this, navigation = $('<div class=\"k-floatwrap\"><input/><input/></div>').appendTo(this.element);\n                that.breadcrumbs = navigation.find('input:first').kendoBreadcrumbs({\n                    value: that.options.path,\n                    change: function () {\n                        that.path(this.value());\n                    }\n                }).data('kendoBreadcrumbs');\n                that.searchBox = navigation.parent().find('input:last').kendoSearchBox({\n                    label: that.options.messages.search,\n                    change: function () {\n                        that.search(this.value());\n                    }\n                }).data('kendoSearchBox');\n            },\n            _error: function (e) {\n                var that = this, status;\n                if (!that.trigger(ERROR, e)) {\n                    status = e.xhr.status;\n                    if (e.status == 'error') {\n                        if (status == '404') {\n                            that._showMessage(that.options.messages.directoryNotFound);\n                        } else if (status != '0') {\n                            that._showMessage('Error! The requested URL returned ' + status + ' - ' + e.xhr.statusText);\n                        }\n                    } else if (status == 'timeout') {\n                        that._showMessage('Error! Server timeout.');\n                    }\n                    var dataSource = that.dataSource;\n                    if (dataSource.hasChanges()) {\n                        dataSource.cancelChanges();\n                    }\n                }\n            },\n            _showMessage: function (message, type) {\n                return window[type || 'alert'](message);\n            },\n            refresh: function () {\n                var that = this;\n                that._navigation();\n                that._toolbar();\n                that._content();\n            },\n            _editTmpl: function () {\n                var html = '<li class=\"k-tile k-state-selected\" ' + kendo.attr('uid') + '=\"#=uid#\" ';\n                html += kendo.attr('type') + '=\"${' + TYPEFIELD + '}\">';\n                html += '#if(' + TYPEFIELD + ' == \"d\") { #';\n                html += '<div class=\"k-thumb\"><span class=\"k-icon k-i-folder\"></span></div>';\n                html += '#}else{#';\n                html += '<div class=\"k-thumb\"><span class=\"k-icon k-i-loading\"></span></div>';\n                html += '#}#';\n                html += '#if(' + TYPEFIELD + ' == \"d\") { #';\n                html += '<input class=\"k-input\" ' + kendo.attr('bind') + '=\"value:' + NAMEFIELD + '\"/>';\n                html += '#}#';\n                html += '</li>';\n                return proxy(kendo.template(html), { sizeFormatter: sizeFormatter });\n            },\n            _itemTmpl: function () {\n                var html = '<li class=\"k-tile\" ' + kendo.attr('uid') + '=\"#=uid#\" ';\n                html += kendo.attr('type') + '=\"${' + TYPEFIELD + '}\">';\n                html += '#if(' + TYPEFIELD + ' == \"d\") { #';\n                html += '<div class=\"k-thumb\"><span class=\"k-icon k-i-folder\"></span></div>';\n                html += '#}else{#';\n                html += '<div class=\"k-thumb\"><span class=\"k-icon k-i-file\"></span></div>';\n                html += '#}#';\n                html += '<strong>${' + NAMEFIELD + '}</strong>';\n                html += '#if(' + TYPEFIELD + ' == \"f\") { # <span class=\"k-filesize\">${this.sizeFormatter(' + SIZEFIELD + ')}</span> #}#';\n                html += '</li>';\n                return proxy(kendo.template(html), { sizeFormatter: sizeFormatter });\n            },\n            path: function (value) {\n                var that = this, path = that._path || '';\n                if (value !== undefined) {\n                    that._path = value.replace(trimSlashesRegExp, '') + '/';\n                    that.dataSource.read({ path: that._path });\n                    return;\n                }\n                if (path) {\n                    path = path.replace(trimSlashesRegExp, '');\n                }\n                return path === '/' || path === '' ? '' : path + '/';\n            }\n        });\n        var SearchBox = Widget.extend({\n            init: function (element, options) {\n                var that = this;\n                options = options || {};\n                Widget.fn.init.call(that, element, options);\n                if (placeholderSupported) {\n                    that.element.attr('placeholder', that.options.label);\n                }\n                that._wrapper();\n                that.element.on('keydown' + SEARCHBOXNS, proxy(that._keydown, that)).on('change' + SEARCHBOXNS, proxy(that._updateValue, that));\n                that.wrapper.on(CLICK + SEARCHBOXNS, 'a', proxy(that._click, that));\n                if (!placeholderSupported) {\n                    that.element.on('focus' + SEARCHBOXNS, proxy(that._focus, that)).on('blur' + SEARCHBOXNS, proxy(that._blur, that));\n                }\n            },\n            options: {\n                name: 'SearchBox',\n                label: 'Search',\n                value: ''\n            },\n            events: [CHANGE],\n            destroy: function () {\n                var that = this;\n                that.wrapper.add(that.element).add(that.label).off(SEARCHBOXNS);\n                Widget.fn.destroy.call(that);\n            },\n            _keydown: function (e) {\n                if (e.keyCode === 13) {\n                    this._updateValue();\n                }\n            },\n            _click: function (e) {\n                e.preventDefault();\n                this._updateValue();\n            },\n            _updateValue: function () {\n                var that = this, value = that.element.val();\n                if (value !== that.value()) {\n                    that.value(value);\n                    that.trigger(CHANGE);\n                }\n            },\n            _blur: function () {\n                this._updateValue();\n                this._toggleLabel();\n            },\n            _toggleLabel: function () {\n                if (!placeholderSupported) {\n                    this.label.toggle(!this.element.val());\n                }\n            },\n            _focus: function () {\n                this.label.hide();\n            },\n            _wrapper: function () {\n                var element = this.element, wrapper = element.parents('.k-search-wrap');\n                element[0].style.width = '';\n                element.addClass('k-input');\n                if (!wrapper.length) {\n                    wrapper = element.wrap($('<div class=\"k-widget k-search-wrap k-textbox\"/>')).parent();\n                    if (!placeholderSupported) {\n                        $('<label style=\"display:block\">' + this.options.label + '</label>').insertBefore(element);\n                    }\n                    $('<a href=\"#\" class=\"k-icon k-i-zoom k-search\"/>').appendTo(wrapper);\n                }\n                this.wrapper = wrapper;\n                this.label = wrapper.find('>label');\n            },\n            value: function (value) {\n                var that = this;\n                if (value !== undefined) {\n                    that.options.value = value;\n                    that.element.val(value);\n                    that._toggleLabel();\n                    return;\n                }\n                return that.options.value;\n            }\n        });\n        var Breadcrumbs = Widget.extend({\n            init: function (element, options) {\n                var that = this;\n                options = options || {};\n                Widget.fn.init.call(that, element, options);\n                that._wrapper();\n                that.wrapper.on('focus' + BREADCRUBMSNS, 'input', proxy(that._focus, that)).on('blur' + BREADCRUBMSNS, 'input', proxy(that._blur, that)).on('keydown' + BREADCRUBMSNS, 'input', proxy(that._keydown, that)).on(CLICK + BREADCRUBMSNS, 'a.k-i-arrow-60-up:first', proxy(that._rootClick, that)).on(CLICK + BREADCRUBMSNS, 'a:not(.k-i-arrow-60-up)', proxy(that._click, that));\n                that.value(that.options.value);\n            },\n            options: {\n                name: 'Breadcrumbs',\n                gap: 50\n            },\n            events: [CHANGE],\n            destroy: function () {\n                var that = this;\n                Widget.fn.destroy.call(that);\n                that.wrapper.add(that.wrapper.find('input')).add(that.wrapper.find('a')).off(BREADCRUBMSNS);\n            },\n            _update: function (val) {\n                val = (val || '').charAt(0) === '/' ? val : '/' + (val || '');\n                if (val !== this.value()) {\n                    this.value(val);\n                    this.trigger(CHANGE);\n                }\n            },\n            _click: function (e) {\n                e.preventDefault();\n                this._update(this._path($(e.target).prevAll('a:not(.k-i-arrow-60-up)').addBack()));\n            },\n            _rootClick: function (e) {\n                e.preventDefault();\n                this._update('');\n            },\n            _focus: function () {\n                var that = this, element = that.element;\n                that.overlay.hide();\n                that.element.val(that.value());\n                setTimeout(function () {\n                    element.select();\n                });\n            },\n            _blur: function () {\n                if (this.overlay.is(':visible')) {\n                    return;\n                }\n                var that = this, element = that.element, val = element.val().replace(/\\/{2,}/g, '/');\n                that.overlay.show();\n                element.val('');\n                that._update(val);\n            },\n            _keydown: function (e) {\n                var that = this;\n                if (e.keyCode === 13) {\n                    that._blur();\n                    setTimeout(function () {\n                        that.overlay.find('a:first').focus();\n                    });\n                }\n            },\n            _wrapper: function () {\n                var element = this.element, wrapper = element.parents('.k-breadcrumbs'), overlay;\n                element[0].style.width = '';\n                element.addClass('k-input');\n                if (!wrapper.length) {\n                    wrapper = element.wrap($('<div class=\"k-widget k-breadcrumbs k-textbox\"/>')).parent();\n                }\n                overlay = wrapper.find('.k-breadcrumbs-wrap');\n                if (!overlay.length) {\n                    overlay = $('<div class=\"k-breadcrumbs-wrap\"/>').appendTo(wrapper);\n                }\n                this.wrapper = wrapper;\n                this.overlay = overlay;\n            },\n            refresh: function () {\n                var html = '', value = this.value(), segments, segment, idx, length;\n                if (value === undefined || !value.match(/^\\//)) {\n                    value = '/' + (value || '');\n                }\n                segments = value.split('/');\n                for (idx = 0, length = segments.length; idx < length; idx++) {\n                    segment = segments[idx];\n                    if (segment) {\n                        if (!html) {\n                            html += '<a href=\"#\" class=\"k-icon k-i-arrow-60-up\" title=\"Go to parent folder\"></a>';\n                        }\n                        html += '<a class=\"k-link\" href=\"#\">' + segments[idx] + '</a>';\n                        html += '<span class=\"k-icon k-i-arrow-60-right\" title=\"Go to child folder\"></span>';\n                    }\n                }\n                this.overlay.empty().append($(html));\n                this._adjustSectionWidth();\n            },\n            _adjustSectionWidth: function () {\n                var that = this, wrapper = that.wrapper, width = wrapper.width() - that.options.gap, links = that.overlay.find('a'), a;\n                links.each(function (index) {\n                    a = $(this);\n                    if (a.parent().width() > width) {\n                        if (index == links.length - 1) {\n                            a.width(width);\n                        } else {\n                            a.prev().addBack().hide();\n                        }\n                    }\n                });\n            },\n            value: function (val) {\n                if (val !== undefined) {\n                    this._value = val.replace(/\\/{2,}/g, '/');\n                    this.refresh();\n                    return;\n                }\n                return this._value;\n            },\n            _path: function (trail) {\n                return '/' + $.map(trail, function (b) {\n                    return $(b).text();\n                }).join('/');\n            }\n        });\n        kendo.ui.plugin(FileBrowser);\n        kendo.ui.plugin(Breadcrumbs);\n        kendo.ui.plugin(SearchBox);\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.imagebrowser', ['kendo.filebrowser'], f);\n}(function () {\n    var __meta__ = {\n        id: 'imagebrowser',\n        name: 'ImageBrowser',\n        category: 'web',\n        description: '',\n        hidden: true,\n        depends: ['filebrowser']\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, FileBrowser = kendo.ui.FileBrowser, isPlainObject = $.isPlainObject, proxy = $.proxy, extend = $.extend, browser = kendo.support.browser, isFunction = kendo.isFunction, trimSlashesRegExp = /(^\\/|\\/$)/g, ERROR = 'error', NS = '.kendoImageBrowser', NAMEFIELD = 'name', SIZEFIELD = 'size', TYPEFIELD = 'type', DEFAULTSORTORDER = {\n                field: TYPEFIELD,\n                dir: 'asc'\n            }, EMPTYTILE = kendo.template('<li class=\"k-tile-empty\"><strong>${text}</strong></li>');\n        extend(true, kendo.data, {\n            schemas: {\n                'imagebrowser': {\n                    data: function (data) {\n                        return data.items || data || [];\n                    },\n                    model: {\n                        id: 'name',\n                        fields: {\n                            name: 'name',\n                            size: 'size',\n                            type: 'type'\n                        }\n                    }\n                }\n            }\n        });\n        extend(true, kendo.data, {\n            transports: {\n                'imagebrowser': kendo.data.RemoteTransport.extend({\n                    init: function (options) {\n                        kendo.data.RemoteTransport.fn.init.call(this, $.extend(true, {}, this.options, options));\n                    },\n                    _call: function (type, options) {\n                        options.data = $.extend({}, options.data, { path: this.options.path() });\n                        if (isFunction(this.options[type])) {\n                            this.options[type].call(this, options);\n                        } else {\n                            kendo.data.RemoteTransport.fn[type].call(this, options);\n                        }\n                    },\n                    read: function (options) {\n                        this._call('read', options);\n                    },\n                    create: function (options) {\n                        this._call('create', options);\n                    },\n                    destroy: function (options) {\n                        this._call('destroy', options);\n                    },\n                    update: function () {\n                    },\n                    options: {\n                        read: { type: 'POST' },\n                        update: { type: 'POST' },\n                        create: { type: 'POST' },\n                        destroy: { type: 'POST' }\n                    }\n                })\n            }\n        });\n        var offsetTop;\n        if (browser.msie && browser.version < 8) {\n            offsetTop = function (element) {\n                return element.offsetTop;\n            };\n        } else {\n            offsetTop = function (element) {\n                return element.offsetTop - $(element).height();\n            };\n        }\n        function concatPaths(path, name) {\n            if (path === undefined || !path.match(/\\/$/)) {\n                path = (path || '') + '/';\n            }\n            return path + name;\n        }\n        function sizeFormatter(value) {\n            if (!value) {\n                return '';\n            }\n            var suffix = ' bytes';\n            if (value >= 1073741824) {\n                suffix = ' GB';\n                value /= 1073741824;\n            } else if (value >= 1048576) {\n                suffix = ' MB';\n                value /= 1048576;\n            } else if (value >= 1024) {\n                suffix = ' KB';\n                value /= 1024;\n            }\n            return Math.round(value * 100) / 100 + suffix;\n        }\n        var ImageBrowser = FileBrowser.extend({\n            init: function (element, options) {\n                var that = this;\n                options = options || {};\n                FileBrowser.fn.init.call(that, element, options);\n                that.element.addClass('k-imagebrowser');\n            },\n            options: {\n                name: 'ImageBrowser',\n                fileTypes: '*.png,*.gif,*.jpg,*.jpeg'\n            },\n            value: function () {\n                var that = this, selected = that._selectedItem(), path, imageUrl = that.options.transport.imageUrl;\n                if (selected && selected.get(TYPEFIELD) === 'f') {\n                    path = concatPaths(that.path(), selected.get(NAMEFIELD)).replace(trimSlashesRegExp, '');\n                    if (imageUrl) {\n                        path = isFunction(imageUrl) ? imageUrl(path) : kendo.format(imageUrl, encodeURIComponent(path));\n                    }\n                    return path;\n                }\n            },\n            _fileUpload: function (e) {\n                var that = this, options = that.options, fileTypes = options.fileTypes, filterRegExp = new RegExp(('(' + fileTypes.split(',').join(')|(') + ')').replace(/\\*\\./g, '.*.'), 'i'), fileName = e.files[0].name, fileNameField = NAMEFIELD, sizeField = SIZEFIELD, file;\n                if (filterRegExp.test(fileName)) {\n                    e.data = { path: that.path() };\n                    file = that._createFile(fileName);\n                    if (!file) {\n                        e.preventDefault();\n                    } else {\n                        file._uploading = true;\n                        that.upload.one('success', function (e) {\n                            delete file._uploading;\n                            var model = that._insertFileToList(file);\n                            model.set(fileNameField, e.response[that._getFieldName(fileNameField)]);\n                            model.set(sizeField, e.response[that._getFieldName(sizeField)]);\n                            that._tiles = that.listView.items().filter('[' + kendo.attr('type') + '=f]');\n                            that._scroll();\n                        });\n                    }\n                } else {\n                    e.preventDefault();\n                    that._showMessage(kendo.format(options.messages.invalidFileType, fileName, fileTypes));\n                }\n            },\n            _content: function () {\n                var that = this;\n                that.list = $('<ul class=\"k-reset k-floats k-tiles\" />').appendTo(that.element).on('scroll' + NS, proxy(that._scroll, that)).on('dblclick' + NS, 'li', proxy(that._dblClick, that));\n                that.listView = new kendo.ui.ListView(that.list, {\n                    dataSource: that.dataSource,\n                    template: that._itemTmpl(),\n                    editTemplate: that._editTmpl(),\n                    selectable: true,\n                    autoBind: false,\n                    dataBinding: function (e) {\n                        that.toolbar.find('.k-i-close').parent().addClass('k-state-disabled');\n                        if (e.action === 'remove' || e.action === 'sync') {\n                            e.preventDefault();\n                        }\n                    },\n                    dataBound: function () {\n                        if (that.dataSource.view().length) {\n                            that._tiles = this.items().filter('[' + kendo.attr('type') + '=f]');\n                            that._scroll();\n                        } else {\n                            this.wrapper.append(EMPTYTILE({ text: that.options.messages.emptyFolder }));\n                        }\n                    },\n                    change: proxy(that._listViewChange, that)\n                });\n            },\n            _dataSource: function () {\n                var that = this, options = that.options, transport = options.transport, typeSortOrder = extend({}, DEFAULTSORTORDER), nameSortOrder = {\n                        field: NAMEFIELD,\n                        dir: 'asc'\n                    }, schema, dataSource = {\n                        type: transport.type || 'imagebrowser',\n                        sort: [\n                            typeSortOrder,\n                            nameSortOrder\n                        ]\n                    };\n                if (isPlainObject(transport)) {\n                    transport.path = proxy(that.path, that);\n                    dataSource.transport = transport;\n                }\n                if (isPlainObject(options.schema)) {\n                    dataSource.schema = options.schema;\n                } else if (transport.type && isPlainObject(kendo.data.schemas[transport.type])) {\n                    schema = kendo.data.schemas[transport.type];\n                }\n                if (that.dataSource && that._errorHandler) {\n                    that.dataSource.unbind(ERROR, that._errorHandler);\n                } else {\n                    that._errorHandler = proxy(that._error, that);\n                }\n                that.dataSource = kendo.data.DataSource.create(dataSource).bind(ERROR, that._errorHandler);\n            },\n            _loadImage: function (li) {\n                var that = this, element = $(li), dataItem = that.dataSource.getByUid(element.attr(kendo.attr('uid'))), name = dataItem.get(NAMEFIELD), thumbnailUrl = that.options.transport.thumbnailUrl, img = $('<img />', { alt: name }), urlJoin = '?';\n                if (dataItem._uploading) {\n                    return;\n                }\n                img.hide().on('load' + NS, function () {\n                    $(this).prev().remove().end().addClass('k-image').fadeIn();\n                });\n                element.find('.k-i-loading').after(img);\n                if (isFunction(thumbnailUrl)) {\n                    thumbnailUrl = thumbnailUrl(that.path(), encodeURIComponent(name));\n                } else {\n                    if (thumbnailUrl.indexOf('?') >= 0) {\n                        urlJoin = '&';\n                    }\n                    thumbnailUrl = thumbnailUrl + urlJoin + 'path=' + encodeURIComponent(that.path() + name);\n                    if (dataItem._override) {\n                        thumbnailUrl += '&_=' + new Date().getTime();\n                        delete dataItem._override;\n                    }\n                }\n                img.attr('src', thumbnailUrl);\n                li.loaded = true;\n            },\n            _scroll: function () {\n                var that = this;\n                if (that.options.transport && that.options.transport.thumbnailUrl) {\n                    clearTimeout(that._timeout);\n                    that._timeout = setTimeout(function () {\n                        var height = kendo._outerHeight(that.list), viewTop = that.list.scrollTop(), viewBottom = viewTop + height;\n                        that._tiles.each(function () {\n                            var top = offsetTop(this), bottom = top + this.offsetHeight;\n                            if (top >= viewTop && top < viewBottom || bottom >= viewTop && bottom < viewBottom) {\n                                that._loadImage(this);\n                            }\n                            if (top > viewBottom) {\n                                return false;\n                            }\n                        });\n                        that._tiles = that._tiles.filter(function () {\n                            return !this.loaded;\n                        });\n                    }, 250);\n                }\n            },\n            _itemTmpl: function () {\n                var that = this, html = '<li class=\"k-tile\" ' + kendo.attr('uid') + '=\"#=uid#\" ';\n                html += kendo.attr('type') + '=\"${' + TYPEFIELD + '}\">';\n                html += '#if(' + TYPEFIELD + ' == \"d\") { #';\n                html += '<div class=\"k-thumb\"><span class=\"k-icon k-i-folder\"></span></div>';\n                html += '#}else{#';\n                if (that.options.transport && that.options.transport.thumbnailUrl) {\n                    html += '<div class=\"k-thumb\"><span class=\"k-icon k-i-loading\"></span></div>';\n                } else {\n                    html += '<div class=\"k-thumb\"><span class=\"k-icon k-i-file\"></span></div>';\n                }\n                html += '#}#';\n                html += '<strong>${' + NAMEFIELD + '}</strong>';\n                html += '#if(' + TYPEFIELD + ' == \"f\") { # <span class=\"k-filesize\">${this.sizeFormatter(' + SIZEFIELD + ')}</span> #}#';\n                html += '</li>';\n                return proxy(kendo.template(html), { sizeFormatter: sizeFormatter });\n            }\n        });\n        kendo.ui.plugin(ImageBrowser);\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.tabstrip', ['kendo.data'], f);\n}(function () {\n    var __meta__ = {\n        id: 'tabstrip',\n        name: 'TabStrip',\n        category: 'web',\n        description: 'The TabStrip widget displays a collection of tabs with associated tab content.',\n        depends: ['data']\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, ui = kendo.ui, keys = kendo.keys, map = $.map, each = $.each, trim = $.trim, extend = $.extend, isFunction = kendo.isFunction, template = kendo.template, outerWidth = kendo._outerWidth, outerHeight = kendo._outerHeight, Widget = ui.Widget, excludedNodesRegExp = /^(a|div)$/i, NS = '.kendoTabStrip', IMG = 'img', HREF = 'href', PREV = 'prev', SHOW = 'show', LINK = 'k-link', LAST = 'k-last', CLICK = 'click', ERROR = 'error', EMPTY = ':empty', IMAGE = 'k-image', FIRST = 'k-first', SELECT = 'select', ACTIVATE = 'activate', CONTENT = 'k-content', CONTENTURL = 'contentUrl', MOUSEENTER = 'mouseenter', MOUSELEAVE = 'mouseleave', CONTENTLOAD = 'contentLoad', DISABLEDSTATE = 'k-state-disabled', DEFAULTSTATE = 'k-state-default', ACTIVESTATE = 'k-state-active', FOCUSEDSTATE = 'k-state-focused', HOVERSTATE = 'k-state-hover', TABONTOP = 'k-tab-on-top', NAVIGATABLEITEMS = '.k-item:not(.' + DISABLEDSTATE + ')', HOVERABLEITEMS = '.k-tabstrip-items > ' + NAVIGATABLEITEMS + ':not(.' + ACTIVESTATE + ')', templates = {\n                content: template('<div class=\\'k-content\\'#= contentAttributes(data) # role=\\'tabpanel\\'>#= content(item) #</div>'),\n                itemWrapper: template('<#= tag(item) # class=\\'k-link\\'#= contentUrl(item) ##= textAttributes(item) #>' + '#= image(item) ##= sprite(item) ##= text(item) #' + '</#= tag(item) #>'),\n                item: template('<li class=\\'#= wrapperCssClass(group, item) #\\' role=\\'tab\\' #=item.active ? \"aria-selected=\\'true\\'\" : \\'\\'#>' + '#= itemWrapper(data) #' + '</li>'),\n                image: template('<img class=\\'k-image\\' alt=\\'\\' src=\\'#= imageUrl #\\' />'),\n                sprite: template('<span class=\\'k-sprite #= spriteCssClass #\\'></span>'),\n                empty: template('')\n            }, rendering = {\n                wrapperCssClass: function (group, item) {\n                    var result = 'k-item', index = item.index;\n                    if (item.enabled === false) {\n                        result += ' k-state-disabled';\n                    } else {\n                        result += ' k-state-default';\n                    }\n                    if (index === 0) {\n                        result += ' k-first';\n                    }\n                    if (index == group.length - 1) {\n                        result += ' k-last';\n                    }\n                    return result;\n                },\n                textAttributes: function (item) {\n                    return item.url ? ' href=\\'' + item.url + '\\'' : '';\n                },\n                text: function (item) {\n                    return item.encoded === false ? item.text : kendo.htmlEncode(item.text);\n                },\n                tag: function (item) {\n                    return item.url ? 'a' : 'span';\n                },\n                contentAttributes: function (content) {\n                    return content.active !== true ? ' style=\\'display:none\\' aria-hidden=\\'true\\' aria-expanded=\\'false\\'' : '';\n                },\n                content: function (item) {\n                    return item.content ? item.content : item.contentUrl ? '' : '&nbsp;';\n                },\n                contentUrl: function (item) {\n                    return item.contentUrl ? kendo.attr('content-url') + '=\"' + item.contentUrl + '\"' : '';\n                }\n            };\n        function updateTabClasses(tabs) {\n            tabs.children(IMG).addClass(IMAGE);\n            tabs.children('a').addClass(LINK).children(IMG).addClass(IMAGE);\n            tabs.filter(':not([disabled]):not([class*=k-state-disabled])').addClass(DEFAULTSTATE);\n            tabs.filter('li[disabled]').addClass(DISABLEDSTATE).removeAttr('disabled');\n            tabs.filter(':not([class*=k-state])').children('a').filter(':focus').parent().addClass(ACTIVESTATE + ' ' + TABONTOP);\n            tabs.attr('role', 'tab');\n            tabs.filter('.' + ACTIVESTATE).attr('aria-selected', true);\n            tabs.each(function () {\n                var item = $(this);\n                if (!item.children('.' + LINK).length) {\n                    item.contents().filter(function () {\n                        return !this.nodeName.match(excludedNodesRegExp) && !(this.nodeType == 3 && !trim(this.nodeValue));\n                    }).wrapAll('<span UNSELECTABLE=\\'on\\' class=\\'' + LINK + '\\'/>');\n                }\n            });\n        }\n        function updateFirstLast(tabGroup) {\n            var tabs = tabGroup.children('.k-item');\n            tabs.filter('.k-first:not(:first-child)').removeClass(FIRST);\n            tabs.filter('.k-last:not(:last-child)').removeClass(LAST);\n            tabs.filter(':first-child').addClass(FIRST);\n            tabs.filter(':last-child').addClass(LAST);\n        }\n        function scrollButtonHtml(buttonClass, iconClass) {\n            return '<span class=\\'k-button k-button-icon k-bare k-tabstrip-' + buttonClass + '\\' unselectable=\\'on\\'><span class=\\'k-icon ' + iconClass + '\\'></span></span>';\n        }\n        var TabStrip = Widget.extend({\n            init: function (element, options) {\n                var that = this, value;\n                Widget.fn.init.call(that, element, options);\n                that._animations(that.options);\n                options = that.options;\n                that._contentUrls = options.contentUrls || [];\n                that._wrapper();\n                that._isRtl = kendo.support.isRtl(that.wrapper);\n                that._tabindex();\n                that._updateClasses();\n                that._dataSource();\n                if (options.dataSource) {\n                    that.dataSource.fetch();\n                }\n                that._tabPosition();\n                that._scrollable();\n                if (that._contentUrls.length) {\n                    that.wrapper.find('.k-tabstrip-items > .k-item').each(function (index, item) {\n                        var url = that._contentUrls[index];\n                        if (typeof url === 'string') {\n                            $(item).find('>.' + LINK).data(CONTENTURL, url);\n                        }\n                    });\n                } else {\n                    that._contentUrls.length = that.tabGroup.find('li.k-item').length;\n                }\n                that.wrapper.on(MOUSEENTER + NS + ' ' + MOUSELEAVE + NS, HOVERABLEITEMS, that._toggleHover).on('focus' + NS, $.proxy(that._active, that)).on('blur' + NS, function () {\n                    that._current(null);\n                });\n                that._keyDownProxy = $.proxy(that._keydown, that);\n                if (options.navigatable) {\n                    that.wrapper.on('keydown' + NS, that._keyDownProxy);\n                }\n                if (that.options.value) {\n                    value = that.options.value;\n                }\n                that.wrapper.children('.k-tabstrip-items').on(CLICK + NS, '.k-state-disabled .k-link', false).on(CLICK + NS, ' > ' + NAVIGATABLEITEMS, function (e) {\n                    var wr = that.wrapper[0];\n                    if (wr !== document.activeElement) {\n                        var msie = kendo.support.browser.msie;\n                        if (msie) {\n                            try {\n                                wr.setActive();\n                            } catch (j) {\n                                wr.focus();\n                            }\n                        } else {\n                            wr.focus();\n                        }\n                    }\n                    if (that._click($(e.currentTarget))) {\n                        e.preventDefault();\n                    }\n                });\n                var selectedItems = that.tabGroup.children('li.' + ACTIVESTATE), content = that.contentHolder(selectedItems.index());\n                if (selectedItems[0] && content.length > 0 && content[0].childNodes.length === 0) {\n                    that.activateTab(selectedItems.eq(0));\n                }\n                that.element.attr('role', 'tablist');\n                if (that.element[0].id) {\n                    that._ariaId = that.element[0].id + '_ts_active';\n                }\n                that.value(value);\n                kendo.notify(that);\n            },\n            _active: function () {\n                var item = this.tabGroup.children().filter('.' + ACTIVESTATE);\n                item = item[0] ? item : this._endItem('first');\n                if (item[0]) {\n                    this._current(item);\n                }\n            },\n            _endItem: function (action) {\n                return this.tabGroup.children(NAVIGATABLEITEMS)[action]();\n            },\n            _item: function (item, action) {\n                var endItem;\n                if (action === PREV) {\n                    endItem = 'last';\n                } else {\n                    endItem = 'first';\n                }\n                if (!item) {\n                    return this._endItem(endItem);\n                }\n                item = item[action]();\n                if (!item[0]) {\n                    item = this._endItem(endItem);\n                }\n                if (item.hasClass(DISABLEDSTATE)) {\n                    item = this._item(item, action);\n                }\n                return item;\n            },\n            _current: function (candidate) {\n                var that = this, focused = that._focused, id = that._ariaId;\n                if (candidate === undefined) {\n                    return focused;\n                }\n                if (focused) {\n                    if (focused[0].id === id) {\n                        focused.removeAttr('id');\n                    }\n                    focused.removeClass(FOCUSEDSTATE);\n                }\n                if (candidate) {\n                    if (!candidate.hasClass(ACTIVESTATE)) {\n                        candidate.addClass(FOCUSEDSTATE);\n                    }\n                    that.element.removeAttr('aria-activedescendant');\n                    id = candidate[0].id || id;\n                    if (id) {\n                        candidate.attr('id', id);\n                        that.element.attr('aria-activedescendant', id);\n                    }\n                }\n                that._focused = candidate;\n            },\n            _keydown: function (e) {\n                var that = this, key = e.keyCode, current = that._current(), rtl = that._isRtl, action;\n                if (e.target != e.currentTarget) {\n                    return;\n                }\n                if (key == keys.DOWN || key == keys.RIGHT) {\n                    action = rtl ? PREV : 'next';\n                } else if (key == keys.UP || key == keys.LEFT) {\n                    action = rtl ? 'next' : PREV;\n                } else if (key == keys.ENTER || key == keys.SPACEBAR) {\n                    that._click(current);\n                    e.preventDefault();\n                } else if (key == keys.HOME) {\n                    that._click(that._endItem('first'));\n                    e.preventDefault();\n                    return;\n                } else if (key == keys.END) {\n                    that._click(that._endItem('last'));\n                    e.preventDefault();\n                    return;\n                }\n                if (action) {\n                    that._click(that._item(current, action));\n                    e.preventDefault();\n                }\n            },\n            _dataSource: function () {\n                var that = this;\n                if (that.dataSource && that._refreshHandler) {\n                    that.dataSource.unbind('change', that._refreshHandler);\n                } else {\n                    that._refreshHandler = $.proxy(that.refresh, that);\n                }\n                that.dataSource = kendo.data.DataSource.create(that.options.dataSource).bind('change', that._refreshHandler);\n            },\n            setDataSource: function (dataSource) {\n                var that = this;\n                that.options.dataSource = dataSource;\n                that._dataSource();\n                that.dataSource.fetch();\n            },\n            _animations: function (options) {\n                if (options && 'animation' in options && !options.animation) {\n                    options.animation = {\n                        open: { effects: {} },\n                        close: { effects: {} }\n                    };\n                }\n            },\n            refresh: function (e) {\n                var that = this, options = that.options, text = kendo.getter(options.dataTextField), content = kendo.getter(options.dataContentField), contentUrl = kendo.getter(options.dataContentUrlField), image = kendo.getter(options.dataImageUrlField), url = kendo.getter(options.dataUrlField), sprite = kendo.getter(options.dataSpriteCssClass), idx, tabs = [], tab, action, view = that.dataSource.view(), length;\n                e = e || {};\n                action = e.action;\n                if (action) {\n                    view = e.items;\n                }\n                for (idx = 0, length = view.length; idx < length; idx++) {\n                    tab = { text: text(view[idx]) };\n                    if (options.dataContentField) {\n                        tab.content = content(view[idx]);\n                    }\n                    if (options.dataContentUrlField) {\n                        tab.contentUrl = contentUrl(view[idx]);\n                    }\n                    if (options.dataUrlField) {\n                        tab.url = url(view[idx]);\n                    }\n                    if (options.dataImageUrlField) {\n                        tab.imageUrl = image(view[idx]);\n                    }\n                    if (options.dataSpriteCssClass) {\n                        tab.spriteCssClass = sprite(view[idx]);\n                    }\n                    tabs[idx] = tab;\n                }\n                if (e.action == 'add') {\n                    if (e.index < that.tabGroup.children().length) {\n                        that.insertBefore(tabs, that.tabGroup.children().eq(e.index));\n                    } else {\n                        that.append(tabs);\n                    }\n                } else if (e.action == 'remove') {\n                    for (idx = 0; idx < view.length; idx++) {\n                        that.remove(e.index);\n                    }\n                } else if (e.action == 'itemchange') {\n                    idx = that.dataSource.view().indexOf(view[0]);\n                    if (e.field === options.dataTextField) {\n                        that.tabGroup.children().eq(idx).find('.k-link').text(view[0].get(e.field));\n                    }\n                    if (e.field === options.dataUrlField) {\n                        that._contentUrls[idx] = view[0].get(e.field);\n                    }\n                } else {\n                    that.trigger('dataBinding');\n                    that.remove('li');\n                    that._contentUrls = [];\n                    that.append(tabs);\n                    that.trigger('dataBound');\n                }\n            },\n            value: function (value) {\n                var that = this;\n                if (value !== undefined) {\n                    if (value != that.value()) {\n                        that.tabGroup.children().each(function () {\n                            if ($.trim($(this).text()) == value) {\n                                that.select(this);\n                            }\n                        });\n                    }\n                } else {\n                    return that.select().text();\n                }\n            },\n            items: function () {\n                return this.tabGroup[0].children;\n            },\n            setOptions: function (options) {\n                var that = this, animation = that.options.animation;\n                that._animations(options);\n                if (options.contentUrls) {\n                    that._contentUrls = options.contentUrls;\n                }\n                options.animation = extend(true, animation, options.animation);\n                if (options.navigatable) {\n                    that.wrapper.on('keydown' + NS, that._keyDownProxy);\n                } else {\n                    that.wrapper.off('keydown' + NS, that._keyDownProxy);\n                }\n                Widget.fn.setOptions.call(that, options);\n            },\n            events: [\n                SELECT,\n                ACTIVATE,\n                SHOW,\n                ERROR,\n                CONTENTLOAD,\n                'change',\n                'dataBinding',\n                'dataBound'\n            ],\n            options: {\n                name: 'TabStrip',\n                dataTextField: '',\n                dataContentField: '',\n                dataImageUrlField: '',\n                dataUrlField: '',\n                dataSpriteCssClass: '',\n                dataContentUrlField: '',\n                tabPosition: 'top',\n                animation: {\n                    open: {\n                        effects: 'expand:vertical fadeIn',\n                        duration: 200\n                    },\n                    close: { duration: 200 }\n                },\n                collapsible: false,\n                navigatable: true,\n                contentUrls: false,\n                scrollable: { distance: 200 }\n            },\n            destroy: function () {\n                var that = this, scrollWrap = that.scrollWrap;\n                Widget.fn.destroy.call(that);\n                if (that._refreshHandler) {\n                    that.dataSource.unbind('change', that._refreshHandler);\n                }\n                that.wrapper.off(NS);\n                that.wrapper.children('.k-tabstrip-items').off(NS);\n                if (that._scrollableModeActive) {\n                    that._scrollPrevButton.off().remove();\n                    that._scrollNextButton.off().remove();\n                }\n                kendo.destroy(that.wrapper);\n                scrollWrap.children('.k-tabstrip').unwrap();\n            },\n            select: function (element) {\n                var that = this;\n                if (arguments.length === 0) {\n                    return that.tabGroup.children('li.' + ACTIVESTATE);\n                }\n                if (!isNaN(element)) {\n                    element = that.tabGroup.children().get(element);\n                }\n                element = that.tabGroup.find(element);\n                $(element).each(function (index, item) {\n                    item = $(item);\n                    if (!item.hasClass(ACTIVESTATE) && !that.trigger(SELECT, {\n                            item: item[0],\n                            contentElement: that.contentHolder(item.index())[0]\n                        })) {\n                        that.activateTab(item);\n                    }\n                });\n                return that;\n            },\n            enable: function (element, state) {\n                this._toggleDisabled(element, state !== false);\n                return this;\n            },\n            disable: function (element) {\n                this._toggleDisabled(element, false);\n                return this;\n            },\n            reload: function (element) {\n                element = this.tabGroup.find(element);\n                var that = this;\n                var contentUrls = that._contentUrls;\n                element.each(function () {\n                    var item = $(this), contentUrl = item.find('.' + LINK).data(CONTENTURL) || contentUrls[item.index()], content = that.contentHolder(item.index());\n                    if (contentUrl) {\n                        that.ajaxRequest(item, content, null, contentUrl);\n                    }\n                });\n                return that;\n            },\n            append: function (tab) {\n                var that = this, inserted = that._create(tab);\n                each(inserted.tabs, function (idx) {\n                    var contents = inserted.contents[idx];\n                    that.tabGroup.append(this);\n                    if (that.options.tabPosition == 'bottom') {\n                        that.tabGroup.before(contents);\n                    } else if (that._scrollableModeActive) {\n                        that._scrollPrevButton.before(contents);\n                    } else {\n                        that.wrapper.append(contents);\n                    }\n                    that.angular('compile', function () {\n                        return { elements: [contents] };\n                    });\n                });\n                updateFirstLast(that.tabGroup);\n                that._updateContentElements();\n                that.resize(true);\n                return that;\n            },\n            _appendUrlItem: function (url) {\n                this._contentUrls.push(url);\n            },\n            _moveUrlItem: function (from, to) {\n                this._contentUrls.splice(to, 0, this._contentUrls.splice(from, 1)[0]);\n            },\n            _removeUrlItem: function (index) {\n                this._contentUrls.splice(index, 1);\n            },\n            insertBefore: function (tab, referenceTab) {\n                if ($(tab).is($(referenceTab))) {\n                    referenceTab = this.tabGroup.find(referenceTab).next();\n                } else {\n                    referenceTab = this.tabGroup.find(referenceTab);\n                }\n                var that = this, inserted = that._create(tab), referenceContent = that.element.find('#' + referenceTab.attr('aria-controls'));\n                each(inserted.tabs, function (idx) {\n                    var contents = inserted.contents[idx];\n                    var fromIndex = inserted.newTabsCreated ? that._contentUrls.length - (inserted.tabs.length - idx) : $(contents).index() - 1;\n                    referenceTab.before(this);\n                    referenceContent.before(contents);\n                    that._moveUrlItem(fromIndex, $(this).index());\n                    that.angular('compile', function () {\n                        return { elements: [contents] };\n                    });\n                });\n                updateFirstLast(that.tabGroup);\n                that._updateContentElements(inserted.newTabsCreated);\n                that.resize(true);\n                return that;\n            },\n            insertAfter: function (tab, referenceTab) {\n                if ($(tab).is($(referenceTab))) {\n                    referenceTab = this.tabGroup.find(referenceTab).prev();\n                } else {\n                    referenceTab = this.tabGroup.find(referenceTab);\n                }\n                var that = this, inserted = that._create(tab), referenceContent = that.element.find('#' + referenceTab.attr('aria-controls'));\n                each(inserted.tabs, function (idx) {\n                    var contents = inserted.contents[idx];\n                    var fromIndex = inserted.newTabsCreated ? that._contentUrls.length - (inserted.tabs.length - idx) : $(contents).index() - 1;\n                    referenceTab.after(this);\n                    referenceContent.after(contents);\n                    that._moveUrlItem(fromIndex, $(this).index());\n                    that.angular('compile', function () {\n                        return { elements: [contents] };\n                    });\n                });\n                updateFirstLast(that.tabGroup);\n                that._updateContentElements(inserted.newTabsCreated);\n                that.resize(true);\n                return that;\n            },\n            remove: function (elements) {\n                var that = this;\n                var type = typeof elements;\n                var contents;\n                if (type === 'string') {\n                    elements = that.tabGroup.find(elements);\n                } else if (type === 'number') {\n                    elements = that.tabGroup.children().eq(elements);\n                }\n                contents = elements.map(function () {\n                    var idx = $(this).index();\n                    var content = that.contentElement(idx);\n                    kendo.destroy(content);\n                    that._removeUrlItem(idx);\n                    return content;\n                });\n                elements.remove();\n                contents.empty();\n                contents.remove();\n                that._updateContentElements();\n                that.resize(true);\n                return that;\n            },\n            _create: function (tab) {\n                var that = this, tabs, contents, content, newTabsCreated = false;\n                tab = tab instanceof kendo.data.ObservableArray ? tab.toJSON() : tab;\n                if ($.isPlainObject(tab) || $.isArray(tab)) {\n                    tab = $.isArray(tab) ? tab : [tab];\n                    newTabsCreated = true;\n                    tabs = map(tab, function (value, idx) {\n                        that._appendUrlItem(tab[idx].contentUrl || null);\n                        return $(TabStrip.renderItem({\n                            group: that.tabGroup,\n                            item: extend(value, { index: idx })\n                        }));\n                    });\n                    contents = map(tab, function (value, idx) {\n                        if (typeof value.content == 'string' || value.contentUrl) {\n                            return $(TabStrip.renderContent({ item: extend(value, { index: idx }) }));\n                        }\n                    });\n                } else {\n                    if (typeof tab == 'string' && tab[0] != '<') {\n                        tabs = that.element.find(tab);\n                    } else {\n                        tabs = $(tab);\n                    }\n                    contents = $();\n                    tabs.each(function () {\n                        if (/k-tabstrip-items/.test(this.parentNode.className)) {\n                            var element = that.element.find('#' + this.getAttribute('aria-controls'));\n                            content = element;\n                        } else {\n                            content = $('<div class=\\'' + CONTENT + '\\'/>');\n                        }\n                        contents = contents.add(content);\n                    });\n                    updateTabClasses(tabs);\n                }\n                return {\n                    tabs: tabs,\n                    contents: contents,\n                    newTabsCreated: newTabsCreated\n                };\n            },\n            _toggleDisabled: function (element, enable) {\n                element = this.tabGroup.find(element);\n                element.each(function () {\n                    $(this).toggleClass(DEFAULTSTATE, enable).toggleClass(DISABLEDSTATE, !enable);\n                });\n            },\n            _updateClasses: function () {\n                var that = this, tabs, activeItem, activeTab;\n                that.wrapper.addClass('k-widget k-header k-tabstrip');\n                that.tabGroup = that.wrapper.children('ul').addClass('k-tabstrip-items k-reset');\n                if (!that.tabGroup[0]) {\n                    that.tabGroup = $('<ul class=\\'k-tabstrip-items k-reset\\'/>').appendTo(that.wrapper);\n                }\n                tabs = that.tabGroup.find('li').addClass('k-item');\n                if (tabs.length) {\n                    activeItem = tabs.filter('.' + ACTIVESTATE).index();\n                    activeTab = activeItem >= 0 ? activeItem : undefined;\n                    that.tabGroup.contents().filter(function () {\n                        return this.nodeType == 3 && !trim(this.nodeValue);\n                    }).remove();\n                }\n                if (activeItem >= 0) {\n                    tabs.eq(activeItem).addClass(TABONTOP);\n                }\n                that.contentElements = that.wrapper.children('div');\n                that.contentElements.addClass(CONTENT).eq(activeTab).addClass(ACTIVESTATE).css({ display: 'block' });\n                if (tabs.length) {\n                    updateTabClasses(tabs);\n                    updateFirstLast(that.tabGroup);\n                    that._updateContentElements(true);\n                }\n            },\n            _elementId: function (element, idx) {\n                var elementId = element.attr('id');\n                var wrapperId = this.element.attr('id');\n                if (!elementId || elementId.indexOf(wrapperId + '-') > -1) {\n                    var tabStripID = (wrapperId || kendo.guid()) + '-';\n                    return tabStripID + (idx + 1);\n                }\n                return elementId;\n            },\n            _updateContentElements: function (isInitialUpdate) {\n                var that = this, contentUrls = that._contentUrls, items = that.tabGroup.children('.k-item'), contentElements = that.wrapper.children('div'), _elementId = that._elementId.bind(that);\n                if (contentElements.length && items.length > contentElements.length) {\n                    contentElements.each(function (idx) {\n                        var id = _elementId($(this), idx);\n                        var item = items.filter('[aria-controls=' + (this.id || 0) + ']')[0];\n                        if (!item && isInitialUpdate) {\n                            item = items[idx];\n                        }\n                        if (item) {\n                            item.setAttribute('aria-controls', id);\n                        }\n                        this.setAttribute('id', id);\n                    });\n                } else {\n                    items.each(function (idx) {\n                        var currentContent = contentElements.eq(idx);\n                        var id = _elementId(currentContent, idx);\n                        this.setAttribute('aria-controls', id);\n                        if (!currentContent.length && contentUrls[idx]) {\n                            $('<div class=\\'' + CONTENT + '\\'/>').appendTo(that.wrapper).attr('id', id);\n                        } else {\n                            currentContent.attr('id', id);\n                            if (!$(this).children('.k-loading')[0] && !contentUrls[idx]) {\n                                $('<span class=\\'k-loading k-complete\\'/>').prependTo(this);\n                            }\n                        }\n                        currentContent.attr('role', 'tabpanel');\n                        currentContent.filter(':not(.' + ACTIVESTATE + ')').attr('aria-hidden', true).attr('aria-expanded', false);\n                        currentContent.filter('.' + ACTIVESTATE).attr('aria-expanded', true);\n                    });\n                }\n                that.contentElements = that.contentAnimators = that.wrapper.children('div');\n                that.tabsHeight = outerHeight(that.tabGroup) + parseInt(that.wrapper.css('border-top-width'), 10) + parseInt(that.wrapper.css('border-bottom-width'), 10);\n                if (kendo.kineticScrollNeeded && kendo.mobile.ui.Scroller) {\n                    kendo.touchScroller(that.contentElements);\n                    that.contentElements = that.contentElements.children('.km-scroll-container');\n                }\n            },\n            _wrapper: function () {\n                var that = this;\n                if (that.element.is('ul')) {\n                    that.wrapper = that.element.wrapAll('<div />').parent();\n                } else {\n                    that.wrapper = that.element;\n                }\n                that.scrollWrap = that.wrapper.parent('.k-tabstrip-wrapper');\n                if (!that.scrollWrap[0]) {\n                    that.scrollWrap = that.wrapper.wrapAll('<div class=\\'k-tabstrip-wrapper\\' />').parent();\n                }\n            },\n            _tabPosition: function () {\n                var that = this, tabPosition = that.options.tabPosition;\n                that.wrapper.addClass('k-floatwrap k-tabstrip-' + tabPosition);\n                if (tabPosition == 'bottom') {\n                    that.tabGroup.appendTo(that.wrapper);\n                }\n                that.resize(true);\n            },\n            _setContentElementsDimensions: function () {\n                var that = this, tabPosition = that.options.tabPosition;\n                if (tabPosition == 'left' || tabPosition == 'right') {\n                    var contentDivs = that.wrapper.children('.k-content'), activeDiv = contentDivs.filter(':visible'), marginStyleProperty = 'margin-' + tabPosition, tabGroup = that.tabGroup, margin = outerWidth(tabGroup);\n                    var minHeight = Math.ceil(tabGroup.height()) - parseInt(activeDiv.css('padding-top'), 10) - parseInt(activeDiv.css('padding-bottom'), 10) - parseInt(activeDiv.css('border-top-width'), 10) - parseInt(activeDiv.css('border-bottom-width'), 10);\n                    setTimeout(function () {\n                        contentDivs.css(marginStyleProperty, margin).css('min-height', minHeight);\n                    });\n                }\n            },\n            _resize: function () {\n                this._setContentElementsDimensions();\n                this._scrollable();\n            },\n            _sizeScrollWrap: function (element) {\n                if (element.is(':visible')) {\n                    var tabPosition = this.options.tabPosition;\n                    var h = Math.floor(outerHeight(element, true)) + (tabPosition === 'left' || tabPosition === 'right' ? 2 : this.tabsHeight);\n                    this.scrollWrap.css('height', h).css('height');\n                }\n            },\n            _toggleHover: function (e) {\n                $(e.currentTarget).toggleClass(HOVERSTATE, e.type == MOUSEENTER);\n            },\n            _click: function (item) {\n                var that = this, link = item.find('.' + LINK), href = link.attr(HREF), collapse = that.options.collapsible, index = item.index(), contentHolder = that.contentHolder(index), prevent, isAnchor;\n                if (item.closest('.k-widget')[0] != that.wrapper[0]) {\n                    return;\n                }\n                if (item.is('.' + DISABLEDSTATE + (!collapse ? ',.' + ACTIVESTATE : ''))) {\n                    return true;\n                }\n                isAnchor = link.data(CONTENTURL) || that._contentUrls[index] || href && (href.charAt(href.length - 1) == '#' || href.indexOf('#' + that.element[0].id + '-') != -1);\n                prevent = !href || isAnchor;\n                if (that.tabGroup.children('[data-animating]').length) {\n                    return prevent;\n                }\n                if (that.trigger(SELECT, {\n                        item: item[0],\n                        contentElement: contentHolder[0]\n                    })) {\n                    return true;\n                }\n                if (prevent === false) {\n                    return;\n                }\n                if (collapse && item.is('.' + ACTIVESTATE)) {\n                    that.deactivateTab(item);\n                    return true;\n                }\n                if (that.activateTab(item)) {\n                    prevent = true;\n                }\n                return prevent;\n            },\n            _scrollable: function () {\n                var that = this, options = that.options, wrapperOffsetWidth, tabGroupScrollWidth, scrollPrevButton, scrollNextButton;\n                if (that._scrollableAllowed()) {\n                    that.wrapper.addClass('k-tabstrip-scrollable');\n                    wrapperOffsetWidth = that.wrapper[0].offsetWidth;\n                    tabGroupScrollWidth = that.tabGroup[0].scrollWidth;\n                    if (tabGroupScrollWidth > wrapperOffsetWidth && !that._scrollableModeActive) {\n                        that._nowScrollingTabs = false;\n                        that._isRtl = kendo.support.isRtl(that.element);\n                        var mouseDown = kendo.support.mobileOS ? 'touchstart' : 'mousedown';\n                        var mouseUp = kendo.support.mobileOS ? 'touchend' : 'mouseup';\n                        that.wrapper.append(scrollButtonHtml('prev', 'k-i-arrow-60-left') + scrollButtonHtml('next', 'k-i-arrow-60-right'));\n                        scrollPrevButton = that._scrollPrevButton = that.wrapper.children('.k-tabstrip-prev');\n                        scrollNextButton = that._scrollNextButton = that.wrapper.children('.k-tabstrip-next');\n                        that.tabGroup.css({\n                            marginLeft: outerWidth(scrollPrevButton) + 9,\n                            marginRight: outerWidth(scrollNextButton) + 12\n                        });\n                        scrollPrevButton.on(mouseDown + NS, function () {\n                            that._nowScrollingTabs = true;\n                            that._scrollTabsByDelta(options.scrollable.distance * (that._isRtl ? 1 : -1));\n                        });\n                        scrollNextButton.on(mouseDown + NS, function () {\n                            that._nowScrollingTabs = true;\n                            that._scrollTabsByDelta(options.scrollable.distance * (that._isRtl ? -1 : 1));\n                        });\n                        scrollPrevButton.add(scrollNextButton).on(mouseUp + NS, function () {\n                            that._nowScrollingTabs = false;\n                        });\n                        that._scrollableModeActive = true;\n                        that._toggleScrollButtons();\n                    } else if (that._scrollableModeActive && tabGroupScrollWidth <= wrapperOffsetWidth) {\n                        that._scrollableModeActive = false;\n                        that.wrapper.removeClass('k-tabstrip-scrollable');\n                        that._scrollPrevButton.off().remove();\n                        that._scrollNextButton.off().remove();\n                        that.tabGroup.css({\n                            marginLeft: '',\n                            marginRight: ''\n                        });\n                    } else if (!that._scrollableModeActive) {\n                        that.wrapper.removeClass('k-tabstrip-scrollable');\n                    } else {\n                        that._toggleScrollButtons();\n                    }\n                }\n            },\n            _scrollableAllowed: function () {\n                var options = this.options;\n                return options.scrollable && !isNaN(options.scrollable.distance) && (options.tabPosition == 'top' || options.tabPosition == 'bottom');\n            },\n            _scrollTabsToItem: function (item) {\n                var that = this, tabGroup = that.tabGroup, currentScrollOffset = tabGroup.scrollLeft(), itemWidth = outerWidth(item), itemOffset = that._isRtl ? item.position().left : item.position().left - tabGroup.children().first().position().left, tabGroupWidth = tabGroup[0].offsetWidth, tabGroupPadding = Math.ceil(parseFloat(tabGroup.css('padding-left'))), itemPosition;\n                if (that._isRtl) {\n                    if (itemOffset < 0) {\n                        itemPosition = currentScrollOffset + itemOffset - (tabGroupWidth - currentScrollOffset) - tabGroupPadding;\n                    } else if (itemOffset + itemWidth > tabGroupWidth) {\n                        itemPosition = currentScrollOffset + itemOffset - itemWidth + tabGroupPadding * 2;\n                    }\n                } else {\n                    if (currentScrollOffset + tabGroupWidth < itemOffset + itemWidth) {\n                        itemPosition = itemOffset + itemWidth - tabGroupWidth + tabGroupPadding * 2;\n                    } else if (currentScrollOffset > itemOffset) {\n                        itemPosition = itemOffset - tabGroupPadding;\n                    }\n                }\n                tabGroup.finish().animate({ 'scrollLeft': itemPosition }, 'fast', 'linear', function () {\n                    that._toggleScrollButtons();\n                });\n            },\n            _scrollTabsByDelta: function (delta) {\n                var that = this;\n                var tabGroup = that.tabGroup;\n                var scrLeft = tabGroup.scrollLeft();\n                tabGroup.finish().animate({ 'scrollLeft': scrLeft + delta }, 'fast', 'linear', function () {\n                    if (that._nowScrollingTabs) {\n                        that._scrollTabsByDelta(delta);\n                    } else {\n                        that._toggleScrollButtons();\n                    }\n                });\n            },\n            _toggleScrollButtons: function () {\n                var that = this, ul = that.tabGroup, scrollLeft = ul.scrollLeft();\n                that._scrollPrevButton.toggle(that._isRtl ? scrollLeft < ul[0].scrollWidth - ul[0].offsetWidth - 1 : scrollLeft !== 0);\n                that._scrollNextButton.toggle(that._isRtl ? scrollLeft !== 0 : scrollLeft < ul[0].scrollWidth - ul[0].offsetWidth - 1);\n            },\n            deactivateTab: function (item) {\n                var that = this, animationSettings = that.options.animation, animation = animationSettings.open, close = extend({}, animationSettings.close), hasCloseAnimation = close && 'effects' in close;\n                item = that.tabGroup.find(item);\n                close = extend(hasCloseAnimation ? close : extend({ reverse: true }, animation), { hide: true });\n                if (kendo.size(animation.effects)) {\n                    item.kendoAddClass(DEFAULTSTATE, { duration: animation.duration });\n                    item.kendoRemoveClass(ACTIVESTATE, { duration: animation.duration });\n                } else {\n                    item.addClass(DEFAULTSTATE);\n                    item.removeClass(ACTIVESTATE);\n                }\n                item.removeAttr('aria-selected');\n                that.contentAnimators.filter('.' + ACTIVESTATE).kendoStop(true, true).kendoAnimate(close).removeClass(ACTIVESTATE).attr('aria-hidden', true);\n            },\n            activateTab: function (item) {\n                if (this.tabGroup.children('[data-animating]').length) {\n                    return;\n                }\n                item = this.tabGroup.find(item);\n                var that = this, animationSettings = that.options.animation, animation = animationSettings.open, close = extend({}, animationSettings.close), hasCloseAnimation = close && 'effects' in close, neighbours = item.parent().children(), oldTab = neighbours.filter('.' + ACTIVESTATE), itemIndex = neighbours.index(item);\n                close = extend(hasCloseAnimation ? close : extend({ reverse: true }, animation), { hide: true });\n                if (kendo.size(animation.effects)) {\n                    oldTab.kendoRemoveClass(ACTIVESTATE, { duration: close.duration });\n                    item.kendoRemoveClass(HOVERSTATE, { duration: close.duration });\n                } else {\n                    oldTab.removeClass(ACTIVESTATE);\n                    item.removeClass(HOVERSTATE);\n                }\n                var contentAnimators = that.contentAnimators;\n                if (that.inRequest) {\n                    that.xhr.abort();\n                    that.inRequest = false;\n                }\n                if (contentAnimators.length === 0) {\n                    that.tabGroup.find('.' + TABONTOP).removeClass(TABONTOP);\n                    item.addClass(TABONTOP).css('z-index');\n                    item.addClass(ACTIVESTATE);\n                    that._current(item);\n                    that.trigger('change');\n                    if (that._scrollableModeActive) {\n                        that._scrollTabsToItem(item);\n                    }\n                    return false;\n                }\n                var visibleContents = contentAnimators.filter('.' + ACTIVESTATE), contentHolder = that.contentHolder(itemIndex), contentElement = contentHolder.closest('.k-content');\n                that.tabsHeight = outerHeight(that.tabGroup) + parseInt(that.wrapper.css('border-top-width'), 10) + parseInt(that.wrapper.css('border-bottom-width'), 10);\n                that._sizeScrollWrap(visibleContents);\n                if (contentHolder.length === 0) {\n                    visibleContents.removeClass(ACTIVESTATE).attr('aria-hidden', true).kendoStop(true, true).kendoAnimate(close);\n                    return false;\n                }\n                item.attr('data-animating', true);\n                var isAjaxContent = (item.children('.' + LINK).data(CONTENTURL) || that._contentUrls[itemIndex] || false) && contentHolder.is(EMPTY), showContentElement = function () {\n                        that.tabGroup.find('.' + TABONTOP).removeClass(TABONTOP);\n                        item.addClass(TABONTOP).css('z-index');\n                        if (kendo.size(animation.effects)) {\n                            oldTab.kendoAddClass(DEFAULTSTATE, { duration: animation.duration });\n                            item.kendoAddClass(ACTIVESTATE, { duration: animation.duration });\n                        } else {\n                            oldTab.addClass(DEFAULTSTATE);\n                            item.addClass(ACTIVESTATE);\n                        }\n                        oldTab.removeAttr('aria-selected');\n                        item.attr('aria-selected', true);\n                        that._current(item);\n                        that._sizeScrollWrap(contentElement);\n                        contentElement.addClass(ACTIVESTATE).removeAttr('aria-hidden').kendoStop(true, true).attr('aria-expanded', true).kendoAnimate(extend({\n                            init: function () {\n                                that.trigger(SHOW, {\n                                    item: item[0],\n                                    contentElement: contentHolder[0]\n                                });\n                                kendo.resize(contentHolder);\n                            }\n                        }, animation, {\n                            complete: function () {\n                                item.removeAttr('data-animating');\n                                that.trigger(ACTIVATE, {\n                                    item: item[0],\n                                    contentElement: contentHolder[0]\n                                });\n                                kendo.resize(contentHolder);\n                                that.scrollWrap.css('height', '').css('height');\n                            }\n                        }));\n                    }, showContent = function () {\n                        if (!isAjaxContent) {\n                            showContentElement();\n                            that.trigger('change');\n                        } else {\n                            item.removeAttr('data-animating');\n                            that.ajaxRequest(item, contentHolder, function () {\n                                item.attr('data-animating', true);\n                                showContentElement();\n                                that.trigger('change');\n                            });\n                        }\n                        if (that._scrollableModeActive) {\n                            that._scrollTabsToItem(item);\n                        }\n                    };\n                visibleContents.removeClass(ACTIVESTATE);\n                visibleContents.attr('aria-hidden', true);\n                visibleContents.attr('aria-expanded', false);\n                if (visibleContents.length) {\n                    visibleContents.kendoStop(true, true).kendoAnimate(extend({ complete: showContent }, close));\n                } else {\n                    showContent();\n                }\n                return true;\n            },\n            contentElement: function (itemIndex) {\n                if (isNaN(itemIndex - 0)) {\n                    return undefined;\n                }\n                var contentElements = this.contentElements && this.contentElements[0] && !kendo.kineticScrollNeeded ? this.contentElements : this.contentAnimators;\n                var id = $(this.tabGroup.children()[itemIndex]).attr('aria-controls');\n                if (contentElements) {\n                    for (var i = 0, len = contentElements.length; i < len; i++) {\n                        if (contentElements.eq(i).closest('.k-content')[0].id == id) {\n                            return contentElements[i];\n                        }\n                    }\n                }\n                return undefined;\n            },\n            contentHolder: function (itemIndex) {\n                var contentElement = $(this.contentElement(itemIndex)), scrollContainer = contentElement.children('.km-scroll-container');\n                return kendo.support.touch && scrollContainer[0] ? scrollContainer : contentElement;\n            },\n            ajaxRequest: function (element, content, complete, url) {\n                element = this.tabGroup.find(element);\n                var that = this, xhr = $.ajaxSettings.xhr, link = element.find('.' + LINK), data = {}, halfWidth = element.width() / 2, fakeProgress = false, statusIcon = element.find('.k-loading').removeClass('k-complete');\n                if (!statusIcon[0]) {\n                    statusIcon = $('<span class=\\'k-loading\\'/>').prependTo(element);\n                }\n                var endState = halfWidth * 2 - statusIcon.width();\n                var oldProgressAnimation = function () {\n                    statusIcon.animate({ marginLeft: (parseInt(statusIcon.css('marginLeft'), 10) || 0) < halfWidth ? endState : 0 }, 500, oldProgressAnimation);\n                };\n                if (kendo.support.browser.msie && kendo.support.browser.version < 10) {\n                    setTimeout(oldProgressAnimation, 40);\n                }\n                url = url || link.data(CONTENTURL) || that._contentUrls[element.index()] || link.attr(HREF);\n                that.inRequest = true;\n                var ajaxOptions = {\n                    type: 'GET',\n                    cache: false,\n                    url: url,\n                    dataType: 'html',\n                    data: data,\n                    xhr: function () {\n                        var current = this, request = xhr(), event = current.progressUpload ? 'progressUpload' : current.progress ? 'progress' : false;\n                        if (request) {\n                            $.each([\n                                request,\n                                request.upload\n                            ], function () {\n                                if (this.addEventListener) {\n                                    this.addEventListener('progress', function (evt) {\n                                        if (event) {\n                                            current[event](evt);\n                                        }\n                                    }, false);\n                                }\n                            });\n                        }\n                        current.noProgress = !(window.XMLHttpRequest && 'upload' in new XMLHttpRequest());\n                        return request;\n                    },\n                    progress: function (evt) {\n                        if (evt.lengthComputable) {\n                            var percent = parseInt(evt.loaded / evt.total * 100, 10) + '%';\n                            statusIcon.stop(true).addClass('k-progress').css({\n                                'width': percent,\n                                'marginLeft': 0\n                            });\n                        }\n                    },\n                    error: function (xhr, status) {\n                        if (that.trigger('error', {\n                                xhr: xhr,\n                                status: status\n                            })) {\n                            this.complete();\n                        }\n                    },\n                    stopProgress: function () {\n                        clearInterval(fakeProgress);\n                        statusIcon.stop(true).addClass('k-progress')[0].style.cssText = '';\n                    },\n                    complete: function (xhr) {\n                        that.inRequest = false;\n                        if (this.noProgress) {\n                            setTimeout(this.stopProgress, 500);\n                        } else {\n                            this.stopProgress();\n                        }\n                        if (xhr.statusText == 'abort') {\n                            statusIcon.remove();\n                        }\n                    },\n                    success: function (data) {\n                        statusIcon.addClass('k-complete');\n                        try {\n                            var current = this, loaded = 10;\n                            if (current.noProgress) {\n                                statusIcon.width(loaded + '%');\n                                fakeProgress = setInterval(function () {\n                                    current.progress({\n                                        lengthComputable: true,\n                                        loaded: Math.min(loaded, 100),\n                                        total: 100\n                                    });\n                                    loaded += 10;\n                                }, 40);\n                            }\n                            that.angular('cleanup', function () {\n                                return { elements: content.get() };\n                            });\n                            kendo.destroy(content);\n                            content.html(data);\n                        } catch (e) {\n                            var console = window.console;\n                            if (console && console.error) {\n                                console.error(e.name + ': ' + e.message + ' in ' + url);\n                            }\n                            this.error(this.xhr, 'error');\n                        }\n                        if (complete) {\n                            complete.call(that, content);\n                        }\n                        that.angular('compile', function () {\n                            return { elements: content.get() };\n                        });\n                        that.trigger(CONTENTLOAD, {\n                            item: element[0],\n                            contentElement: content[0]\n                        });\n                    }\n                };\n                if (typeof url === 'object') {\n                    ajaxOptions = $.extend(true, {}, ajaxOptions, url);\n                    if (isFunction(ajaxOptions.url)) {\n                        ajaxOptions.url = ajaxOptions.url();\n                    }\n                }\n                that.xhr = $.ajax(ajaxOptions);\n            }\n        });\n        extend(TabStrip, {\n            renderItem: function (options) {\n                options = extend({\n                    tabStrip: {},\n                    group: {}\n                }, options);\n                var empty = templates.empty, item = options.item;\n                return templates.item(extend(options, {\n                    image: item.imageUrl ? templates.image : empty,\n                    sprite: item.spriteCssClass ? templates.sprite : empty,\n                    itemWrapper: templates.itemWrapper\n                }, rendering));\n            },\n            renderContent: function (options) {\n                return templates.content(extend(options, rendering));\n            }\n        });\n        kendo.ui.plugin(TabStrip);\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('util/undoredostack', ['kendo.core'], f);\n}(function () {\n    (function (kendo) {\n        var UndoRedoStack = kendo.Observable.extend({\n            init: function (options) {\n                kendo.Observable.fn.init.call(this, options);\n                this.clear();\n            },\n            events: [\n                'undo',\n                'redo'\n            ],\n            push: function (command) {\n                this.stack = this.stack.slice(0, this.currentCommandIndex + 1);\n                this.currentCommandIndex = this.stack.push(command) - 1;\n            },\n            undo: function () {\n                if (this.canUndo()) {\n                    var command = this.stack[this.currentCommandIndex--];\n                    command.undo();\n                    this.trigger('undo', { command: command });\n                }\n            },\n            redo: function () {\n                if (this.canRedo()) {\n                    var command = this.stack[++this.currentCommandIndex];\n                    command.redo();\n                    this.trigger('redo', { command: command });\n                }\n            },\n            clear: function () {\n                this.stack = [];\n                this.currentCommandIndex = -1;\n            },\n            canUndo: function () {\n                return this.currentCommandIndex >= 0;\n            },\n            canRedo: function () {\n                return this.currentCommandIndex != this.stack.length - 1;\n            }\n        });\n        kendo.deepExtend(kendo, { util: { UndoRedoStack: UndoRedoStack } });\n    }(kendo));\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('editor/main', [\n        'util/undoredostack',\n        'kendo.combobox',\n        'kendo.dropdownlist',\n        'kendo.window',\n        'kendo.colorpicker'\n    ], f);\n}(function () {\n    (function ($, undefined) {\n        var kendo = window.kendo, Class = kendo.Class, Widget = kendo.ui.Widget, os = kendo.support.mobileOS, browser = kendo.support.browser, extend = $.extend, proxy = $.proxy, deepExtend = kendo.deepExtend, keys = kendo.keys;\n        var SELECT = 'select';\n        var SELECT_OVERLAY_SELECTOR = 'select.k-select-overlay';\n        var ToolTemplate = Class.extend({\n            init: function (options) {\n                this.options = options;\n            },\n            getHtml: function () {\n                var options = this.options;\n                return kendo.template(options.template, { useWithBlock: false })(options);\n            }\n        });\n        var EditorUtils = {\n            editorWrapperTemplate: '<table cellspacing=\"4\" cellpadding=\"0\" class=\"k-widget k-editor k-header\" role=\"presentation\"><tbody>' + '<tr role=\"presentation\"><td class=\"k-editor-toolbar-wrap\" role=\"presentation\"><ul class=\"k-editor-toolbar\" role=\"toolbar\" /></td></tr>' + '<tr><td class=\"k-editable-area\" /></tr>' + '</tbody></table>',\n            buttonTemplate: '# var iconCssClass= \"k-icon k-i-\" + kendo.toHyphens(data.cssClass.replace(\"k-\", \"\"));#' + '<a tabindex=\"0\" role=\"button\" class=\"k-tool\"' + '#= data.popup ? \" data-popup\" : \"\" #' + ' unselectable=\"on\" title=\"#= data.title #\"><span unselectable=\"on\" class=\"k-tool-icon #= iconCssClass #\"></span><span class=\"k-tool-text\">#= data.title #</span></a>',\n            colorPickerTemplate: '<div class=\"k-colorpicker k-icon k-i-#= data.cssClass.replace(\"k-\", \"\") #\" />',\n            comboBoxTemplate: '<select title=\"#= data.title #\" class=\"#= data.cssClass #\" />',\n            dropDownListTemplate: '<span class=\"k-editor-dropdown\"><select title=\"#= data.title #\" class=\"#= data.cssClass #\" /></span>',\n            separatorTemplate: '<span class=\"k-separator\" />',\n            overflowAnchorTemplate: '<a tabindex=\"0\" role=\"button\" class=\"k-tool k-overflow-anchor\" data-popup' + ' unselectable=\"on\" title=\"#= data.title #\" aria-haspopup=\"true\" aria-expanded=\"false\">' + '<span unselectable=\"on\" class=\"k-icon k-i-more-vertical\"></span><span class=\"k-tool-text\">#= data.title #</span></a>',\n            formatByName: function (name, format) {\n                for (var i = 0; i < format.length; i++) {\n                    if ($.inArray(name, format[i].tags) >= 0) {\n                        return format[i];\n                    }\n                }\n            },\n            getToolCssClass: function (name) {\n                var toolCssClassNames = {\n                    superscript: 'sup-script',\n                    subscript: 'sub-script',\n                    justifyLeft: 'align-left',\n                    justifyCenter: 'align-center',\n                    justifyRight: 'align-right',\n                    justifyFull: 'align-justify',\n                    insertUnorderedList: 'list-unordered',\n                    insertOrderedList: 'list-ordered',\n                    'import': 'login',\n                    indent: 'indent-increase',\n                    outdent: 'indent-decrease',\n                    createLink: 'link-horizontal',\n                    unlink: 'unlink-horizontal',\n                    insertImage: 'image',\n                    insertFile: 'file-add',\n                    viewHtml: 'html',\n                    foreColor: 'foreground-color',\n                    backColor: 'paint',\n                    createTable: 'table-insert',\n                    addColumnLeft: 'table-column-insert-left',\n                    addColumnRight: 'table-column-insert-right',\n                    addRowAbove: 'table-row-insert-above',\n                    addRowBelow: 'table-row-insert-below',\n                    deleteRow: 'table-row-delete',\n                    deleteColumn: 'table-column-delete',\n                    tableWizard: 'table-properties',\n                    tableWizardInsert: 'table-wizard',\n                    cleanFormatting: 'clear-css'\n                };\n                var cssClass = toolCssClassNames[name];\n                if (cssClass) {\n                    return cssClass;\n                }\n                return name;\n            },\n            registerTool: function (toolName, tool) {\n                var toolOptions = tool.options;\n                if (toolOptions && toolOptions.template) {\n                    toolOptions.template.options.cssClass = 'k-' + EditorUtils.getToolCssClass(toolName);\n                }\n                if (!tool.name) {\n                    tool.options.name = toolName;\n                    tool.name = toolName.toLowerCase();\n                }\n                Editor.defaultTools[toolName] = tool;\n            },\n            registerFormat: function (formatName, format) {\n                Editor.fn.options.formats[formatName] = format;\n            }\n        };\n        var messages = {\n            bold: 'Bold',\n            italic: 'Italic',\n            underline: 'Underline',\n            strikethrough: 'Strikethrough',\n            superscript: 'Superscript',\n            subscript: 'Subscript',\n            justifyCenter: 'Center text',\n            justifyLeft: 'Align text left',\n            justifyRight: 'Align text right',\n            justifyFull: 'Justify',\n            insertUnorderedList: 'Insert unordered list',\n            insertOrderedList: 'Insert ordered list',\n            indent: 'Indent',\n            outdent: 'Outdent',\n            createLink: 'Insert hyperlink',\n            unlink: 'Remove hyperlink',\n            insertImage: 'Insert image',\n            insertFile: 'Insert file',\n            insertHtml: 'Insert HTML',\n            viewHtml: 'View HTML',\n            fontName: 'Select font family',\n            fontNameInherit: '(inherited font)',\n            fontSize: 'Select font size',\n            fontSizeInherit: '(inherited size)',\n            formatBlock: 'Format',\n            formatting: 'Format',\n            foreColor: 'Color',\n            backColor: 'Background color',\n            style: 'Styles',\n            emptyFolder: 'Empty Folder',\n            editAreaTitle: 'Editable area. Press F10 for toolbar.',\n            uploadFile: 'Upload',\n            overflowAnchor: 'More tools',\n            orderBy: 'Arrange by:',\n            orderBySize: 'Size',\n            orderByName: 'Name',\n            invalidFileType: 'The selected file \"{0}\" is not valid. Supported file types are {1}.',\n            deleteFile: 'Are you sure you want to delete \"{0}\"?',\n            overwriteFile: 'A file with name \"{0}\" already exists in the current directory. Do you want to overwrite it?',\n            directoryNotFound: 'A directory with this name was not found.',\n            imageWebAddress: 'Web address',\n            imageAltText: 'Alternate text',\n            imageWidth: 'Width (px)',\n            imageHeight: 'Height (px)',\n            fileWebAddress: 'Web address',\n            fileTitle: 'Title',\n            fileText: 'Text',\n            linkWebAddress: 'Web address',\n            linkText: 'Text',\n            linkToolTip: 'ToolTip',\n            linkOpenInNewWindow: 'Open link in new window',\n            dialogUpdate: 'Update',\n            dialogInsert: 'Insert',\n            dialogOk: 'Ok',\n            dialogCancel: 'Cancel',\n            cleanFormatting: 'Clean formatting',\n            createTable: 'Create a table',\n            createTableHint: 'Create a {0} x {1} table',\n            addColumnLeft: 'Add column on the left',\n            addColumnRight: 'Add column on the right',\n            addRowAbove: 'Add row above',\n            addRowBelow: 'Add row below',\n            deleteRow: 'Delete row',\n            deleteColumn: 'Delete column',\n            tableWizard: 'Table Wizard',\n            tableTab: 'Table',\n            cellTab: 'Cell',\n            accessibilityTab: 'Accessibility',\n            caption: 'Caption',\n            summary: 'Summary',\n            width: 'Width',\n            height: 'Height',\n            units: 'Units',\n            cellSpacing: 'Cell Spacing',\n            cellPadding: 'Cell Padding',\n            cellMargin: 'Cell Margin',\n            alignment: 'Alignment',\n            background: 'Background',\n            cssClass: 'CSS Class',\n            id: 'ID',\n            border: 'Border',\n            borderStyle: 'Border Style',\n            collapseBorders: 'Collapse borders',\n            wrapText: 'Wrap text',\n            associateCellsWithHeaders: 'Associate cells with headers',\n            alignLeft: 'Align Left',\n            alignCenter: 'Align Center',\n            alignRight: 'Align Right',\n            alignLeftTop: 'Align Left Top',\n            alignCenterTop: 'Align Center Top',\n            alignRightTop: 'Align Right Top',\n            alignLeftMiddle: 'Align Left Middle',\n            alignCenterMiddle: 'Align Center Middle',\n            alignRightMiddle: 'Align Right Middle',\n            alignLeftBottom: 'Align Left Bottom',\n            alignCenterBottom: 'Align Center Bottom',\n            alignRightBottom: 'Align Right Bottom',\n            alignRemove: 'Remove Alignment',\n            columns: 'Columns',\n            rows: 'Rows',\n            selectAllCells: 'Select All Cells',\n            exportAs: 'Export As',\n            'import': 'Import'\n        };\n        var supportedBrowser = !os || os.ios && os.flatVersion >= 500 || !os.ios && typeof document.documentElement.contentEditable != 'undefined';\n        var toolGroups = {\n            basic: [\n                'bold',\n                'italic',\n                'underline'\n            ],\n            alignment: [\n                'justifyLeft',\n                'justifyCenter',\n                'justifyRight'\n            ],\n            lists: [\n                'insertUnorderedList',\n                'insertOrderedList'\n            ],\n            indenting: [\n                'indent',\n                'outdent'\n            ],\n            links: [\n                'createLink',\n                'unlink'\n            ],\n            tables: [\n                'tableWizard',\n                'createTable',\n                'addColumnLeft',\n                'addColumnRight',\n                'addRowAbove',\n                'addRowBelow',\n                'deleteRow',\n                'deleteColumn'\n            ]\n        };\n        var Editor = Widget.extend({\n            init: function (element, options) {\n                var that = this, value, editorNS = kendo.ui.editor, toolbarContainer, toolbarOptions, type;\n                var domElement;\n                var dom = editorNS.Dom;\n                if (!supportedBrowser) {\n                    return;\n                }\n                Widget.fn.init.call(that, element, options);\n                that.options = deepExtend({}, that.options, options);\n                that.options.tools = that.options.tools.slice();\n                element = that.element;\n                domElement = element[0];\n                type = dom.name(domElement);\n                this._registerHandler(element.closest('form'), 'submit', proxy(that.update, that, undefined));\n                toolbarOptions = extend({}, that.options);\n                toolbarOptions.editor = that;\n                if (type == 'textarea') {\n                    that._wrapTextarea();\n                    toolbarContainer = that.wrapper.find('.k-editor-toolbar');\n                    if (domElement.id) {\n                        toolbarContainer.attr('aria-controls', domElement.id);\n                    }\n                } else {\n                    that.element.attr('contenteditable', true).addClass('k-widget k-editor k-editor-inline');\n                    toolbarOptions.popup = true;\n                    toolbarContainer = $('<ul class=\"k-editor-toolbar\" role=\"toolbar\" />').insertBefore(element);\n                }\n                that.toolbar = new editorNS.Toolbar(toolbarContainer[0], toolbarOptions);\n                that.toolbar.bindTo(that);\n                if (type == 'textarea') {\n                    setTimeout(function () {\n                        var heightStyle = that.wrapper[0].style.height;\n                        var expectedHeight = parseInt(heightStyle, 10);\n                        var actualHeight = that.wrapper.height();\n                        if (heightStyle.indexOf('px') > 0 && !isNaN(expectedHeight) && actualHeight > expectedHeight) {\n                            that.wrapper.height(expectedHeight - (actualHeight - expectedHeight));\n                        }\n                    });\n                }\n                that._resizable();\n                that._initializeContentElement(that);\n                that.keyboard = new editorNS.Keyboard([\n                    new editorNS.BackspaceHandler(that),\n                    new editorNS.TypingHandler(that),\n                    new editorNS.SystemHandler(that),\n                    new editorNS.SelectAllHandler(that)\n                ]);\n                that.clipboard = new editorNS.Clipboard(this);\n                that.undoRedoStack = new kendo.util.UndoRedoStack();\n                if (options && options.value) {\n                    value = options.value;\n                } else if (that.textarea) {\n                    value = domElement.value;\n                    if (that.options.encoded && $.trim(domElement.defaultValue).length) {\n                        value = domElement.defaultValue;\n                    }\n                    value = value.replace(/[\\r\\n\\v\\f\\t ]+/gi, ' ');\n                } else {\n                    value = domElement.innerHTML;\n                }\n                that.value(value || kendo.ui.editor.emptyElementContent);\n                this._registerHandler(document, {\n                    'mousedown': function () {\n                        that._endTyping();\n                    },\n                    'mouseup': function (e) {\n                        that._mouseup(e);\n                    }\n                });\n                that._initializeImmutables();\n                that.toolbar.resize();\n                kendo.notify(that);\n            },\n            setOptions: function (options) {\n                var editor = this;\n                Widget.fn.setOptions.call(editor, options);\n                if (options.tools) {\n                    editor.toolbar.bindTo(editor);\n                }\n            },\n            _endTyping: function () {\n                var keyboard = this.keyboard;\n                try {\n                    if (keyboard.isTypingInProgress()) {\n                        keyboard.endTyping(true);\n                        this.saveSelection();\n                    }\n                } catch (e) {\n                }\n            },\n            _selectionChange: function () {\n                this._selectionStarted = false;\n                this.saveSelection();\n                this.trigger('select', {});\n            },\n            _resizable: function () {\n                var resizable = this.options.resizable;\n                var isResizable = $.isPlainObject(resizable) ? resizable.content === undefined || resizable.content === true : resizable;\n                if (isResizable && this.textarea) {\n                    $('<div class=\\'k-resize-handle\\'><span class=\\'k-icon k-i-arrow-45-down-right\\' /></div>').insertAfter(this.textarea);\n                    this.wrapper.kendoResizable(extend({}, this.options.resizable, {\n                        start: function (e) {\n                            var editor = this.editor = $(e.currentTarget).closest('.k-editor');\n                            this.initialSize = editor.height();\n                            editor.find('td:last').append('<div class=\\'k-overlay\\' />');\n                        },\n                        resize: function (e) {\n                            var delta = e.y.initialDelta;\n                            var newSize = this.initialSize + delta;\n                            var min = this.options.min || 0;\n                            var max = this.options.max || Infinity;\n                            newSize = Math.min(max, Math.max(min, newSize));\n                            this.editor.height(newSize);\n                        },\n                        resizeend: function () {\n                            this.editor.find('.k-overlay').remove();\n                            this.editor = null;\n                        }\n                    }));\n                    if (kendo.support.mobileOS.ios) {\n                        var resizableWidget = this.wrapper.getKendoResizable();\n                        resizableWidget.draggable.options.ignore = SELECT_OVERLAY_SELECTOR;\n                    }\n                }\n            },\n            _initializeTableResizing: function () {\n                var editor = this;\n                kendo.ui.editor.TableResizing.create(editor);\n                editor._showTableResizeHandlesProxy = proxy(editor._showTableResizeHandles, editor);\n                editor.bind(SELECT, editor._showTableResizeHandlesProxy);\n            },\n            _destroyTableResizing: function () {\n                var editor = this;\n                var tableResizing = editor.tableResizing;\n                if (tableResizing) {\n                    tableResizing.destroy();\n                    editor.tableResizing = null;\n                }\n                if (editor._showTableResizeHandlesProxy) {\n                    editor.unbind(SELECT, editor._showTableResizeHandlesProxy);\n                }\n            },\n            _showTableResizeHandles: function () {\n                var editor = this;\n                var tableResizing = editor.tableResizing;\n                if (tableResizing) {\n                    tableResizing.showResizeHandles();\n                }\n            },\n            _initializeColumnResizing: function () {\n                kendo.ui.editor.ColumnResizing.create(this);\n            },\n            _destroyColumnResizing: function () {\n                var editor = this;\n                if (editor.columnResizing) {\n                    editor.columnResizing.destroy();\n                    editor.columnResizing = null;\n                }\n            },\n            _initializeRowResizing: function () {\n                kendo.ui.editor.RowResizing.create(this);\n            },\n            _destroyRowResizing: function () {\n                var editor = this;\n                if (editor.rowResizing) {\n                    editor.rowResizing.destroy();\n                    editor.rowResizing = null;\n                }\n            },\n            _wrapTextarea: function () {\n                var that = this, textarea = that.element, w = textarea[0].style.width, h = textarea[0].style.height, template = EditorUtils.editorWrapperTemplate, editorWrap = $(template).insertBefore(textarea).width(w).height(h), editArea = editorWrap.find('.k-editable-area');\n                textarea.attr('autocomplete', 'off').appendTo(editArea).addClass('k-content k-raw-content').css('display', 'none');\n                that.textarea = textarea;\n                that.wrapper = editorWrap;\n            },\n            _createContentElement: function (stylesheets) {\n                var editor = this;\n                var iframe, wnd, doc;\n                var textarea = editor.textarea;\n                var specifiedDomain = editor.options.domain;\n                var domain = specifiedDomain || document.domain;\n                var domainScript = '';\n                var src = 'javascript:\"\"';\n                if (specifiedDomain || domain != location.hostname) {\n                    domainScript = '<script>document.domain=\"' + domain + '\"</script>';\n                    src = 'javascript:document.write(\\'' + domainScript + '\\')';\n                }\n                textarea.hide();\n                iframe = $('<iframe />', {\n                    title: editor.options.messages.editAreaTitle,\n                    frameBorder: '0'\n                })[0];\n                $(iframe).css('display', '').addClass('k-content').attr('tabindex', textarea[0].tabIndex).insertBefore(textarea);\n                iframe.src = src;\n                wnd = iframe.contentWindow || iframe;\n                doc = wnd.document || iframe.contentDocument;\n                $(iframe).one('load', function () {\n                    editor.toolbar.decorateFrom(doc.body);\n                });\n                doc.open();\n                doc.write('<!DOCTYPE html><html><head>' + '<meta charset=\\'utf-8\\' />' + '<style>' + 'html,body{padding:0;margin:0;height:100%;min-height:100%;}' + 'body{box-sizing:border-box;font-size:12px;font-family:Verdana,Geneva,sans-serif;margin-top:-1px;padding:5px .4em 0;' + 'word-wrap: break-word;-webkit-nbsp-mode: space;-webkit-line-break: after-white-space;' + (kendo.support.isRtl(textarea) ? 'direction:rtl;' : '') + (browser.msie || browser.edge ? 'height:auto;' : '') + (os.ios ? 'word-break:break-all;' : '') + '}' + 'h1{font-size:2em;margin:.67em 0}h2{font-size:1.5em}h3{font-size:1.16em}h4{font-size:1em}h5{font-size:.83em}h6{font-size:.7em}' + 'p{margin:0 0 1em;}.k-marker{display:none;}.k-paste-container,.Apple-style-span{position:absolute;left:-10000px;width:1px;height:1px;overflow:hidden}' + 'ul,ol{padding-left:2.5em}' + 'span{-ms-high-contrast-adjust:none;}' + 'a{color:#00a}' + 'code{font-size:1.23em}' + 'telerik\\\\3Ascript{display: none;}' + '.k-table{width:100%;border-spacing:0;margin: 0 0 1em;}' + '.k-table td{min-width:1px;padding:.2em .3em;}' + '.k-table,.k-table td{outline:0;border: 1px dotted #ccc;}' + '.k-table p{margin:0;padding:0;}' + '.k-column-resize-handle-wrapper {position: absolute; height: 10px; width:10px; cursor: col-resize; z-index: 2;}' + '.k-column-resize-handle {width: 100%; height: 100%;}' + '.k-column-resize-handle > .k-column-resize-marker {width:2px; height:100%; margin:0 auto; background-color:#00b0ff; display:none; opacity:0.8;}' + '.k-row-resize-handle-wrapper {position: absolute; cursor: row-resize; z-index:2; width: 10px; height: 10px;}' + '.k-row-resize-handle {display: table; width: 100%; height: 100%;}' + '.k-row-resize-marker-wrapper{display: table-cell; height:100%; width:100%; margin:0; padding:0; vertical-align: middle;}' + '.k-row-resize-marker{margin: 0; padding:0; width:100%; height:2px; background-color: #00b0ff; opacity:0.8; display:none;}' + '.k-table-resize-handle-wrapper {position: absolute; background-color: #fff; border: 1px solid #000; z-index: 100; width: 5px; height: 5px;}' + '.k-table-resize-handle {width: 100%; height: 100%;}' + '.k-table-resize-handle.k-resize-east{cursor:e-resize;}' + '.k-table-resize-handle.k-resize-north{cursor:n-resize;}' + '.k-table-resize-handle.k-resize-northeast{cursor:ne-resize;}' + '.k-table-resize-handle.k-resize-northwest{cursor:nw-resize;}' + '.k-table-resize-handle.k-resize-south{cursor:s-resize;}' + '.k-table-resize-handle.k-resize-southeast{cursor:se-resize;}' + '.k-table-resize-handle.k-resize-southwest{cursor:sw-resize;}' + '.k-table-resize-handle.k-resize-west{cursor:w-resize;}' + '.k-table.k-table-resizing{opacity:0.6;}' + 'k\\\\:script{display:none;}' + '</style>' + domainScript + '<script>(function(d,c){d[c](\\'header\\'),d[c](\\'article\\'),d[c](\\'nav\\'),d[c](\\'section\\'),d[c](\\'footer\\');})(document, \\'createElement\\');</script>' + $.map(stylesheets, function (href) {\n                    return '<link rel=\\'stylesheet\\' href=\\'' + href + '\\'>';\n                }).join('') + '</head><body autocorrect=\\'off\\' contenteditable=\\'true\\'></body></html>');\n                doc.close();\n                return wnd;\n            },\n            _blur: function () {\n                var textarea = this.textarea;\n                var old = textarea ? textarea.val() : this._oldValue;\n                var value = this.options.encoded ? this.encodedValue() : this.value();\n                this.update();\n                if (textarea) {\n                    textarea.trigger('blur');\n                }\n                if (value != old) {\n                    this.trigger('change');\n                }\n            },\n            _spellCorrect: function (editor) {\n                var beforeCorrection;\n                var falseTrigger = false;\n                this._registerHandler(editor.body, {\n                    'contextmenu': function () {\n                        editor.one('select', function () {\n                            beforeCorrection = null;\n                        });\n                        editor._spellCorrectTimeout = setTimeout(function () {\n                            beforeCorrection = new kendo.ui.editor.RestorePoint(editor.getRange(), editor.body);\n                            falseTrigger = false;\n                        }, 10);\n                    },\n                    'input': function () {\n                        if (!beforeCorrection) {\n                            return;\n                        }\n                        if (kendo.support.browser.mozilla && !falseTrigger) {\n                            falseTrigger = true;\n                            return;\n                        }\n                        kendo.ui.editor._finishUpdate(editor, beforeCorrection);\n                    }\n                });\n            },\n            _registerHandler: function (element, type, handler) {\n                var editor = this;\n                var NS = '.kendoEditor';\n                var eventNames;\n                var i;\n                element = $(element);\n                if (!this._handlers) {\n                    this._handlers = [];\n                }\n                if (element.length) {\n                    if ($.isPlainObject(type)) {\n                        for (var t in type) {\n                            if (type.hasOwnProperty(t)) {\n                                this._registerHandler(element, t, type[t]);\n                            }\n                        }\n                    } else {\n                        eventNames = kendo.applyEventMap(type).split(' ');\n                        for (i = 0; i < eventNames.length; i++) {\n                            editor._handlers.push({\n                                element: element,\n                                type: eventNames[i] + NS,\n                                handler: handler\n                            });\n                            element.on(eventNames[i] + NS, handler);\n                        }\n                    }\n                }\n            },\n            _deregisterHandlers: function () {\n                var handlers = this._handlers;\n                for (var i = 0; i < handlers.length; i++) {\n                    var h = handlers[i];\n                    h.element.off(h.type, h.handler);\n                }\n                this._handlers = [];\n            },\n            _initializeContentElement: function () {\n                var editor = this;\n                var doc;\n                var blurTrigger;\n                var mousedownTrigger;\n                if (editor.textarea) {\n                    editor.window = editor._createContentElement(editor.options.stylesheets);\n                    doc = editor.document = editor.window.contentDocument || editor.window.document;\n                    editor.body = doc.body;\n                    blurTrigger = editor.window;\n                    mousedownTrigger = doc;\n                    this._registerHandler(doc, 'mouseup', proxy(this._mouseup, this));\n                } else {\n                    editor.window = window;\n                    doc = editor.document = document;\n                    editor.body = editor.element[0];\n                    blurTrigger = editor.body;\n                    mousedownTrigger = editor.body;\n                    editor.toolbar.decorateFrom(editor.body);\n                }\n                this._registerHandler(blurTrigger, 'blur', proxy(this._blur, this));\n                editor._registerHandler(mousedownTrigger, 'down', proxy(editor._mousedown, editor));\n                try {\n                    doc.execCommand('enableInlineTableEditing', null, false);\n                } catch (e) {\n                }\n                if (kendo.support.touch) {\n                    this._registerHandler(doc, {\n                        'keydown': function () {\n                            if (kendo._activeElement() != doc.body) {\n                                editor.window.focus();\n                            }\n                        }\n                    });\n                }\n                this._spellCorrect(editor);\n                this._registerHandler(editor.body, {\n                    'keydown': function (e) {\n                        var range;\n                        if ((e.keyCode === keys.BACKSPACE || e.keyCode === keys.DELETE) && editor.body.getAttribute('contenteditable') !== 'true') {\n                            return false;\n                        }\n                        if (e.keyCode === keys.F10) {\n                            setTimeout(proxy(editor.toolbar.focus, editor.toolbar), 100);\n                            e.preventDefault();\n                            return;\n                        } else if (e.keyCode == keys.LEFT || e.keyCode == keys.RIGHT) {\n                            range = editor.getRange();\n                            var left = e.keyCode == keys.LEFT;\n                            var container = range[left ? 'startContainer' : 'endContainer'];\n                            var offset = range[left ? 'startOffset' : 'endOffset'];\n                            var direction = left ? -1 : 1;\n                            var next = offset + direction;\n                            var nextChar = left ? next : offset;\n                            if (container.nodeType == 3 && container.nodeValue[nextChar] == '\\uFEFF') {\n                                range.setStart(container, next);\n                                range.collapse(true);\n                                editor.selectRange(range);\n                            }\n                        }\n                        var tools = editor.toolbar.tools;\n                        var toolName = editor.keyboard.toolFromShortcut(tools, e);\n                        var toolOptions = toolName ? tools[toolName].options : {};\n                        if (toolName && !toolOptions.keyPressCommand) {\n                            e.preventDefault();\n                            if (!/^(undo|redo)$/.test(toolName)) {\n                                editor.keyboard.endTyping(true);\n                            }\n                            editor.trigger('keydown', e);\n                            editor.exec(toolName);\n                            editor._runPostContentKeyCommands(e);\n                            return false;\n                        }\n                        editor.keyboard.clearTimeout();\n                        editor.keyboard.keydown(e);\n                    },\n                    'keypress': function (e) {\n                        setTimeout(function () {\n                            editor._runPostContentKeyCommands(e);\n                            editor._showTableResizeHandles();\n                        }, 0);\n                    },\n                    'keyup': function (e) {\n                        var selectionCodes = [\n                            keys.BACKSPACE,\n                            keys.TAB,\n                            keys.PAGEUP,\n                            keys.PAGEDOWN,\n                            keys.END,\n                            keys.HOME,\n                            keys.LEFT,\n                            keys.UP,\n                            keys.RIGHT,\n                            keys.DOWN,\n                            keys.INSERT,\n                            keys.DELETE\n                        ];\n                        if ($.inArray(e.keyCode, selectionCodes) > -1 || e.keyCode == 65 && e.ctrlKey && !e.altKey && !e.shiftKey) {\n                            editor._selectionChange();\n                        }\n                        editor.keyboard.keyup(e);\n                    },\n                    'click': function (e) {\n                        var dom = kendo.ui.editor.Dom, range;\n                        if (dom.name(e.target) === 'img') {\n                            range = editor.createRange();\n                            range.selectNode(e.target);\n                            editor.selectRange(range);\n                        }\n                    },\n                    'cut copy paste': function (e) {\n                        editor.clipboard['on' + e.type](e);\n                    },\n                    'focusin': function () {\n                        if (editor.body.hasAttribute('contenteditable')) {\n                            $(this).addClass('k-state-active');\n                            editor.toolbar.show();\n                        }\n                    },\n                    'focusout': function () {\n                        setTimeout(function () {\n                            var active = kendo._activeElement();\n                            var body = editor.body;\n                            var toolbar = editor.toolbar;\n                            if (toolbar.options.popup) {\n                                var toolbarContainerElement = toolbar.window.element.get(0);\n                                if (toolbarContainerElement && !($.contains(toolbarContainerElement, active) || toolbarContainerElement == active)) {\n                                    toolbar.preventPopupHide = false;\n                                }\n                            }\n                            if (active != body && !$.contains(body, active) && !$(active).is('.k-editortoolbar-dragHandle') && !toolbar.focused()) {\n                                $(body).removeClass('k-state-active');\n                                toolbar.hide();\n                            }\n                        }, 10);\n                    }\n                });\n                editor._initializeColumnResizing();\n                editor._initializeRowResizing();\n                editor._initializeTableResizing();\n            },\n            _initializeImmutables: function () {\n                var that = this, editorNS = kendo.ui.editor;\n                if (that.options.immutables) {\n                    that.immutables = new editorNS.Immutables(that);\n                }\n            },\n            _mousedown: function (e) {\n                var editor = this;\n                editor._selectionStarted = true;\n                if (browser.gecko) {\n                    return;\n                }\n                var target = $(e.target);\n                if ((e.which == 2 || e.which == 1 && e.ctrlKey) && target.is('a[href]')) {\n                    window.open(target.attr('href'), '_new');\n                }\n            },\n            _mouseup: function (e) {\n                var that = this;\n                if (kendo.support.mobileOS.ios && e && $(e.target).is(SELECT_OVERLAY_SELECTOR)) {\n                    return;\n                }\n                if (that._selectionStarted) {\n                    setTimeout(function () {\n                        that._selectionChange();\n                    }, 1);\n                }\n            },\n            _runPostContentKeyCommands: function (e) {\n                var range = this.getRange();\n                var tools = this.keyboard.toolsFromShortcut(this.toolbar.tools, e);\n                for (var i = 0; i < tools.length; i++) {\n                    var tool = tools[i];\n                    var o = tool.options;\n                    if (!o.keyPressCommand) {\n                        continue;\n                    }\n                    var cmd = new o.command({ range: range });\n                    if (cmd.changesContent()) {\n                        this.keyboard.endTyping(true);\n                        this.exec(tool.name);\n                    }\n                }\n            },\n            refresh: function () {\n                var that = this;\n                if (that.textarea) {\n                    that._destroyResizings();\n                    var value = that.value();\n                    that.textarea.val(value);\n                    that.wrapper.find('iframe').remove();\n                    that._initializeContentElement(that);\n                    that.value(value);\n                }\n            },\n            events: [\n                'select',\n                'change',\n                'execute',\n                'error',\n                'paste',\n                'keydown',\n                'keyup'\n            ],\n            options: {\n                name: 'Editor',\n                messages: messages,\n                formats: {},\n                encoded: true,\n                domain: null,\n                resizable: false,\n                deserialization: { custom: null },\n                serialization: {\n                    entities: true,\n                    semantic: true,\n                    scripts: false\n                },\n                pasteCleanup: {\n                    all: false,\n                    css: false,\n                    custom: null,\n                    keepNewLines: false,\n                    msAllFormatting: false,\n                    msConvertLists: true,\n                    msTags: true,\n                    none: false,\n                    span: false\n                },\n                stylesheets: [],\n                dialogOptions: {\n                    modal: true,\n                    resizable: false,\n                    draggable: true,\n                    animation: false\n                },\n                imageBrowser: null,\n                fileBrowser: null,\n                fontName: [\n                    {\n                        text: 'Arial',\n                        value: 'Arial,Helvetica,sans-serif'\n                    },\n                    {\n                        text: 'Courier New',\n                        value: '\\'Courier New\\',Courier,monospace'\n                    },\n                    {\n                        text: 'Georgia',\n                        value: 'Georgia,serif'\n                    },\n                    {\n                        text: 'Impact',\n                        value: 'Impact,Charcoal,sans-serif'\n                    },\n                    {\n                        text: 'Lucida Console',\n                        value: '\\'Lucida Console\\',Monaco,monospace'\n                    },\n                    {\n                        text: 'Tahoma',\n                        value: 'Tahoma,Geneva,sans-serif'\n                    },\n                    {\n                        text: 'Times New Roman',\n                        value: '\\'Times New Roman\\',Times,serif'\n                    },\n                    {\n                        text: 'Trebuchet MS',\n                        value: '\\'Trebuchet MS\\',Helvetica,sans-serif'\n                    },\n                    {\n                        text: 'Verdana',\n                        value: 'Verdana,Geneva,sans-serif'\n                    }\n                ],\n                fontSize: [\n                    {\n                        text: '1 (8pt)',\n                        value: 'xx-small'\n                    },\n                    {\n                        text: '2 (10pt)',\n                        value: 'x-small'\n                    },\n                    {\n                        text: '3 (12pt)',\n                        value: 'small'\n                    },\n                    {\n                        text: '4 (14pt)',\n                        value: 'medium'\n                    },\n                    {\n                        text: '5 (18pt)',\n                        value: 'large'\n                    },\n                    {\n                        text: '6 (24pt)',\n                        value: 'x-large'\n                    },\n                    {\n                        text: '7 (36pt)',\n                        value: 'xx-large'\n                    }\n                ],\n                formatBlock: [\n                    {\n                        text: 'Paragraph',\n                        value: 'p'\n                    },\n                    {\n                        text: 'Quotation',\n                        value: 'blockquote'\n                    },\n                    {\n                        text: 'Heading 1',\n                        value: 'h1'\n                    },\n                    {\n                        text: 'Heading 2',\n                        value: 'h2'\n                    },\n                    {\n                        text: 'Heading 3',\n                        value: 'h3'\n                    },\n                    {\n                        text: 'Heading 4',\n                        value: 'h4'\n                    },\n                    {\n                        text: 'Heading 5',\n                        value: 'h5'\n                    },\n                    {\n                        text: 'Heading 6',\n                        value: 'h6'\n                    }\n                ],\n                tools: [].concat.call(['formatting'], toolGroups.basic, toolGroups.alignment, toolGroups.lists, toolGroups.indenting, toolGroups.links, ['insertImage'], toolGroups.tables)\n            },\n            destroy: function () {\n                var editor = this;\n                Widget.fn.destroy.call(this);\n                this._endTyping(true);\n                this._deregisterHandlers();\n                clearTimeout(this._spellCorrectTimeout);\n                this._focusOutside();\n                this.toolbar.destroy();\n                editor._destroyUploadWidget();\n                editor._destroyResizings();\n                kendo.destroy(this.wrapper);\n            },\n            _destroyResizings: function () {\n                var editor = this;\n                editor._destroyTableResizing();\n                kendo.ui.editor.TableResizing.dispose(editor);\n                editor._destroyRowResizing();\n                kendo.ui.editor.RowResizing.dispose(editor);\n                editor._destroyColumnResizing();\n                kendo.ui.editor.ColumnResizing.dispose(editor);\n            },\n            _focusOutside: function () {\n                if (kendo.support.browser.msie && this.textarea) {\n                    var tempInput = $('<input style=\\'position:fixed;left:1px;top:1px;width:1px;height:1px;font-size:0;border:0;opacity:0\\' />').appendTo(document.body).focus();\n                    tempInput.blur().remove();\n                }\n            },\n            _destroyUploadWidget: function () {\n                var editor = this;\n                if (editor._uploadWidget) {\n                    editor._uploadWidget.destroy();\n                    editor._uploadWidget = null;\n                }\n            },\n            state: function (toolName) {\n                var tool = Editor.defaultTools[toolName];\n                var finder = tool && (tool.options.finder || tool.finder);\n                var RangeUtils = kendo.ui.editor.RangeUtils;\n                var range, textNodes;\n                if (finder) {\n                    range = this.getRange();\n                    textNodes = RangeUtils.textNodes(range);\n                    if (!textNodes.length && range.collapsed) {\n                        textNodes = [range.startContainer];\n                    }\n                    return finder.getFormat ? finder.getFormat(textNodes) : finder.isFormatted(textNodes);\n                }\n                return false;\n            },\n            value: function (html) {\n                var body = this.body, editorNS = kendo.ui.editor, options = this.options, currentHtml = editorNS.Serializer.domToXhtml(body, options.serialization);\n                if (html === undefined) {\n                    return currentHtml;\n                }\n                if (html == currentHtml) {\n                    return;\n                }\n                editorNS.Serializer.htmlToDom(html, body, options.deserialization);\n                this.selectionRestorePoint = null;\n                this.update();\n                this.toolbar.refreshTools();\n            },\n            saveSelection: function (range) {\n                range = range || this.getRange();\n                var container = range.commonAncestorContainer, body = this.body;\n                if (container == body || $.contains(body, container)) {\n                    this.selectionRestorePoint = new kendo.ui.editor.RestorePoint(range, body);\n                }\n            },\n            _focusBody: function () {\n                var body = this.body;\n                var iframe = this.wrapper && this.wrapper.find('iframe')[0];\n                var documentElement = this.document.documentElement;\n                var activeElement = kendo._activeElement();\n                var scrollTop;\n                if (iframe) {\n                    if (activeElement != body && activeElement != iframe) {\n                        scrollTop = documentElement.scrollTop;\n                        body.focus();\n                        documentElement.scrollTop = scrollTop;\n                    }\n                } else {\n                    scrollTop = body.scrollTop;\n                    body.focus();\n                    body.scrollTop = scrollTop;\n                }\n            },\n            restoreSelection: function () {\n                this._focusBody();\n                if (this.selectionRestorePoint) {\n                    this.selectRange(this.selectionRestorePoint.toRange());\n                }\n            },\n            focus: function () {\n                this.restoreSelection();\n            },\n            update: function (value) {\n                value = value || this.options.encoded ? this.encodedValue() : this.value();\n                if (this.textarea) {\n                    this.textarea.val(value);\n                } else {\n                    this._oldValue = value;\n                }\n            },\n            encodedValue: function () {\n                return kendo.ui.editor.Dom.encode(this.value());\n            },\n            createRange: function (document) {\n                return kendo.ui.editor.RangeUtils.createRange(document || this.document);\n            },\n            getSelection: function () {\n                return kendo.ui.editor.SelectionUtils.selectionFromDocument(this.document);\n            },\n            selectRange: function (range) {\n                this._focusBody();\n                var selection = this.getSelection();\n                selection.removeAllRanges();\n                selection.addRange(range);\n                this.saveSelection(range);\n            },\n            getRange: function () {\n                var selection = this.getSelection(), range = selection && selection.rangeCount > 0 ? selection.getRangeAt(0) : this.createRange(), doc = this.document;\n                if (range.startContainer == doc && range.endContainer == doc && !range.startOffset && !range.endOffset) {\n                    range.setStart(this.body, 0);\n                    range.collapse(true);\n                }\n                return range;\n            },\n            _containsRange: function (range) {\n                var dom = kendo.ui.editor.Dom;\n                var body = this.body;\n                return range && dom.isAncestorOrSelf(body, range.startContainer) && dom.isAncestorOrSelf(body, range.endContainer);\n            },\n            selectedHtml: function () {\n                return kendo.ui.editor.Serializer.domToXhtml(this.getRange().cloneContents());\n            },\n            paste: function (html, options) {\n                this.focus();\n                var command = new kendo.ui.editor.InsertHtmlCommand($.extend({\n                    range: this.getRange(),\n                    html: html\n                }, options));\n                command.editor = this;\n                command.exec();\n            },\n            exec: function (name, params) {\n                var that = this;\n                var command = null;\n                var range, tool, prevented;\n                if (!name) {\n                    throw new Error('kendoEditor.exec(): `name` parameter cannot be empty');\n                }\n                if (that.body.getAttribute('contenteditable') !== 'true' && name !== 'print' && name !== 'pdf') {\n                    return false;\n                }\n                name = name.toLowerCase();\n                if (!that.keyboard.isTypingInProgress()) {\n                    that._focusBody();\n                    that.selectRange(that._range || that.getRange());\n                }\n                tool = that.toolbar.toolById(name);\n                if (!tool) {\n                    for (var id in Editor.defaultTools) {\n                        if (id.toLowerCase() == name) {\n                            tool = Editor.defaultTools[id];\n                            break;\n                        }\n                    }\n                }\n                if (tool) {\n                    range = that.getRange();\n                    if (tool.command) {\n                        command = tool.command(extend({\n                            range: range,\n                            body: that.body,\n                            immutables: !!that.immutables\n                        }, params));\n                    }\n                    prevented = that.trigger('execute', {\n                        name: name,\n                        command: command\n                    });\n                    if (prevented) {\n                        return;\n                    }\n                    if (/^(undo|redo)$/i.test(name)) {\n                        that.undoRedoStack[name]();\n                    } else if (command) {\n                        that.execCommand(command);\n                        if (command.async) {\n                            command.change = proxy(that._selectionChange, that);\n                            return;\n                        }\n                    }\n                    that._selectionChange();\n                }\n            },\n            execCommand: function (command) {\n                if (!command.managesUndoRedo) {\n                    this.undoRedoStack.push(command);\n                }\n                command.editor = this;\n                command.exec();\n            }\n        });\n        Editor.defaultTools = {\n            undo: {\n                options: {\n                    key: 'Z',\n                    ctrl: true\n                }\n            },\n            redo: {\n                options: {\n                    key: 'Y',\n                    ctrl: true\n                }\n            }\n        };\n        kendo.ui.plugin(Editor);\n        var Tool = Class.extend({\n            init: function (options) {\n                this.options = options;\n            },\n            initialize: function (ui, options) {\n                ui.attr({\n                    unselectable: 'on',\n                    title: options.title\n                });\n                ui.children('.k-tool-text').html(options.title);\n            },\n            command: function (commandArguments) {\n                return new this.options.command(commandArguments);\n            },\n            update: $.noop\n        });\n        Tool.exec = function (editor, name, value) {\n            editor.exec(name, { value: value });\n        };\n        var FormatTool = Tool.extend({\n            init: function (options) {\n                Tool.fn.init.call(this, options);\n            },\n            command: function (commandArguments) {\n                var that = this;\n                return new kendo.ui.editor.FormatCommand(extend(commandArguments, { formatter: that.options.formatter }));\n            },\n            update: function (ui, nodes) {\n                var isFormatted = this.options.finder.isFormatted(nodes);\n                ui.toggleClass('k-state-selected', isFormatted);\n                ui.attr('aria-pressed', isFormatted);\n            }\n        });\n        EditorUtils.registerTool('separator', new Tool({ template: new ToolTemplate({ template: EditorUtils.separatorTemplate }) }));\n        var bomFill = browser.msie && browser.version < 9 ? '\\uFEFF' : '';\n        var emptyElementContent = '\\uFEFF';\n        var emptyTableCellContent = emptyElementContent;\n        if (browser.msie && browser.version == 10) {\n            emptyTableCellContent = '&nbsp;';\n        }\n        extend(kendo.ui, {\n            editor: {\n                ToolTemplate: ToolTemplate,\n                EditorUtils: EditorUtils,\n                Tool: Tool,\n                FormatTool: FormatTool,\n                _bomFill: bomFill,\n                emptyElementContent: emptyElementContent,\n                emptyTableCellContent: emptyTableCellContent\n            }\n        });\n        if (kendo.PDFMixin) {\n            kendo.PDFMixin.extend(Editor.prototype);\n            Editor.prototype._drawPDF = function () {\n                return kendo.drawing.drawDOM(this.body, this.options.pdf);\n            };\n            Editor.prototype.saveAsPDF = function () {\n                var progress = new $.Deferred();\n                var promise = progress.promise();\n                var args = { promise: promise };\n                if (this.trigger('pdfExport', args)) {\n                    return;\n                }\n                var options = this.options.pdf;\n                this._drawPDF(progress).then(function (root) {\n                    return kendo.drawing.exportPDF(root, options);\n                }).done(function (dataURI) {\n                    kendo.saveAs({\n                        dataURI: dataURI,\n                        fileName: options.fileName,\n                        proxyURL: options.proxyURL,\n                        forceProxy: options.forceProxy\n                    });\n                    progress.resolve();\n                }).fail(function (err) {\n                    progress.reject(err);\n                });\n                return promise;\n            };\n        }\n    }(window.kendo.jQuery));\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('editor/dom', ['editor/main'], f);\n}(function () {\n    (function ($) {\n        var kendo = window.kendo, map = $.map, extend = $.extend, browser = kendo.support.browser, STYLE = 'style', FLOAT = 'float', CSSFLOAT = 'cssFloat', STYLEFLOAT = 'styleFloat', CLASS = 'class', KMARKER = 'k-marker';\n        function makeMap(items) {\n            var obj = {}, i, len;\n            for (i = 0, len = items.length; i < len; i++) {\n                obj[items[i]] = true;\n            }\n            return obj;\n        }\n        var empty = makeMap('area,base,basefont,br,col,frame,hr,img,input,isindex,link,meta,param,embed'.split(',')), nonListBlockElements = 'div,p,h1,h2,h3,h4,h5,h6,address,applet,blockquote,button,center,dd,dir,dl,dt,fieldset,form,frameset,hr,iframe,isindex,map,menu,noframes,noscript,object,pre,script,table,tbody,td,tfoot,th,thead,tr,header,article,nav,footer,section,aside,main,figure,figcaption'.split(','), blockElements = nonListBlockElements.concat([\n                'ul',\n                'ol',\n                'li'\n            ]), block = makeMap(blockElements), inlineElements = 'span,em,a,abbr,acronym,applet,b,basefont,bdo,big,br,button,cite,code,del,dfn,font,i,iframe,img,input,ins,kbd,label,map,object,q,s,samp,script,select,small,strike,strong,sub,sup,textarea,tt,u,var,data,time,mark,ruby'.split(','), inline = makeMap(inlineElements), fillAttrs = makeMap('checked,compact,declare,defer,disabled,ismap,multiple,nohref,noresize,noshade,nowrap,readonly,selected'.split(','));\n        var normalize = function (node) {\n            if (node.nodeType == 1) {\n                node.normalize();\n            }\n        };\n        if (browser.msie && browser.version >= 8) {\n            normalize = function (parent) {\n                if (parent.nodeType == 1 && parent.firstChild) {\n                    var prev = parent.firstChild, node = prev;\n                    while (true) {\n                        node = node.nextSibling;\n                        if (!node) {\n                            break;\n                        }\n                        if (node.nodeType == 3 && prev.nodeType == 3) {\n                            node.nodeValue = prev.nodeValue + node.nodeValue;\n                            Dom.remove(prev);\n                        }\n                        prev = node;\n                    }\n                }\n            };\n        }\n        var whitespace = /^\\s+$/, emptyspace = /^[\\n\\r\\t]+$/, rgb = /rgb\\s*\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*\\)/i, bom = /\\ufeff/g, whitespaceOrBom = /^(\\s+|\\ufeff)$/, persistedScrollTop, cssAttributes = ('color,padding-left,padding-right,padding-top,padding-bottom,' + 'background-color,background-attachment,background-image,background-position,background-repeat,' + 'border-top-style,border-top-width,border-top-color,' + 'border-bottom-style,border-bottom-width,border-bottom-color,' + 'border-left-style,border-left-width,border-left-color,' + 'border-right-style,border-right-width,border-right-color,' + 'font-family,font-size,font-style,font-variant,font-weight,line-height').split(','), htmlRe = /[<>\\&]/g, entityRe = /[\\u00A0-\\u2666<>\\&]/g, entityTable = {\n                34: 'quot',\n                38: 'amp',\n                39: 'apos',\n                60: 'lt',\n                62: 'gt',\n                160: 'nbsp',\n                161: 'iexcl',\n                162: 'cent',\n                163: 'pound',\n                164: 'curren',\n                165: 'yen',\n                166: 'brvbar',\n                167: 'sect',\n                168: 'uml',\n                169: 'copy',\n                170: 'ordf',\n                171: 'laquo',\n                172: 'not',\n                173: 'shy',\n                174: 'reg',\n                175: 'macr',\n                176: 'deg',\n                177: 'plusmn',\n                178: 'sup2',\n                179: 'sup3',\n                180: 'acute',\n                181: 'micro',\n                182: 'para',\n                183: 'middot',\n                184: 'cedil',\n                185: 'sup1',\n                186: 'ordm',\n                187: 'raquo',\n                188: 'frac14',\n                189: 'frac12',\n                190: 'frac34',\n                191: 'iquest',\n                192: 'Agrave',\n                193: 'Aacute',\n                194: 'Acirc',\n                195: 'Atilde',\n                196: 'Auml',\n                197: 'Aring',\n                198: 'AElig',\n                199: 'Ccedil',\n                200: 'Egrave',\n                201: 'Eacute',\n                202: 'Ecirc',\n                203: 'Euml',\n                204: 'Igrave',\n                205: 'Iacute',\n                206: 'Icirc',\n                207: 'Iuml',\n                208: 'ETH',\n                209: 'Ntilde',\n                210: 'Ograve',\n                211: 'Oacute',\n                212: 'Ocirc',\n                213: 'Otilde',\n                214: 'Ouml',\n                215: 'times',\n                216: 'Oslash',\n                217: 'Ugrave',\n                218: 'Uacute',\n                219: 'Ucirc',\n                220: 'Uuml',\n                221: 'Yacute',\n                222: 'THORN',\n                223: 'szlig',\n                224: 'agrave',\n                225: 'aacute',\n                226: 'acirc',\n                227: 'atilde',\n                228: 'auml',\n                229: 'aring',\n                230: 'aelig',\n                231: 'ccedil',\n                232: 'egrave',\n                233: 'eacute',\n                234: 'ecirc',\n                235: 'euml',\n                236: 'igrave',\n                237: 'iacute',\n                238: 'icirc',\n                239: 'iuml',\n                240: 'eth',\n                241: 'ntilde',\n                242: 'ograve',\n                243: 'oacute',\n                244: 'ocirc',\n                245: 'otilde',\n                246: 'ouml',\n                247: 'divide',\n                248: 'oslash',\n                249: 'ugrave',\n                250: 'uacute',\n                251: 'ucirc',\n                252: 'uuml',\n                253: 'yacute',\n                254: 'thorn',\n                255: 'yuml',\n                402: 'fnof',\n                913: 'Alpha',\n                914: 'Beta',\n                915: 'Gamma',\n                916: 'Delta',\n                917: 'Epsilon',\n                918: 'Zeta',\n                919: 'Eta',\n                920: 'Theta',\n                921: 'Iota',\n                922: 'Kappa',\n                923: 'Lambda',\n                924: 'Mu',\n                925: 'Nu',\n                926: 'Xi',\n                927: 'Omicron',\n                928: 'Pi',\n                929: 'Rho',\n                931: 'Sigma',\n                932: 'Tau',\n                933: 'Upsilon',\n                934: 'Phi',\n                935: 'Chi',\n                936: 'Psi',\n                937: 'Omega',\n                945: 'alpha',\n                946: 'beta',\n                947: 'gamma',\n                948: 'delta',\n                949: 'epsilon',\n                950: 'zeta',\n                951: 'eta',\n                952: 'theta',\n                953: 'iota',\n                954: 'kappa',\n                955: 'lambda',\n                956: 'mu',\n                957: 'nu',\n                958: 'xi',\n                959: 'omicron',\n                960: 'pi',\n                961: 'rho',\n                962: 'sigmaf',\n                963: 'sigma',\n                964: 'tau',\n                965: 'upsilon',\n                966: 'phi',\n                967: 'chi',\n                968: 'psi',\n                969: 'omega',\n                977: 'thetasym',\n                978: 'upsih',\n                982: 'piv',\n                8226: 'bull',\n                8230: 'hellip',\n                8242: 'prime',\n                8243: 'Prime',\n                8254: 'oline',\n                8260: 'frasl',\n                8472: 'weierp',\n                8465: 'image',\n                8476: 'real',\n                8482: 'trade',\n                8501: 'alefsym',\n                8592: 'larr',\n                8593: 'uarr',\n                8594: 'rarr',\n                8595: 'darr',\n                8596: 'harr',\n                8629: 'crarr',\n                8656: 'lArr',\n                8657: 'uArr',\n                8658: 'rArr',\n                8659: 'dArr',\n                8660: 'hArr',\n                8704: 'forall',\n                8706: 'part',\n                8707: 'exist',\n                8709: 'empty',\n                8711: 'nabla',\n                8712: 'isin',\n                8713: 'notin',\n                8715: 'ni',\n                8719: 'prod',\n                8721: 'sum',\n                8722: 'minus',\n                8727: 'lowast',\n                8730: 'radic',\n                8733: 'prop',\n                8734: 'infin',\n                8736: 'ang',\n                8743: 'and',\n                8744: 'or',\n                8745: 'cap',\n                8746: 'cup',\n                8747: 'int',\n                8756: 'there4',\n                8764: 'sim',\n                8773: 'cong',\n                8776: 'asymp',\n                8800: 'ne',\n                8801: 'equiv',\n                8804: 'le',\n                8805: 'ge',\n                8834: 'sub',\n                8835: 'sup',\n                8836: 'nsub',\n                8838: 'sube',\n                8839: 'supe',\n                8853: 'oplus',\n                8855: 'otimes',\n                8869: 'perp',\n                8901: 'sdot',\n                8968: 'lceil',\n                8969: 'rceil',\n                8970: 'lfloor',\n                8971: 'rfloor',\n                9001: 'lang',\n                9002: 'rang',\n                9674: 'loz',\n                9824: 'spades',\n                9827: 'clubs',\n                9829: 'hearts',\n                9830: 'diams',\n                338: 'OElig',\n                339: 'oelig',\n                352: 'Scaron',\n                353: 'scaron',\n                376: 'Yuml',\n                710: 'circ',\n                732: 'tilde',\n                8194: 'ensp',\n                8195: 'emsp',\n                8201: 'thinsp',\n                8204: 'zwnj',\n                8205: 'zwj',\n                8206: 'lrm',\n                8207: 'rlm',\n                8211: 'ndash',\n                8212: 'mdash',\n                8216: 'lsquo',\n                8217: 'rsquo',\n                8218: 'sbquo',\n                8220: 'ldquo',\n                8221: 'rdquo',\n                8222: 'bdquo',\n                8224: 'dagger',\n                8225: 'Dagger',\n                8240: 'permil',\n                8249: 'lsaquo',\n                8250: 'rsaquo',\n                8364: 'euro'\n            };\n        var Dom = {\n            block: block,\n            inline: inline,\n            findNodeIndex: function (node, skipText) {\n                var i = 0;\n                if (!node) {\n                    return -1;\n                }\n                while (true) {\n                    node = node.previousSibling;\n                    if (!node) {\n                        break;\n                    }\n                    if (!(skipText && node.nodeType == 3)) {\n                        i++;\n                    }\n                }\n                return i;\n            },\n            isDataNode: function (node) {\n                return node && node.nodeValue !== null && node.data !== null;\n            },\n            isAncestorOf: function (parent, node) {\n                try {\n                    return !Dom.isDataNode(parent) && ($.contains(parent, Dom.isDataNode(node) ? node.parentNode : node) || node.parentNode == parent);\n                } catch (e) {\n                    return false;\n                }\n            },\n            isAncestorOrSelf: function (root, node) {\n                return Dom.isAncestorOf(root, node) || root == node;\n            },\n            findClosestAncestor: function (root, node) {\n                if (Dom.isAncestorOf(root, node)) {\n                    while (node && node.parentNode != root) {\n                        node = node.parentNode;\n                    }\n                }\n                return node;\n            },\n            getNodeLength: function (node) {\n                return Dom.isDataNode(node) ? node.length : node.childNodes.length;\n            },\n            splitDataNode: function (node, offset) {\n                var newNode = node.cloneNode(false);\n                var denormalizedText = '';\n                var iterator = node.nextSibling;\n                var temp;\n                while (iterator && iterator.nodeType == 3 && iterator.nodeValue) {\n                    denormalizedText += iterator.nodeValue;\n                    temp = iterator;\n                    iterator = iterator.nextSibling;\n                    Dom.remove(temp);\n                }\n                node.deleteData(offset, node.length);\n                newNode.deleteData(0, offset);\n                newNode.nodeValue += denormalizedText;\n                Dom.insertAfter(newNode, node);\n            },\n            attrEquals: function (node, attributes) {\n                for (var key in attributes) {\n                    var value = node[key];\n                    if (key == FLOAT) {\n                        value = node[kendo.support.cssFloat ? CSSFLOAT : STYLEFLOAT];\n                    }\n                    if (typeof value == 'object') {\n                        if (!Dom.attrEquals(value, attributes[key])) {\n                            return false;\n                        }\n                    } else if (value != attributes[key]) {\n                        return false;\n                    }\n                }\n                return true;\n            },\n            blockParentOrBody: function (node) {\n                return Dom.parentOfType(node, blockElements) || node.ownerDocument.body;\n            },\n            blockParents: function (nodes) {\n                var blocks = [], i, len;\n                for (i = 0, len = nodes.length; i < len; i++) {\n                    var block = Dom.parentOfType(nodes[i], Dom.blockElements);\n                    if (block && $.inArray(block, blocks) < 0) {\n                        blocks.push(block);\n                    }\n                }\n                return blocks;\n            },\n            windowFromDocument: function (document) {\n                return document.defaultView || document.parentWindow;\n            },\n            normalize: normalize,\n            blockElements: blockElements,\n            nonListBlockElements: nonListBlockElements,\n            inlineElements: inlineElements,\n            empty: empty,\n            fillAttrs: fillAttrs,\n            nodeTypes: {\n                ELEMENT_NODE: 1,\n                ATTRIBUTE_NODE: 2,\n                TEXT_NODE: 3,\n                CDATA_SECTION_NODE: 4,\n                ENTITY_REFERENCE_NODE: 5,\n                ENTITY_NODE: 6,\n                PROCESSING_INSTRUCTION_NODE: 7,\n                COMMENT_NODE: 8,\n                DOCUMENT_NODE: 9,\n                DOCUMENT_TYPE_NODE: 10,\n                DOCUMENT_FRAGMENT_NODE: 11,\n                NOTATION_NODE: 12\n            },\n            toHex: function (color) {\n                var matches = rgb.exec(color);\n                if (!matches) {\n                    return color;\n                }\n                return '#' + map(matches.slice(1), function (x) {\n                    x = parseInt(x, 10).toString(16);\n                    return x.length > 1 ? x : '0' + x;\n                }).join('');\n            },\n            encode: function (value, options) {\n                var encodableChars = !options || options.entities ? entityRe : htmlRe;\n                return value.replace(encodableChars, function (c) {\n                    var charCode = c.charCodeAt(0);\n                    var entity = entityTable[charCode];\n                    return entity ? '&' + entity + ';' : c;\n                });\n            },\n            isBom: function (node) {\n                return node && node.nodeType === 3 && /^[\\ufeff]+$/.test(node.nodeValue);\n            },\n            stripBom: function (text) {\n                return (text || '').replace(bom, '');\n            },\n            stripBomNode: function (node) {\n                if (Dom.isBom(node)) {\n                    node.parentNode.removeChild(node);\n                }\n            },\n            insignificant: function (node) {\n                var attr = node.attributes;\n                return node.className == 'k-marker' || Dom.is(node, 'br') && (node.className == 'k-br' || attr._moz_dirty || attr._moz_editor_bogus_node);\n            },\n            tableCell: function (node) {\n                return Dom.is(node, 'td') || Dom.is(node, 'th');\n            },\n            significantNodes: function (nodes) {\n                return $.grep(nodes, function (child) {\n                    var name = Dom.name(child);\n                    if (name == 'br') {\n                        return false;\n                    } else if (Dom.insignificant(child)) {\n                        return false;\n                    } else if (Dom.emptyTextNode(child)) {\n                        return false;\n                    } else if (child.nodeType == 1 && !empty[name] && Dom.emptyNode(child)) {\n                        return false;\n                    }\n                    return true;\n                });\n            },\n            emptyTextNode: function (node) {\n                return node && node.nodeType == 3 && whitespaceOrBom.test(node.nodeValue);\n            },\n            emptyNode: function (node) {\n                return node.nodeType == 1 && !Dom.significantNodes(node.childNodes).length;\n            },\n            name: function (node) {\n                return node.nodeName.toLowerCase();\n            },\n            significantChildNodes: function (node) {\n                return $.grep(node.childNodes, function (child) {\n                    return child.nodeType != 3 || !Dom.isWhitespace(child);\n                });\n            },\n            lastTextNode: function (node) {\n                var result = null;\n                if (node.nodeType == 3) {\n                    return node;\n                }\n                for (var child = node.lastChild; child; child = child.previousSibling) {\n                    result = Dom.lastTextNode(child);\n                    if (result) {\n                        return result;\n                    }\n                }\n                return result;\n            },\n            is: function (node, nodeName) {\n                return node && Dom.name(node) == nodeName;\n            },\n            isMarker: function (node) {\n                return node.className == KMARKER;\n            },\n            isWhitespace: function (node) {\n                return whitespace.test(node.nodeValue);\n            },\n            allWhitespaceContent: function (node) {\n                var child = node.firstChild;\n                while (child && Dom.isWhitespace(child)) {\n                    child = child.nextSibling;\n                }\n                return !child;\n            },\n            isEmptyspace: function (node) {\n                return emptyspace.test(node.nodeValue);\n            },\n            htmlIndentSpace: function (node) {\n                if (!(Dom.isDataNode(node) && Dom.isWhitespace(node))) {\n                    return false;\n                }\n                if (emptyspace.test(node.nodeValue)) {\n                    return true;\n                }\n                var sibling = function (el, direction) {\n                    while (el[direction]) {\n                        el = el[direction];\n                        if (Dom.significantNodes([el]).length > 0) {\n                            return el;\n                        }\n                    }\n                };\n                var parent = node.parentNode;\n                var prev = sibling(node, 'previousSibling');\n                var next = sibling(node, 'nextSibling');\n                if (bom.test(node.nodeValue)) {\n                    return !!(prev || next);\n                }\n                if ($(parent).is('tr,tbody,thead,tfoot,table,ol,ul')) {\n                    return true;\n                }\n                if (Dom.isBlock(parent) || Dom.is(parent, 'body')) {\n                    var isPrevBlock = prev && Dom.isBlock(prev);\n                    var isNextBlock = next && Dom.isBlock(next);\n                    if (!next && isPrevBlock || !prev && isNextBlock || isPrevBlock && isNextBlock) {\n                        return true;\n                    }\n                }\n                return false;\n            },\n            isBlock: function (node) {\n                return block[Dom.name(node)];\n            },\n            isEmpty: function (node) {\n                return empty[Dom.name(node)];\n            },\n            isInline: function (node) {\n                return inline[Dom.name(node)];\n            },\n            list: function (node) {\n                var name = node ? Dom.name(node) : '';\n                return name == 'ul' || name == 'ol' || name == 'dl';\n            },\n            scrollContainer: function (doc) {\n                var wnd = Dom.windowFromDocument(doc), scrollContainer = (wnd.contentWindow || wnd).document || wnd.ownerDocument || wnd;\n                if (kendo.support.browser.webkit || scrollContainer.compatMode == 'BackCompat') {\n                    scrollContainer = scrollContainer.body;\n                } else {\n                    scrollContainer = scrollContainer.documentElement;\n                }\n                return scrollContainer;\n            },\n            scrollTo: function (node) {\n                var element = $(Dom.isDataNode(node) ? node.parentNode : node), wnd = Dom.windowFromDocument(node.ownerDocument), windowHeight = wnd.innerHeight, elementTop, elementHeight, scrollContainer = Dom.scrollContainer(node.ownerDocument);\n                elementTop = element.offset().top;\n                elementHeight = element[0].offsetHeight;\n                if (!elementHeight) {\n                    elementHeight = parseInt(element.css('line-height'), 10) || Math.ceil(1.2 * parseInt(element.css('font-size'), 10)) || 15;\n                }\n                if (elementHeight + elementTop > scrollContainer.scrollTop + windowHeight) {\n                    scrollContainer.scrollTop = elementHeight + elementTop - windowHeight;\n                }\n            },\n            persistScrollTop: function (doc) {\n                persistedScrollTop = Dom.scrollContainer(doc).scrollTop;\n            },\n            offset: function (target, offsetParent) {\n                var result = {\n                    top: target.offsetTop,\n                    left: target.offsetLeft\n                };\n                var parent = target.offsetParent;\n                while (parent && (!offsetParent || Dom.isAncestorOf(offsetParent, parent))) {\n                    result.top += parent.offsetTop;\n                    result.left += parent.offsetLeft;\n                    parent = parent.offsetParent;\n                }\n                return result;\n            },\n            restoreScrollTop: function (doc) {\n                if (typeof persistedScrollTop == 'number') {\n                    Dom.scrollContainer(doc).scrollTop = persistedScrollTop;\n                }\n            },\n            insertAt: function (parent, newElement, position) {\n                parent.insertBefore(newElement, parent.childNodes[position] || null);\n            },\n            insertBefore: function (newElement, referenceElement) {\n                if (referenceElement.parentNode) {\n                    return referenceElement.parentNode.insertBefore(newElement, referenceElement);\n                } else {\n                    return referenceElement;\n                }\n            },\n            insertAfter: function (newElement, referenceElement) {\n                return referenceElement.parentNode.insertBefore(newElement, referenceElement.nextSibling);\n            },\n            remove: function (node) {\n                if (node.parentNode) {\n                    node.parentNode.removeChild(node);\n                }\n            },\n            removeChildren: function (node) {\n                while (node.firstChild) {\n                    node.removeChild(node.firstChild);\n                }\n            },\n            removeTextSiblings: function (node) {\n                var parentNode = node.parentNode;\n                while (node.nextSibling && node.nextSibling.nodeType == 3) {\n                    parentNode.removeChild(node.nextSibling);\n                }\n                while (node.previousSibling && node.previousSibling.nodeType == 3) {\n                    parentNode.removeChild(node.previousSibling);\n                }\n            },\n            trim: function (parent) {\n                for (var i = parent.childNodes.length - 1; i >= 0; i--) {\n                    var node = parent.childNodes[i];\n                    if (Dom.isDataNode(node)) {\n                        if (!Dom.stripBom(node.nodeValue).length) {\n                            Dom.remove(node);\n                        }\n                    } else if (node.className != KMARKER) {\n                        Dom.trim(node);\n                        if (node.childNodes.length === 0 || Dom.allWhitespaceContent(node) && Dom.isBlock(node) && !Dom.isEmpty(node)) {\n                            Dom.remove(node);\n                        }\n                    }\n                }\n                return parent;\n            },\n            closest: function (node, tag) {\n                while (node && Dom.name(node) != tag) {\n                    node = node.parentNode;\n                }\n                return node;\n            },\n            closestBy: function (node, condition, rootCondition) {\n                while (node && !condition(node)) {\n                    if (rootCondition && rootCondition(node)) {\n                        return null;\n                    }\n                    node = node.parentNode;\n                }\n                return node;\n            },\n            sibling: function (node, direction) {\n                do {\n                    node = node[direction];\n                } while (node && node.nodeType != 1);\n                return node;\n            },\n            next: function (node) {\n                return Dom.sibling(node, 'nextSibling');\n            },\n            prev: function (node) {\n                return Dom.sibling(node, 'previousSibling');\n            },\n            parentOfType: function (node, tags) {\n                do {\n                    node = node.parentNode;\n                } while (node && !Dom.ofType(node, tags));\n                return node;\n            },\n            ofType: function (node, tags) {\n                return $.inArray(Dom.name(node), tags) >= 0;\n            },\n            changeTag: function (referenceElement, tagName, skipAttributes) {\n                var newElement = Dom.create(referenceElement.ownerDocument, tagName), attributes = referenceElement.attributes, i, len, name, value, attribute;\n                if (!skipAttributes) {\n                    for (i = 0, len = attributes.length; i < len; i++) {\n                        attribute = attributes[i];\n                        if (attribute.specified) {\n                            name = attribute.nodeName;\n                            value = attribute.nodeValue;\n                            if (name == CLASS) {\n                                newElement.className = value;\n                            } else if (name == STYLE) {\n                                newElement.style.cssText = referenceElement.style.cssText;\n                            } else {\n                                newElement.setAttribute(name, value);\n                            }\n                        }\n                    }\n                }\n                while (referenceElement.firstChild) {\n                    newElement.appendChild(referenceElement.firstChild);\n                }\n                Dom.insertBefore(newElement, referenceElement);\n                Dom.remove(referenceElement);\n                return newElement;\n            },\n            editableParent: function (node) {\n                while (node && (node.nodeType == 3 || node.contentEditable !== 'true')) {\n                    node = node.parentNode;\n                }\n                return node;\n            },\n            wrap: function (node, wrapper) {\n                Dom.insertBefore(wrapper, node);\n                wrapper.appendChild(node);\n                return wrapper;\n            },\n            unwrap: function (node) {\n                var parent = node.parentNode;\n                while (node.firstChild) {\n                    parent.insertBefore(node.firstChild, node);\n                }\n                parent.removeChild(node);\n            },\n            wrapper: function (node) {\n                var wrapper = Dom.closestBy(node, function (el) {\n                    return el.parentNode && Dom.significantNodes(el.parentNode.childNodes).length > 1;\n                });\n                return $(wrapper).is('body,.k-editor') ? undefined : wrapper;\n            },\n            create: function (document, tagName, attributes) {\n                return Dom.attr(document.createElement(tagName), attributes);\n            },\n            attr: function (element, attributes) {\n                attributes = extend({}, attributes);\n                if (attributes && STYLE in attributes) {\n                    Dom.style(element, attributes.style);\n                    delete attributes.style;\n                }\n                for (var attr in attributes) {\n                    if (attributes[attr] === null) {\n                        element.removeAttribute(attr);\n                        delete attributes[attr];\n                    } else if (attr == 'className') {\n                        element[attr] = attributes[attr];\n                    }\n                }\n                return extend(element, attributes);\n            },\n            style: function (node, value) {\n                $(node).css(value || {});\n            },\n            unstyle: function (node, value) {\n                for (var key in value) {\n                    if (key == FLOAT) {\n                        key = kendo.support.cssFloat ? CSSFLOAT : STYLEFLOAT;\n                    }\n                    node.style[key] = '';\n                }\n                if (node.style.cssText === '') {\n                    node.removeAttribute(STYLE);\n                }\n            },\n            inlineStyle: function (body, name, attributes) {\n                var span = $(Dom.create(body.ownerDocument, name, attributes)), style;\n                body.appendChild(span[0]);\n                style = map(cssAttributes, function (value) {\n                    if (browser.msie && value == 'line-height' && span.css(value) == '1px') {\n                        return 'line-height:1.5';\n                    } else {\n                        return value + ':' + span.css(value);\n                    }\n                }).join(';');\n                span.remove();\n                return style;\n            },\n            getEffectiveBackground: function (element) {\n                var backgroundStyle = element.css('background-color') || '';\n                if (backgroundStyle.indexOf('rgba(0, 0, 0, 0') < 0 && backgroundStyle !== 'transparent') {\n                    return backgroundStyle;\n                } else if (element[0].tagName.toLowerCase() === 'html') {\n                    return 'Window';\n                } else {\n                    return Dom.getEffectiveBackground(element.parent());\n                }\n            },\n            innerText: function (node) {\n                var text = node.innerHTML;\n                text = text.replace(/<!--(.|\\s)*?-->/gi, '');\n                text = text.replace(/<\\/?[^>]+?\\/?>/gm, '');\n                return text;\n            },\n            removeClass: function (node, classNames) {\n                var className = ' ' + node.className + ' ', classes = classNames.split(' '), i, len;\n                for (i = 0, len = classes.length; i < len; i++) {\n                    className = className.replace(' ' + classes[i] + ' ', ' ');\n                }\n                className = $.trim(className);\n                if (className.length) {\n                    node.className = className;\n                } else {\n                    node.removeAttribute(CLASS);\n                }\n            },\n            commonAncestor: function () {\n                var count = arguments.length, paths = [], minPathLength = Infinity, output = null, i, ancestors, node, first, j;\n                if (!count) {\n                    return null;\n                }\n                if (count == 1) {\n                    return arguments[0];\n                }\n                for (i = 0; i < count; i++) {\n                    ancestors = [];\n                    node = arguments[i];\n                    while (node) {\n                        ancestors.push(node);\n                        node = node.parentNode;\n                    }\n                    paths.push(ancestors.reverse());\n                    minPathLength = Math.min(minPathLength, ancestors.length);\n                }\n                if (count == 1) {\n                    return paths[0][0];\n                }\n                for (i = 0; i < minPathLength; i++) {\n                    first = paths[0][i];\n                    for (j = 1; j < count; j++) {\n                        if (first != paths[j][i]) {\n                            return output;\n                        }\n                    }\n                    output = first;\n                }\n                return output;\n            },\n            closestSplittableParent: function (nodes) {\n                var result;\n                if (nodes.length == 1) {\n                    result = Dom.parentOfType(nodes[0], [\n                        'ul',\n                        'ol'\n                    ]);\n                } else {\n                    result = Dom.commonAncestor.apply(null, nodes);\n                }\n                if (!result) {\n                    result = Dom.parentOfType(nodes[0], [\n                        'p',\n                        'td'\n                    ]) || nodes[0].ownerDocument.body;\n                }\n                if (Dom.isInline(result)) {\n                    result = Dom.blockParentOrBody(result);\n                }\n                var editableParents = map(nodes, Dom.editableParent);\n                var editableAncestor = Dom.commonAncestor(editableParents)[0];\n                if ($.contains(result, editableAncestor)) {\n                    result = editableAncestor;\n                }\n                return result;\n            },\n            closestEditable: function (node, types) {\n                var closest;\n                var editable = Dom.editableParent(node);\n                if (Dom.ofType(node, types)) {\n                    closest = node;\n                } else {\n                    closest = Dom.parentOfType(node, types);\n                }\n                if (closest && editable && $.contains(closest, editable)) {\n                    closest = editable;\n                } else if (!closest && editable) {\n                    closest = editable;\n                }\n                return closest;\n            },\n            closestEditableOfType: function (node, types) {\n                var editable = Dom.closestEditable(node, types);\n                if (editable && Dom.ofType(editable, types)) {\n                    return editable;\n                }\n            },\n            filter: function (tagName, nodes, invert) {\n                var filterFn = function (node) {\n                    return Dom.name(node) == tagName;\n                };\n                return Dom.filterBy(nodes, filterFn, invert);\n            },\n            filterBy: function (nodes, condition, invert) {\n                var i = 0;\n                var len = nodes.length;\n                var result = [];\n                var match;\n                for (; i < len; i++) {\n                    match = condition(nodes[i]);\n                    if (match && !invert || !match && invert) {\n                        result.push(nodes[i]);\n                    }\n                }\n                return result;\n            },\n            ensureTrailingBreaks: function (node) {\n                var elements = $(node).find('p,td,th');\n                var length = elements.length;\n                var i = 0;\n                if (length) {\n                    for (; i < length; i++) {\n                        Dom.ensureTrailingBreak(elements[i]);\n                    }\n                } else {\n                    Dom.ensureTrailingBreak(node);\n                }\n            },\n            removeTrailingBreak: function (node) {\n                $(node).find('br[type=_moz],.k-br').remove();\n            },\n            ensureTrailingBreak: function (node) {\n                Dom.removeTrailingBreak(node);\n                var lastChild = node.lastChild;\n                var name = lastChild && Dom.name(lastChild);\n                var br;\n                if (!name || name != 'br' && name != 'img' || name == 'br' && lastChild.className != 'k-br') {\n                    br = node.ownerDocument.createElement('br');\n                    br.className = 'k-br';\n                    node.appendChild(br);\n                }\n            }\n        };\n        kendo.ui.editor.Dom = Dom;\n    }(window.kendo.jQuery));\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('editor/serializer', ['editor/dom'], f);\n}(function () {\n    (function ($, undefined) {\n        var kendo = window.kendo;\n        var Editor = kendo.ui.editor;\n        var dom = Editor.Dom;\n        var extend = $.extend;\n        var fontSizeMappings = 'xx-small,x-small,small,medium,large,x-large,xx-large'.split(',');\n        var quoteRe = /\"/g;\n        var brRe = /<br[^>]*>/i;\n        var pixelRe = /^\\d+(\\.\\d*)?(px)?$/i;\n        var emptyPRe = /<p>(?:&nbsp;)?<\\/p>/i;\n        var cssDeclaration = /(\\*?[-#\\/\\*\\\\\\w]+(?:\\[[0-9a-z_-]+\\])?)\\s*:\\s*((?:'(?:\\\\'|.)*?'|\"(?:\\\\\"|.)*?\"|\\([^\\)]*?\\)|[^};])+)/g;\n        var sizzleAttr = /^sizzle-\\d+/i;\n        var scriptAttr = /^k-script-/i;\n        var onerrorRe = /\\s*onerror\\s*=\\s*(?:'|\")?([^'\">\\s]*)(?:'|\")?/i;\n        var br = '<br class=\"k-br\">';\n        var div = document.createElement('div');\n        div.innerHTML = ' <hr>';\n        var supportsLeadingWhitespace = div.firstChild.nodeType === 3;\n        div = null;\n        var isFunction = $.isFunction;\n        var TD = 'td';\n        var Serializer = {\n            toEditableHtml: function (html) {\n                return (html || '').replace(/<!\\[CDATA\\[(.*)?\\]\\]>/g, '<!--[CDATA[$1]]-->').replace(/<(\\/?)script([^>]*)>/gi, '<$1k:script$2>').replace(/<img([^>]*)>/gi, function (match) {\n                    return match.replace(onerrorRe, '');\n                }).replace(/(<\\/?img[^>]*>)[\\r\\n\\v\\f\\t ]+/gi, '$1').replace(/^<(table|blockquote)/i, br + '<$1').replace(/^[\\s]*(&nbsp;|\\u00a0)/i, '$1').replace(/<\\/(table|blockquote)>$/i, '</$1>' + br);\n            },\n            _toEditableImmutables: function (body) {\n                var immutable = Editor.Immutables.immutable, emptyTextNode = dom.emptyTextNode, first = body.firstChild, last = body.lastChild;\n                while (emptyTextNode(first)) {\n                    first = first.nextSibling;\n                }\n                while (emptyTextNode(last)) {\n                    last = last.previousSibling;\n                }\n                if (first && immutable(first)) {\n                    $(br).prependTo(body);\n                }\n                if (last && immutable(last)) {\n                    $(br).appendTo(body);\n                }\n            },\n            _fillEmptyElements: function (body) {\n                $(body).find('p,td').each(function () {\n                    var p = $(this);\n                    if (/^\\s*$/g.test(p.text()) && !p.find('img,input').length) {\n                        var node = this;\n                        while (node.firstChild && node.firstChild.nodeType != 3) {\n                            node = node.firstChild;\n                        }\n                        if (node.nodeType == 1 && !dom.empty[dom.name(node)]) {\n                            if (dom.is(node, 'td')) {\n                                node.innerHTML = kendo.ui.editor.emptyTableCellContent;\n                            } else {\n                                node.innerHTML = kendo.ui.editor.emptyElementContent;\n                            }\n                        }\n                    }\n                });\n            },\n            _removeSystemElements: function (body) {\n                $('.k-paste-container', body).remove();\n            },\n            _resetOrderedLists: function (root) {\n                var ols = root.getElementsByTagName('ol'), i, ol, originalStart;\n                for (i = 0; i < ols.length; i++) {\n                    ol = ols[i];\n                    originalStart = ol.getAttribute('start');\n                    ol.setAttribute('start', 1);\n                    if (originalStart) {\n                        ol.setAttribute('start', originalStart);\n                    } else {\n                        ol.removeAttribute(originalStart);\n                    }\n                }\n            },\n            _preventScriptExecution: function (root) {\n                $(root).find('*').each(function () {\n                    var attributes = this.attributes;\n                    var attribute, i, l, name;\n                    for (i = 0, l = attributes.length; i < l; i++) {\n                        attribute = attributes[i];\n                        name = attribute.nodeName;\n                        if (attribute.specified && /^on/i.test(name)) {\n                            this.setAttribute('k-script-' + name, attribute.value);\n                            this.removeAttribute(name);\n                        }\n                    }\n                });\n            },\n            htmlToDom: function (html, root, options) {\n                var browser = kendo.support.browser;\n                var msie = browser.msie;\n                var legacyIE = msie && browser.version < 9;\n                var originalSrc = 'originalsrc';\n                var originalHref = 'originalhref';\n                var o = options || {};\n                var immutables = o.immutables;\n                html = Serializer.toEditableHtml(html);\n                if (legacyIE) {\n                    html = '<br/>' + html;\n                    html = html.replace(/href\\s*=\\s*(?:'|\")?([^'\">\\s]*)(?:'|\")?/, originalHref + '=\"$1\"');\n                    html = html.replace(/src\\s*=\\s*(?:'|\")?([^'\">\\s]*)(?:'|\")?/, originalSrc + '=\"$1\"');\n                }\n                if (isFunction(o.custom)) {\n                    html = o.custom(html) || html;\n                }\n                root.innerHTML = html;\n                if (immutables) {\n                    immutables.deserialize(root);\n                }\n                if (legacyIE) {\n                    dom.remove(root.firstChild);\n                    $(root).find('k\\\\:script,script,link,img,a').each(function () {\n                        var node = this;\n                        if (node[originalHref]) {\n                            node.setAttribute('href', node[originalHref]);\n                            node.removeAttribute(originalHref);\n                        }\n                        if (node[originalSrc]) {\n                            node.setAttribute('src', node[originalSrc]);\n                            node.removeAttribute(originalSrc);\n                        }\n                    });\n                } else if (msie) {\n                    dom.normalize(root);\n                    Serializer._resetOrderedLists(root);\n                }\n                Serializer._preventScriptExecution(root);\n                Serializer._fillEmptyElements(root);\n                Serializer._removeSystemElements(root);\n                Serializer._toEditableImmutables(root);\n                $('table', root).addClass('k-table');\n                return root;\n            },\n            domToXhtml: function (root, options) {\n                var result = [];\n                var immutables = options && options.immutables;\n                function semanticFilter(attributes) {\n                    return $.grep(attributes, function (attr) {\n                        return attr.name != 'style';\n                    });\n                }\n                var tagMap = {\n                    iframe: {\n                        start: function (node) {\n                            result.push('<iframe');\n                            attr(node);\n                            result.push('>');\n                        },\n                        end: function () {\n                            result.push('</iframe>');\n                        }\n                    },\n                    'k:script': {\n                        start: function (node) {\n                            result.push('<script');\n                            attr(node);\n                            result.push('>');\n                        },\n                        end: function () {\n                            result.push('</script>');\n                        },\n                        skipEncoding: true\n                    },\n                    span: {\n                        semantic: true,\n                        start: function (node) {\n                            var style = node.style;\n                            var attributes = specifiedAttributes(node);\n                            var semanticAttributes = semanticFilter(attributes);\n                            if (semanticAttributes.length) {\n                                result.push('<span');\n                                attr(node, semanticAttributes);\n                                result.push('>');\n                            }\n                            if (style.textDecoration == 'underline') {\n                                result.push('<u>');\n                            }\n                            var font = [];\n                            if (style.color) {\n                                font.push('color=\"' + dom.toHex(style.color) + '\"');\n                            }\n                            if (style.fontFamily) {\n                                font.push('face=\"' + style.fontFamily + '\"');\n                            }\n                            if (style.fontSize) {\n                                var size = $.inArray(style.fontSize, fontSizeMappings);\n                                font.push('size=\"' + size + '\"');\n                            }\n                            if (font.length) {\n                                result.push('<font ' + font.join(' ') + '>');\n                            }\n                        },\n                        end: function (node) {\n                            var style = node.style;\n                            if (style.color || style.fontFamily || style.fontSize) {\n                                result.push('</font>');\n                            }\n                            if (style.textDecoration == 'underline') {\n                                result.push('</u>');\n                            }\n                            if (semanticFilter(specifiedAttributes(node)).length) {\n                                result.push('</span>');\n                            }\n                        }\n                    },\n                    strong: {\n                        semantic: true,\n                        start: function () {\n                            result.push('<b>');\n                        },\n                        end: function () {\n                            result.push('</b>');\n                        }\n                    },\n                    em: {\n                        semantic: true,\n                        start: function () {\n                            result.push('<i>');\n                        },\n                        end: function () {\n                            result.push('</i>');\n                        }\n                    },\n                    b: {\n                        semantic: false,\n                        start: function () {\n                            result.push('<strong>');\n                        },\n                        end: function () {\n                            result.push('</strong>');\n                        }\n                    },\n                    i: {\n                        semantic: false,\n                        start: function () {\n                            result.push('<em>');\n                        },\n                        end: function () {\n                            result.push('</em>');\n                        }\n                    },\n                    u: {\n                        semantic: false,\n                        start: function () {\n                            result.push('<span style=\"text-decoration:underline;\">');\n                        },\n                        end: function () {\n                            result.push('</span>');\n                        }\n                    },\n                    font: {\n                        semantic: false,\n                        start: function (node) {\n                            result.push('<span style=\"');\n                            var color = node.getAttribute('color');\n                            var size = fontSizeMappings[node.getAttribute('size')];\n                            var face = node.getAttribute('face');\n                            if (color) {\n                                result.push('color:');\n                                result.push(dom.toHex(color));\n                                result.push(';');\n                            }\n                            if (face) {\n                                result.push('font-family:');\n                                result.push(face);\n                                result.push(';');\n                            }\n                            if (size) {\n                                result.push('font-size:');\n                                result.push(size);\n                                result.push(';');\n                            }\n                            result.push('\">');\n                        },\n                        end: function () {\n                            result.push('</span>');\n                        }\n                    }\n                };\n                tagMap.script = tagMap['k:script'];\n                options = options || {};\n                if (typeof options.semantic == 'undefined') {\n                    options.semantic = true;\n                }\n                function cssProperties(cssText) {\n                    var trim = $.trim;\n                    var css = trim(cssText);\n                    var match;\n                    var property, value;\n                    var properties = [];\n                    cssDeclaration.lastIndex = 0;\n                    while (true) {\n                        match = cssDeclaration.exec(css);\n                        if (!match) {\n                            break;\n                        }\n                        property = trim(match[1].toLowerCase());\n                        value = trim(match[2]);\n                        if (property == 'font-size-adjust' || property == 'font-stretch') {\n                            continue;\n                        }\n                        if (property.indexOf('color') >= 0) {\n                            value = dom.toHex(value);\n                        } else if (property.indexOf('font') >= 0) {\n                            value = value.replace(quoteRe, '\\'');\n                        } else if (/\\burl\\(/g.test(value)) {\n                            value = value.replace(quoteRe, '');\n                        }\n                        properties.push({\n                            property: property,\n                            value: value\n                        });\n                    }\n                    return properties;\n                }\n                function styleAttr(cssText) {\n                    var properties = cssProperties(cssText);\n                    var i;\n                    for (i = 0; i < properties.length; i++) {\n                        result.push(properties[i].property);\n                        result.push(':');\n                        result.push(properties[i].value);\n                        result.push(';');\n                    }\n                }\n                function specifiedAttributes(node) {\n                    var result = [];\n                    var attributes = node.attributes;\n                    var attribute, i, l;\n                    var name, value, specified;\n                    for (i = 0, l = attributes.length; i < l; i++) {\n                        attribute = attributes[i];\n                        name = attribute.nodeName;\n                        value = attribute.value;\n                        specified = attribute.specified;\n                        if (name == 'value' && 'value' in node && node.value) {\n                            specified = true;\n                        } else if (name == 'type' && value == 'text') {\n                            specified = true;\n                        } else if (name == 'class' && !value) {\n                            specified = false;\n                        } else if (sizzleAttr.test(name)) {\n                            specified = false;\n                        } else if (name == 'complete') {\n                            specified = false;\n                        } else if (name == 'altHtml') {\n                            specified = false;\n                        } else if (name == 'start' && dom.is(node, 'ul')) {\n                            specified = false;\n                        } else if (name == 'start' && dom.is(node, 'ol') && value == '1') {\n                            specified = false;\n                        } else if (name.indexOf('_moz') >= 0) {\n                            specified = false;\n                        } else if (scriptAttr.test(name)) {\n                            specified = !!options.scripts;\n                        } else if (name == 'data-role' && value == 'resizable' && (dom.is(node, 'tr') || dom.is(node, 'td'))) {\n                            specified = false;\n                        }\n                        if (specified) {\n                            result.push(attribute);\n                        }\n                    }\n                    return result;\n                }\n                function attr(node, attributes) {\n                    var i, l, attribute, name, value;\n                    attributes = attributes || specifiedAttributes(node);\n                    if (dom.is(node, 'img')) {\n                        var width = node.style.width, height = node.style.height, $node = $(node);\n                        if (width && pixelRe.test(width)) {\n                            $node.attr('width', parseInt(width, 10));\n                            dom.unstyle(node, { width: undefined });\n                        }\n                        if (height && pixelRe.test(height)) {\n                            $node.attr('height', parseInt(height, 10));\n                            dom.unstyle(node, { height: undefined });\n                        }\n                    }\n                    if (!attributes.length) {\n                        return;\n                    }\n                    attributes.sort(function (a, b) {\n                        return a.nodeName > b.nodeName ? 1 : a.nodeName < b.nodeName ? -1 : 0;\n                    });\n                    for (i = 0, l = attributes.length; i < l; i++) {\n                        attribute = attributes[i];\n                        name = attribute.nodeName;\n                        value = attribute.value;\n                        if (name == 'class' && value == 'k-table') {\n                            continue;\n                        }\n                        name = name.replace(scriptAttr, '');\n                        result.push(' ');\n                        result.push(name);\n                        result.push('=\"');\n                        if (name == 'style') {\n                            styleAttr(value || node.style.cssText);\n                        } else if (name == 'src' || name == 'href') {\n                            result.push(kendo.htmlEncode(node.getAttribute(name, 2)));\n                        } else {\n                            result.push(dom.fillAttrs[name] ? name : value);\n                        }\n                        result.push('\"');\n                    }\n                }\n                function children(node, skip, skipEncoding) {\n                    for (var childNode = node.firstChild; childNode; childNode = childNode.nextSibling) {\n                        child(childNode, skip, skipEncoding);\n                    }\n                }\n                function text(node) {\n                    return node.nodeValue.replace(/\\ufeff/g, '');\n                }\n                function isEmptyBomNode(node) {\n                    if (node.nodeValue === '\\uFEFF') {\n                        do {\n                            node = node.parentNode;\n                            if (dom.is(node, TD) && node.childNodes.length === 1) {\n                                return true;\n                            }\n                            if (node.childNodes.length !== 1) {\n                                return false;\n                            }\n                        } while (!dom.isBlock(node));\n                        return true;\n                    }\n                    return false;\n                }\n                function child(node, skip, skipEncoding) {\n                    var nodeType = node.nodeType, tagName, mapper, parent, value, previous, jqNode;\n                    if (immutables && Editor.Immutables.immutable(node)) {\n                        result.push(immutables.serialize(node));\n                    } else if (nodeType == 1) {\n                        tagName = dom.name(node);\n                        jqNode = $(node);\n                        if (jqNode.hasClass('k-table-resize-handle-wrapper') || jqNode.hasClass('k-column-resize-handle-wrapper') || jqNode.hasClass('k-row-resize-handle-wrapper')) {\n                            return;\n                        }\n                        if (!tagName || dom.insignificant(node)) {\n                            return;\n                        }\n                        if (!options.scripts && (tagName == 'script' || tagName == 'k:script')) {\n                            return;\n                        }\n                        mapper = tagMap[tagName];\n                        if (mapper) {\n                            if (typeof mapper.semantic == 'undefined' || options.semantic ^ mapper.semantic) {\n                                mapper.start(node);\n                                children(node, false, mapper.skipEncoding);\n                                mapper.end(node);\n                                return;\n                            }\n                        }\n                        result.push('<');\n                        result.push(tagName);\n                        attr(node);\n                        if (dom.empty[tagName]) {\n                            result.push(' />');\n                        } else {\n                            result.push('>');\n                            children(node, skip || dom.is(node, 'pre'));\n                            result.push('</');\n                            result.push(tagName);\n                            result.push('>');\n                        }\n                    } else if (nodeType == 3) {\n                        if (isEmptyBomNode(node)) {\n                            result.push('&nbsp;');\n                            return;\n                        }\n                        value = text(node);\n                        if (!skip && supportsLeadingWhitespace) {\n                            parent = node.parentNode;\n                            previous = node.previousSibling;\n                            if (!previous) {\n                                previous = (dom.isInline(parent) ? parent : node).previousSibling;\n                            }\n                            if (!previous || previous.innerHTML === '' || dom.isBlock(previous)) {\n                                value = value.replace(/^[\\r\\n\\v\\f\\t ]+/, '');\n                            }\n                            value = value.replace(/ +/, ' ');\n                        }\n                        result.push(skipEncoding ? value : dom.encode(value, options));\n                    } else if (nodeType == 4) {\n                        result.push('<![CDATA[');\n                        result.push(node.data);\n                        result.push(']]>');\n                    } else if (nodeType == 8) {\n                        if (node.data.indexOf('[CDATA[') < 0) {\n                            result.push('<!--');\n                            result.push(node.data);\n                            result.push('-->');\n                        } else {\n                            result.push('<!');\n                            result.push(node.data);\n                            result.push('>');\n                        }\n                    }\n                }\n                function textOnly(root) {\n                    var childrenCount = root.childNodes.length;\n                    var textChild = childrenCount && root.firstChild.nodeType == 3;\n                    return textChild && (childrenCount == 1 || childrenCount == 2 && dom.insignificant(root.lastChild));\n                }\n                function runCustom() {\n                    if ($.isFunction(options.custom)) {\n                        result = options.custom(result) || result;\n                    }\n                }\n                if (textOnly(root)) {\n                    result = dom.encode(text(root.firstChild).replace(/[\\r\\n\\v\\f\\t ]+/, ' '), options);\n                    runCustom();\n                    return result;\n                }\n                children(root);\n                result = result.join('');\n                runCustom();\n                if (result.replace(brRe, '').replace(emptyPRe, '') === '') {\n                    return '';\n                }\n                return result;\n            }\n        };\n        extend(Editor, { Serializer: Serializer });\n    }(window.kendo.jQuery));\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('editor/range', ['editor/serializer'], f);\n}(function () {\n    (function ($) {\n        var kendo = window.kendo, Class = kendo.Class, extend = $.extend, Editor = kendo.ui.editor, browser = kendo.support.browser, dom = Editor.Dom, findNodeIndex = dom.findNodeIndex, isDataNode = dom.isDataNode, findClosestAncestor = dom.findClosestAncestor, getNodeLength = dom.getNodeLength, normalize = dom.normalize;\n        var SelectionUtils = {\n            selectionFromWindow: function (window) {\n                if (!('getSelection' in window)) {\n                    return new W3CSelection(window.document);\n                }\n                return window.getSelection();\n            },\n            selectionFromRange: function (range) {\n                var rangeDocument = RangeUtils.documentFromRange(range);\n                return SelectionUtils.selectionFromDocument(rangeDocument);\n            },\n            selectionFromDocument: function (document) {\n                return SelectionUtils.selectionFromWindow(dom.windowFromDocument(document));\n            }\n        };\n        var W3CRange = Class.extend({\n            init: function (doc) {\n                $.extend(this, {\n                    ownerDocument: doc,\n                    startContainer: doc,\n                    endContainer: doc,\n                    commonAncestorContainer: doc,\n                    startOffset: 0,\n                    endOffset: 0,\n                    collapsed: true\n                });\n            },\n            setStart: function (node, offset) {\n                this.startContainer = node;\n                this.startOffset = offset;\n                updateRangeProperties(this);\n                fixIvalidRange(this, true);\n            },\n            setEnd: function (node, offset) {\n                this.endContainer = node;\n                this.endOffset = offset;\n                updateRangeProperties(this);\n                fixIvalidRange(this, false);\n            },\n            setStartBefore: function (node) {\n                this.setStart(node.parentNode, findNodeIndex(node));\n            },\n            setStartAfter: function (node) {\n                this.setStart(node.parentNode, findNodeIndex(node) + 1);\n            },\n            setEndBefore: function (node) {\n                this.setEnd(node.parentNode, findNodeIndex(node));\n            },\n            setEndAfter: function (node) {\n                this.setEnd(node.parentNode, findNodeIndex(node) + 1);\n            },\n            selectNode: function (node) {\n                this.setStartBefore(node);\n                this.setEndAfter(node);\n            },\n            selectNodeContents: function (node) {\n                this.setStart(node, 0);\n                this.setEnd(node, node[node.nodeType === 1 ? 'childNodes' : 'nodeValue'].length);\n            },\n            collapse: function (toStart) {\n                var that = this;\n                if (toStart) {\n                    that.setEnd(that.startContainer, that.startOffset);\n                } else {\n                    that.setStart(that.endContainer, that.endOffset);\n                }\n            },\n            deleteContents: function () {\n                var that = this, range = that.cloneRange();\n                if (that.startContainer != that.commonAncestorContainer) {\n                    that.setStartAfter(findClosestAncestor(that.commonAncestorContainer, that.startContainer));\n                }\n                that.collapse(true);\n                (function deleteSubtree(iterator) {\n                    while (iterator.next()) {\n                        if (iterator.hasPartialSubtree()) {\n                            deleteSubtree(iterator.getSubtreeIterator());\n                        } else {\n                            iterator.remove();\n                        }\n                    }\n                }(new RangeIterator(range)));\n            },\n            cloneContents: function () {\n                var document = RangeUtils.documentFromRange(this);\n                return function cloneSubtree(iterator) {\n                    var node, frag = document.createDocumentFragment();\n                    while (node = iterator.next()) {\n                        node = node.cloneNode(!iterator.hasPartialSubtree());\n                        if (iterator.hasPartialSubtree()) {\n                            node.appendChild(cloneSubtree(iterator.getSubtreeIterator()));\n                        }\n                        frag.appendChild(node);\n                    }\n                    return frag;\n                }(new RangeIterator(this));\n            },\n            extractContents: function () {\n                var that = this, range = that.cloneRange();\n                if (that.startContainer != that.commonAncestorContainer) {\n                    that.setStartAfter(findClosestAncestor(that.commonAncestorContainer, that.startContainer));\n                }\n                that.collapse(true);\n                var document = RangeUtils.documentFromRange(that);\n                return function extractSubtree(iterator) {\n                    var node, frag = document.createDocumentFragment();\n                    while (node = iterator.next()) {\n                        if (iterator.hasPartialSubtree()) {\n                            node = node.cloneNode(false);\n                            node.appendChild(extractSubtree(iterator.getSubtreeIterator()));\n                        } else {\n                            iterator.remove(that.originalRange);\n                        }\n                        frag.appendChild(node);\n                    }\n                    return frag;\n                }(new RangeIterator(range));\n            },\n            insertNode: function (node) {\n                var that = this;\n                if (isDataNode(that.startContainer)) {\n                    if (that.startOffset != that.startContainer.nodeValue.length) {\n                        dom.splitDataNode(that.startContainer, that.startOffset);\n                    }\n                    dom.insertAfter(node, that.startContainer);\n                } else {\n                    dom.insertAt(that.startContainer, node, that.startOffset);\n                }\n                that.setStart(that.startContainer, that.startOffset);\n            },\n            cloneRange: function () {\n                return $.extend(new W3CRange(this.ownerDocument), {\n                    startContainer: this.startContainer,\n                    endContainer: this.endContainer,\n                    commonAncestorContainer: this.commonAncestorContainer,\n                    startOffset: this.startOffset,\n                    endOffset: this.endOffset,\n                    collapsed: this.collapsed,\n                    originalRange: this\n                });\n            },\n            toString: function () {\n                var startNodeName = this.startContainer.nodeName, endNodeName = this.endContainer.nodeName;\n                return [\n                    startNodeName == '#text' ? this.startContainer.nodeValue : startNodeName,\n                    '(',\n                    this.startOffset,\n                    ') : ',\n                    endNodeName == '#text' ? this.endContainer.nodeValue : endNodeName,\n                    '(',\n                    this.endOffset,\n                    ')'\n                ].join('');\n            }\n        });\n        W3CRange.fromNode = function (node) {\n            return new W3CRange(node.ownerDocument);\n        };\n        function compareBoundaries(start, end, startOffset, endOffset) {\n            if (start == end) {\n                return endOffset - startOffset;\n            }\n            var container = end;\n            while (container && container.parentNode != start) {\n                container = container.parentNode;\n            }\n            if (container) {\n                return findNodeIndex(container) - startOffset;\n            }\n            container = start;\n            while (container && container.parentNode != end) {\n                container = container.parentNode;\n            }\n            if (container) {\n                return endOffset - findNodeIndex(container) - 1;\n            }\n            var root = dom.commonAncestor(start, end);\n            var startAncestor = start;\n            while (startAncestor && startAncestor.parentNode != root) {\n                startAncestor = startAncestor.parentNode;\n            }\n            if (!startAncestor) {\n                startAncestor = root;\n            }\n            var endAncestor = end;\n            while (endAncestor && endAncestor.parentNode != root) {\n                endAncestor = endAncestor.parentNode;\n            }\n            if (!endAncestor) {\n                endAncestor = root;\n            }\n            if (startAncestor == endAncestor) {\n                return 0;\n            }\n            return findNodeIndex(endAncestor) - findNodeIndex(startAncestor);\n        }\n        function fixIvalidRange(range, toStart) {\n            function isInvalidRange(range) {\n                try {\n                    return compareBoundaries(range.startContainer, range.endContainer, range.startOffset, range.endOffset) < 0;\n                } catch (ex) {\n                    return true;\n                }\n            }\n            if (isInvalidRange(range)) {\n                if (toStart) {\n                    range.commonAncestorContainer = range.endContainer = range.startContainer;\n                    range.endOffset = range.startOffset;\n                } else {\n                    range.commonAncestorContainer = range.startContainer = range.endContainer;\n                    range.startOffset = range.endOffset;\n                }\n                range.collapsed = true;\n            }\n        }\n        function updateRangeProperties(range) {\n            range.collapsed = range.startContainer == range.endContainer && range.startOffset == range.endOffset;\n            var node = range.startContainer;\n            while (node && node != range.endContainer && !dom.isAncestorOf(node, range.endContainer)) {\n                node = node.parentNode;\n            }\n            range.commonAncestorContainer = node;\n        }\n        var RangeIterator = Class.extend({\n            init: function (range) {\n                $.extend(this, {\n                    range: range,\n                    _current: null,\n                    _next: null,\n                    _end: null\n                });\n                if (range.collapsed) {\n                    return;\n                }\n                var root = range.commonAncestorContainer;\n                this._next = range.startContainer == root && !isDataNode(range.startContainer) ? range.startContainer.childNodes[range.startOffset] : findClosestAncestor(root, range.startContainer);\n                this._end = range.endContainer == root && !isDataNode(range.endContainer) ? range.endContainer.childNodes[range.endOffset] : findClosestAncestor(root, range.endContainer).nextSibling;\n            },\n            hasNext: function () {\n                return !!this._next;\n            },\n            next: function () {\n                var that = this, current = that._current = that._next;\n                that._next = that._current && that._current.nextSibling != that._end ? that._current.nextSibling : null;\n                if (isDataNode(that._current)) {\n                    if (that.range.endContainer == that._current) {\n                        current = current.cloneNode(true);\n                        current.deleteData(that.range.endOffset, current.length - that.range.endOffset);\n                    }\n                    if (that.range.startContainer == that._current) {\n                        current = current.cloneNode(true);\n                        current.deleteData(0, that.range.startOffset);\n                    }\n                }\n                return current;\n            },\n            traverse: function (callback) {\n                var that = this, current;\n                function next() {\n                    that._current = that._next;\n                    that._next = that._current && that._current.nextSibling != that._end ? that._current.nextSibling : null;\n                    return that._current;\n                }\n                while (current = next()) {\n                    if (that.hasPartialSubtree()) {\n                        that.getSubtreeIterator().traverse(callback);\n                    } else {\n                        callback(current);\n                    }\n                }\n                return current;\n            },\n            remove: function (originalRange) {\n                var that = this, inStartContainer = that.range.startContainer == that._current, inEndContainer = that.range.endContainer == that._current, start, end, delta;\n                if (isDataNode(that._current) && (inStartContainer || inEndContainer)) {\n                    start = inStartContainer ? that.range.startOffset : 0;\n                    end = inEndContainer ? that.range.endOffset : that._current.length;\n                    delta = end - start;\n                    if (originalRange && (inStartContainer || inEndContainer)) {\n                        if (that._current == originalRange.startContainer && start <= originalRange.startOffset) {\n                            originalRange.startOffset -= delta;\n                        }\n                        if (that._current == originalRange.endContainer && end <= originalRange.endOffset) {\n                            originalRange.endOffset -= delta;\n                        }\n                    }\n                    that._current.deleteData(start, delta);\n                } else {\n                    var parent = that._current.parentNode;\n                    if (originalRange && (that.range.startContainer == parent || that.range.endContainer == parent)) {\n                        var nodeIndex = findNodeIndex(that._current);\n                        if (parent == originalRange.startContainer && nodeIndex <= originalRange.startOffset) {\n                            originalRange.startOffset -= 1;\n                        }\n                        if (parent == originalRange.endContainer && nodeIndex < originalRange.endOffset) {\n                            originalRange.endOffset -= 1;\n                        }\n                    }\n                    dom.remove(that._current);\n                }\n            },\n            hasPartialSubtree: function () {\n                return !isDataNode(this._current) && (dom.isAncestorOrSelf(this._current, this.range.startContainer) || dom.isAncestorOrSelf(this._current, this.range.endContainer));\n            },\n            getSubtreeIterator: function () {\n                return new RangeIterator(this.getSubRange());\n            },\n            getSubRange: function () {\n                var that = this, subRange = that.range.cloneRange();\n                subRange.selectNodeContents(that._current);\n                if (dom.isAncestorOrSelf(that._current, that.range.startContainer)) {\n                    subRange.setStart(that.range.startContainer, that.range.startOffset);\n                }\n                if (dom.isAncestorOrSelf(that._current, that.range.endContainer)) {\n                    subRange.setEnd(that.range.endContainer, that.range.endOffset);\n                }\n                return subRange;\n            }\n        });\n        var W3CSelection = Class.extend({\n            init: function (doc) {\n                this.ownerDocument = doc;\n                this.rangeCount = 1;\n            },\n            addRange: function (range) {\n                var textRange = this.ownerDocument.body.createTextRange();\n                adoptContainer(textRange, range, false);\n                adoptContainer(textRange, range, true);\n                textRange.select();\n            },\n            removeAllRanges: function () {\n                var selection = this.ownerDocument.selection;\n                if (selection.type != 'None') {\n                    selection.empty();\n                }\n            },\n            getRangeAt: function () {\n                var textRange, range = new W3CRange(this.ownerDocument), selection = this.ownerDocument.selection, element, commonAncestor;\n                try {\n                    textRange = selection.createRange();\n                    element = textRange.item ? textRange.item(0) : textRange.parentElement();\n                    if (element.ownerDocument != this.ownerDocument) {\n                        return range;\n                    }\n                } catch (ex) {\n                    return range;\n                }\n                if (selection.type == 'Control') {\n                    range.selectNode(textRange.item(0));\n                } else {\n                    commonAncestor = textRangeContainer(textRange);\n                    adoptEndPoint(textRange, range, commonAncestor, true);\n                    adoptEndPoint(textRange, range, commonAncestor, false);\n                    if (range.startContainer.nodeType == 9) {\n                        range.setStart(range.endContainer, range.startOffset);\n                    }\n                    if (range.endContainer.nodeType == 9) {\n                        range.setEnd(range.startContainer, range.endOffset);\n                    }\n                    if (textRange.compareEndPoints('StartToEnd', textRange) === 0) {\n                        range.collapse(false);\n                    }\n                    var startContainer = range.startContainer, endContainer = range.endContainer, body = this.ownerDocument.body;\n                    if (!range.collapsed && range.startOffset === 0 && range.endOffset == getNodeLength(range.endContainer) && !(startContainer == endContainer && isDataNode(startContainer) && startContainer.parentNode == body)) {\n                        var movedStart = false, movedEnd = false;\n                        while (findNodeIndex(startContainer) === 0 && startContainer == startContainer.parentNode.firstChild && startContainer != body) {\n                            startContainer = startContainer.parentNode;\n                            movedStart = true;\n                        }\n                        while (findNodeIndex(endContainer) == getNodeLength(endContainer.parentNode) - 1 && endContainer == endContainer.parentNode.lastChild && endContainer != body) {\n                            endContainer = endContainer.parentNode;\n                            movedEnd = true;\n                        }\n                        if (startContainer == body && endContainer == body && movedStart && movedEnd) {\n                            range.setStart(startContainer, 0);\n                            range.setEnd(endContainer, getNodeLength(body));\n                        }\n                    }\n                }\n                return range;\n            }\n        });\n        function textRangeContainer(textRange) {\n            var left = textRange.duplicate(), right = textRange.duplicate();\n            left.collapse(true);\n            right.collapse(false);\n            return dom.commonAncestor(textRange.parentElement(), left.parentElement(), right.parentElement());\n        }\n        function adoptContainer(textRange, range, start) {\n            var container = range[start ? 'startContainer' : 'endContainer'], offset = range[start ? 'startOffset' : 'endOffset'], textOffset = 0, isData = isDataNode(container), anchorNode = isData ? container : container.childNodes[offset] || null, anchorParent = isData ? container.parentNode : container, doc = range.ownerDocument, cursor = doc.body.createTextRange(), cursorNode;\n            if (container.nodeType == 3 || container.nodeType == 4) {\n                textOffset = offset;\n            }\n            if (!anchorParent) {\n                anchorParent = doc.body;\n            }\n            if (anchorParent.nodeName.toLowerCase() == 'img') {\n                cursor.moveToElementText(anchorParent);\n                cursor.collapse(false);\n                textRange.setEndPoint(start ? 'StartToStart' : 'EndToStart', cursor);\n            } else {\n                cursorNode = anchorParent.insertBefore(dom.create(doc, 'a'), anchorNode);\n                cursor.moveToElementText(cursorNode);\n                dom.remove(cursorNode);\n                cursor[start ? 'moveStart' : 'moveEnd']('character', textOffset);\n                cursor.collapse(false);\n                textRange.setEndPoint(start ? 'StartToStart' : 'EndToStart', cursor);\n            }\n        }\n        function adoptEndPoint(textRange, range, commonAncestor, start) {\n            var cursorNode = dom.create(range.ownerDocument, 'a'), cursor = textRange.duplicate(), comparison = start ? 'StartToStart' : 'StartToEnd', result, parent, target, previous, next, args, index, appended = false;\n            cursorNode.innerHTML = '\\uFEFF';\n            cursor.collapse(start);\n            parent = cursor.parentElement();\n            if (!dom.isAncestorOrSelf(commonAncestor, parent)) {\n                parent = commonAncestor;\n            }\n            do {\n                if (appended) {\n                    parent.insertBefore(cursorNode, cursorNode.previousSibling);\n                } else {\n                    parent.appendChild(cursorNode);\n                    appended = true;\n                }\n                cursor.moveToElementText(cursorNode);\n            } while ((result = cursor.compareEndPoints(comparison, textRange)) > 0 && cursorNode.previousSibling);\n            target = cursorNode.nextSibling;\n            if (result == -1 && isDataNode(target)) {\n                cursor.setEndPoint(start ? 'EndToStart' : 'EndToEnd', textRange);\n                dom.remove(cursorNode);\n                args = [\n                    target,\n                    cursor.text.length\n                ];\n            } else {\n                previous = !start && cursorNode.previousSibling;\n                next = start && cursorNode.nextSibling;\n                if (isDataNode(next)) {\n                    args = [\n                        next,\n                        0\n                    ];\n                } else if (isDataNode(previous)) {\n                    args = [\n                        previous,\n                        previous.length\n                    ];\n                } else {\n                    index = findNodeIndex(cursorNode);\n                    if (parent.nextSibling && index == parent.childNodes.length - 1) {\n                        args = [\n                            parent.nextSibling,\n                            0\n                        ];\n                    } else {\n                        args = [\n                            parent,\n                            index\n                        ];\n                    }\n                }\n                dom.remove(cursorNode);\n            }\n            range[start ? 'setStart' : 'setEnd'].apply(range, args);\n        }\n        var RangeEnumerator = Class.extend({\n            init: function (range) {\n                this.enumerate = function () {\n                    var nodes = [];\n                    function visit(node) {\n                        if (dom.is(node, 'img') || node.nodeType == 3 && (!dom.isEmptyspace(node) || node.nodeValue == '\\uFEFF')) {\n                            nodes.push(node);\n                        } else {\n                            node = node.firstChild;\n                            while (node) {\n                                visit(node);\n                                node = node.nextSibling;\n                            }\n                        }\n                    }\n                    new RangeIterator(range).traverse(visit);\n                    return nodes;\n                };\n            }\n        });\n        var ImmutablesRangeIterator = RangeIterator.extend({\n            hasPartialSubtree: function () {\n                var immutable = Editor.Immutables && Editor.Immutables.immutable;\n                return immutable && !immutable(this._current) && RangeIterator.fn.hasPartialSubtree.call(this);\n            },\n            getSubtreeIterator: function () {\n                return new ImmutablesRangeIterator(this.getSubRange());\n            }\n        });\n        var ImmutablesRangeEnumerator = Class.extend({\n            init: function (range) {\n                this.enumerate = function () {\n                    var nodes = [];\n                    var immutable = Editor.Immutables && Editor.Immutables.immutable;\n                    function visit(node) {\n                        if (immutable && !immutable(node)) {\n                            if (dom.is(node, 'img') || node.nodeType == 3 && (!dom.isEmptyspace(node) || node.nodeValue == '\\uFEFF')) {\n                                nodes.push(node);\n                            } else {\n                                node = node.firstChild;\n                                while (node) {\n                                    visit(node);\n                                    node = node.nextSibling;\n                                }\n                            }\n                        }\n                    }\n                    new ImmutablesRangeIterator(range).traverse(visit);\n                    return nodes;\n                };\n            }\n        });\n        var RestorePoint = Class.extend({\n            init: function (range, body, options) {\n                var that = this;\n                that.range = range;\n                that.rootNode = RangeUtils.documentFromRange(range);\n                that.body = body || that.getEditable(range);\n                if (dom.name(that.body) != 'body') {\n                    that.rootNode = that.body;\n                }\n                that.startContainer = that.nodeToPath(range.startContainer);\n                that.endContainer = that.nodeToPath(range.endContainer);\n                that.startOffset = that.offset(range.startContainer, range.startOffset);\n                that.endOffset = that.offset(range.endContainer, range.endOffset);\n                that.immutables = options && options.immutables;\n                if (that.immutables) {\n                    that.serializedImmutables = Editor.Immutables.removeImmutables(that.body);\n                }\n                that.html = that.body.innerHTML;\n                if (that.immutables && !that.serializedImmutables.empty) {\n                    Editor.Immutables.restoreImmutables(that.body, that.serializedImmutables);\n                }\n            },\n            index: function (node) {\n                var result = 0, lastType = node.nodeType;\n                while (node = node.previousSibling) {\n                    var nodeType = node.nodeType;\n                    if (nodeType != 3 || lastType != nodeType) {\n                        result++;\n                    }\n                    lastType = nodeType;\n                }\n                return result;\n            },\n            getEditable: function (range) {\n                var root = range.commonAncestorContainer;\n                while (root && (root.nodeType == 3 || root.attributes && (!root.attributes.contentEditable || root.attributes.contentEditable.nodeValue.toLowerCase() == 'false'))) {\n                    root = root.parentNode;\n                }\n                return root;\n            },\n            restoreHtml: function () {\n                var that = this;\n                dom.removeChildren(that.body);\n                that.body.innerHTML = that.html;\n                if (that.immutables && !that.serializedImmutables.empty) {\n                    Editor.Immutables.restoreImmutables(that.body, that.serializedImmutables);\n                }\n            },\n            offset: function (node, value) {\n                if (node.nodeType == 3) {\n                    while ((node = node.previousSibling) && node.nodeType == 3) {\n                        value += node.nodeValue.length;\n                    }\n                }\n                return value;\n            },\n            nodeToPath: function (node) {\n                var path = [];\n                while (node != this.rootNode) {\n                    path.push(this.index(node));\n                    node = node.parentNode;\n                }\n                return path;\n            },\n            toRangePoint: function (range, start, path, denormalizedOffset) {\n                var node = this.rootNode, length = path.length, offset = denormalizedOffset;\n                while (length--) {\n                    node = node.childNodes[path[length]];\n                }\n                while (node && node.nodeType == 3 && node.nodeValue.length < offset) {\n                    offset -= node.nodeValue.length;\n                    node = node.nextSibling;\n                }\n                if (node && offset >= 0) {\n                    range[start ? 'setStart' : 'setEnd'](node, offset);\n                }\n            },\n            toRange: function () {\n                var that = this, result = that.range.cloneRange();\n                that.toRangePoint(result, true, that.startContainer, that.startOffset);\n                that.toRangePoint(result, false, that.endContainer, that.endOffset);\n                return result;\n            }\n        });\n        var Marker = Class.extend({\n            init: function () {\n                this.caret = null;\n            },\n            addCaret: function (range) {\n                var that = this;\n                var caret = that.caret = dom.create(RangeUtils.documentFromRange(range), 'span', { className: 'k-marker' });\n                range.insertNode(caret);\n                dom.stripBomNode(caret.previousSibling);\n                dom.stripBomNode(caret.nextSibling);\n                range.selectNode(caret);\n                return caret;\n            },\n            removeCaret: function (range) {\n                var that = this, previous = that.caret.previousSibling, startOffset = 0;\n                if (previous) {\n                    startOffset = isDataNode(previous) ? previous.nodeValue.length : findNodeIndex(previous);\n                }\n                var container = that.caret.parentNode;\n                var containerIndex = previous ? findNodeIndex(previous) : 0;\n                dom.remove(that.caret);\n                normalize(container);\n                var node = container.childNodes[containerIndex];\n                if (isDataNode(node)) {\n                    range.setStart(node, startOffset);\n                } else if (node) {\n                    var textNode = dom.lastTextNode(node);\n                    if (textNode) {\n                        range.setStart(textNode, textNode.nodeValue.length);\n                    } else {\n                        range[previous ? 'setStartAfter' : 'setStartBefore'](node);\n                    }\n                } else {\n                    if (!browser.msie && !container.innerHTML) {\n                        container.innerHTML = '<br _moz_dirty=\"\" />';\n                    }\n                    range.selectNodeContents(container);\n                }\n                range.collapse(true);\n            },\n            add: function (range, expand) {\n                var that = this;\n                var collapsed = range.collapsed && !RangeUtils.isExpandable(range);\n                var doc = RangeUtils.documentFromRange(range);\n                if (expand && range.collapsed) {\n                    that.addCaret(range);\n                    range = RangeUtils.expand(range);\n                }\n                var rangeBoundary = range.cloneRange();\n                rangeBoundary.collapse(false);\n                that.end = dom.create(doc, 'span', { className: 'k-marker' });\n                rangeBoundary.insertNode(that.end);\n                rangeBoundary = range.cloneRange();\n                rangeBoundary.collapse(true);\n                that.start = that.end.cloneNode(true);\n                rangeBoundary.insertNode(that.start);\n                that._removeDeadMarkers(that.start, that.end);\n                if (collapsed) {\n                    var bom = doc.createTextNode('\\uFEFF');\n                    dom.insertAfter(bom.cloneNode(), that.start);\n                    dom.insertBefore(bom, that.end);\n                }\n                normalize(range.commonAncestorContainer);\n                range.setStartBefore(that.start);\n                range.setEndAfter(that.end);\n                return range;\n            },\n            _removeDeadMarkers: function (start, end) {\n                if (start.previousSibling && start.previousSibling.nodeValue == '\\uFEFF') {\n                    dom.remove(start.previousSibling);\n                }\n                if (end.nextSibling && end.nextSibling.nodeValue == '\\uFEFF') {\n                    dom.remove(end.nextSibling);\n                }\n            },\n            _normalizedIndex: function (node) {\n                var index = findNodeIndex(node);\n                var pointer = node;\n                while (pointer.previousSibling) {\n                    if (pointer.nodeType == 3 && pointer.previousSibling.nodeType == 3) {\n                        index--;\n                    }\n                    pointer = pointer.previousSibling;\n                }\n                return index;\n            },\n            remove: function (range) {\n                var that = this, start = that.start, end = that.end, shouldNormalizeStart, shouldNormalizeEnd, shouldNormalize;\n                normalize(range.commonAncestorContainer);\n                while (!start.nextSibling && start.parentNode) {\n                    start = start.parentNode;\n                }\n                while (!end.previousSibling && end.parentNode) {\n                    end = end.parentNode;\n                }\n                shouldNormalizeStart = start.previousSibling && start.previousSibling.nodeType == 3 && (start.nextSibling && start.nextSibling.nodeType == 3);\n                shouldNormalizeEnd = end.previousSibling && end.previousSibling.nodeType == 3 && (end.nextSibling && end.nextSibling.nodeType == 3);\n                shouldNormalize = shouldNormalizeStart && shouldNormalizeEnd;\n                start = start.nextSibling;\n                end = end.previousSibling;\n                var collapsed = false;\n                var collapsedToStart = false;\n                if (start == that.end) {\n                    collapsedToStart = !!that.start.previousSibling;\n                    start = end = that.start.previousSibling || that.end.nextSibling;\n                    collapsed = true;\n                }\n                dom.remove(that.start);\n                dom.remove(that.end);\n                if (!start || !end) {\n                    range.selectNodeContents(range.commonAncestorContainer);\n                    range.collapse(true);\n                    return;\n                }\n                var startOffset = collapsed ? isDataNode(start) ? start.nodeValue.length : start.childNodes.length : 0;\n                var endOffset = isDataNode(end) ? end.nodeValue.length : end.childNodes.length;\n                if (start.nodeType == 3) {\n                    while (start.previousSibling && start.previousSibling.nodeType == 3) {\n                        start = start.previousSibling;\n                        startOffset += start.nodeValue.length;\n                    }\n                }\n                if (end.nodeType == 3) {\n                    while (end.previousSibling && end.previousSibling.nodeType == 3) {\n                        end = end.previousSibling;\n                        endOffset += end.nodeValue.length;\n                    }\n                }\n                var startParent = start.parentNode;\n                var endParent = end.parentNode;\n                var startIndex = this._normalizedIndex(start);\n                var endIndex = this._normalizedIndex(end);\n                normalize(startParent);\n                if (start.nodeType == 3) {\n                    start = startParent.childNodes[startIndex];\n                }\n                normalize(endParent);\n                if (end.nodeType == 3) {\n                    end = endParent.childNodes[endIndex];\n                }\n                if (collapsed) {\n                    if (start.nodeType == 3) {\n                        range.setStart(start, startOffset);\n                    } else {\n                        range[collapsedToStart ? 'setStartAfter' : 'setStartBefore'](start);\n                    }\n                    range.collapse(true);\n                } else {\n                    if (start.nodeType == 3) {\n                        range.setStart(start, startOffset);\n                    } else {\n                        range.setStartBefore(start);\n                    }\n                    if (end.nodeType == 3) {\n                        range.setEnd(end, endOffset);\n                    } else {\n                        range.setEndAfter(end);\n                    }\n                }\n                if (that.caret) {\n                    that.removeCaret(range);\n                }\n            }\n        });\n        var boundary = /[\\u0009-\\u000d]|\\u0020|\\u00a0|\\ufeff|\\.|,|;|:|!|\\(|\\)|\\?/;\n        var RangeUtils = {\n            nodes: function (range) {\n                var nodes = RangeUtils.textNodes(range);\n                if (!nodes.length) {\n                    range.selectNodeContents(range.commonAncestorContainer);\n                    nodes = RangeUtils.textNodes(range);\n                    if (!nodes.length) {\n                        nodes = dom.significantChildNodes(range.commonAncestorContainer);\n                    }\n                }\n                return nodes;\n            },\n            textNodes: function (range) {\n                return new RangeEnumerator(range).enumerate();\n            },\n            editableTextNodes: function (range) {\n                var nodes = [], immutableParent = Editor.Immutables && Editor.Immutables.immutableParent;\n                if (immutableParent && !immutableParent(range.commonAncestorContainer)) {\n                    nodes = new ImmutablesRangeEnumerator(range).enumerate();\n                }\n                return nodes;\n            },\n            documentFromRange: function (range) {\n                var startContainer = range.startContainer;\n                return startContainer.nodeType == 9 ? startContainer : startContainer.ownerDocument;\n            },\n            createRange: function (document) {\n                if (browser.msie && browser.version < 9) {\n                    return new W3CRange(document);\n                }\n                return document.createRange();\n            },\n            selectRange: function (range) {\n                var image = RangeUtils.image(range);\n                if (image) {\n                    range.setStartAfter(image);\n                    range.setEndAfter(image);\n                }\n                var selection = SelectionUtils.selectionFromRange(range);\n                selection.removeAllRanges();\n                selection.addRange(range);\n            },\n            stringify: function (range) {\n                return kendo.format('{0}:{1} - {2}:{3}', dom.name(range.startContainer), range.startOffset, dom.name(range.endContainer), range.endOffset);\n            },\n            split: function (range, node, trim) {\n                function partition(start) {\n                    var partitionRange = range.cloneRange();\n                    partitionRange.collapse(start);\n                    partitionRange[start ? 'setStartBefore' : 'setEndAfter'](node);\n                    var contents = partitionRange.extractContents();\n                    if (trim) {\n                        contents = dom.trim(contents);\n                    }\n                    dom[start ? 'insertBefore' : 'insertAfter'](contents, node);\n                }\n                partition(true);\n                partition(false);\n            },\n            mapAll: function (range, map) {\n                var nodes = [];\n                new RangeIterator(range).traverse(function (node) {\n                    var mapped = map(node);\n                    if (mapped && $.inArray(mapped, nodes) < 0) {\n                        nodes.push(mapped);\n                    }\n                });\n                return nodes;\n            },\n            getAll: function (range, predicate) {\n                var selector = predicate;\n                if (typeof predicate == 'string') {\n                    predicate = function (node) {\n                        return dom.is(node, selector);\n                    };\n                }\n                return RangeUtils.mapAll(range, function (node) {\n                    if (predicate(node)) {\n                        return node;\n                    }\n                });\n            },\n            getMarkers: function (range) {\n                return RangeUtils.getAll(range, function (node) {\n                    return node.className == 'k-marker';\n                });\n            },\n            image: function (range) {\n                var nodes = RangeUtils.getAll(range, 'img');\n                if (nodes.length == 1) {\n                    return nodes[0];\n                }\n            },\n            isStartOf: function (originalRange, node) {\n                if (originalRange.startOffset !== 0) {\n                    return false;\n                }\n                var range = originalRange.cloneRange();\n                while (range.startOffset === 0 && range.startContainer != node) {\n                    var index = dom.findNodeIndex(range.startContainer);\n                    var parent = range.startContainer.parentNode;\n                    while (index > 0 && parent[index - 1] && dom.insignificant(parent[index - 1])) {\n                        index--;\n                    }\n                    range.setStart(parent, index);\n                }\n                return range.startOffset === 0 && range.startContainer == node;\n            },\n            isEndOf: function (originalRange, node) {\n                var range = originalRange.cloneRange();\n                range.collapse(false);\n                var start = range.startContainer;\n                if (dom.isDataNode(start) && range.startOffset == dom.getNodeLength(start)) {\n                    range.setStart(start.parentNode, dom.findNodeIndex(start) + 1);\n                    range.collapse(true);\n                }\n                range.setEnd(node, dom.getNodeLength(node));\n                var nodes = [];\n                function visit(node) {\n                    if (!dom.insignificant(node)) {\n                        nodes.push(node);\n                    }\n                }\n                new RangeIterator(range).traverse(visit);\n                return !nodes.length;\n            },\n            wrapSelectedElements: function (range) {\n                var startEditable = dom.editableParent(range.startContainer);\n                var endEditable = dom.editableParent(range.endContainer);\n                while (range.startOffset === 0 && range.startContainer != startEditable) {\n                    range.setStart(range.startContainer.parentNode, dom.findNodeIndex(range.startContainer));\n                }\n                function isEnd(offset, container) {\n                    var length = dom.getNodeLength(container);\n                    if (offset == length) {\n                        return true;\n                    }\n                    for (var i = offset; i < length; i++) {\n                        if (!dom.insignificant(container.childNodes[i])) {\n                            return false;\n                        }\n                    }\n                    return true;\n                }\n                while (isEnd(range.endOffset, range.endContainer) && range.endContainer != endEditable) {\n                    range.setEnd(range.endContainer.parentNode, dom.findNodeIndex(range.endContainer) + 1);\n                }\n                return range;\n            },\n            expand: function (range) {\n                var result = range.cloneRange();\n                var startContainer = result.startContainer.childNodes[result.startOffset === 0 ? 0 : result.startOffset - 1];\n                var endContainer = result.endContainer.childNodes[result.endOffset];\n                if (!isDataNode(startContainer) || !isDataNode(endContainer)) {\n                    return result;\n                }\n                var beforeCaret = startContainer.nodeValue;\n                var afterCaret = endContainer.nodeValue;\n                if (!beforeCaret || !afterCaret) {\n                    return result;\n                }\n                var startOffset = beforeCaret.split('').reverse().join('').search(boundary);\n                var endOffset = afterCaret.search(boundary);\n                if (!startOffset || !endOffset) {\n                    return result;\n                }\n                endOffset = endOffset == -1 ? afterCaret.length : endOffset;\n                startOffset = startOffset == -1 ? 0 : beforeCaret.length - startOffset;\n                result.setStart(startContainer, startOffset);\n                result.setEnd(endContainer, endOffset);\n                return result;\n            },\n            isExpandable: function (range) {\n                var node = range.startContainer;\n                var rangeDocument = RangeUtils.documentFromRange(range);\n                if (node == rangeDocument || node == rangeDocument.body) {\n                    return false;\n                }\n                var result = range.cloneRange();\n                var value = node.nodeValue;\n                if (!value) {\n                    return false;\n                }\n                var beforeCaret = value.substring(0, result.startOffset);\n                var afterCaret = value.substring(result.startOffset);\n                var startOffset = 0, endOffset = 0;\n                if (beforeCaret) {\n                    startOffset = beforeCaret.split('').reverse().join('').search(boundary);\n                }\n                if (afterCaret) {\n                    endOffset = afterCaret.search(boundary);\n                }\n                return startOffset && endOffset;\n            }\n        };\n        extend(Editor, {\n            SelectionUtils: SelectionUtils,\n            W3CRange: W3CRange,\n            RangeIterator: RangeIterator,\n            W3CSelection: W3CSelection,\n            RangeEnumerator: RangeEnumerator,\n            RestorePoint: RestorePoint,\n            Marker: Marker,\n            RangeUtils: RangeUtils\n        });\n    }(window.kendo.jQuery));\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('editor/system', ['editor/range'], f);\n}(function () {\n    (function ($) {\n        var kendo = window.kendo, Class = kendo.Class, editorNS = kendo.ui.editor, EditorUtils = editorNS.EditorUtils, RangeUtils = editorNS.RangeUtils, registerTool = EditorUtils.registerTool, dom = editorNS.Dom, Tool = editorNS.Tool, ToolTemplate = editorNS.ToolTemplate, RestorePoint = editorNS.RestorePoint, Marker = editorNS.Marker, browser = kendo.support.browser, br = '<br class=\"k-br\">', extend = $.extend;\n        var nodeTypes = dom.nodeTypes;\n        var PREVIOUS_SIBLING = 'previousSibling';\n        function finishUpdate(editor, startRestorePoint) {\n            var endRestorePoint = editor.selectionRestorePoint = new RestorePoint(editor.getRange(), editor.body);\n            var command = new GenericCommand(startRestorePoint, endRestorePoint);\n            command.editor = editor;\n            editor.undoRedoStack.push(command);\n            return endRestorePoint;\n        }\n        function selected(node, range) {\n            return range.startContainer === node && range.endContainer === node && range.startOffset === 0 && range.endOffset == node.childNodes.length;\n        }\n        function getSibling(node, direction, condition) {\n            var sibling = node ? node[direction] : null;\n            while (sibling && !condition(sibling)) {\n                sibling = sibling[direction];\n            }\n            return sibling;\n        }\n        var Command = Class.extend({\n            init: function (options) {\n                this.options = options;\n                this.restorePoint = new RestorePoint(options.range, options.body, { immutables: options.immutables });\n                this.marker = new Marker();\n                this.formatter = options.formatter;\n            },\n            getRange: function () {\n                return this.restorePoint.toRange();\n            },\n            lockRange: function (expand) {\n                return this.marker.add(this.getRange(), expand);\n            },\n            releaseRange: function (range) {\n                this.marker.remove(range);\n                this.editor.selectRange(range);\n            },\n            undo: function () {\n                var point = this.restorePoint;\n                point.restoreHtml();\n                this.editor.selectRange(point.toRange());\n            },\n            redo: function () {\n                this.exec();\n            },\n            createDialog: function (content, options) {\n                var editor = this.editor;\n                return $(content).appendTo(document.body).kendoWindow(extend({}, editor.options.dialogOptions, options)).closest('.k-window').toggleClass('k-rtl', kendo.support.isRtl(editor.wrapper)).end();\n            },\n            exec: function () {\n                var range = this.lockRange(true);\n                this.formatter.editor = this.editor;\n                this.formatter.toggle(range);\n                this.releaseRange(range);\n            },\n            immutables: function () {\n                return this.editor && this.editor.options.immutables;\n            },\n            expandImmutablesIn: function (range) {\n                if (this.immutables()) {\n                    kendo.ui.editor.Immutables.expandImmutablesIn(range);\n                    this.restorePoint = new RestorePoint(range, this.editor.body);\n                }\n            }\n        });\n        var GenericCommand = Class.extend({\n            init: function (startRestorePoint, endRestorePoint) {\n                this.body = startRestorePoint.body;\n                this.startRestorePoint = startRestorePoint;\n                this.endRestorePoint = endRestorePoint;\n            },\n            redo: function () {\n                dom.removeChildren(this.body);\n                this.body.innerHTML = this.endRestorePoint.html;\n                this.editor.selectRange(this.endRestorePoint.toRange());\n            },\n            undo: function () {\n                dom.removeChildren(this.body);\n                this.body.innerHTML = this.startRestorePoint.html;\n                this.editor.selectRange(this.startRestorePoint.toRange());\n            }\n        });\n        var InsertHtmlCommand = Command.extend({\n            init: function (options) {\n                Command.fn.init.call(this, options);\n                this.managesUndoRedo = true;\n            },\n            exec: function () {\n                var editor = this.editor;\n                var options = this.options;\n                var range = options.range;\n                var body = editor.body;\n                var startRestorePoint = new RestorePoint(range, body);\n                var html = options.html || options.value || '';\n                editor.selectRange(range);\n                editor.clipboard.paste(html, options);\n                if (options.postProcess) {\n                    options.postProcess(editor, editor.getRange());\n                }\n                var genericCommand = new GenericCommand(startRestorePoint, new RestorePoint(editor.getRange(), body));\n                genericCommand.editor = editor;\n                editor.undoRedoStack.push(genericCommand);\n                editor.focus();\n            }\n        });\n        var InsertHtmlTool = Tool.extend({\n            initialize: function (ui, initOptions) {\n                var editor = initOptions.editor, options = this.options, dataSource = options.items ? options.items : editor.options.insertHtml;\n                this._selectBox = new editorNS.SelectBox(ui, {\n                    dataSource: dataSource,\n                    dataTextField: 'text',\n                    dataValueField: 'value',\n                    change: function () {\n                        Tool.exec(editor, 'insertHtml', this.value());\n                    },\n                    title: editor.options.messages.insertHtml,\n                    highlightFirst: false\n                });\n            },\n            command: function (commandArguments) {\n                return new InsertHtmlCommand(commandArguments);\n            },\n            update: function (ui) {\n                var selectbox = ui.data('kendoSelectBox') || ui.find('select').data('kendoSelectBox');\n                selectbox.close();\n                selectbox.value(selectbox.options.title);\n            }\n        });\n        var tableCells = 'td,th,caption';\n        var tableCellsWrappers = 'table,tbody,thead,tfoot,tr';\n        var tableElements = tableCellsWrappers + ',' + tableCells;\n        var inTable = function (range) {\n            return !range.collapsed && $(range.commonAncestorContainer).is(tableCellsWrappers);\n        };\n        var RemoveTableContent = Class.extend({\n            remove: function (range) {\n                var that = this;\n                var marker = new Marker();\n                marker.add(range, false);\n                var nodes = RangeUtils.getAll(range, function (node) {\n                    return $(node).is(tableElements);\n                });\n                var doc = RangeUtils.documentFromRange(range);\n                var start = marker.start;\n                var end = marker.end;\n                var cellsTypes = tableCells.split(',');\n                var startCell = dom.parentOfType(start, cellsTypes);\n                var endCell = dom.parentOfType(end, cellsTypes);\n                that._removeContent(start, startCell, true);\n                that._removeContent(end, endCell, false);\n                $(nodes).each(function (i, node) {\n                    node = $(node);\n                    (node.is(tableCells) ? node : node.find(tableCells)).each(function (j, cell) {\n                        cell.innerHTML = '&#65279;';\n                    });\n                });\n                if (startCell && !start.previousSibling) {\n                    dom.insertBefore(doc.createTextNode('\\uFEFF'), start);\n                }\n                if (endCell && !end.nextSibling) {\n                    dom.insertAfter(doc.createTextNode('\\uFEFF'), end);\n                }\n                if (startCell) {\n                    range.setStartBefore(start);\n                } else if (nodes[0]) {\n                    startCell = $(nodes[0]);\n                    startCell = startCell.is(tableCells) ? startCell : startCell.find(tableCells).first();\n                    if (startCell.length) {\n                        range.setStart(startCell.get(0), 0);\n                    }\n                }\n                range.collapse(true);\n                dom.remove(start);\n                dom.remove(end);\n            },\n            _removeContent: function (start, top, forwards) {\n                if (top) {\n                    var sibling = forwards ? 'nextSibling' : 'previousSibling', next, getNext = function (node) {\n                            while (node && !node[sibling]) {\n                                node = node.parentNode;\n                            }\n                            return node && $.contains(top, node) ? node[sibling] : null;\n                        };\n                    start = getNext(start);\n                    while (start) {\n                        next = getNext(start);\n                        dom.remove(start);\n                        start = next;\n                    }\n                }\n            }\n        });\n        var TypingHandler = Class.extend({\n            init: function (editor) {\n                this.editor = editor;\n            },\n            keydown: function (e) {\n                var that = this, editor = that.editor, keyboard = editor.keyboard, isTypingKey = keyboard.isTypingKey(e), evt = extend($.Event(), e);\n                that.editor.trigger('keydown', evt);\n                if (evt.isDefaultPrevented()) {\n                    e.preventDefault();\n                    return true;\n                }\n                if (!evt.isDefaultPrevented() && isTypingKey && !keyboard.isTypingInProgress()) {\n                    var range = editor.getRange();\n                    var body = editor.body;\n                    that.startRestorePoint = new RestorePoint(range, body);\n                    if (inTable(range)) {\n                        var removeTableContent = new RemoveTableContent(editor);\n                        removeTableContent.remove(range);\n                        editor.selectRange(range);\n                    }\n                    if (browser.webkit && !range.collapsed && selected(body, range)) {\n                        body.innerHTML = '';\n                    }\n                    if (editor.immutables && editorNS.Immutables.immutablesContext(range)) {\n                        var backspaceHandler = new editorNS.BackspaceHandler(editor);\n                        backspaceHandler.deleteSelection(range);\n                    }\n                    keyboard.startTyping(function () {\n                        that.endRestorePoint = finishUpdate(editor, that.startRestorePoint);\n                    });\n                    return true;\n                }\n                return false;\n            },\n            keyup: function (e) {\n                var keyboard = this.editor.keyboard;\n                this.editor.trigger('keyup', e);\n                if (keyboard.isTypingInProgress()) {\n                    keyboard.endTyping();\n                    return true;\n                }\n                return false;\n            }\n        });\n        var BackspaceHandler = Class.extend({\n            init: function (editor) {\n                this.editor = editor;\n            },\n            _addCaret: function (container) {\n                var caret = dom.create(this.editor.document, 'a');\n                dom.insertAt(container, caret, 0);\n                dom.stripBomNode(caret.previousSibling);\n                dom.stripBomNode(caret.nextSibling);\n                return caret;\n            },\n            _restoreCaret: function (caret) {\n                var range = this.editor.createRange();\n                range.setStartAfter(caret);\n                range.collapse(true);\n                this.editor.selectRange(range);\n                dom.remove(caret);\n            },\n            _handleDelete: function (range) {\n                var node = range.endContainer;\n                var block = dom.closestEditableOfType(node, dom.blockElements);\n                if (block && editorNS.RangeUtils.isEndOf(range, block)) {\n                    var next = dom.next(block);\n                    if (!next || dom.name(next) != 'p') {\n                        return false;\n                    }\n                    var caret = this._addCaret(next);\n                    this._merge(block, next);\n                    this._restoreCaret(caret);\n                    return true;\n                }\n                return false;\n            },\n            _cleanBomBefore: function (range) {\n                var offset = range.startOffset;\n                var node = range.startContainer;\n                var text = node.nodeValue;\n                var count = 0;\n                while (offset - count >= 0 && text[offset - count - 1] == '\\uFEFF') {\n                    count++;\n                }\n                if (count > 0) {\n                    node.deleteData(offset - count, count);\n                    range.setStart(node, Math.max(0, offset - count));\n                    range.collapse(true);\n                    this.editor.selectRange(range);\n                }\n            },\n            _handleBackspace: function (range) {\n                var node = range.startContainer;\n                var li = dom.closestEditableOfType(node, ['li']);\n                var block = dom.closestEditableOfType(node, 'p,h1,h2,h3,h4,h5,h6'.split(','));\n                var editor = this.editor;\n                var previousSibling;\n                if (dom.isDataNode(node)) {\n                    this._cleanBomBefore(range);\n                }\n                previousSibling = getSibling(block, PREVIOUS_SIBLING, function (sibling) {\n                    return !dom.htmlIndentSpace(sibling);\n                });\n                if (range.collapsed && range.startOffset !== range.endOffset && range.startOffset < 0) {\n                    range.startOffset = 0;\n                    range.endOffset = 0;\n                    editor.selectRange(range);\n                }\n                if (block && previousSibling && editorNS.RangeUtils.isStartOf(range, block)) {\n                    var caret = this._addCaret(block);\n                    this._merge(previousSibling, block);\n                    this._restoreCaret(caret);\n                    return true;\n                }\n                if (li && editorNS.RangeUtils.isStartOf(range, li)) {\n                    var child = li.firstChild;\n                    if (!child) {\n                        li.innerHTML = editorNS.emptyElementContent;\n                        child = li.firstChild;\n                    }\n                    var formatter = new editorNS.ListFormatter(dom.name(li.parentNode), 'p');\n                    range.selectNodeContents(li);\n                    formatter.toggle(range);\n                    if (dom.insignificant(child)) {\n                        range.setStartBefore(child);\n                    } else {\n                        range.setStart(child, 0);\n                    }\n                    editor.selectRange(range);\n                    return true;\n                }\n                var linkRange = range;\n                var previousNode = node.previousSibling;\n                if (linkRange.startOffset === 0 && previousNode && previousNode.nodeName.toLowerCase() === 'a') {\n                    linkRange = editor.createRange();\n                    linkRange.setStart(previousNode, previousNode.childNodes.length);\n                    linkRange.setEnd(previousNode, previousNode.childNodes.length);\n                }\n                var a = dom.closestEditableOfType(linkRange.startContainer, ['a']);\n                var isEndOfLink = a && editorNS.RangeUtils.isEndOf(linkRange, a);\n                if (isEndOfLink) {\n                    var command = new editorNS.UnlinkCommand({\n                        range: linkRange,\n                        body: editor.body,\n                        immutables: !!editor.immutables\n                    });\n                    editor.execCommand(command);\n                    editor._selectionChange();\n                }\n                return false;\n            },\n            _handleSelection: function (range) {\n                var ancestor = range.commonAncestorContainer;\n                var table = dom.closest(ancestor, 'table');\n                var emptyParagraphContent = editorNS.emptyElementContent;\n                var editor = this.editor;\n                if (inTable(range)) {\n                    var removeTableContent = new RemoveTableContent(editor);\n                    removeTableContent.remove(range);\n                    editor.selectRange(range);\n                    return true;\n                }\n                var marker = new Marker();\n                marker.add(range, false);\n                if (editor.immutables) {\n                    this._handleImmutables(marker);\n                }\n                this._surroundFullySelectedAnchor(marker, range);\n                range.setStartAfter(marker.start);\n                range.setEndBefore(marker.end);\n                var start = range.startContainer;\n                var end = range.endContainer;\n                range.deleteContents();\n                if (table && $(table).text() === '') {\n                    range.selectNode(table);\n                    range.deleteContents();\n                }\n                ancestor = range.commonAncestorContainer;\n                if (dom.name(ancestor) === 'p' && ancestor.innerHTML === '') {\n                    ancestor.innerHTML = emptyParagraphContent;\n                    range.setStart(ancestor, 0);\n                }\n                this._join(start, end);\n                dom.insertAfter(editor.document.createTextNode('\\uFEFF'), marker.start);\n                marker.remove(range);\n                start = range.startContainer;\n                if (dom.name(start) == 'tr') {\n                    start = start.childNodes[Math.max(0, range.startOffset - 1)];\n                    range.setStart(start, dom.getNodeLength(start));\n                }\n                range.collapse(true);\n                editor.selectRange(range);\n                return true;\n            },\n            _handleImmutables: function (marker) {\n                var immutableParent = editorNS.Immutables.immutableParent;\n                var startImmutable = immutableParent(marker.start);\n                var endImmutable = immutableParent(marker.start);\n                if (startImmutable) {\n                    dom.insertBefore(marker.start, startImmutable);\n                }\n                if (endImmutable) {\n                    dom.insertAfter(marker.end, endImmutable);\n                }\n                if (startImmutable) {\n                    dom.remove(startImmutable);\n                }\n                if (endImmutable && endImmutable.parentNode) {\n                    dom.remove(endImmutable);\n                }\n            },\n            _surroundFullySelectedAnchor: function (marker, range) {\n                var start = marker.start, startParent = $(start).closest('a').get(0), end = marker.end, endParent = $(end).closest('a').get(0);\n                if (startParent && RangeUtils.isStartOf(range, startParent)) {\n                    dom.insertBefore(start, startParent);\n                }\n                if (endParent && RangeUtils.isEndOf(range, endParent)) {\n                    dom.insertAfter(end, endParent);\n                }\n            },\n            _root: function (node) {\n                while (node && node.parentNode && dom.name(node.parentNode) != 'body') {\n                    node = node.parentNode;\n                }\n                return node;\n            },\n            _join: function (start, end) {\n                start = this._root(start);\n                end = this._root(end);\n                if (start != end && dom.is(end, 'p')) {\n                    this._merge(start, end);\n                }\n            },\n            _merge: function (dest, src) {\n                dom.removeTrailingBreak(dest);\n                while (dest && src.firstChild) {\n                    if (dest.nodeType == 1) {\n                        dest = dom.list(dest) ? dest.children[dest.children.length - 1] : dest;\n                        if (dest) {\n                            dest.appendChild(src.firstChild);\n                        }\n                    } else if (dest.nodeType === nodeTypes.TEXT_NODE) {\n                        this._mergeWithTextNode(dest, src.firstChild);\n                    } else {\n                        dest.parentNode.appendChild(src.firstChild);\n                    }\n                }\n                dom.remove(src);\n            },\n            _mergeWithTextNode: function (textNode, appendedNode) {\n                if (textNode && textNode.nodeType === nodeTypes.TEXT_NODE) {\n                    if (textNode.nextSibling && this._isCaret(textNode.nextSibling)) {\n                        dom.insertAfter(appendedNode, textNode.nextSibling);\n                    } else {\n                        dom.insertAfter(appendedNode, textNode);\n                    }\n                }\n            },\n            _isCaret: function (element) {\n                return $(element).is('a');\n            },\n            keydown: function (e) {\n                var method, startRestorePoint;\n                var editor = this.editor;\n                var range = editor.getRange();\n                var keyCode = e.keyCode;\n                var keys = kendo.keys;\n                var backspace = keyCode === keys.BACKSPACE;\n                var del = keyCode == keys.DELETE;\n                if (editor.immutables && editor.immutables.keydown(e, range)) {\n                    return;\n                }\n                if ((backspace || del) && !range.collapsed) {\n                    method = '_handleSelection';\n                } else if (backspace) {\n                    method = '_handleBackspace';\n                } else if (del) {\n                    method = '_handleDelete';\n                }\n                if (!method) {\n                    return;\n                }\n                startRestorePoint = new RestorePoint(range, editor.body);\n                if (this[method](range)) {\n                    e.preventDefault();\n                    finishUpdate(editor, startRestorePoint);\n                }\n            },\n            deleteSelection: function (range) {\n                this._handleSelection(range);\n            },\n            keyup: $.noop\n        });\n        var SystemHandler = Class.extend({\n            init: function (editor) {\n                this.editor = editor;\n                this.systemCommandIsInProgress = false;\n            },\n            createUndoCommand: function () {\n                this.startRestorePoint = this.endRestorePoint = finishUpdate(this.editor, this.startRestorePoint);\n            },\n            changed: function () {\n                if (this.startRestorePoint) {\n                    return this.startRestorePoint.html != this.editor.body.innerHTML;\n                }\n                return false;\n            },\n            keydown: function (e) {\n                var that = this, editor = that.editor, keyboard = editor.keyboard;\n                if (keyboard.isModifierKey(e)) {\n                    if (keyboard.isTypingInProgress()) {\n                        keyboard.endTyping(true);\n                    }\n                    that.startRestorePoint = new RestorePoint(editor.getRange(), editor.body);\n                    return true;\n                }\n                if (keyboard.isSystem(e)) {\n                    that.systemCommandIsInProgress = true;\n                    if (that.changed()) {\n                        that.systemCommandIsInProgress = false;\n                        that.createUndoCommand();\n                    }\n                    return true;\n                }\n                return false;\n            },\n            keyup: function () {\n                var that = this;\n                if (that.systemCommandIsInProgress && that.changed()) {\n                    that.systemCommandIsInProgress = false;\n                    that.createUndoCommand();\n                    return true;\n                }\n                return false;\n            }\n        });\n        var SelectAllHandler = Class.extend({\n            init: function (editor) {\n                this.editor = editor;\n            },\n            keydown: function (e) {\n                if (!browser.webkit || e.isDefaultPrevented() || !(e.ctrlKey && e.keyCode == 65 && !e.altKey && !e.shiftKey)) {\n                    return;\n                }\n                if (this.editor.options.immutables) {\n                    this._toSelectableImmutables();\n                }\n                this._selectEditorBody();\n            },\n            _selectEditorBody: function () {\n                var editor = this.editor;\n                var range = editor.getRange();\n                range.selectNodeContents(editor.body);\n                editor.selectRange(range);\n            },\n            _toSelectableImmutables: function () {\n                var editor = this.editor, body = editor.body, immutable = editorNS.Immutables.immutable, emptyTextNode = dom.emptyTextNode, first = body.firstChild, last = body.lastChild;\n                while (emptyTextNode(first)) {\n                    first = first.nextSibling;\n                }\n                while (emptyTextNode(last)) {\n                    last = last.previousSibling;\n                }\n                if (first && immutable(first)) {\n                    $(br).prependTo(body);\n                }\n                if (last && immutable(last)) {\n                    $(br).appendTo(body);\n                }\n            },\n            keyup: $.noop\n        });\n        var Keyboard = Class.extend({\n            init: function (handlers) {\n                this.handlers = handlers;\n                this.typingInProgress = false;\n            },\n            isCharacter: function (keyCode) {\n                return keyCode >= 48 && keyCode <= 90 || keyCode >= 96 && keyCode <= 111 || keyCode >= 186 && keyCode <= 192 || keyCode >= 219 && keyCode <= 222 || keyCode == 229;\n            },\n            toolFromShortcut: function (tools, e) {\n                var key = String.fromCharCode(e.keyCode), toolName, toolOptions, modifier = this._getShortcutModifier(e, navigator.platform);\n                for (toolName in tools) {\n                    toolOptions = $.extend({\n                        ctrl: false,\n                        alt: false,\n                        shift: false\n                    }, tools[toolName].options);\n                    if ((toolOptions.key == key || toolOptions.key == e.keyCode) && toolOptions.ctrl == modifier && toolOptions.alt == e.altKey && toolOptions.shift == e.shiftKey) {\n                        return toolName;\n                    }\n                }\n            },\n            _getShortcutModifier: function (e, platform) {\n                var mac = platform.toUpperCase().indexOf('MAC') >= 0;\n                return mac ? e.metaKey : e.ctrlKey;\n            },\n            toolsFromShortcut: function (tools, e) {\n                var key = String.fromCharCode(e.keyCode), toolName, o, matchesKey, found = [];\n                var matchKey = function (toolKey) {\n                    return toolKey == key || toolKey == e.keyCode || toolKey == e.charCode;\n                };\n                for (toolName in tools) {\n                    o = $.extend({\n                        ctrl: false,\n                        alt: false,\n                        shift: false\n                    }, tools[toolName].options);\n                    matchesKey = $.isArray(o.key) ? $.grep(o.key, matchKey).length > 0 : matchKey(o.key);\n                    if (matchesKey && o.ctrl == e.ctrlKey && o.alt == e.altKey && o.shift == e.shiftKey) {\n                        found.push(tools[toolName]);\n                    }\n                }\n                return found;\n            },\n            isTypingKey: function (e) {\n                var keyCode = e.keyCode;\n                return this.isCharacter(keyCode) && !e.ctrlKey && !e.altKey || keyCode == 32 || keyCode == 13 || keyCode == 8 || keyCode == 46 && !e.shiftKey && !e.ctrlKey && !e.altKey;\n            },\n            isModifierKey: function (e) {\n                var keyCode = e.keyCode;\n                return keyCode == 17 && !e.shiftKey && !e.altKey || keyCode == 16 && !e.ctrlKey && !e.altKey || keyCode == 18 && !e.ctrlKey && !e.shiftKey;\n            },\n            isSystem: function (e) {\n                return e.keyCode == 46 && e.ctrlKey && !e.altKey && !e.shiftKey;\n            },\n            startTyping: function (callback) {\n                this.onEndTyping = callback;\n                this.typingInProgress = true;\n            },\n            stopTyping: function () {\n                if (this.typingInProgress && this.onEndTyping) {\n                    this.onEndTyping();\n                }\n                this.typingInProgress = false;\n            },\n            endTyping: function (force) {\n                var that = this;\n                that.clearTimeout();\n                if (force) {\n                    that.stopTyping();\n                } else {\n                    that.timeout = window.setTimeout($.proxy(that.stopTyping, that), 1000);\n                }\n            },\n            isTypingInProgress: function () {\n                return this.typingInProgress;\n            },\n            clearTimeout: function () {\n                window.clearTimeout(this.timeout);\n            },\n            notify: function (e, what) {\n                var i, handlers = this.handlers;\n                for (i = 0; i < handlers.length; i++) {\n                    if (handlers[i][what](e)) {\n                        break;\n                    }\n                }\n            },\n            keydown: function (e) {\n                this.notify(e, 'keydown');\n            },\n            keyup: function (e) {\n                this.notify(e, 'keyup');\n            }\n        });\n        var Clipboard = Class.extend({\n            init: function (editor) {\n                this.editor = editor;\n                var pasteCleanup = editor.options.pasteCleanup;\n                this.cleaners = [\n                    new ScriptCleaner(pasteCleanup),\n                    new TabCleaner(pasteCleanup),\n                    new MSWordFormatCleaner(pasteCleanup),\n                    new WebkitFormatCleaner(pasteCleanup),\n                    new HtmlTagsCleaner(pasteCleanup),\n                    new HtmlAttrCleaner(pasteCleanup),\n                    new HtmlContentCleaner(pasteCleanup),\n                    new CustomCleaner(pasteCleanup)\n                ];\n            },\n            htmlToFragment: function (html) {\n                var editor = this.editor, doc = editor.document, container = dom.create(doc, 'div'), fragment = doc.createDocumentFragment();\n                container.innerHTML = html;\n                while (container.firstChild) {\n                    fragment.appendChild(container.firstChild);\n                }\n                return fragment;\n            },\n            isBlock: function (html) {\n                return /<(div|p|ul|ol|table|h[1-6])/i.test(html);\n            },\n            _startModification: function () {\n                var range;\n                var restorePoint;\n                var editor = this.editor;\n                if (this._inProgress) {\n                    return;\n                }\n                this._inProgress = true;\n                range = editor.getRange();\n                restorePoint = new RestorePoint(range, editor.body);\n                dom.persistScrollTop(editor.document);\n                return {\n                    range: range,\n                    restorePoint: restorePoint\n                };\n            },\n            _endModification: function (modificationInfo) {\n                finishUpdate(this.editor, modificationInfo.restorePoint);\n                this.editor._selectionChange();\n                this._inProgress = false;\n            },\n            _contentModification: function (before, after) {\n                var that = this;\n                var editor = that.editor;\n                var modificationInfo = that._startModification();\n                if (!modificationInfo) {\n                    return;\n                }\n                before.call(that, editor, modificationInfo.range);\n                setTimeout(function () {\n                    after.call(that, editor, modificationInfo.range);\n                    that._endModification(modificationInfo);\n                });\n            },\n            _removeBomNodes: function (range) {\n                var nodes = editorNS.RangeUtils.textNodes(range);\n                for (var i = 0; i < nodes.length; i++) {\n                    nodes[i].nodeValue = dom.stripBom(nodes[i].nodeValue);\n                }\n            },\n            _onBeforeCopy: function (range) {\n                var marker = new Marker();\n                marker.add(range);\n                this._removeBomNodes(range);\n                marker.remove(range);\n                this.editor.selectRange(range);\n            },\n            oncopy: function () {\n                this._onBeforeCopy(this.editor.getRange());\n            },\n            oncut: function () {\n                this._onBeforeCopy(this.editor.getRange());\n                this._contentModification($.noop, $.noop);\n            },\n            _fileToDataURL: function (blob) {\n                var deferred = $.Deferred();\n                var reader = new FileReader();\n                if (!(blob instanceof window.File) && blob.getAsFile) {\n                    blob = blob.getAsFile();\n                }\n                reader.onload = $.proxy(deferred.resolve, deferred);\n                reader.readAsDataURL(blob);\n                return deferred.promise();\n            },\n            _triggerPaste: function (html, options) {\n                var args = { html: html || '' };\n                args.html = args.html.replace(/\\ufeff/g, '');\n                this.editor.trigger('paste', args);\n                this.paste(args.html, options || {});\n            },\n            _handleImagePaste: function (e) {\n                if (!('FileReader' in window) || browser.msie && browser.version > 10) {\n                    return;\n                }\n                var clipboardData = e.clipboardData || e.originalEvent.clipboardData || window.clipboardData || {};\n                var items = clipboardData.items || clipboardData.files;\n                if (!items) {\n                    return;\n                }\n                var images = $.grep(items, function (item) {\n                    return /^image\\//i.test(item.type);\n                });\n                var html = $.grep(items, function (item) {\n                    return /^text\\/html/i.test(item.type);\n                });\n                if (html.length || !images.length) {\n                    return;\n                }\n                var modificationInfo = this._startModification();\n                if (!modificationInfo) {\n                    return;\n                }\n                $.when.apply($, $.map(images, this._fileToDataURL)).done($.proxy(function () {\n                    var results = Array.prototype.slice.call(arguments);\n                    var html = $.map(results, function (e) {\n                        return '<img src=\"' + e.target.result + '\" />';\n                    }).join('');\n                    this._triggerPaste(html);\n                    this._endModification(modificationInfo);\n                }, this));\n                return true;\n            },\n            onpaste: function (e) {\n                if (this._handleImagePaste(e)) {\n                    e.preventDefault();\n                    return;\n                }\n                this.expandImmutablesIn();\n                this._contentModification(function beforePaste(editor, range) {\n                    var clipboardNode = dom.create(editor.document, 'div', {\n                        className: 'k-paste-container',\n                        innerHTML: '\\uFEFF'\n                    });\n                    var browser = kendo.support.browser;\n                    var body = editor.body;\n                    this._decoreateClipboardNode(clipboardNode, body);\n                    body.appendChild(clipboardNode);\n                    if (browser.webkit) {\n                        this._moveToCaretPosition(clipboardNode, range);\n                    }\n                    if (browser.msie && browser.version < 11) {\n                        e.preventDefault();\n                        var r = editor.createRange();\n                        r.selectNodeContents(clipboardNode);\n                        editor.selectRange(r);\n                        var textRange = editor.document.body.createTextRange();\n                        textRange.moveToElementText(clipboardNode);\n                        $(body).unbind('paste');\n                        textRange.execCommand('Paste');\n                        $(body).bind('paste', $.proxy(this.onpaste, this));\n                    } else {\n                        var clipboardRange = editor.createRange();\n                        clipboardRange.selectNodeContents(clipboardNode);\n                        editor.selectRange(clipboardRange);\n                    }\n                    range.deleteContents();\n                }, function afterPaste(editor, range) {\n                    var html = '', containers;\n                    editor.selectRange(range);\n                    containers = $(editor.body).children('.k-paste-container');\n                    containers.each(function () {\n                        var lastChild = this.lastChild;\n                        if (lastChild && dom.is(lastChild, 'br')) {\n                            dom.remove(lastChild);\n                        }\n                        html += this.innerHTML;\n                    });\n                    containers.remove();\n                    this._triggerPaste(html, { clean: true });\n                });\n            },\n            _decoreateClipboardNode: function (node, body) {\n                if (!browser.msie && !browser.webkit) {\n                    return;\n                }\n                node = $(node);\n                node.css({\n                    borderWidth: '0px',\n                    width: '0px',\n                    height: '0px',\n                    overflow: 'hidden',\n                    margin: '0',\n                    padding: '0'\n                });\n                if (browser.msie) {\n                    var documentElement = $(body.ownerDocument.documentElement);\n                    node.css({\n                        fontVariant: 'normal',\n                        fontWeight: 'normal',\n                        lineSpacing: 'normal',\n                        lineHeight: 'normal',\n                        textDecoration: 'none'\n                    });\n                    var color = documentElement.css('color');\n                    if (color) {\n                        node.css('color', color);\n                    }\n                    var fontFamily = documentElement.css('fontFamily');\n                    if (fontFamily) {\n                        node.css('fontFamily', fontFamily);\n                    }\n                    var fontSize = documentElement.css('fontSize');\n                    if (fontSize) {\n                        node.css('fontSize', fontSize);\n                    }\n                }\n            },\n            _moveToCaretPosition: function (node, range) {\n                var that = this;\n                var body = that.editor.body;\n                var nodeOffset = dom.offset(node, body);\n                var caretOffset = that._caretOffset(range, body);\n                var translateX = caretOffset.left - nodeOffset.left;\n                var translateY = caretOffset.top - nodeOffset.top;\n                var translate = 'translate(' + translateX + 'px,' + translateY + 'px)';\n                $(node).css({\n                    '-webkit-transform': translate,\n                    'transform': translate\n                });\n            },\n            _caretOffset: function (range, body) {\n                var editor = this.editor;\n                var caret = dom.create(editor.document, 'span', { innerHTML: '\\uFEFF' });\n                var startContainer = range.startContainer;\n                var rangeChanged;\n                if (range.collapsed) {\n                    var isStartTextNode = dom.isDataNode(startContainer);\n                    if (isStartTextNode && (dom.isBom(startContainer) || range.startOffset === 0)) {\n                        dom.insertBefore(caret, startContainer);\n                    } else if (isStartTextNode && range.startOffset === startContainer.length) {\n                        dom.insertAfter(caret, startContainer);\n                    } else {\n                        range.insertNode(caret);\n                        rangeChanged = true;\n                    }\n                } else {\n                    startContainer = startContainer === body ? startContainer.childNodes[range.startOffset] : startContainer;\n                    dom.insertBefore(caret, startContainer);\n                }\n                var offset = dom.offset(caret, body);\n                var prev = caret.previousSibling;\n                var next = caret.nextSibling;\n                dom.remove(caret);\n                if (rangeChanged && dom.isDataNode(prev) && dom.isDataNode(next) && !dom.isBom(prev) && !dom.isBom(next)) {\n                    var prevLength = prev.length;\n                    next.data = prev.data + next.data;\n                    range.setStart(next, prevLength);\n                    dom.remove(prev);\n                    range.collapse(true);\n                    editor.selectRange(range);\n                }\n                return offset;\n            },\n            expandImmutablesIn: function (range) {\n                var editor = this.editor;\n                if (editor && editor.options.immutables) {\n                    var body = editor.body;\n                    range = range || editor.getRange();\n                    kendo.ui.editor.Immutables.expandImmutablesIn(range);\n                    if (range.startContainer === body && range.startOffset === 0) {\n                        var doc = body.ownerDocument;\n                        var bomNode = doc.createTextNode('\\uFEFF');\n                        body.insertBefore(bomNode, body.childNodes[0]);\n                        range.setStartBefore(bomNode);\n                    }\n                    editor.selectRange(range);\n                }\n            },\n            splittableParent: function (block, node) {\n                var parentNode, body;\n                if (block) {\n                    return dom.closestEditableOfType(node, [\n                        'p',\n                        'ul',\n                        'ol'\n                    ]) || node.parentNode;\n                }\n                parentNode = node.parentNode;\n                body = node.ownerDocument.body;\n                if (dom.isInline(parentNode)) {\n                    while (parentNode.parentNode != body && !dom.isBlock(parentNode.parentNode)) {\n                        parentNode = parentNode.parentNode;\n                    }\n                }\n                return parentNode;\n            },\n            paste: function (html, options) {\n                var editor = this.editor, i, l;\n                this.expandImmutablesIn();\n                options = extend({\n                    clean: false,\n                    split: true\n                }, options);\n                if (!options.skipCleaners) {\n                    for (i = 0, l = this.cleaners.length; i < l; i++) {\n                        if (this.cleaners[i].applicable(html)) {\n                            html = this.cleaners[i].clean(html);\n                        }\n                    }\n                }\n                if (options.clean) {\n                    html = html.replace(/(<br>(\\s|&nbsp;)*)+(<\\/?(div|p|li|col|t))/gi, '$3');\n                    html = html.replace(/<(a|span)[^>]*><\\/\\1>/gi, '');\n                }\n                html = html.replace(/^<li/i, '<ul><li').replace(/li>$/g, 'li></ul>');\n                var block = this.isBlock(html);\n                editor.focus();\n                var range = editor.getRange();\n                range.deleteContents();\n                if (range.startContainer == editor.document) {\n                    range.selectNodeContents(editor.body);\n                }\n                var marker = new Marker();\n                var caret = marker.addCaret(range);\n                var parent = this.splittableParent(block, caret);\n                var unwrap = false;\n                var splittable = parent != editor.body && !dom.is(parent, 'td');\n                if (options.split && splittable && (block || dom.isInline(parent))) {\n                    range.selectNode(caret);\n                    editorNS.RangeUtils.split(range, parent, true);\n                    unwrap = true;\n                }\n                var fragment = this.htmlToFragment(html);\n                if (fragment.firstChild && fragment.firstChild.className === 'k-paste-container') {\n                    var fragmentsHtml = [];\n                    for (i = 0, l = fragment.childNodes.length; i < l; i++) {\n                        fragmentsHtml.push(fragment.childNodes[i].innerHTML);\n                    }\n                    fragment = this.htmlToFragment(fragmentsHtml.join('<br />'));\n                }\n                $(fragment.childNodes).filter('table').addClass('k-table').end().find('table').addClass('k-table');\n                range.insertNode(fragment);\n                parent = this.splittableParent(block, caret);\n                if (unwrap) {\n                    while (caret.parentNode != parent) {\n                        dom.unwrap(caret.parentNode);\n                    }\n                    dom.unwrap(caret.parentNode);\n                }\n                dom.normalize(range.commonAncestorContainer);\n                caret.style.display = 'inline';\n                dom.restoreScrollTop(editor.document);\n                dom.scrollTo(caret);\n                marker.removeCaret(range);\n                var rangeEnd = range.commonAncestorContainer.parentNode;\n                if (range.collapsed && dom.name(rangeEnd) == 'tbody') {\n                    range.setStartAfter($(rangeEnd).closest('table')[0]);\n                    range.collapse(true);\n                }\n                editor.selectRange(range);\n            }\n        });\n        var Cleaner = Class.extend({\n            init: function (options) {\n                this.options = options || {};\n                this.replacements = [];\n            },\n            clean: function (html, customReplacements) {\n                var that = this, replacements = customReplacements || that.replacements, i, l;\n                for (i = 0, l = replacements.length; i < l; i += 2) {\n                    html = html.replace(replacements[i], replacements[i + 1]);\n                }\n                return html;\n            }\n        });\n        var ScriptCleaner = Cleaner.extend({\n            init: function (options) {\n                Cleaner.fn.init.call(this, options);\n                this.replacements = [\n                    /<(\\/?)script([^>]*)>/i,\n                    '<$1telerik:script$2>'\n                ];\n            },\n            applicable: function (html) {\n                return !this.options.none && /<script[^>]*>/i.test(html);\n            }\n        });\n        var TabCleaner = Cleaner.extend({\n            init: function (options) {\n                Cleaner.fn.init.call(this, options);\n                var replacement = ' ';\n                this.replacements = [\n                    /<span\\s+class=\"Apple-tab-span\"[^>]*>\\s*<\\/span>/gi,\n                    replacement,\n                    /\\t/gi,\n                    replacement,\n                    /&nbsp;&nbsp; &nbsp;/gi,\n                    replacement\n                ];\n            },\n            applicable: function (html) {\n                return /&nbsp;&nbsp; &nbsp;|class=\"?Apple-tab-span/i.test(html);\n            }\n        });\n        var MSWordFormatCleaner = Cleaner.extend({\n            init: function (options) {\n                Cleaner.fn.init.call(this, options);\n                this.junkReplacements = [\n                    /<\\?xml[^>]*>/gi,\n                    '',\n                    /<!--(.|\\n)*?-->/g,\n                    '',\n                    /&quot;/g,\n                    '\\'',\n                    /<o:p>&nbsp;<\\/o:p>/gi,\n                    '&nbsp;',\n                    /<\\/?(meta|link|style|o:|v:|x:)[^>]*>((?:.|\\n)*?<\\/(meta|link|style|o:|v:|x:)[^>]*>)?/gi,\n                    '',\n                    /<\\/o>/g,\n                    ''\n                ];\n                this.replacements = this.junkReplacements.concat([\n                    /(?:<br>&nbsp;[\\s\\r\\n]+|<br>)*(<\\/?(h[1-6]|hr|p|div|table|tbody|thead|tfoot|th|tr|td|li|ol|ul|caption|address|pre|form|blockquote|dl|dt|dd|dir|fieldset)[^>]*>)(?:<br>&nbsp;[\\s\\r\\n]+|<br>)*/g,\n                    '$1',\n                    /<br><br>/g,\n                    '<BR><BR>',\n                    /<br>(?!\\n)/g,\n                    ' ',\n                    /<table([^>]*)>(\\s|&nbsp;)+<t/gi,\n                    '<table$1><t',\n                    /<tr[^>]*>(\\s|&nbsp;)*<\\/tr>/gi,\n                    '',\n                    /<tbody[^>]*>(\\s|&nbsp;)*<\\/tbody>/gi,\n                    '',\n                    /<table[^>]*>(\\s|&nbsp;)*<\\/table>/gi,\n                    '',\n                    /<BR><BR>/g,\n                    '<br>',\n                    /^\\s*(&nbsp;)+/gi,\n                    '',\n                    /(&nbsp;|<br[^>]*>)+\\s*$/gi,\n                    '',\n                    /mso-[^;\"]*;?/gi,\n                    '',\n                    /<(\\/?)b(\\s[^>]*)?>/gi,\n                    '<$1strong$2>',\n                    /<(\\/?)font(\\s[^>]*)?>/gi,\n                    this.convertFontMatch,\n                    /<(\\/?)i(\\s[^>]*)?>/gi,\n                    '<$1em$2>',\n                    /style=([\"|'])\\s*\\1/g,\n                    '',\n                    /(<br[^>]*>)?\\n/g,\n                    function ($0, $1) {\n                        return $1 ? $0 : ' ';\n                    }\n                ]);\n            },\n            convertFontMatch: function (match, closing, args) {\n                var faceRe = /face=['\"]([^'\"]+)['\"]/i;\n                var face = faceRe.exec(args);\n                var family = args && face && face[1];\n                if (closing) {\n                    return '</span>';\n                } else if (family) {\n                    return '<span style=\"font-family:' + family + '\">';\n                } else {\n                    return '<span>';\n                }\n            },\n            applicable: function (html) {\n                return /class=\"?Mso/i.test(html) || /style=\"[^\"]*mso-/i.test(html) || /urn:schemas-microsoft-com:office/.test(html);\n            },\n            stripEmptyAnchors: function (html) {\n                return html.replace(/<a([^>]*)>\\s*<\\/a>/gi, function (a, attributes) {\n                    if (!attributes || attributes.indexOf('href') < 0) {\n                        return '';\n                    }\n                    return a;\n                });\n            },\n            listType: function (p, listData) {\n                var html = p.innerHTML;\n                var text = dom.innerText(p);\n                var startingSymbol;\n                var matchSymbol = html.match(/^(?:<span [^>]*texhtml[^>]*>)?<span [^>]*(?:Symbol|Wingdings)[^>]*>([^<]+)/i);\n                var symbol = matchSymbol && matchSymbol[1];\n                var isNumber = /^[a-z\\d]/i.test(symbol);\n                var trimStartText = function (text) {\n                    return text.replace(/^(?:&nbsp;|[\\u00a0\\n\\r\\s])+/, '');\n                };\n                if (matchSymbol) {\n                    startingSymbol = true;\n                }\n                html = html.replace(/<\\/?\\w+[^>]*>/g, '').replace(/&nbsp;/g, '\\xA0');\n                if (!startingSymbol && /^[\\u2022\\u00b7\\u00a7\\u00d8o]\\u00a0+/.test(html) || startingSymbol && /^.\\u00a0+/.test(html) || symbol && !isNumber && listData) {\n                    return {\n                        tag: 'ul',\n                        style: this._guessUnorderedListStyle(trimStartText(text))\n                    };\n                }\n                if (/^\\s*\\w+[\\.\\)][\\u00a0 ]{2,}/.test(html)) {\n                    return {\n                        tag: 'ol',\n                        style: this._guessOrderedListStyle(trimStartText(text))\n                    };\n                }\n            },\n            _convertToLi: function (p) {\n                var content;\n                if (p.childNodes.length == 1) {\n                    content = p.firstChild.innerHTML.replace(/^\\w+[\\.\\)](&nbsp;)+ /, '');\n                } else {\n                    dom.remove(p.firstChild);\n                    if (p.firstChild.nodeType == 3) {\n                        if (/^[ivxlcdm]+\\.$/i.test(p.firstChild.nodeValue)) {\n                            dom.remove(p.firstChild);\n                        }\n                    }\n                    if (/^(&nbsp;|\\s)+$/i.test(p.firstChild.innerHTML)) {\n                        dom.remove(p.firstChild);\n                    }\n                    content = p.innerHTML;\n                }\n                dom.remove(p);\n                return dom.create(document, 'li', { innerHTML: content });\n            },\n            _guessUnorderedListStyle: function (symbol) {\n                if (/^[\\u2022\\u00b7\\u00FC\\u00D8\\u002dv-]/.test(symbol)) {\n                    return null;\n                } else if (/^o/.test(symbol)) {\n                    return 'circle';\n                } else {\n                    return 'square';\n                }\n            },\n            _guessOrderedListStyle: function (symbol) {\n                var listType = null;\n                if (!/^\\d/.test(symbol)) {\n                    listType = (/^[a-z]/.test(symbol) ? 'lower-' : 'upper-') + (/^[ivxlcdm]/i.test(symbol) ? 'roman' : 'alpha');\n                }\n                return listType;\n            },\n            extractListLevels: function (html) {\n                var msoListRegExp = /style=['\"]?[^'\"]*?mso-list:\\s?[a-zA-Z]+(\\d+)\\s[a-zA-Z]+(\\d+)\\s(\\w+)/gi;\n                html = html.replace(msoListRegExp, function (match, list, level) {\n                    return kendo.format('data-list=\"{0}\" data-level=\"{1}\" {2}', list, level, match);\n                });\n                return html;\n            },\n            lists: function (placeholder) {\n                var blockChildren = $(placeholder).find(dom.blockElements.join(',')), lastMargin = -1, name, levels = {}, li = placeholder, rootMargin, listContainer, i, p, type, margin, list, listData;\n                for (i = 0; i < blockChildren.length; i++) {\n                    p = blockChildren[i];\n                    listData = $(p).data();\n                    var listIndex = listData.list;\n                    name = dom.name(p);\n                    if (name == 'td') {\n                        continue;\n                    }\n                    var listType = this.listType(p, listData);\n                    type = listType && listType.tag;\n                    if (!type || name != 'p') {\n                        if (!p.innerHTML) {\n                            dom.remove(p);\n                        } else {\n                            lastMargin = -1;\n                            li = placeholder;\n                        }\n                        continue;\n                    }\n                    margin = parseFloat(p.style.marginLeft || 0);\n                    if (rootMargin === undefined) {\n                        rootMargin = margin;\n                    }\n                    var levelType = type + listIndex;\n                    if (!levels[margin]) {\n                        levels[margin] = {};\n                    }\n                    list = levels[margin][levelType];\n                    if (margin > lastMargin || !list) {\n                        list = dom.create(document, type, { style: { listStyleType: listType.style } });\n                        if (li == placeholder || margin <= lastMargin) {\n                            if (listContainer && rootMargin !== margin) {\n                                listContainer.appendChild(list);\n                            } else {\n                                dom.insertBefore(list, p);\n                            }\n                            levels[margin] = {};\n                        } else {\n                            listContainer = li;\n                            li.appendChild(list);\n                        }\n                        levels[margin][levelType] = list;\n                    }\n                    li = this._convertToLi(p);\n                    list.appendChild(li);\n                    lastMargin = margin;\n                }\n            },\n            removeAttributes: function (element) {\n                var attributes = element.attributes, i = attributes.length;\n                while (i--) {\n                    if (dom.name(attributes[i]) != 'colspan') {\n                        element.removeAttributeNode(attributes[i]);\n                    }\n                }\n            },\n            createColGroup: function (row) {\n                var cells = row.cells;\n                var table = $(row).closest('table');\n                var colgroup = table.children('colgroup');\n                if (cells.length < 2) {\n                    return;\n                } else if (colgroup.length) {\n                    cells = colgroup.children();\n                    colgroup[0].parentNode.removeChild(colgroup[0]);\n                }\n                colgroup = $($.map(cells, function (cell) {\n                    var width = cell.width;\n                    if (width && parseInt(width, 10) !== 0) {\n                        return kendo.format('<col style=\"width:{0}px;\"/>', width);\n                    }\n                    return '<col />';\n                }).join(''));\n                if (!colgroup.is('colgroup')) {\n                    colgroup = $('<colgroup/>').append(colgroup);\n                }\n                colgroup.prependTo(table);\n            },\n            convertHeaders: function (row) {\n                var cells = row.cells, i, boldedCells = $.map(cells, function (cell) {\n                        var child = $(cell).children('p').children('strong')[0];\n                        if (child && dom.name(child) == 'strong') {\n                            return child;\n                        }\n                    });\n                if (boldedCells.length == cells.length) {\n                    for (i = 0; i < boldedCells.length; i++) {\n                        dom.unwrap(boldedCells[i]);\n                    }\n                    $(row).closest('table').find('colgroup').after('<thead></thead>').end().find('thead').append(row);\n                    for (i = 0; i < cells.length; i++) {\n                        dom.changeTag(cells[i], 'th');\n                    }\n                }\n            },\n            removeParagraphs: function (cells) {\n                var i, j, len, cell, paragraphs;\n                for (i = 0; i < cells.length; i++) {\n                    this.removeAttributes(cells[i]);\n                    cell = $(cells[i]);\n                    paragraphs = cell.children('p');\n                    for (j = 0, len = paragraphs.length; j < len; j++) {\n                        if (j < len - 1) {\n                            dom.insertAfter(dom.create(document, 'br'), paragraphs[j]);\n                        }\n                        dom.unwrap(paragraphs[j]);\n                    }\n                }\n            },\n            removeDefaultColors: function (spans) {\n                for (var i = 0; i < spans.length; i++) {\n                    if (/^\\s*color:\\s*[^;]*;?$/i.test(spans[i].style.cssText)) {\n                        dom.unwrap(spans[i]);\n                    }\n                }\n            },\n            tables: function (placeholder) {\n                var tables = $(placeholder).find('table'), that = this, rows, firstRow, longestRow, i, j;\n                for (i = 0; i < tables.length; i++) {\n                    rows = tables[i].rows;\n                    longestRow = firstRow = rows[0];\n                    for (j = 1; j < rows.length; j++) {\n                        if (rows[j].cells.length > longestRow.cells.length) {\n                            longestRow = rows[j];\n                        }\n                    }\n                    that.createColGroup(longestRow);\n                    that.convertHeaders(firstRow);\n                    that.removeAttributes(tables[i]);\n                    that.removeParagraphs(tables.eq(i).find('td,th'));\n                    that.removeDefaultColors(tables.eq(i).find('span'));\n                }\n            },\n            headers: function (placeholder) {\n                var titles = $(placeholder).find('p.MsoTitle');\n                for (var i = 0; i < titles.length; i++) {\n                    dom.changeTag(titles[i], 'h1');\n                }\n            },\n            removeFormatting: function (placeholder) {\n                $(placeholder).find('*').each(function () {\n                    $(this).css({\n                        fontSize: '',\n                        fontFamily: ''\n                    });\n                    if (!this.getAttribute('style') && !this.style.cssText) {\n                        this.removeAttribute('style');\n                    }\n                });\n            },\n            clean: function (html) {\n                var that = this, placeholder;\n                var filters = this.options;\n                if (filters.none) {\n                    html = Cleaner.fn.clean.call(that, html, this.junkReplacements);\n                    html = that.stripEmptyAnchors(html);\n                } else {\n                    html = this.extractListLevels(html);\n                    html = Cleaner.fn.clean.call(that, html);\n                    html = that.stripEmptyAnchors(html);\n                    placeholder = dom.create(document, 'div', { innerHTML: html });\n                    that.headers(placeholder);\n                    if (filters.msConvertLists) {\n                        that.lists(placeholder);\n                    }\n                    that.tables(placeholder);\n                    if (filters.msAllFormatting) {\n                        that.removeFormatting(placeholder);\n                    }\n                    html = placeholder.innerHTML.replace(/(<[^>]*)\\s+class=\"?[^\"\\s>]*\"?/gi, '$1');\n                }\n                return html;\n            }\n        });\n        var WebkitFormatCleaner = Cleaner.extend({\n            init: function (options) {\n                Cleaner.fn.init.call(this, options);\n                this.replacements = [\n                    /\\s+class=\"Apple-style-span[^\"]*\"/gi,\n                    '',\n                    /<(div|p|h[1-6])\\s+style=\"[^\"]*\"/gi,\n                    '<$1',\n                    /^<div>(.*)<\\/div>$/,\n                    '$1'\n                ];\n            },\n            applicable: function (html) {\n                return /class=\"?Apple-style-span|style=\"[^\"]*-webkit-nbsp-mode/i.test(html);\n            }\n        });\n        var DomCleaner = Cleaner.extend({\n            clean: function (html) {\n                var container = dom.create(document, 'div', { innerHTML: html });\n                container = this.cleanDom(container);\n                return container.innerHTML;\n            },\n            cleanDom: function (container) {\n                return container;\n            }\n        });\n        var HtmlTagsCleaner = DomCleaner.extend({\n            cleanDom: function (container) {\n                var tags = this.collectTags();\n                $(container).find(tags).each(function () {\n                    dom.unwrap(this);\n                });\n                return container;\n            },\n            collectTags: function () {\n                if (this.options.span) {\n                    return 'span';\n                }\n            },\n            applicable: function () {\n                return this.options.span;\n            }\n        });\n        var HtmlAttrCleaner = DomCleaner.extend({\n            cleanDom: function (container) {\n                var attributes = this.collectAttr();\n                var nodes = $(container).find('[' + attributes.join('],[') + ']');\n                nodes.removeAttr(attributes.join(' '));\n                return container;\n            },\n            collectAttr: function () {\n                if (this.options.css) {\n                    return [\n                        'class',\n                        'style'\n                    ];\n                }\n                return [];\n            },\n            applicable: function () {\n                return this.options.css;\n            }\n        });\n        var TextContainer = function () {\n            this.text = '';\n            this.add = function (text) {\n                this.text += text;\n            };\n        };\n        var HtmlTextLines = Class.extend({\n            init: function (separators) {\n                this.separators = separators || {\n                    text: ' ',\n                    line: '<br/>'\n                };\n                this.lines = [];\n                this.inlineBlockText = [];\n                this.resetLine();\n            },\n            appendText: function (text) {\n                if (text.nodeType === 3) {\n                    text = text.nodeValue;\n                }\n                this.textContainer.add(text);\n            },\n            appendInlineBlockText: function (text) {\n                this.inlineBlockText.push(text);\n            },\n            flashInlineBlockText: function () {\n                if (this.inlineBlockText.length) {\n                    this.appendText(this.inlineBlockText.join(' '));\n                    this.inlineBlockText = [];\n                }\n            },\n            endLine: function () {\n                this.flashInlineBlockText();\n                this.resetLine();\n            },\n            html: function () {\n                var separators = this.separators;\n                var result = '';\n                var lines = this.lines;\n                this.flashInlineBlockText();\n                for (var i = 0, il = lines.length, il1 = il - 1; i < il; i++) {\n                    var line = lines[i];\n                    for (var j = 0, jl = line.length, jl1 = jl - 1; j < jl; j++) {\n                        var text = line[j].text;\n                        result += text;\n                        if (j !== jl1) {\n                            result += separators.text;\n                        }\n                    }\n                    if (i !== il1) {\n                        result += separators.line;\n                    }\n                }\n                return result;\n            },\n            resetLine: function () {\n                this.textContainer = new TextContainer();\n                this.line = [];\n                this.line.push(this.textContainer);\n                this.lines.push(this.line);\n            }\n        });\n        var DomEnumerator = Class.extend({\n            init: function (callback) {\n                this.callback = callback;\n            },\n            enumerate: function (node) {\n                if (!node) {\n                    return;\n                }\n                var preventDown = this.callback(node);\n                var child = node.firstChild;\n                if (!preventDown && child) {\n                    this.enumerate(child);\n                }\n                this.enumerate(node.nextSibling);\n            }\n        });\n        var HtmlContentCleaner = Cleaner.extend({\n            init: function (options) {\n                Cleaner.fn.init.call(this, options);\n                this.hasText = false;\n                this.enumerator = new DomEnumerator($.proxy(this.buildText, this));\n            },\n            clean: function (html) {\n                var container = dom.create(document, 'div', { innerHTML: html });\n                return this.cleanDom(container);\n            },\n            cleanDom: function (container) {\n                this.separators = this.getDefaultSeparators();\n                this.htmlLines = new HtmlTextLines(this.separators);\n                this.enumerator.enumerate(container.firstChild);\n                this.hasText = false;\n                return this.htmlLines.html();\n            },\n            buildText: function (node) {\n                if (dom.isDataNode(node)) {\n                    if (dom.isEmptyspace(node)) {\n                        return;\n                    }\n                    this.htmlLines.appendText(node.nodeValue.replace('\\n', this.separators.line));\n                    this.hasText = true;\n                } else if (dom.isBlock(node) && this.hasText) {\n                    var action = this.actions[dom.name(node)] || this.actions.block;\n                    return action(this, node);\n                }\n            },\n            applicable: function () {\n                var o = this.options;\n                return o.all || o.keepNewLines;\n            },\n            getDefaultSeparators: function () {\n                if (this.options.all) {\n                    return {\n                        text: ' ',\n                        line: ' '\n                    };\n                } else {\n                    return {\n                        text: ' ',\n                        line: '<br/>'\n                    };\n                }\n            },\n            actions: {\n                ul: $.noop,\n                ol: $.noop,\n                table: $.noop,\n                thead: $.noop,\n                tbody: $.noop,\n                td: function (cleaner, node) {\n                    var tdCleaner = new HtmlContentCleaner({ all: true });\n                    var cellText = tdCleaner.cleanDom(node);\n                    cleaner.htmlLines.appendInlineBlockText(cellText);\n                    return true;\n                },\n                block: function (cleaner) {\n                    cleaner.htmlLines.endLine();\n                }\n            }\n        });\n        var CustomCleaner = Cleaner.extend({\n            clean: function (html) {\n                return this.options.custom(html);\n            },\n            applicable: function () {\n                return typeof this.options.custom === 'function';\n            }\n        });\n        var PrintCommand = Command.extend({\n            init: function (options) {\n                Command.fn.init.call(this, options);\n                this.managesUndoRedo = true;\n            },\n            exec: function () {\n                var editor = this.editor;\n                if (kendo.support.browser.msie) {\n                    editor.document.execCommand('print', false, null);\n                } else if (editor.window.print) {\n                    editor.window.print();\n                }\n            }\n        });\n        var ExportPdfCommand = Command.extend({\n            init: function (options) {\n                this.async = true;\n                Command.fn.init.call(this, options);\n            },\n            exec: function () {\n                var that = this;\n                var range = that.lockRange(true);\n                var editor = that.editor;\n                editor._destroyResizings();\n                editor.saveAsPDF().then(function () {\n                    that.releaseRange(range);\n                    editor._initializeColumnResizing();\n                    editor._initializeRowResizing();\n                    editor._initializeTableResizing();\n                });\n            }\n        });\n        extend(editorNS, {\n            _finishUpdate: finishUpdate,\n            Command: Command,\n            GenericCommand: GenericCommand,\n            InsertHtmlCommand: InsertHtmlCommand,\n            InsertHtmlTool: InsertHtmlTool,\n            TypingHandler: TypingHandler,\n            SystemHandler: SystemHandler,\n            BackspaceHandler: BackspaceHandler,\n            SelectAllHandler: SelectAllHandler,\n            Keyboard: Keyboard,\n            Clipboard: Clipboard,\n            Cleaner: Cleaner,\n            ScriptCleaner: ScriptCleaner,\n            TabCleaner: TabCleaner,\n            MSWordFormatCleaner: MSWordFormatCleaner,\n            WebkitFormatCleaner: WebkitFormatCleaner,\n            HtmlTagsCleaner: HtmlTagsCleaner,\n            HtmlAttrCleaner: HtmlAttrCleaner,\n            HtmlContentCleaner: HtmlContentCleaner,\n            HtmlTextLines: HtmlTextLines,\n            CustomCleaner: CustomCleaner,\n            PrintCommand: PrintCommand,\n            ExportPdfCommand: ExportPdfCommand\n        });\n        registerTool('insertHtml', new InsertHtmlTool({\n            template: new ToolTemplate({\n                template: EditorUtils.dropDownListTemplate,\n                title: 'Insert HTML',\n                initialValue: 'Insert HTML'\n            })\n        }));\n        registerTool('print', new Tool({\n            command: PrintCommand,\n            template: new ToolTemplate({\n                template: EditorUtils.buttonTemplate,\n                title: 'Print'\n            })\n        }));\n        registerTool('pdf', new Tool({\n            command: ExportPdfCommand,\n            template: new ToolTemplate({\n                template: EditorUtils.buttonTemplate,\n                title: 'Export PDF'\n            })\n        }));\n    }(window.kendo.jQuery));\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('editor/inlineformat', ['editor/system'], f);\n}(function () {\n    (function ($) {\n        var kendo = window.kendo, Class = kendo.Class, Editor = kendo.ui.editor, formats = kendo.ui.Editor.fn.options.formats, EditorUtils = Editor.EditorUtils, Tool = Editor.Tool, ToolTemplate = Editor.ToolTemplate, FormatTool = Editor.FormatTool, dom = Editor.Dom, RangeUtils = Editor.RangeUtils, extend = $.extend, registerTool = Editor.EditorUtils.registerTool, registerFormat = Editor.EditorUtils.registerFormat, preventDefault = function (ev) {\n                ev.preventDefault();\n            }, MOUSEDOWN_NS = 'mousedown.kendoEditor', KEYDOWN_NS = 'keydown.kendoEditor', KMARKER = 'k-marker';\n        var InlineFormatFinder = Class.extend({\n            init: function (format) {\n                this.format = format;\n            },\n            numberOfSiblings: function (referenceNode) {\n                var textNodesCount = 0, elementNodesCount = 0, markerCount = 0, parentNode = referenceNode.parentNode, node;\n                for (node = parentNode.firstChild; node; node = node.nextSibling) {\n                    if (node != referenceNode) {\n                        if (node.className == KMARKER) {\n                            markerCount++;\n                        } else if (node.nodeType == 3) {\n                            textNodesCount++;\n                        } else {\n                            elementNodesCount++;\n                        }\n                    }\n                }\n                if (markerCount > 1 && parentNode.firstChild.className == KMARKER && parentNode.lastChild.className == KMARKER) {\n                    return 0;\n                } else {\n                    return elementNodesCount + textNodesCount;\n                }\n            },\n            findSuitable: function (sourceNode, skip) {\n                if (!skip && this.numberOfSiblings(sourceNode) > 0) {\n                    return null;\n                }\n                var node = sourceNode.parentNode;\n                var tags = this.format[0].tags;\n                while (!dom.ofType(node, tags)) {\n                    if (this.numberOfSiblings(node) > 0) {\n                        return null;\n                    }\n                    node = node.parentNode;\n                }\n                return node;\n            },\n            findFormat: function (sourceNode) {\n                var format = this.format, attrEquals = dom.attrEquals, i, len, node, tags, attributes;\n                for (i = 0, len = format.length; i < len; i++) {\n                    node = sourceNode;\n                    tags = format[i].tags;\n                    attributes = format[i].attr;\n                    if (node && dom.ofType(node, tags) && attrEquals(node, attributes)) {\n                        return node;\n                    }\n                    while (node) {\n                        node = dom.parentOfType(node, tags);\n                        if (node && attrEquals(node, attributes)) {\n                            return node;\n                        }\n                    }\n                }\n                return null;\n            },\n            isFormatted: function (nodes) {\n                var i, len;\n                for (i = 0, len = nodes.length; i < len; i++) {\n                    if (this.findFormat(nodes[i])) {\n                        return true;\n                    }\n                }\n                return false;\n            }\n        });\n        var InlineFormatter = Class.extend({\n            init: function (format, values) {\n                this.finder = new InlineFormatFinder(format);\n                this.attributes = extend({}, format[0].attr, values);\n                this.tag = format[0].tags[0];\n            },\n            wrap: function (node) {\n                return dom.wrap(node, dom.create(node.ownerDocument, this.tag, this.attributes));\n            },\n            activate: function (range, nodes) {\n                if (this.finder.isFormatted(nodes)) {\n                    this.split(range);\n                    this.remove(nodes);\n                } else {\n                    this.apply(nodes);\n                }\n            },\n            toggle: function (range) {\n                var textNodes = this.immutables() ? RangeUtils.editableTextNodes : RangeUtils.textNodes;\n                var nodes = textNodes(range);\n                if (nodes.length > 0) {\n                    this.activate(range, nodes);\n                }\n            },\n            immutables: function () {\n                return this.editor && this.editor.options.immutables;\n            },\n            apply: function (nodes) {\n                var formatNodes = [];\n                var i, l, node, formatNode;\n                var attributes = this.attributes;\n                var styleAttr = attributes ? attributes.style || {} : {};\n                for (i = 0, l = nodes.length; i < l; i++) {\n                    node = nodes[i];\n                    formatNode = this.finder.findSuitable(node);\n                    if (formatNode) {\n                        if (dom.is(formatNode, 'font')) {\n                            if (styleAttr.color) {\n                                formatNode.removeAttribute('color');\n                            }\n                            if (styleAttr.fontName) {\n                                formatNode.removeAttribute('face');\n                            }\n                            if (styleAttr.fontSize) {\n                                formatNode.removeAttribute('size');\n                            }\n                        }\n                        dom.attr(formatNode, attributes);\n                    } else {\n                        while (!dom.isBlock(node.parentNode) && node.parentNode.childNodes.length == 1 && node.parentNode.contentEditable !== 'true') {\n                            node = node.parentNode;\n                        }\n                        formatNode = this.wrap(node);\n                    }\n                    formatNodes.push(formatNode);\n                }\n                this.consolidate(formatNodes);\n            },\n            remove: function (nodes) {\n                var i, l, formatNode;\n                for (i = 0, l = nodes.length; i < l; i++) {\n                    formatNode = this.finder.findFormat(nodes[i]);\n                    if (formatNode) {\n                        if (this.attributes && this.attributes.style) {\n                            dom.unstyle(formatNode, this.attributes.style);\n                            if (!formatNode.style.cssText && !formatNode.attributes['class']) {\n                                dom.unwrap(formatNode);\n                            }\n                        } else {\n                            dom.unwrap(formatNode);\n                        }\n                    }\n                }\n            },\n            split: function (range) {\n                var nodes = RangeUtils.textNodes(range);\n                var l = nodes.length;\n                var i, formatNode;\n                if (l > 0) {\n                    for (i = 0; i < l; i++) {\n                        formatNode = this.finder.findFormat(nodes[i]);\n                        if (formatNode) {\n                            RangeUtils.split(range, formatNode, true);\n                        }\n                    }\n                }\n            },\n            consolidate: function (nodes) {\n                var node, last;\n                while (nodes.length > 1) {\n                    node = nodes.pop();\n                    last = nodes[nodes.length - 1];\n                    if (node.previousSibling && node.previousSibling.className == KMARKER) {\n                        last.appendChild(node.previousSibling);\n                    }\n                    if (node.tagName == last.tagName && node.previousSibling == last && node.style.cssText == last.style.cssText) {\n                        while (node.firstChild) {\n                            last.appendChild(node.firstChild);\n                        }\n                        dom.remove(node);\n                    }\n                }\n            }\n        });\n        var GreedyInlineFormatFinder = InlineFormatFinder.extend({\n            init: function (format, greedyProperty) {\n                this.format = format;\n                this.greedyProperty = greedyProperty;\n                InlineFormatFinder.fn.init.call(this, format);\n            },\n            getInlineCssValue: function (node) {\n                var attributes = node.attributes;\n                var trim = $.trim;\n                var i, l, attribute, name, attributeValue, css, pair, cssIndex, len;\n                var propertyAndValue, property, value;\n                if (!attributes) {\n                    return;\n                }\n                for (i = 0, l = attributes.length; i < l; i++) {\n                    attribute = attributes[i];\n                    name = attribute.nodeName;\n                    attributeValue = attribute.nodeValue;\n                    if (attribute.specified && name == 'style') {\n                        css = trim(attributeValue || node.style.cssText).split(';');\n                        for (cssIndex = 0, len = css.length; cssIndex < len; cssIndex++) {\n                            pair = css[cssIndex];\n                            if (pair.length) {\n                                propertyAndValue = pair.split(':');\n                                property = trim(propertyAndValue[0].toLowerCase());\n                                value = trim(propertyAndValue[1]);\n                                if (property != this.greedyProperty) {\n                                    continue;\n                                }\n                                return property.indexOf('color') >= 0 ? dom.toHex(value) : value;\n                            }\n                        }\n                    }\n                }\n            },\n            getFormatInner: function (node) {\n                var $node = $(dom.isDataNode(node) ? node.parentNode : node);\n                var parents = $node.parentsUntil('[contentEditable]').addBack().toArray().reverse();\n                var i, len, value;\n                for (i = 0, len = parents.length; i < len; i++) {\n                    value = this.greedyProperty == 'className' ? parents[i].className : this.getInlineCssValue(parents[i]);\n                    if (value) {\n                        return value;\n                    }\n                }\n                return 'inherit';\n            },\n            getFormat: function (nodes) {\n                var result = this.getFormatInner(nodes[0]), i, len;\n                for (i = 1, len = nodes.length; i < len; i++) {\n                    if (result != this.getFormatInner(nodes[i])) {\n                        return '';\n                    }\n                }\n                return result;\n            },\n            isFormatted: function (nodes) {\n                return this.getFormat(nodes) !== '';\n            }\n        });\n        var GreedyInlineFormatter = InlineFormatter.extend({\n            init: function (format, values, greedyProperty) {\n                InlineFormatter.fn.init.call(this, format, values);\n                this.values = values;\n                this.finder = new GreedyInlineFormatFinder(format, greedyProperty);\n                if (greedyProperty) {\n                    this.greedyProperty = kendo.toCamelCase(greedyProperty);\n                }\n            },\n            activate: function (range, nodes) {\n                var greedyProperty = this.greedyProperty;\n                var action = 'apply';\n                this.split(range);\n                if (greedyProperty && this.values.style[greedyProperty] == 'inherit') {\n                    action = 'remove';\n                }\n                this[action](nodes);\n            }\n        });\n        var InlineFormatTool = FormatTool.extend({\n            init: function (options) {\n                FormatTool.fn.init.call(this, extend(options, {\n                    finder: new InlineFormatFinder(options.format),\n                    formatter: function () {\n                        return new InlineFormatter(options.format);\n                    }\n                }));\n            }\n        });\n        var DelayedExecutionTool = Tool.extend({\n            update: function (ui, nodes) {\n                var list = ui.data(this.type);\n                list.close();\n                list.value(this.finder.getFormat(nodes));\n            }\n        });\n        var FontTool = DelayedExecutionTool.extend({\n            init: function (options) {\n                Tool.fn.init.call(this, options);\n                this.type = kendo.support.browser.msie || kendo.support.touch ? 'kendoDropDownList' : 'kendoComboBox';\n                this.format = [{\n                        tags: [\n                            'span',\n                            'font'\n                        ]\n                    }];\n                this.finder = new GreedyInlineFormatFinder(this.format, options.cssAttr);\n            },\n            command: function (commandArguments) {\n                var options = this.options, format = this.format, style = {};\n                return new Editor.FormatCommand(extend(commandArguments, {\n                    formatter: function () {\n                        style[options.domAttr] = commandArguments.value;\n                        return new GreedyInlineFormatter(format, { style: style }, options.cssAttr);\n                    }\n                }));\n            },\n            initialize: function (ui, initOptions) {\n                var editor = initOptions.editor, options = this.options, toolName = options.name, dataSource, range, defaultValue = [];\n                if (options.defaultValue) {\n                    defaultValue = [{\n                            text: editor.options.messages[options.defaultValue[0].text],\n                            value: options.defaultValue[0].value\n                        }];\n                }\n                dataSource = defaultValue.concat(options.items ? options.items : editor.options[toolName] || []);\n                ui.attr({ title: initOptions.title });\n                ui[this.type]({\n                    dataTextField: 'text',\n                    dataValueField: 'value',\n                    dataSource: dataSource,\n                    change: function () {\n                        editor._range = range;\n                        Tool.exec(editor, toolName, this.value());\n                    },\n                    close: function () {\n                        setTimeout(function () {\n                            if ('_range' in editor) {\n                                delete editor._range;\n                            }\n                        }, 0);\n                    },\n                    highlightFirst: false\n                });\n                ui.closest('.k-widget').removeClass('k-' + toolName).find('*').addBack().attr('unselectable', 'on');\n                var widget = ui.data(this.type);\n                widget.value('inherit');\n                widget.wrapper.on(MOUSEDOWN_NS, '.k-select,.k-input', function () {\n                    var newRange = editor.getRange();\n                    range = editor._containsRange(newRange) ? newRange : range;\n                }).on(KEYDOWN_NS, function (e) {\n                    if (e.keyCode === kendo.keys.ENTER) {\n                        e.preventDefault();\n                    }\n                });\n            }\n        });\n        var ColorTool = Tool.extend({\n            init: function (options) {\n                Tool.fn.init.call(this, options);\n                this.format = [{\n                        tags: [\n                            'span',\n                            'font'\n                        ]\n                    }];\n                this.finder = new GreedyInlineFormatFinder(this.format, options.cssAttr);\n            },\n            options: { palette: 'websafe' },\n            update: function () {\n                this._widget.close();\n            },\n            command: function (commandArguments) {\n                var options = this.options, format = this.format, style = {};\n                return new Editor.FormatCommand(extend(commandArguments, {\n                    formatter: function () {\n                        style[options.domAttr] = commandArguments.value;\n                        return new GreedyInlineFormatter(format, { style: style }, options.cssAttr);\n                    }\n                }));\n            },\n            initialize: function (ui, initOptions) {\n                var editor = initOptions.editor, toolName = this.name, options = extend({}, ColorTool.fn.options, this.options), palette = options.palette, columns = options.columns;\n                ui = this._widget = new kendo.ui.ColorPicker(ui, {\n                    toolIcon: 'k-icon k-i-' + EditorUtils.getToolCssClass(options.name),\n                    palette: palette,\n                    columns: columns,\n                    change: function () {\n                        var color = ui.value();\n                        if (color) {\n                            Tool.exec(editor, toolName, color);\n                        }\n                        editor.focus();\n                    },\n                    open: function (e) {\n                        var picker = e.sender;\n                        picker.value(null);\n                        picker._popup.element.on(MOUSEDOWN_NS, preventDefault);\n                    },\n                    close: function (e) {\n                        e.sender._popup.element.off(MOUSEDOWN_NS);\n                    },\n                    activate: function (e) {\n                        e.preventDefault();\n                        ui.trigger('change');\n                    }\n                });\n                ui.wrapper.attr({\n                    title: initOptions.title,\n                    unselectable: 'on'\n                }).find('*').attr('unselectable', 'on');\n            }\n        });\n        extend(Editor, {\n            InlineFormatFinder: InlineFormatFinder,\n            InlineFormatter: InlineFormatter,\n            DelayedExecutionTool: DelayedExecutionTool,\n            GreedyInlineFormatFinder: GreedyInlineFormatFinder,\n            GreedyInlineFormatter: GreedyInlineFormatter,\n            InlineFormatTool: InlineFormatTool,\n            FontTool: FontTool,\n            ColorTool: ColorTool\n        });\n        registerFormat('bold', [\n            {\n                tags: [\n                    'strong',\n                    'b'\n                ]\n            },\n            {\n                tags: ['span'],\n                attr: { style: { fontWeight: 'bold' } }\n            }\n        ]);\n        registerTool('bold', new InlineFormatTool({\n            key: 'B',\n            ctrl: true,\n            format: formats.bold,\n            template: new ToolTemplate({\n                template: EditorUtils.buttonTemplate,\n                title: 'Bold'\n            })\n        }));\n        registerFormat('italic', [\n            {\n                tags: [\n                    'em',\n                    'i'\n                ]\n            },\n            {\n                tags: ['span'],\n                attr: { style: { fontStyle: 'italic' } }\n            }\n        ]);\n        registerTool('italic', new InlineFormatTool({\n            key: 'I',\n            ctrl: true,\n            format: formats.italic,\n            template: new ToolTemplate({\n                template: EditorUtils.buttonTemplate,\n                title: 'Italic'\n            })\n        }));\n        registerFormat('underline', [\n            {\n                tags: ['span'],\n                attr: { style: { textDecoration: 'underline' } }\n            },\n            { tags: ['u'] }\n        ]);\n        registerTool('underline', new InlineFormatTool({\n            key: 'U',\n            ctrl: true,\n            format: formats.underline,\n            template: new ToolTemplate({\n                template: EditorUtils.buttonTemplate,\n                title: 'Underline'\n            })\n        }));\n        registerFormat('strikethrough', [\n            {\n                tags: [\n                    'del',\n                    'strike'\n                ]\n            },\n            {\n                tags: ['span'],\n                attr: { style: { textDecoration: 'line-through' } }\n            }\n        ]);\n        registerTool('strikethrough', new InlineFormatTool({\n            format: formats.strikethrough,\n            template: new ToolTemplate({\n                template: EditorUtils.buttonTemplate,\n                title: 'Strikethrough'\n            })\n        }));\n        registerFormat('superscript', [{ tags: ['sup'] }]);\n        registerTool('superscript', new InlineFormatTool({\n            format: formats.superscript,\n            template: new ToolTemplate({\n                template: EditorUtils.buttonTemplate,\n                title: 'Superscript'\n            })\n        }));\n        registerFormat('subscript', [{ tags: ['sub'] }]);\n        registerTool('subscript', new InlineFormatTool({\n            format: formats.subscript,\n            template: new ToolTemplate({\n                template: EditorUtils.buttonTemplate,\n                title: 'Subscript'\n            })\n        }));\n        registerTool('foreColor', new ColorTool({\n            cssAttr: 'color',\n            domAttr: 'color',\n            name: 'foreColor',\n            template: new ToolTemplate({\n                template: EditorUtils.colorPickerTemplate,\n                title: 'Color'\n            })\n        }));\n        registerTool('backColor', new ColorTool({\n            cssAttr: 'background-color',\n            domAttr: 'backgroundColor',\n            name: 'backColor',\n            template: new ToolTemplate({\n                template: EditorUtils.colorPickerTemplate,\n                title: 'Background Color'\n            })\n        }));\n        registerTool('fontName', new FontTool({\n            cssAttr: 'font-family',\n            domAttr: 'fontFamily',\n            name: 'fontName',\n            defaultValue: [{\n                    text: 'fontNameInherit',\n                    value: 'inherit'\n                }],\n            template: new ToolTemplate({\n                template: EditorUtils.comboBoxTemplate,\n                title: 'Font Name'\n            })\n        }));\n        registerTool('fontSize', new FontTool({\n            cssAttr: 'font-size',\n            domAttr: 'fontSize',\n            name: 'fontSize',\n            defaultValue: [{\n                    text: 'fontSizeInherit',\n                    value: 'inherit'\n                }],\n            template: new ToolTemplate({\n                template: EditorUtils.comboBoxTemplate,\n                title: 'Font Size'\n            })\n        }));\n    }(window.kendo.jQuery));\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('editor/formatblock', ['editor/inlineformat'], f);\n}(function () {\n    (function ($) {\n        var kendo = window.kendo, Class = kendo.Class, extend = $.extend, Editor = kendo.ui.editor, formats = kendo.ui.Editor.fn.options.formats, dom = Editor.Dom, Command = Editor.Command, ToolTemplate = Editor.ToolTemplate, FormatTool = Editor.FormatTool, EditorUtils = Editor.EditorUtils, registerTool = EditorUtils.registerTool, registerFormat = EditorUtils.registerFormat, RangeUtils = Editor.RangeUtils;\n        var BlockFormatFinder = Class.extend({\n            init: function (format) {\n                this.format = format;\n            },\n            contains: function (node, children) {\n                var i, len, child;\n                for (i = 0, len = children.length; i < len; i++) {\n                    child = children[i];\n                    if (!child || !dom.isAncestorOrSelf(node, child)) {\n                        return false;\n                    }\n                }\n                return true;\n            },\n            findSuitable: function (nodes) {\n                var format = this.format, suitable = [], i, len, candidate;\n                for (i = 0, len = nodes.length; i < len; i++) {\n                    for (var f = format.length - 1; f >= 0; f--) {\n                        candidate = dom.ofType(nodes[i], format[f].tags) ? nodes[i] : dom.closestEditableOfType(nodes[i], format[f].tags);\n                        if (candidate) {\n                            break;\n                        }\n                    }\n                    if (!candidate || candidate.contentEditable === 'true') {\n                        return [];\n                    }\n                    if ($.inArray(candidate, suitable) < 0) {\n                        suitable.push(candidate);\n                    }\n                }\n                this._resolveListsItems(suitable);\n                for (i = 0, len = suitable.length; i < len; i++) {\n                    if (this.contains(suitable[i], suitable)) {\n                        return [suitable[i]];\n                    }\n                }\n                return suitable;\n            },\n            _resolveListsItems: function (nodes) {\n                var i, node, wrapper;\n                for (i = 0; i < nodes.length; i++) {\n                    node = nodes[i];\n                    wrapper = dom.is(node, 'li') ? node : dom.wrapper(node);\n                    wrapper = wrapper && dom.list(wrapper) ? wrapper.children[0] : wrapper;\n                    if (dom.is(wrapper, 'li')) {\n                        node = nodes[i] = wrapper;\n                    }\n                }\n            },\n            findFormat: function (sourceNode) {\n                var format = this.format, i, len, node, tags, attributes;\n                var editableParent = dom.editableParent(sourceNode);\n                var immutables = this.options && this.options.immutables;\n                var ImmutablesNS = Editor.Immutables;\n                for (i = 0, len = format.length; i < len; i++) {\n                    node = sourceNode;\n                    tags = format[i].tags;\n                    attributes = format[i].attr;\n                    if (immutables && tags && tags[0] == 'immutable') {\n                        var immutable = ImmutablesNS.immutableParent(node);\n                        if (immutable && dom.attrEquals(immutable, attributes)) {\n                            return node;\n                        }\n                    }\n                    while (node && dom.isAncestorOf(editableParent, node)) {\n                        if (dom.ofType(node, tags) && dom.attrEquals(node, attributes)) {\n                            return node;\n                        }\n                        node = node.parentNode;\n                    }\n                }\n                return null;\n            },\n            getFormat: function (nodes) {\n                var that = this, findFormat = function (node) {\n                        return that.findFormat(dom.isDataNode(node) ? node.parentNode : node);\n                    }, result = findFormat(nodes[0]), i, len;\n                if (!result) {\n                    return '';\n                }\n                for (i = 1, len = nodes.length; i < len; i++) {\n                    if (result != findFormat(nodes[i])) {\n                        return '';\n                    }\n                }\n                return result.nodeName.toLowerCase();\n            },\n            isFormatted: function (nodes) {\n                for (var i = 0, len = nodes.length; i < len; i++) {\n                    if (!this.findFormat(nodes[i])) {\n                        return false;\n                    }\n                }\n                return true;\n            }\n        });\n        var BlockFormatter = Class.extend({\n            init: function (format, values) {\n                this.format = format;\n                this.values = values;\n                this.finder = new BlockFormatFinder(format);\n            },\n            wrap: function (tag, attributes, nodes) {\n                var commonAncestor = nodes.length == 1 ? dom.blockParentOrBody(nodes[0]) : dom.commonAncestor.apply(null, nodes);\n                if (dom.isInline(commonAncestor)) {\n                    commonAncestor = dom.blockParentOrBody(commonAncestor);\n                }\n                var ancestors = dom.significantChildNodes(commonAncestor), position = dom.findNodeIndex(ancestors[0]), wrapper = dom.create(commonAncestor.ownerDocument, tag, attributes), i, ancestor;\n                for (i = 0; i < ancestors.length; i++) {\n                    ancestor = ancestors[i];\n                    if (dom.isBlock(ancestor)) {\n                        dom.attr(ancestor, attributes);\n                        if (wrapper.childNodes.length) {\n                            dom.insertBefore(wrapper, ancestor);\n                            wrapper = wrapper.cloneNode(false);\n                        }\n                        position = dom.findNodeIndex(ancestor) + 1;\n                        continue;\n                    }\n                    wrapper.appendChild(ancestor);\n                }\n                if (wrapper.firstChild) {\n                    dom.insertAt(commonAncestor, wrapper, position);\n                }\n            },\n            apply: function (nodes) {\n                var format, values = this.values;\n                function attributes(format) {\n                    return extend({}, format && format.attr, values);\n                }\n                this._handleImmutables(nodes, true);\n                var images = dom.filter('img', nodes);\n                var imageFormat = EditorUtils.formatByName('img', this.format);\n                var imageAttributes = attributes(imageFormat);\n                $.each(images, function () {\n                    dom.attr(this, imageAttributes);\n                });\n                if (images.length == nodes.length) {\n                    return;\n                }\n                var nonImages = dom.filter('img', nodes, true);\n                var formatNodes = this.finder.findSuitable(nonImages);\n                if (formatNodes.length) {\n                    for (var i = 0, len = formatNodes.length; i < len; i++) {\n                        format = EditorUtils.formatByName(dom.name(formatNodes[i]), this.format);\n                        dom.attr(formatNodes[i], attributes(format));\n                    }\n                } else {\n                    format = this.format[0];\n                    this.wrap(format.tags[0], attributes(format), nonImages);\n                }\n            },\n            _handleImmutables: function (nodes, applyFormatting) {\n                if (!this.immutables()) {\n                    return;\n                }\n                var immutableFormat = EditorUtils.formatByName('immutable', this.format);\n                if (!immutableFormat) {\n                    return;\n                }\n                var ImmutablesNS = Editor.Immutables;\n                var l = nodes.length - 1;\n                for (var i = l; i >= 0; i--) {\n                    var immutableParent = ImmutablesNS.immutableParent(nodes[i]);\n                    if (!immutableParent) {\n                        continue;\n                    }\n                    if (immutableParent !== nodes[i + 1]) {\n                        if (applyFormatting) {\n                            dom.attr(immutableParent, immutableFormat.attr);\n                        } else {\n                            dom.unstyle(immutableParent, immutableFormat.attr.style);\n                        }\n                    }\n                    nodes.splice(i, 1);\n                }\n            },\n            immutables: function () {\n                return this.editor && this.editor.options.immutables;\n            },\n            remove: function (nodes) {\n                var i, l, formatNode, namedFormat, name;\n                this._handleImmutables(nodes, false);\n                for (i = 0, l = nodes.length; i < l; i++) {\n                    formatNode = this.finder.findFormat(nodes[i]);\n                    if (formatNode) {\n                        name = dom.name(formatNode);\n                        if (name == 'div' && !formatNode.getAttribute('class')) {\n                            dom.unwrap(formatNode);\n                        } else {\n                            namedFormat = EditorUtils.formatByName(name, this.format);\n                            if (namedFormat.attr.style) {\n                                dom.unstyle(formatNode, namedFormat.attr.style);\n                            }\n                            if (namedFormat.attr.className) {\n                                dom.removeClass(formatNode, namedFormat.attr.className);\n                            }\n                        }\n                    }\n                }\n            },\n            toggle: function (range) {\n                var that = this, nodes = dom.filterBy(RangeUtils.nodes(range), dom.htmlIndentSpace, true);\n                if (that.finder.isFormatted(nodes)) {\n                    that.remove(nodes);\n                } else {\n                    that.apply(nodes);\n                }\n            }\n        });\n        var GreedyBlockFormatter = Class.extend({\n            init: function (format, values) {\n                var that = this;\n                that.format = format;\n                that.values = values;\n                that.finder = new BlockFormatFinder(format);\n            },\n            apply: function (nodes) {\n                var format = this.format;\n                var blocks = dom.blockParents(nodes);\n                var formatTag = format[0].tags[0];\n                var i, len, list, formatter, range;\n                var element;\n                var tagName;\n                var block;\n                var immutalbeParent;\n                if (blocks.length) {\n                    for (i = 0, len = blocks.length; i < len; i++) {\n                        block = blocks[i];\n                        immutalbeParent = this.immutables() && Editor.Immutables.immutableParent(block);\n                        if (!immutalbeParent) {\n                            tagName = dom.name(block);\n                            if (tagName == 'li') {\n                                list = block.parentNode;\n                                formatter = new Editor.ListFormatter(list.nodeName.toLowerCase(), formatTag);\n                                range = this.editor.createRange();\n                                range.selectNode(blocks[i]);\n                                formatter.toggle(range);\n                            } else if (formatTag && (tagName == 'td' || block.attributes.contentEditable)) {\n                                new BlockFormatter(format, this.values).apply(block.childNodes);\n                            } else {\n                                element = dom.changeTag(block, formatTag);\n                                dom.attr(element, format[0].attr);\n                            }\n                        }\n                    }\n                } else {\n                    var blockFormatter = new BlockFormatter(format, this.values);\n                    blockFormatter.editor = this.editor;\n                    blockFormatter.apply(nodes);\n                }\n            },\n            toggle: function (range) {\n                var nodes = RangeUtils.textNodes(range);\n                if (!nodes.length) {\n                    range.selectNodeContents(range.commonAncestorContainer);\n                    nodes = RangeUtils.textNodes(range);\n                    if (!nodes.length) {\n                        nodes = dom.significantChildNodes(range.commonAncestorContainer);\n                    }\n                }\n                this.apply(nodes);\n            },\n            immutables: function () {\n                return this.editor && this.editor.options.immutables;\n            }\n        });\n        var FormatCommand = Command.extend({\n            init: function (options) {\n                options.formatter = options.formatter();\n                var finder = options.formatter.finder;\n                if (finder && EditorUtils.formatByName('immutable', finder.format)) {\n                    finder._initOptions({ immutables: options.immutables });\n                }\n                Command.fn.init.call(this, options);\n            }\n        });\n        var BlockFormatTool = FormatTool.extend({\n            init: function (options) {\n                FormatTool.fn.init.call(this, extend(options, {\n                    finder: new BlockFormatFinder(options.format),\n                    formatter: function () {\n                        return new BlockFormatter(options.format);\n                    }\n                }));\n            }\n        });\n        extend(Editor, {\n            BlockFormatFinder: BlockFormatFinder,\n            BlockFormatter: BlockFormatter,\n            GreedyBlockFormatter: GreedyBlockFormatter,\n            FormatCommand: FormatCommand,\n            BlockFormatTool: BlockFormatTool\n        });\n        var listElements = [\n            'ul',\n            'ol',\n            'li'\n        ];\n        registerFormat('justifyLeft', [\n            {\n                tags: dom.nonListBlockElements,\n                attr: { style: { textAlign: 'left' } }\n            },\n            {\n                tags: ['img'],\n                attr: {\n                    style: {\n                        'float': 'left',\n                        display: '',\n                        marginLeft: '',\n                        marginRight: ''\n                    }\n                }\n            },\n            {\n                tags: ['immutable'],\n                attr: {\n                    style: {\n                        'float': 'left',\n                        display: '',\n                        marginLeft: '',\n                        marginRight: ''\n                    }\n                }\n            },\n            {\n                tags: listElements,\n                attr: {\n                    style: {\n                        textAlign: 'left',\n                        listStylePosition: ''\n                    }\n                }\n            }\n        ]);\n        registerTool('justifyLeft', new BlockFormatTool({\n            format: formats.justifyLeft,\n            template: new ToolTemplate({\n                template: EditorUtils.buttonTemplate,\n                title: 'Justify Left'\n            })\n        }));\n        registerFormat('justifyCenter', [\n            {\n                tags: dom.nonListBlockElements,\n                attr: { style: { textAlign: 'center' } }\n            },\n            {\n                tags: ['img'],\n                attr: {\n                    style: {\n                        display: 'block',\n                        marginLeft: 'auto',\n                        marginRight: 'auto',\n                        'float': ''\n                    }\n                }\n            },\n            {\n                tags: ['immutable'],\n                attr: {\n                    style: {\n                        display: 'block',\n                        marginLeft: 'auto',\n                        marginRight: 'auto',\n                        'float': ''\n                    }\n                }\n            },\n            {\n                tags: listElements,\n                attr: {\n                    style: {\n                        textAlign: 'center',\n                        listStylePosition: 'inside'\n                    }\n                }\n            }\n        ]);\n        registerTool('justifyCenter', new BlockFormatTool({\n            format: formats.justifyCenter,\n            template: new ToolTemplate({\n                template: EditorUtils.buttonTemplate,\n                title: 'Justify Center'\n            })\n        }));\n        registerFormat('justifyRight', [\n            {\n                tags: dom.nonListBlockElements,\n                attr: { style: { textAlign: 'right' } }\n            },\n            {\n                tags: ['img'],\n                attr: {\n                    style: {\n                        'float': 'right',\n                        display: '',\n                        marginLeft: '',\n                        marginRight: ''\n                    }\n                }\n            },\n            {\n                tags: ['immutable'],\n                attr: {\n                    style: {\n                        'float': 'right',\n                        display: '',\n                        marginLeft: '',\n                        marginRight: ''\n                    }\n                }\n            },\n            {\n                tags: listElements,\n                attr: {\n                    style: {\n                        textAlign: 'right',\n                        listStylePosition: 'inside'\n                    }\n                }\n            }\n        ]);\n        registerTool('justifyRight', new BlockFormatTool({\n            format: formats.justifyRight,\n            template: new ToolTemplate({\n                template: EditorUtils.buttonTemplate,\n                title: 'Justify Right'\n            })\n        }));\n        registerFormat('justifyFull', [\n            {\n                tags: dom.nonListBlockElements,\n                attr: { style: { textAlign: 'justify' } }\n            },\n            {\n                tags: ['img'],\n                attr: {\n                    style: {\n                        display: 'block',\n                        marginLeft: 'auto',\n                        marginRight: 'auto',\n                        'float': ''\n                    }\n                }\n            },\n            {\n                tags: ['immutable'],\n                attr: {\n                    style: {\n                        display: 'block',\n                        marginLeft: 'auto',\n                        marginRight: 'auto',\n                        'float': ''\n                    }\n                }\n            },\n            {\n                tags: listElements,\n                attr: {\n                    style: {\n                        textAlign: 'justify',\n                        listStylePosition: ''\n                    }\n                }\n            }\n        ]);\n        registerTool('justifyFull', new BlockFormatTool({\n            format: formats.justifyFull,\n            template: new ToolTemplate({\n                template: EditorUtils.buttonTemplate,\n                title: 'Justify Full'\n            })\n        }));\n    }(window.kendo.jQuery));\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('editor/linebreak', ['editor/formatblock'], f);\n}(function () {\n    (function ($) {\n        var kendo = window.kendo, extend = $.extend, editorNS = kendo.ui.editor, dom = editorNS.Dom, Command = editorNS.Command, Tool = editorNS.Tool, BlockFormatter = editorNS.BlockFormatter, normalize = dom.normalize, RangeUtils = editorNS.RangeUtils, registerTool = editorNS.EditorUtils.registerTool;\n        var ParagraphCommand = Command.extend({\n            init: function (options) {\n                this.options = options;\n                Command.fn.init.call(this, options);\n            },\n            _insertMarker: function (doc, range) {\n                var marker = dom.create(doc, 'a'), container;\n                marker.className = 'k-marker';\n                range.insertNode(marker);\n                if (!marker.parentNode) {\n                    container = range.commonAncestorContainer;\n                    container.innerHTML = '';\n                    container.appendChild(marker);\n                }\n                normalize(marker.parentNode);\n                return marker;\n            },\n            _moveFocus: function (range, candidate) {\n                if (dom.isEmpty(candidate)) {\n                    range.setStartBefore(candidate);\n                } else {\n                    range.selectNodeContents(candidate);\n                    var focusNode = RangeUtils.textNodes(range)[0];\n                    if (!focusNode) {\n                        while (candidate.childNodes.length && !dom.is(candidate.firstChild, 'br')) {\n                            candidate = candidate.firstChild;\n                        }\n                        focusNode = candidate;\n                    }\n                    if (dom.isEmpty(focusNode)) {\n                        range.setStartBefore(focusNode);\n                    } else {\n                        if (dom.emptyNode(focusNode)) {\n                            focusNode.innerHTML = '\\uFEFF';\n                        }\n                        range.setStartBefore(focusNode.firstChild || focusNode);\n                    }\n                }\n            },\n            shouldTrim: function (range) {\n                var blocks = 'p,h1,h2,h3,h4,h5,h6'.split(','), startInBlock = dom.parentOfType(range.startContainer, blocks), endInBlock = dom.parentOfType(range.endContainer, blocks);\n                return startInBlock && !endInBlock || !startInBlock && endInBlock;\n            },\n            _blankAfter: function (node) {\n                while (node && (dom.isMarker(node) || dom.stripBom(node.nodeValue) === '')) {\n                    node = node.nextSibling;\n                }\n                return !node;\n            },\n            exec: function () {\n                var range = this.getRange(), doc = RangeUtils.documentFromRange(range), parent, previous, next, emptyParagraphContent = editorNS.emptyElementContent, paragraph, marker, li, heading, rng, shouldTrim;\n                this.expandImmutablesIn(range);\n                shouldTrim = this.shouldTrim(range);\n                range.deleteContents();\n                marker = this._insertMarker(doc, range);\n                dom.stripBomNode(marker.previousSibling);\n                dom.stripBomNode(marker.nextSibling);\n                li = dom.closestEditableOfType(marker, ['li']);\n                heading = dom.closestEditableOfType(marker, 'h1,h2,h3,h4,h5,h6'.split(','));\n                if (li) {\n                    if (dom.emptyNode(li)) {\n                        paragraph = dom.create(doc, 'p');\n                        if (dom.next(li)) {\n                            rng = range.cloneRange();\n                            rng.selectNode(li);\n                            RangeUtils.split(rng, li.parentNode);\n                        }\n                        var br = $('br', li);\n                        if (br.length == 1) {\n                            br.remove();\n                        }\n                        var parentNode = li.parentNode;\n                        var parentChildrenLength = li.parentNode.children.length;\n                        var firstChild = parentChildrenLength > 1 && li.childNodes.length == 1 && li.children[0];\n                        dom.insertAfter(paragraph, parentNode);\n                        dom.remove(parentChildrenLength == 1 ? li.parentNode : li);\n                        if (firstChild && firstChild !== marker) {\n                            paragraph.appendChild(firstChild);\n                            paragraph.appendChild(marker);\n                        } else {\n                            paragraph.innerHTML = emptyParagraphContent;\n                        }\n                        next = paragraph;\n                    }\n                } else if (heading && this._blankAfter(marker)) {\n                    paragraph = dom.create(doc, 'p');\n                    dom.insertAfter(paragraph, heading);\n                    paragraph.innerHTML = emptyParagraphContent;\n                    dom.remove(marker);\n                    next = paragraph;\n                }\n                if (!next) {\n                    if (!(li || heading)) {\n                        new BlockFormatter([{ tags: ['p'] }]).apply([marker]);\n                    }\n                    range.selectNode(marker);\n                    parent = dom.parentOfType(marker, [li ? 'li' : heading ? dom.name(heading) : 'p']);\n                    RangeUtils.split(range, parent, shouldTrim);\n                    previous = parent.previousSibling;\n                    if (dom.is(previous, 'li') && previous.firstChild && !dom.is(previous.firstChild, 'br')) {\n                        previous = previous.firstChild;\n                    }\n                    next = parent.nextSibling;\n                    this.clean(previous);\n                    this.clean(next, { links: true });\n                    if (dom.is(next, 'li') && next.firstChild && !dom.is(next.firstChild, 'br')) {\n                        next = next.firstChild;\n                    }\n                    dom.remove(parent);\n                    normalize(previous);\n                }\n                normalize(next);\n                this._moveFocus(range, next);\n                range.collapse(true);\n                dom.scrollTo(next);\n                RangeUtils.selectRange(range);\n            },\n            clean: function (node, options) {\n                var root = node;\n                if (node.firstChild && dom.is(node.firstChild, 'br')) {\n                    dom.remove(node.firstChild);\n                }\n                if (dom.isDataNode(node) && !node.nodeValue) {\n                    node = node.parentNode;\n                }\n                if (node) {\n                    var siblings = false;\n                    while (node.firstChild && node.firstChild.nodeType == 1) {\n                        siblings = siblings || dom.significantNodes(node.childNodes).length > 1;\n                        node = node.firstChild;\n                    }\n                    if (!dom.isEmpty(node) && /^\\s*$/.test(node.innerHTML) && !siblings) {\n                        $(root).find('.k-br').remove();\n                        node.innerHTML = editorNS.emptyElementContent;\n                    }\n                    if (options && options.links) {\n                        while (node != root) {\n                            if (dom.is(node, 'a') && dom.emptyNode(node)) {\n                                dom.unwrap(node);\n                                break;\n                            }\n                            node = node.parentNode;\n                        }\n                    }\n                }\n            }\n        });\n        var NewLineCommand = Command.extend({\n            init: function (options) {\n                this.options = options;\n                Command.fn.init.call(this, options);\n            },\n            exec: function () {\n                var range = this.getRange();\n                this.expandImmutablesIn(range);\n                var br = dom.create(RangeUtils.documentFromRange(range), 'br');\n                var filler;\n                var browser = kendo.support.browser;\n                var oldIE = browser.msie && browser.version < 11;\n                range.deleteContents();\n                range.insertNode(br);\n                normalize(br.parentNode);\n                if (!oldIE && (!br.nextSibling || dom.isWhitespace(br.nextSibling))) {\n                    filler = br.cloneNode(true);\n                    filler.className = 'k-br';\n                    dom.insertAfter(filler, br);\n                }\n                range.setStartAfter(br);\n                range.collapse(true);\n                dom.scrollTo(br.nextSibling || br);\n                RangeUtils.selectRange(range);\n            }\n        });\n        extend(editorNS, {\n            ParagraphCommand: ParagraphCommand,\n            NewLineCommand: NewLineCommand\n        });\n        registerTool('insertLineBreak', new Tool({\n            key: 13,\n            shift: true,\n            command: NewLineCommand\n        }));\n        registerTool('insertParagraph', new Tool({\n            key: 13,\n            command: ParagraphCommand\n        }));\n    }(window.kendo.jQuery));\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('editor/lists', ['editor/linebreak'], f);\n}(function () {\n    (function ($) {\n        var kendo = window.kendo, Class = kendo.Class, extend = $.extend, Editor = kendo.ui.editor, dom = Editor.Dom, RangeUtils = Editor.RangeUtils, EditorUtils = Editor.EditorUtils, Command = Editor.Command, ToolTemplate = Editor.ToolTemplate, FormatTool = Editor.FormatTool, BlockFormatFinder = Editor.BlockFormatFinder, textNodes = RangeUtils.textNodes, registerTool = Editor.EditorUtils.registerTool;\n        var ListFormatFinder = BlockFormatFinder.extend({\n            init: function (tag) {\n                this.tag = tag;\n                var tags = this.tags = [\n                    tag == 'ul' ? 'ol' : 'ul',\n                    tag\n                ];\n                BlockFormatFinder.fn.init.call(this, [{ tags: tags }]);\n            },\n            isFormatted: function (nodes) {\n                var formatNodes = [];\n                var formatNode, i;\n                for (i = 0; i < nodes.length; i++) {\n                    formatNode = this.findFormat(nodes[i]);\n                    if (formatNode && dom.name(formatNode) == this.tag) {\n                        formatNodes.push(formatNode);\n                    }\n                }\n                if (formatNodes.length < 1) {\n                    return false;\n                }\n                if (formatNodes.length != nodes.length) {\n                    return false;\n                }\n                for (i = 0; i < formatNodes.length; i++) {\n                    if (formatNodes[i].parentNode != formatNode.parentNode) {\n                        break;\n                    }\n                    if (formatNodes[i] != formatNode) {\n                        return false;\n                    }\n                }\n                return true;\n            },\n            findSuitable: function (nodes) {\n                var candidate = this.findFormat(nodes[0]);\n                if (candidate && dom.name(candidate) == this.tag) {\n                    return candidate;\n                }\n                return null;\n            }\n        });\n        var ListFormatter = Class.extend({\n            init: function (tag, unwrapTag) {\n                var that = this;\n                that.finder = new ListFormatFinder(tag);\n                that.tag = tag;\n                that.unwrapTag = unwrapTag;\n            },\n            isList: function (node) {\n                return dom.list(node);\n            },\n            immutables: function () {\n                return this.editor && !!this.editor.options.immutables;\n            },\n            wrap: function (list, nodes) {\n                var li = dom.create(list.ownerDocument, 'li'), i, node, isImmutable = this.immutables() ? Editor.Immutables.immutable : $.noop;\n                for (i = 0; i < nodes.length; i++) {\n                    node = nodes[i];\n                    if (dom.is(node, 'li')) {\n                        list.appendChild(node);\n                        continue;\n                    }\n                    if (this.isList(node)) {\n                        while (node.firstChild) {\n                            list.appendChild(node.firstChild);\n                        }\n                        continue;\n                    }\n                    if (dom.is(node, 'td')) {\n                        while (node.firstChild) {\n                            li.appendChild(node.firstChild);\n                        }\n                        list.appendChild(li);\n                        node.appendChild(list);\n                        list = list.cloneNode(false);\n                        li = li.cloneNode(false);\n                        continue;\n                    }\n                    li.appendChild(node);\n                    if (dom.isBlock(node)) {\n                        list.appendChild(li);\n                        if (!isImmutable(node)) {\n                            dom.unwrap(node);\n                        }\n                        li = li.cloneNode(false);\n                    }\n                }\n                if (li.firstChild) {\n                    list.appendChild(li);\n                }\n            },\n            containsAny: function (parent, nodes) {\n                for (var i = 0; i < nodes.length; i++) {\n                    if (dom.isAncestorOrSelf(parent, nodes[i])) {\n                        return true;\n                    }\n                }\n                return false;\n            },\n            suitable: function (candidate, nodes) {\n                if (candidate.className == 'k-marker') {\n                    var sibling = candidate.nextSibling;\n                    if (sibling && dom.isBlock(sibling)) {\n                        return false;\n                    }\n                    sibling = candidate.previousSibling;\n                    if (sibling && dom.isBlock(sibling)) {\n                        return false;\n                    }\n                }\n                return this.containsAny(candidate, nodes) || dom.isInline(candidate) || candidate.nodeType == 3;\n            },\n            _parentLists: function (node) {\n                var editable = dom.closestEditable(node);\n                return $(node).parentsUntil(editable, 'ul,ol');\n            },\n            split: function (range) {\n                var nodes = textNodes(range);\n                var start, end, parents;\n                if (nodes.length) {\n                    start = dom.parentOfType(nodes[0], ['li']);\n                    end = dom.parentOfType(nodes[nodes.length - 1], ['li']);\n                    range.setStartBefore(start);\n                    range.setEndAfter(end);\n                    for (var i = 0, l = nodes.length; i < l; i++) {\n                        var formatNode = this.finder.findFormat(nodes[i]);\n                        if (formatNode) {\n                            parents = this._parentLists(formatNode);\n                            if (parents.length) {\n                                RangeUtils.split(range, parents.last()[0], true);\n                            } else {\n                                RangeUtils.split(range, formatNode, true);\n                            }\n                        }\n                    }\n                }\n            },\n            merge: function (tag, formatNode) {\n                var prev = formatNode.previousSibling, next;\n                while (prev && (prev.className == 'k-marker' || prev.nodeType == 3 && dom.isWhitespace(prev))) {\n                    prev = prev.previousSibling;\n                }\n                if (prev && dom.name(prev) == tag) {\n                    while (formatNode.firstChild) {\n                        prev.appendChild(formatNode.firstChild);\n                    }\n                    dom.remove(formatNode);\n                    formatNode = prev;\n                }\n                next = formatNode.nextSibling;\n                while (next && (next.className == 'k-marker' || next.nodeType == 3 && dom.isWhitespace(next))) {\n                    next = next.nextSibling;\n                }\n                if (next && dom.name(next) == tag) {\n                    while (formatNode.lastChild) {\n                        next.insertBefore(formatNode.lastChild, next.firstChild);\n                    }\n                    dom.remove(formatNode);\n                }\n            },\n            breakable: function (node) {\n                return node != node.ownerDocument.body && !/table|tbody|tr|td/.test(dom.name(node)) && !node.attributes.contentEditable;\n            },\n            applyOnSection: function (section, nodes) {\n                var tag = this.tag;\n                var commonAncestor = dom.closestSplittableParent(nodes);\n                var ancestors = [];\n                var formatNode = this.finder.findSuitable(nodes);\n                if (!formatNode) {\n                    formatNode = new ListFormatFinder(tag == 'ul' ? 'ol' : 'ul').findSuitable(nodes);\n                }\n                var childNodes;\n                if (/table|tbody/.test(dom.name(commonAncestor))) {\n                    childNodes = $.map(nodes, function (node) {\n                        return dom.parentOfType(node, ['td']);\n                    });\n                } else {\n                    childNodes = dom.significantChildNodes(commonAncestor);\n                    if ($.grep(childNodes, dom.isBlock).length) {\n                        childNodes = $.grep(childNodes, $.proxy(function (node) {\n                            return this.containsAny(node, nodes);\n                        }, this));\n                    }\n                    if (!childNodes.length) {\n                        childNodes = nodes;\n                    }\n                }\n                function pushAncestor() {\n                    ancestors.push(this);\n                }\n                for (var i = 0; i < childNodes.length; i++) {\n                    var child = childNodes[i];\n                    var suitable = (!formatNode || !dom.isAncestorOrSelf(formatNode, child)) && this.suitable(child, nodes);\n                    if (!suitable) {\n                        continue;\n                    }\n                    if (formatNode && this.isList(child)) {\n                        $.each(child.children, pushAncestor);\n                        dom.remove(child);\n                    } else {\n                        ancestors.push(child);\n                    }\n                }\n                if (ancestors.length == childNodes.length && this.breakable(commonAncestor)) {\n                    ancestors = [commonAncestor];\n                }\n                if (!formatNode) {\n                    formatNode = dom.create(commonAncestor.ownerDocument, tag);\n                    dom.insertBefore(formatNode, ancestors[0]);\n                }\n                this.wrap(formatNode, ancestors);\n                while (dom.isBom(formatNode.nextSibling)) {\n                    dom.remove(formatNode.nextSibling);\n                }\n                if (!dom.is(formatNode, tag)) {\n                    dom.changeTag(formatNode, tag);\n                }\n                this.merge(tag, formatNode);\n            },\n            apply: function (nodes) {\n                var i = 0, sections = [], lastSection, lastNodes, section, node, l = nodes.length, immutableParent = this.immutables() ? Editor.Immutables.immutableParent : $.noop;\n                function addLastSection() {\n                    if (lastSection) {\n                        sections.push({\n                            section: lastSection,\n                            nodes: lastNodes\n                        });\n                    }\n                }\n                for (i = 0; i < l; i++) {\n                    node = immutableParent(nodes[i]) || nodes[i];\n                    section = dom.closestEditable(node, [\n                        'td',\n                        'body'\n                    ]);\n                    if (!lastSection || section != lastSection) {\n                        addLastSection();\n                        lastNodes = [node];\n                        lastSection = section;\n                    } else {\n                        lastNodes.push(node);\n                    }\n                }\n                addLastSection();\n                for (i = 0; i < sections.length; i++) {\n                    this.applyOnSection(sections[i].section, sections[i].nodes);\n                }\n            },\n            unwrap: function (ul) {\n                var fragment = ul.ownerDocument.createDocumentFragment(), unwrapTag = this.unwrapTag, parents, li, p, child;\n                for (li = ul.firstChild; li; li = li.nextSibling) {\n                    p = dom.create(ul.ownerDocument, unwrapTag || 'p');\n                    while (li.firstChild) {\n                        child = li.firstChild;\n                        if (dom.isBlock(child)) {\n                            if (p.firstChild) {\n                                fragment.appendChild(p);\n                                p = dom.create(ul.ownerDocument, unwrapTag || 'p');\n                            }\n                            fragment.appendChild(child);\n                        } else {\n                            p.appendChild(child);\n                        }\n                    }\n                    if (p.firstChild) {\n                        fragment.appendChild(p);\n                    }\n                }\n                parents = this._parentLists(ul);\n                if (parents[0]) {\n                    dom.insertAfter(fragment, parents.last()[0]);\n                    parents.last().remove();\n                } else {\n                    dom.insertAfter(fragment, ul);\n                }\n                dom.remove(ul);\n            },\n            remove: function (nodes) {\n                var formatNode;\n                for (var i = 0, l = nodes.length; i < l; i++) {\n                    formatNode = this.finder.findFormat(nodes[i]);\n                    if (formatNode) {\n                        this.unwrap(formatNode);\n                    }\n                }\n            },\n            toggle: function (range) {\n                var that = this, nodes = textNodes(range), ancestor = range.commonAncestorContainer;\n                if (!nodes.length) {\n                    range.selectNodeContents(ancestor);\n                    nodes = textNodes(range);\n                    if (!nodes.length) {\n                        var text = ancestor.ownerDocument.createTextNode('');\n                        range.startContainer.appendChild(text);\n                        nodes = [text];\n                        range.selectNode(text.parentNode);\n                    }\n                }\n                nodes = dom.filterBy(nodes, dom.htmlIndentSpace, true);\n                if (that.finder.isFormatted(nodes)) {\n                    that.split(range);\n                    that.remove(nodes);\n                } else {\n                    that.apply(nodes);\n                }\n            }\n        });\n        var ListCommand = Command.extend({\n            init: function (options) {\n                options.formatter = new ListFormatter(options.tag);\n                Command.fn.init.call(this, options);\n            }\n        });\n        var ListTool = FormatTool.extend({\n            init: function (options) {\n                this.options = options;\n                FormatTool.fn.init.call(this, extend(options, { finder: new ListFormatFinder(options.tag) }));\n            },\n            command: function (commandArguments) {\n                return new ListCommand(extend(commandArguments, { tag: this.options.tag }));\n            }\n        });\n        extend(Editor, {\n            ListFormatFinder: ListFormatFinder,\n            ListFormatter: ListFormatter,\n            ListCommand: ListCommand,\n            ListTool: ListTool\n        });\n        registerTool('insertUnorderedList', new ListTool({\n            tag: 'ul',\n            template: new ToolTemplate({\n                template: EditorUtils.buttonTemplate,\n                title: 'Insert unordered list'\n            })\n        }));\n        registerTool('insertOrderedList', new ListTool({\n            tag: 'ol',\n            template: new ToolTemplate({\n                template: EditorUtils.buttonTemplate,\n                title: 'Insert ordered list'\n            })\n        }));\n    }(window.kendo.jQuery));\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('editor/link', ['editor/lists'], f);\n}(function () {\n    (function ($, undefined) {\n        var kendo = window.kendo, Class = kendo.Class, extend = $.extend, proxy = $.proxy, Editor = kendo.ui.editor, dom = Editor.Dom, RangeUtils = Editor.RangeUtils, EditorUtils = Editor.EditorUtils, Command = Editor.Command, Tool = Editor.Tool, ToolTemplate = Editor.ToolTemplate, InlineFormatter = Editor.InlineFormatter, InlineFormatFinder = Editor.InlineFormatFinder, textNodes = RangeUtils.textNodes, editableTextNodes = RangeUtils.editableTextNodes, registerTool = Editor.EditorUtils.registerTool, keys = kendo.keys;\n        var HTTP_PROTOCOL = 'http://';\n        var protocolRegExp = /^\\w*:\\/\\//;\n        var endLinkCharsRegExp = /[\\w\\/\\$\\-_\\*\\?]/i;\n        var LinkFormatFinder = Class.extend({\n            findSuitable: function (sourceNode) {\n                return dom.parentOfType(sourceNode, ['a']);\n            }\n        });\n        var LinkFormatter = Class.extend({\n            init: function () {\n                this.finder = new LinkFormatFinder();\n            },\n            apply: function (range, attributes) {\n                var nodes = this.immutables ? editableTextNodes(range) : textNodes(range);\n                var markers, doc, formatter, a, parent;\n                if (attributes.innerHTML) {\n                    doc = RangeUtils.documentFromRange(range);\n                    markers = RangeUtils.getMarkers(range);\n                    range.deleteContents();\n                    a = dom.create(doc, 'a', attributes);\n                    range.insertNode(a);\n                    parent = a.parentNode;\n                    if (dom.name(parent) == 'a') {\n                        dom.insertAfter(a, parent);\n                    }\n                    if (dom.emptyNode(parent)) {\n                        dom.remove(parent);\n                    }\n                    var ref = a;\n                    for (var i = 0; i < markers.length; i++) {\n                        dom.insertAfter(markers[i], ref);\n                        ref = markers[i];\n                    }\n                    if (markers.length) {\n                        dom.insertBefore(doc.createTextNode('\\uFEFF'), markers[1]);\n                        dom.insertAfter(doc.createTextNode('\\uFEFF'), markers[1]);\n                        range.setStartBefore(markers[0]);\n                        range.setEndAfter(markers[markers.length - 1]);\n                    }\n                } else {\n                    formatter = new InlineFormatter([{ tags: ['a'] }], attributes);\n                    formatter.finder = this.finder;\n                    formatter.apply(nodes);\n                }\n            }\n        });\n        var UnlinkCommand = Command.extend({\n            init: function (options) {\n                var that = this;\n                options.formatter = {\n                    toggle: function (range) {\n                        var nodes = that.immutables() ? editableTextNodes(range) : textNodes(range);\n                        new InlineFormatter([{ tags: ['a'] }]).remove(nodes);\n                    }\n                };\n                this.options = options;\n                Command.fn.init.call(this, options);\n            }\n        });\n        var LinkCommand = Command.extend({\n            init: function (options) {\n                var that;\n                this.options = options;\n                Command.fn.init.call(this, options);\n                this.formatter = new LinkFormatter();\n                if (!options.url) {\n                    this.attributes = null;\n                    this.async = true;\n                } else {\n                    this.exec = function () {\n                        this.formatter.immutables = that && that.immutables();\n                        this.formatter.apply(options.range, {\n                            href: options.url,\n                            innerHTML: options.text || options.url,\n                            target: options.target\n                        });\n                    };\n                }\n            },\n            _dialogTemplate: function () {\n                return kendo.template('<div class=\"k-editor-dialog k-popup-edit-form\">' + '<div class=\"k-edit-form-container\">' + '<div class=\\'k-edit-label\\'>' + '<label for=\\'k-editor-link-url\\'>#: messages.linkWebAddress #</label>' + '</div>' + '<div class=\\'k-edit-field\\'>' + '<input type=\\'text\\' class=\\'k-input k-textbox\\' id=\\'k-editor-link-url\\'>' + '</div>' + '<div class=\\'k-edit-label k-editor-link-text-row\\'>' + '<label for=\\'k-editor-link-text\\'>#: messages.linkText #</label>' + '</div>' + '<div class=\\'k-edit-field k-editor-link-text-row\\'>' + '<input type=\\'text\\' class=\\'k-input k-textbox\\' id=\\'k-editor-link-text\\'>' + '</div>' + '<div class=\\'k-edit-label\\'>' + '<label for=\\'k-editor-link-title\\'>#: messages.linkToolTip #</label>' + '</div>' + '<div class=\\'k-edit-field\\'>' + '<input type=\\'text\\' class=\\'k-input k-textbox\\' id=\\'k-editor-link-title\\'>' + '</div>' + '<div class=\\'k-edit-label\\'></div>' + '<div class=\\'k-edit-field\\'>' + '<input type=\\'checkbox\\' class=\\'k-checkbox\\' id=\\'k-editor-link-target\\'>' + '<label for=\\'k-editor-link-target\\' class=\\'k-checkbox-label\\'>#: messages.linkOpenInNewWindow #</label>' + '</div>' + '<div class=\\'k-edit-buttons k-state-default\\'>' + '<button class=\"k-dialog-insert k-button k-primary\">#: messages.dialogInsert #</button>' + '<button class=\"k-dialog-close k-button\">#: messages.dialogCancel #</button>' + '</div>' + '</div>' + '</div>')({ messages: this.editor.options.messages });\n            },\n            exec: function () {\n                var messages = this.editor.options.messages;\n                this._initialText = '';\n                this._range = this.lockRange(true);\n                this.formatter.immutables = this.immutables();\n                var nodes = textNodes(this._range);\n                var a = nodes.length ? this.formatter.finder.findSuitable(nodes[0]) : null;\n                var img = nodes.length && dom.name(nodes[0]) == 'img';\n                var dialog = this.createDialog(this._dialogTemplate(), {\n                    title: messages.createLink,\n                    close: proxy(this._close, this),\n                    visible: false\n                });\n                if (a) {\n                    this._range.selectNodeContents(a);\n                    nodes = textNodes(this._range);\n                }\n                this._initialText = this.linkText(nodes);\n                dialog.find('.k-dialog-insert').click(proxy(this._apply, this)).end().find('.k-dialog-close').click(proxy(this._close, this)).end().find('.k-edit-field input').keydown(proxy(this._keydown, this)).end().find('#k-editor-link-url').val(this.linkUrl(a)).end().find('#k-editor-link-text').val(this._initialText).end().find('#k-editor-link-title').val(a ? a.title : '').end().find('#k-editor-link-target').attr('checked', a ? a.target == '_blank' : false).end().find('.k-editor-link-text-row').toggle(!img);\n                this._dialog = dialog.data('kendoWindow').center().open();\n                $('#k-editor-link-url', dialog).focus().select();\n            },\n            _keydown: function (e) {\n                var keys = kendo.keys;\n                if (e.keyCode == keys.ENTER) {\n                    this._apply(e);\n                } else if (e.keyCode == keys.ESC) {\n                    this._close(e);\n                }\n            },\n            _apply: function (e) {\n                var element = this._dialog.element;\n                var href = $('#k-editor-link-url', element).val();\n                var title, text, target;\n                var textInput = $('#k-editor-link-text', element);\n                if (href && href != HTTP_PROTOCOL) {\n                    if (href.indexOf('@') > 0 && !/^(\\w+:)|(\\/\\/)/i.test(href)) {\n                        href = 'mailto:' + href;\n                    }\n                    this.attributes = { href: href };\n                    title = $('#k-editor-link-title', element).val();\n                    if (title) {\n                        this.attributes.title = title;\n                    }\n                    if (textInput.is(':visible')) {\n                        text = textInput.val();\n                        if (!text && !this._initialText) {\n                            this.attributes.innerHTML = href;\n                        } else if (text && text !== this._initialText) {\n                            this.attributes.innerHTML = dom.stripBom(text);\n                        }\n                    }\n                    target = $('#k-editor-link-target', element).is(':checked');\n                    this.attributes.target = target ? '_blank' : null;\n                    this.formatter.apply(this._range, this.attributes);\n                }\n                this._close(e);\n                if (this.change) {\n                    this.change();\n                }\n            },\n            _close: function (e) {\n                e.preventDefault();\n                this._dialog.destroy();\n                dom.windowFromDocument(RangeUtils.documentFromRange(this._range)).focus();\n                this.releaseRange(this._range);\n            },\n            linkUrl: function (anchor) {\n                if (anchor) {\n                    return anchor.getAttribute('href', 2);\n                }\n                return HTTP_PROTOCOL;\n            },\n            linkText: function (nodes) {\n                var text = '';\n                var i;\n                for (i = 0; i < nodes.length; i++) {\n                    text += nodes[i].nodeValue;\n                }\n                return dom.stripBom(text || '');\n            },\n            redo: function () {\n                var range = this.lockRange(true);\n                this.formatter.apply(range, this.attributes);\n                this.releaseRange(range);\n            }\n        });\n        var AutoLinkCommand = Command.extend({\n            init: function (options) {\n                Command.fn.init.call(this, options);\n                this.formatter = new LinkFormatter();\n            },\n            exec: function () {\n                var detectedLink = this.detectLink();\n                if (!detectedLink) {\n                    return;\n                }\n                var range = this.getRange();\n                var linkMarker = new kendo.ui.editor.Marker();\n                var linkRange = range.cloneRange();\n                linkRange.setStart(detectedLink.start.node, detectedLink.start.offset);\n                linkRange.setEnd(detectedLink.end.node, detectedLink.end.offset);\n                range = this.lockRange();\n                linkMarker.add(linkRange);\n                this.formatter.apply(linkRange, { href: this._ensureWebProtocol(detectedLink.text) });\n                linkMarker.remove(linkRange);\n                this.releaseRange(range);\n            },\n            detectLink: function () {\n                var range = this.getRange();\n                var traverser = new LeftDomTextTraverser({\n                    node: range.startContainer,\n                    offset: range.startOffset,\n                    cancelAtNode: function (node) {\n                        return node && dom.name(node) === 'a';\n                    }\n                });\n                var detection = new DomTextLinkDetection(traverser);\n                return detection.detectLink();\n            },\n            changesContent: function () {\n                return !!this.detectLink();\n            },\n            _ensureWebProtocol: function (linkText) {\n                var hasProtocol = this._hasProtocolPrefix(linkText);\n                return hasProtocol ? linkText : this._prefixWithWebProtocol(linkText);\n            },\n            _hasProtocolPrefix: function (linkText) {\n                return protocolRegExp.test(linkText);\n            },\n            _prefixWithWebProtocol: function (linkText) {\n                return HTTP_PROTOCOL + linkText;\n            }\n        });\n        var UnlinkTool = Tool.extend({\n            init: function (options) {\n                this.options = options;\n                this.finder = new InlineFormatFinder([{ tags: ['a'] }]);\n                Tool.fn.init.call(this, $.extend(options, { command: UnlinkCommand }));\n            },\n            initialize: function (ui, options) {\n                Tool.fn.initialize.call(this, ui, options);\n                ui.addClass('k-state-disabled');\n            },\n            update: function (ui, nodes) {\n                ui.toggleClass('k-state-disabled', !this.finder.isFormatted(nodes)).removeClass('k-state-hover');\n            }\n        });\n        var DomTextLinkDetection = Class.extend({\n            init: function (traverser) {\n                this.traverser = traverser;\n                this.start = DomPos();\n                this.end = DomPos();\n                this.text = '';\n            },\n            detectLink: function () {\n                var node = this.traverser.node;\n                var offset = this.traverser.offset;\n                if (dom.isDataNode(node)) {\n                    var text = node.data.substring(0, offset);\n                    if (/\\s{2}$/.test(dom.stripBom(text))) {\n                        return;\n                    }\n                } else if (offset === 0) {\n                    var p = dom.closestEditableOfType(node, dom.blockElements);\n                    if (p && p.previousSibling) {\n                        this.traverser.init({ node: p.previousSibling });\n                    }\n                }\n                this.traverser.traverse($.proxy(this._detectEnd, this));\n                if (!this.end.blank()) {\n                    this.traverser = this.traverser.clone(this.end);\n                    this.traverser.traverse($.proxy(this._detectStart, this));\n                    if (!this._isLinkDetected()) {\n                        var puntuationOptions = this.traverser.extendOptions(this.start);\n                        var puntuationTraverser = new RightDomTextTraverser(puntuationOptions);\n                        puntuationTraverser.traverse($.proxy(this._skipStartPuntuation, this));\n                        if (!this._isLinkDetected()) {\n                            this.start = DomPos();\n                        }\n                    }\n                }\n                if (this.start.blank()) {\n                    return null;\n                } else {\n                    return {\n                        start: this.start,\n                        end: this.end,\n                        text: this.text\n                    };\n                }\n            },\n            _isLinkDetected: function () {\n                return protocolRegExp.test(this.text) || /^w{3}\\./i.test(this.text);\n            },\n            _detectEnd: function (text, node) {\n                var i = lastIndexOfRegExp(text, endLinkCharsRegExp);\n                if (i > -1) {\n                    this.end.node = node;\n                    this.end.offset = i + 1;\n                    return false;\n                }\n            },\n            _detectStart: function (text, node) {\n                var i = lastIndexOfRegExp(text, /\\s/);\n                var ii = i + 1;\n                this.text = text.substring(ii) + this.text;\n                this.start.node = node;\n                this.start.offset = ii;\n                if (i > -1) {\n                    return false;\n                }\n            },\n            _skipStartPuntuation: function (text, node, offset) {\n                var i = indexOfRegExp(text, /\\w/);\n                var ii = i;\n                if (i === -1) {\n                    ii = text.length;\n                }\n                this.text = this.text.substring(ii);\n                this.start.node = node;\n                this.start.offset = ii + (offset | 0);\n                if (i > -1) {\n                    return false;\n                }\n            }\n        });\n        function lastIndexOfRegExp(str, search) {\n            var i = str.length;\n            while (i-- && !search.test(str[i])) {\n            }\n            return i;\n        }\n        function indexOfRegExp(str, search) {\n            var r = search.exec(str);\n            return r ? r.index : -1;\n        }\n        var DomPos = function () {\n            return {\n                node: null,\n                offset: null,\n                blank: function () {\n                    return this.node === null && this.offset === null;\n                }\n            };\n        };\n        var DomTextTraverser = Class.extend({\n            init: function (options) {\n                this.node = options.node;\n                this.offset = options.offset === undefined ? dom.isDataNode(this.node) && this.node.length || 0 : options.offset;\n                this.cancelAtNode = options.cancelAtNode || this.cancelAtNode || $.noop;\n            },\n            traverse: function (callback) {\n                if (!callback) {\n                    return;\n                }\n                this.cancel = false;\n                this._traverse(callback, this.node, this.offset);\n            },\n            _traverse: function (callback, node, offset) {\n                if (!node || this.cancel) {\n                    return;\n                }\n                if (node.nodeType === 3) {\n                    var text = node.data;\n                    if (offset !== undefined) {\n                        text = this.subText(text, offset);\n                    }\n                    this.cancel = callback(text, node, offset) === false;\n                } else {\n                    var edgeNode = this.edgeNode(node);\n                    this.cancel = this.cancel || this.cancelAtNode(edgeNode);\n                    return this._traverse(callback, edgeNode);\n                }\n                var next = this.next(node);\n                if (!next) {\n                    var parent = node.parentNode;\n                    while (!next && dom.isInline(parent)) {\n                        next = this.next(parent);\n                        parent = parent.parentNode;\n                    }\n                }\n                this.cancel = this.cancel || this.cancelAtNode(next);\n                this._traverse(callback, next);\n            },\n            extendOptions: function (o) {\n                return $.extend({\n                    node: this.node,\n                    offset: this.offset,\n                    cancelAtNode: this.cancelAtNode\n                }, o || {});\n            },\n            edgeNode: function (node) {\n            },\n            next: function (node) {\n            },\n            subText: function (text, offset) {\n            }\n        });\n        var LeftDomTextTraverser = DomTextTraverser.extend({\n            subText: function (text, splitIndex) {\n                return text.substring(0, splitIndex);\n            },\n            next: function (node) {\n                return node.previousSibling;\n            },\n            edgeNode: function (node) {\n                return node.lastChild;\n            },\n            clone: function (options) {\n                var o = this.extendOptions(options);\n                return new LeftDomTextTraverser(o);\n            }\n        });\n        var RightDomTextTraverser = DomTextTraverser.extend({\n            subText: function (text, splitIndex) {\n                return text.substring(splitIndex);\n            },\n            next: function (node) {\n                return node.nextSibling;\n            },\n            edgeNode: function (node) {\n                return node.firstChild;\n            },\n            clone: function (options) {\n                var o = this.extendOptions(options);\n                return new RightDomTextTraverser(o);\n            }\n        });\n        extend(kendo.ui.editor, {\n            LinkFormatFinder: LinkFormatFinder,\n            LinkFormatter: LinkFormatter,\n            UnlinkCommand: UnlinkCommand,\n            LinkCommand: LinkCommand,\n            AutoLinkCommand: AutoLinkCommand,\n            UnlinkTool: UnlinkTool,\n            DomTextLinkDetection: DomTextLinkDetection,\n            LeftDomTextTraverser: LeftDomTextTraverser,\n            RightDomTextTraverser: RightDomTextTraverser\n        });\n        registerTool('createLink', new Tool({\n            key: 'K',\n            ctrl: true,\n            command: LinkCommand,\n            template: new ToolTemplate({\n                template: EditorUtils.buttonTemplate,\n                title: 'Create Link'\n            })\n        }));\n        registerTool('unlink', new UnlinkTool({\n            key: 'K',\n            ctrl: true,\n            shift: true,\n            template: new ToolTemplate({\n                template: EditorUtils.buttonTemplate,\n                title: 'Remove Link'\n            })\n        }));\n        registerTool('autoLink', new Tool({\n            key: [\n                keys.ENTER,\n                keys.SPACEBAR\n            ],\n            keyPressCommand: true,\n            command: AutoLinkCommand\n        }));\n    }(window.kendo.jQuery));\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('editor/file', [\n        'kendo.filebrowser',\n        'editor/link'\n    ], f);\n}(function () {\n    (function ($, undefined) {\n        var kendo = window.kendo, extend = $.extend, Editor = kendo.ui.editor, EditorUtils = Editor.EditorUtils, dom = Editor.Dom, registerTool = EditorUtils.registerTool, ToolTemplate = Editor.ToolTemplate, RangeUtils = Editor.RangeUtils, Command = Editor.Command, LinkFormatter = Editor.LinkFormatter, textNodes = RangeUtils.textNodes, keys = kendo.keys, KEDITORFILEURL = '#k-editor-file-url', KEDITORFILETEXT = '#k-editor-file-text', KEDITORFILETITLE = '#k-editor-file-title';\n        var FileCommand = Command.extend({\n            init: function (options) {\n                var that = this;\n                Command.fn.init.call(that, options);\n                that.formatter = new LinkFormatter();\n                that.async = true;\n                that.attributes = {};\n            },\n            insertFile: function (file, range) {\n                var attributes = this.attributes;\n                var doc = RangeUtils.documentFromRange(range);\n                if (attributes.href && attributes.href != 'http://') {\n                    if (!file) {\n                        file = dom.create(doc, 'a', { href: attributes.href });\n                        file.innerHTML = attributes.innerHTML;\n                        file.title = attributes.title;\n                        range.deleteContents();\n                        range.insertNode(file);\n                        if (!file.nextSibling) {\n                            dom.insertAfter(doc.createTextNode('\\uFEFF'), file);\n                        }\n                        range.setStartAfter(file);\n                        range.setEndAfter(file);\n                        RangeUtils.selectRange(range);\n                        return true;\n                    } else {\n                        dom.attr(file, attributes);\n                    }\n                }\n                return false;\n            },\n            _dialogTemplate: function (showBrowser) {\n                return kendo.template('<div class=\"k-editor-dialog k-popup-edit-form\">' + '<div class=\"k-edit-form-container\">' + '# if (showBrowser) { #' + '<div class=\"k-filebrowser\"></div>' + '# } #' + '<div class=\\'k-edit-label\\'>' + '<label for=\"k-editor-file-url\">#: messages.fileWebAddress #</label>' + '</div>' + '<div class=\\'k-edit-field\\'>' + '<input type=\"text\" class=\"k-input k-textbox\" id=\"k-editor-file-url\">' + '</div>' + '<div class=\\'k-edit-label\\'>' + '<label for=\"k-editor-file-text\">#: messages.fileText #</label>' + '</div>' + '<div class=\\'k-edit-field\\'>' + '<input type=\"text\" class=\"k-input k-textbox\" id=\"k-editor-file-text\">' + '</div>' + '<div class=\\'k-edit-label\\'>' + '<label for=\"k-editor-file-title\">#: messages.fileTitle #</label>' + '</div>' + '<div class=\\'k-edit-field\\'>' + '<input type=\"text\" class=\"k-input k-textbox\" id=\"k-editor-file-title\">' + '</div>' + '<div class=\"k-edit-buttons k-state-default\">' + '<button class=\"k-dialog-insert k-button k-primary\">#: messages.dialogInsert #</button>' + '<button class=\"k-dialog-close k-button\">#: messages.dialogCancel #</button>' + '</div>' + '</div>' + '</div>')({\n                    messages: this.editor.options.messages,\n                    showBrowser: showBrowser\n                });\n            },\n            redo: function () {\n                var that = this, range = that.lockRange();\n                this.formatter.apply(range, this.attributes);\n                that.releaseRange(range);\n            },\n            exec: function () {\n                var that = this, range = that.lockRange(), nodes = textNodes(range), applied = false, file = nodes.length ? this.formatter.finder.findSuitable(nodes[0]) : null, dialog, options = that.editor.options, messages = options.messages, fileBrowser = options.fileBrowser, showBrowser = !!(kendo.ui.FileBrowser && fileBrowser && fileBrowser.transport && fileBrowser.transport.read !== undefined), dialogOptions = {\n                        title: messages.insertFile,\n                        visible: false,\n                        resizable: showBrowser\n                    };\n                this.expandImmutablesIn(range);\n                function apply(e) {\n                    var element = dialog.element, href = element.find(KEDITORFILEURL).val().replace(/ /g, '%20'), innerHTML = element.find(KEDITORFILETEXT).val(), title = element.find(KEDITORFILETITLE).val();\n                    that.attributes = {\n                        href: href,\n                        innerHTML: innerHTML !== '' ? innerHTML : href,\n                        title: title\n                    };\n                    applied = that.insertFile(file, range);\n                    close(e);\n                    if (that.change) {\n                        that.change();\n                    }\n                }\n                function close(e) {\n                    e.preventDefault();\n                    dialog.destroy();\n                    dom.windowFromDocument(RangeUtils.documentFromRange(range)).focus();\n                    if (!applied) {\n                        that.releaseRange(range);\n                    }\n                }\n                function keyDown(e) {\n                    if (e.keyCode == keys.ENTER) {\n                        apply(e);\n                    } else if (e.keyCode == keys.ESC) {\n                        close(e);\n                    }\n                }\n                dialogOptions.close = close;\n                if (showBrowser) {\n                    dialogOptions.width = 750;\n                }\n                dialog = this.createDialog(that._dialogTemplate(showBrowser), dialogOptions).toggleClass('k-filebrowser-dialog', showBrowser).find('.k-dialog-insert').click(apply).end().find('.k-dialog-close').click(close).end().find('.k-edit-field input').keydown(keyDown).end().find(KEDITORFILEURL).val(file ? file.getAttribute('href', 2) : 'http://').end().find(KEDITORFILETEXT).val(file ? file.innerText : '').end().find(KEDITORFILETITLE).val(file ? file.title : '').end().data('kendoWindow');\n                if (showBrowser) {\n                    that._fileBrowser = new kendo.ui.FileBrowser(dialog.element.find('.k-filebrowser'), extend({}, fileBrowser));\n                    that._fileBrowser.bind('change', function (ev) {\n                        if (ev.selected.get('type') === 'f') {\n                            dialog.element.find(KEDITORFILEURL).val(this.value());\n                        }\n                    });\n                    that._fileBrowser.bind('apply', apply);\n                }\n                dialog.center().open();\n                dialog.element.find(KEDITORFILEURL).focus().select();\n            }\n        });\n        kendo.ui.editor.FileCommand = FileCommand;\n        registerTool('insertFile', new Editor.Tool({\n            command: FileCommand,\n            template: new ToolTemplate({\n                template: EditorUtils.buttonTemplate,\n                title: 'Insert File'\n            })\n        }));\n    }(window.kendo.jQuery));\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('editor/image', [\n        'kendo.imagebrowser',\n        'editor/link'\n    ], f);\n}(function () {\n    (function ($, undefined) {\n        var kendo = window.kendo, extend = $.extend, Editor = kendo.ui.editor, EditorUtils = Editor.EditorUtils, dom = Editor.Dom, registerTool = EditorUtils.registerTool, ToolTemplate = Editor.ToolTemplate, RangeUtils = Editor.RangeUtils, Command = Editor.Command, keys = kendo.keys, KEDITORIMAGEURL = '#k-editor-image-url', KEDITORIMAGETITLE = '#k-editor-image-title', KEDITORIMAGEWIDTH = '#k-editor-image-width', KEDITORIMAGEHEIGHT = '#k-editor-image-height';\n        var ImageCommand = Command.extend({\n            init: function (options) {\n                var that = this;\n                Command.fn.init.call(that, options);\n                that.async = true;\n                that.attributes = {};\n            },\n            insertImage: function (img, range) {\n                var attributes = this.attributes;\n                var doc = RangeUtils.documentFromRange(range);\n                if (attributes.src && attributes.src != 'http://') {\n                    var removeIEAttributes = function () {\n                        setTimeout(function () {\n                            if (!attributes.width) {\n                                img.removeAttribute('width');\n                            }\n                            if (!attributes.height) {\n                                img.removeAttribute('height');\n                            }\n                            img.removeAttribute('complete');\n                        });\n                    };\n                    if (!img) {\n                        img = dom.create(doc, 'img', attributes);\n                        img.onload = img.onerror = removeIEAttributes;\n                        range.deleteContents();\n                        range.insertNode(img);\n                        if (!img.nextSibling) {\n                            dom.insertAfter(doc.createTextNode('\\uFEFF'), img);\n                        }\n                        removeIEAttributes();\n                        range.setStartAfter(img);\n                        range.setEndAfter(img);\n                        RangeUtils.selectRange(range);\n                        return true;\n                    } else {\n                        img.onload = img.onerror = removeIEAttributes;\n                        dom.attr(img, attributes);\n                        removeIEAttributes();\n                    }\n                }\n                return false;\n            },\n            _dialogTemplate: function (showBrowser) {\n                return kendo.template('<div class=\"k-editor-dialog k-popup-edit-form\">' + '<div class=\"k-edit-form-container\">' + '# if (showBrowser) { #' + '<div class=\"k-filebrowser k-imagebrowser\"></div>' + '# } #' + '<div class=\\'k-edit-label\\'>' + '<label for=\"k-editor-image-url\">#: messages.imageWebAddress #</label>' + '</div>' + '<div class=\\'k-edit-field\\'>' + '<input type=\"text\" class=\"k-input k-textbox\" id=\"k-editor-image-url\">' + '</div>' + '<div class=\\'k-edit-label\\'>' + '<label for=\"k-editor-image-title\">#: messages.imageAltText #</label>' + '</div>' + '<div class=\\'k-edit-field\\'>' + '<input type=\"text\" class=\"k-input k-textbox\" id=\"k-editor-image-title\">' + '</div>' + '<div class=\\'k-edit-label\\'>' + '<label for=\"k-editor-image-width\">#: messages.imageWidth #</label>' + '</div>' + '<div class=\\'k-edit-field\\'>' + '<input type=\"text\" class=\"k-input k-textbox\" id=\"k-editor-image-width\">' + '</div>' + '<div class=\\'k-edit-label\\'>' + '<label for=\"k-editor-image-height\">#: messages.imageHeight #</label>' + '</div>' + '<div class=\\'k-edit-field\\'>' + '<input type=\"text\" class=\"k-input k-textbox\" id=\"k-editor-image-height\">' + '</div>' + '<div class=\"k-edit-buttons k-state-default\">' + '<button class=\"k-dialog-insert k-button k-primary\">#: messages.dialogInsert #</button>' + '<button class=\"k-dialog-close k-button\">#: messages.dialogCancel #</button>' + '</div>' + '</div>' + '</div>')({\n                    messages: this.editor.options.messages,\n                    showBrowser: showBrowser\n                });\n            },\n            redo: function () {\n                var that = this, range = that.lockRange();\n                if (!that.insertImage(RangeUtils.image(range), range)) {\n                    that.releaseRange(range);\n                }\n            },\n            exec: function () {\n                var that = this, range = that.lockRange(), applied = false, img = RangeUtils.image(range), imageWidth = img && img.getAttribute('width') || '', imageHeight = img && img.getAttribute('height') || '', dialog, options = that.editor.options, messages = options.messages, imageBrowser = options.imageBrowser, showBrowser = !!(kendo.ui.ImageBrowser && imageBrowser && imageBrowser.transport && imageBrowser.transport.read !== undefined), dialogOptions = {\n                        title: messages.insertImage,\n                        visible: false,\n                        resizable: showBrowser\n                    };\n                this.expandImmutablesIn(range);\n                function apply(e) {\n                    var element = dialog.element, w = parseInt(element.find(KEDITORIMAGEWIDTH).val(), 10), h = parseInt(element.find(KEDITORIMAGEHEIGHT).val(), 10);\n                    that.attributes = {\n                        src: element.find(KEDITORIMAGEURL).val().replace(/ /g, '%20'),\n                        alt: element.find(KEDITORIMAGETITLE).val()\n                    };\n                    that.attributes.width = null;\n                    that.attributes.height = null;\n                    if (!isNaN(w) && w > 0) {\n                        that.attributes.width = w;\n                    }\n                    if (!isNaN(h) && h > 0) {\n                        that.attributes.height = h;\n                    }\n                    applied = that.insertImage(img, range);\n                    close(e);\n                    if (that.change) {\n                        that.change();\n                    }\n                }\n                function close(e) {\n                    e.preventDefault();\n                    dialog.destroy();\n                    dom.windowFromDocument(RangeUtils.documentFromRange(range)).focus();\n                    if (!applied) {\n                        that.releaseRange(range);\n                    }\n                }\n                function keyDown(e) {\n                    if (e.keyCode == keys.ENTER) {\n                        apply(e);\n                    } else if (e.keyCode == keys.ESC) {\n                        close(e);\n                    }\n                }\n                dialogOptions.close = close;\n                if (showBrowser) {\n                    dialogOptions.width = 750;\n                }\n                dialog = this.createDialog(that._dialogTemplate(showBrowser), dialogOptions).toggleClass('k-filebrowser-dialog', showBrowser).find('.k-dialog-insert').click(apply).end().find('.k-dialog-close').click(close).end().find('.k-edit-field input').keydown(keyDown).end().find(KEDITORIMAGEURL).val(img ? img.getAttribute('src', 2) : 'http://').end().find(KEDITORIMAGETITLE).val(img ? img.alt : '').end().find(KEDITORIMAGEWIDTH).val(imageWidth).end().find(KEDITORIMAGEHEIGHT).val(imageHeight).end().data('kendoWindow');\n                if (showBrowser) {\n                    this._imageBrowser = new kendo.ui.ImageBrowser(dialog.element.find('.k-imagebrowser'), extend({}, imageBrowser));\n                    this._imageBrowser.bind('change', function (ev) {\n                        if (ev.selected.get('type') === 'f') {\n                            dialog.element.find(KEDITORIMAGEURL).val(this.value());\n                        }\n                    });\n                    this._imageBrowser.bind('apply', apply);\n                }\n                dialog.center().open();\n                dialog.element.find(KEDITORIMAGEURL).focus().select();\n            }\n        });\n        kendo.ui.editor.ImageCommand = ImageCommand;\n        registerTool('insertImage', new Editor.Tool({\n            command: ImageCommand,\n            template: new ToolTemplate({\n                template: EditorUtils.buttonTemplate,\n                title: 'Insert Image'\n            })\n        }));\n    }(window.kendo.jQuery));\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('editor/components', ['editor/image'], f);\n}(function () {\n    (function ($, undefined) {\n        var kendo = window.kendo, DropDownList = kendo.ui.DropDownList, dom = kendo.ui.editor.Dom;\n        var SelectBox = DropDownList.extend({\n            init: function (element, options) {\n                var that = this;\n                DropDownList.fn.init.call(that, element, options);\n                if (kendo.support.mobileOS.ios) {\n                    this._initSelectOverlay();\n                    this.bind('dataBound', $.proxy(this._initSelectOverlay, this));\n                }\n                that.text(that.options.title);\n                that.bind('open', function () {\n                    if (that.options.autoSize) {\n                        var list = that.list, listWidth;\n                        list.css({\n                            whiteSpace: 'nowrap',\n                            width: 'auto'\n                        });\n                        listWidth = list.width();\n                        if (listWidth) {\n                            listWidth += 20;\n                        } else {\n                            listWidth = that._listWidth;\n                        }\n                        list.css('width', listWidth + kendo.support.scrollbar());\n                        that._listWidth = listWidth;\n                    }\n                });\n            },\n            options: {\n                name: 'SelectBox',\n                index: -1\n            },\n            _initSelectOverlay: function () {\n                var selectBox = this;\n                var value = selectBox.value();\n                var view = this.dataSource.view();\n                var item;\n                var html = '';\n                var encode = kendo.htmlEncode;\n                for (var i = 0; i < view.length; i++) {\n                    item = view[i];\n                    html += '<option value=\\'' + encode(item.value) + '\\'';\n                    if (item.value == value) {\n                        html += ' selected';\n                    }\n                    html += '>' + encode(item.text) + '</option>';\n                }\n                var select = $('<select class=\\'k-select-overlay\\'>' + html + '</select>');\n                var wrapper = $(this.element).closest('.k-widget');\n                wrapper.next('.k-select-overlay').remove();\n                select.insertAfter(wrapper);\n                select.on('change', function () {\n                    selectBox.value(this.value);\n                    selectBox.trigger('change');\n                });\n            },\n            value: function (value) {\n                var that = this, result = DropDownList.fn.value.call(that, value);\n                if (value === undefined) {\n                    return result;\n                }\n                if (!DropDownList.fn.value.call(that)) {\n                    that.text(that.options.title);\n                }\n            },\n            decorate: function (body) {\n                var that = this, dataSource = that.dataSource, items = dataSource.data(), i, tag, className, style;\n                if (body) {\n                    that.list.css('background-color', dom.getEffectiveBackground($(body)));\n                }\n                for (i = 0; i < items.length; i++) {\n                    tag = items[i].tag || 'span';\n                    className = items[i].className;\n                    style = dom.inlineStyle(body, tag, { className: className });\n                    style = style.replace(/\"/g, '\\'');\n                    items[i].style = style + ';display:inline-block';\n                }\n                dataSource.trigger('change');\n            }\n        });\n        kendo.ui.plugin(SelectBox);\n        kendo.ui.editor.SelectBox = SelectBox;\n    }(window.kendo.jQuery));\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('editor/indent', ['editor/components'], f);\n}(function () {\n    (function ($, undefined) {\n        var kendo = window.kendo, Class = kendo.Class, extend = $.extend, Editor = kendo.ui.editor, dom = Editor.Dom, EditorUtils = Editor.EditorUtils, registerTool = EditorUtils.registerTool, Command = Editor.Command, Tool = Editor.Tool, ToolTemplate = Editor.ToolTemplate, RangeUtils = Editor.RangeUtils, blockElements = dom.blockElements, BlockFormatFinder = Editor.BlockFormatFinder, BlockFormatter = Editor.BlockFormatter;\n        function indent(node, value) {\n            var isRtl = $(node).css('direction') == 'rtl', indentDirection = isRtl ? 'Right' : 'Left', property = dom.name(node) != 'td' ? 'margin' + indentDirection : 'padding' + indentDirection;\n            if (value === undefined) {\n                return node.style[property] || 0;\n            } else {\n                if (value > 0) {\n                    node.style[property] = value + 'px';\n                } else {\n                    node.style[property] = '';\n                    if (!node.style.cssText) {\n                        node.removeAttribute('style');\n                    }\n                }\n            }\n        }\n        var IndentFormatter = Class.extend({\n            init: function () {\n                this.finder = new BlockFormatFinder([{ tags: dom.blockElements }]);\n            },\n            apply: function (nodes) {\n                nodes = dom.filterBy(nodes, dom.htmlIndentSpace, true);\n                var formatNodes = this.finder.findSuitable(nodes), targets = [], i, len, formatNode, parentList, sibling;\n                formatNodes = this.mapImmutables(formatNodes);\n                if (formatNodes.length) {\n                    for (i = 0, len = formatNodes.length; i < len; i++) {\n                        if (dom.is(formatNodes[i], 'li')) {\n                            if (!$(formatNodes[i]).index()) {\n                                targets.push(formatNodes[i].parentNode);\n                            } else if ($.inArray(formatNodes[i].parentNode, targets) < 0) {\n                                targets.push(formatNodes[i]);\n                            }\n                        } else {\n                            targets.push(formatNodes[i]);\n                        }\n                    }\n                    while (targets.length) {\n                        formatNode = targets.shift();\n                        if (dom.is(formatNode, 'li')) {\n                            parentList = formatNode.parentNode;\n                            sibling = $(formatNode).prev('li');\n                            var siblingList = sibling.find('ul,ol').last();\n                            var nestedList = $(formatNode).children('ul,ol')[0];\n                            if (nestedList && sibling[0]) {\n                                if (siblingList[0]) {\n                                    siblingList.append(formatNode);\n                                    siblingList.append($(nestedList).children());\n                                    dom.remove(nestedList);\n                                } else {\n                                    sibling.append(nestedList);\n                                    nestedList.insertBefore(formatNode, nestedList.firstChild);\n                                }\n                            } else {\n                                nestedList = sibling.children('ul,ol')[0];\n                                if (!nestedList) {\n                                    nestedList = dom.create(formatNode.ownerDocument, dom.name(parentList));\n                                    sibling.append(nestedList);\n                                }\n                                while (formatNode && formatNode.parentNode == parentList) {\n                                    nestedList.appendChild(formatNode);\n                                    formatNode = targets.shift();\n                                }\n                            }\n                        } else {\n                            var marginLeft = parseInt(indent(formatNode), 10) + 30;\n                            indent(formatNode, marginLeft);\n                            for (var targetIndex = 0; targetIndex < targets.length; targetIndex++) {\n                                if ($.contains(formatNode, targets[targetIndex])) {\n                                    targets.splice(targetIndex, 1);\n                                }\n                            }\n                        }\n                    }\n                } else {\n                    var formatter = new BlockFormatter([{ tags: ['p'] }], { style: { marginLeft: 30 } });\n                    formatter.apply(nodes);\n                }\n            },\n            mapImmutables: function (nodes) {\n                if (!this.immutables) {\n                    return nodes;\n                } else {\n                    var immutables = [];\n                    return $.map(nodes, function (node) {\n                        var immutable = Editor.Immutables.immutableParent(node);\n                        if (immutable) {\n                            if ($.inArray(immutable, immutables) === -1) {\n                                immutables.push(immutable);\n                            } else {\n                                return null;\n                            }\n                        }\n                        return immutable || node;\n                    });\n                }\n            },\n            remove: function (nodes) {\n                nodes = dom.filterBy(nodes, dom.htmlIndentSpace, true);\n                var formatNodes = this.finder.findSuitable(nodes), targetNode, i, len, list, listParent, siblings, formatNode, marginLeft;\n                formatNodes = this.mapImmutables(formatNodes);\n                for (i = 0, len = formatNodes.length; i < len; i++) {\n                    formatNode = $(formatNodes[i]);\n                    if (formatNode.is('li')) {\n                        list = formatNode.parent();\n                        listParent = list.parent();\n                        if (listParent.is('li,ul,ol') && !indent(list[0])) {\n                            if (targetNode && $.contains(targetNode, listParent[0])) {\n                                continue;\n                            }\n                            siblings = formatNode.nextAll('li');\n                            if (siblings.length) {\n                                $(list[0].cloneNode(false)).appendTo(formatNode).append(siblings);\n                            }\n                            if (listParent.is('li')) {\n                                formatNode.insertAfter(listParent);\n                            } else {\n                                formatNode.appendTo(listParent);\n                            }\n                            if (!list.children('li').length) {\n                                list.remove();\n                            }\n                            continue;\n                        } else {\n                            if (targetNode == list[0]) {\n                                continue;\n                            }\n                            targetNode = list[0];\n                        }\n                    } else {\n                        targetNode = formatNodes[i];\n                    }\n                    marginLeft = parseInt(indent(targetNode), 10) - 30;\n                    indent(targetNode, marginLeft);\n                }\n            }\n        });\n        var IndentCommand = Command.extend({\n            init: function (options) {\n                var that = this;\n                options.formatter = {\n                    toggle: $.proxy(function (range) {\n                        var indentFormatter = new IndentFormatter();\n                        indentFormatter.immutables = this.editor && this.editor.options.immutables;\n                        indentFormatter.apply(RangeUtils.nodes(range));\n                    }, that)\n                };\n                Command.fn.init.call(this, options);\n            }\n        });\n        var OutdentCommand = Command.extend({\n            init: function (options) {\n                var that = this;\n                options.formatter = {\n                    toggle: $.proxy(function (range) {\n                        var indentFormatter = new IndentFormatter();\n                        indentFormatter.immutables = this.editor && this.editor.options.immutables;\n                        indentFormatter.remove(RangeUtils.nodes(range));\n                    }, that)\n                };\n                Command.fn.init.call(this, options);\n            }\n        });\n        var OutdentTool = Tool.extend({\n            init: function (options) {\n                Tool.fn.init.call(this, options);\n                this.finder = new BlockFormatFinder([{ tags: blockElements }]);\n            },\n            initialize: function (ui, options) {\n                Tool.fn.initialize.call(this, ui, options);\n                $.extend(this.options, { immutables: options.editor && options.editor.options.immutables });\n                ui.addClass('k-state-disabled');\n            },\n            update: function (ui, nodes) {\n                var suitableNodes = this.finder.findSuitable(nodes), isOutdentable, listParentsCount, i, len, suitable, immutableParent;\n                for (i = 0, len = suitableNodes.length; i < len; i++) {\n                    suitable = suitableNodes[i];\n                    if (this.options.immutables) {\n                        immutableParent = Editor.Immutables.immutableParent(suitable);\n                        if (immutableParent) {\n                            suitable = immutableParent;\n                        }\n                    }\n                    isOutdentable = indent(suitable);\n                    if (!isOutdentable) {\n                        listParentsCount = $(suitable).parents('ul,ol').length;\n                        isOutdentable = dom.is(suitable, 'li') && (listParentsCount > 1 || indent(suitable.parentNode)) || dom.ofType(suitable, [\n                            'ul',\n                            'ol'\n                        ]) && listParentsCount > 0;\n                    }\n                    if (isOutdentable) {\n                        ui.removeClass('k-state-disabled');\n                        return;\n                    }\n                }\n                ui.addClass('k-state-disabled').removeClass('k-state-hover');\n            }\n        });\n        extend(Editor, {\n            IndentFormatter: IndentFormatter,\n            IndentCommand: IndentCommand,\n            OutdentCommand: OutdentCommand,\n            OutdentTool: OutdentTool\n        });\n        registerTool('indent', new Tool({\n            command: IndentCommand,\n            template: new ToolTemplate({\n                template: EditorUtils.buttonTemplate,\n                title: 'Indent'\n            })\n        }));\n        registerTool('outdent', new OutdentTool({\n            command: OutdentCommand,\n            template: new ToolTemplate({\n                template: EditorUtils.buttonTemplate,\n                title: 'Outdent'\n            })\n        }));\n    }(window.kendo.jQuery));\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('editor/viewhtml', ['editor/indent'], f);\n}(function () {\n    (function ($, undefined) {\n        var kendo = window.kendo, extend = $.extend, Editor = kendo.ui.editor, EditorUtils = Editor.EditorUtils, Command = Editor.Command, Tool = Editor.Tool, ToolTemplate = Editor.ToolTemplate;\n        var ViewHtmlCommand = Command.extend({\n            init: function (options) {\n                var cmd = this;\n                cmd.options = options;\n                Command.fn.init.call(cmd, options);\n                cmd.attributes = null;\n                cmd.async = true;\n            },\n            exec: function () {\n                var that = this, editor = that.editor, options = editor.options, messages = editor.options.messages, dialog = $(kendo.template(ViewHtmlCommand.template)(messages)).appendTo(document.body), textarea = '.k-editor-textarea', content;\n                options.serialization.immutables = editor.immutables;\n                content = ViewHtmlCommand.indent(editor.value());\n                options.serialization.immutables = undefined;\n                function apply(e) {\n                    options.deserialization.immutables = editor.immutables;\n                    editor.value(dialog.find(textarea).val());\n                    options.deserialization.immutables = undefined;\n                    close(e);\n                    if (that.change) {\n                        that.change();\n                    }\n                    editor.trigger('change');\n                }\n                function close(e) {\n                    e.preventDefault();\n                    dialog.data('kendoWindow').destroy();\n                    if (editor.immutables) {\n                        editor.immutables.serializedImmutables = {};\n                    }\n                    editor.focus();\n                }\n                this.createDialog(dialog, {\n                    title: messages.viewHtml,\n                    close: close,\n                    visible: false\n                }).find(textarea).val(content).end().find('.k-dialog-update').click(apply).end().find('.k-dialog-close').click(close).end().data('kendoWindow').center().open();\n                dialog.find(textarea).focus();\n            }\n        });\n        extend(ViewHtmlCommand, {\n            template: '<div class=\\'k-editor-dialog k-popup-edit-form k-viewhtml-dialog\\'>' + '<div class=\\'k-edit-form-container\\'></div>' + '<textarea class=\\'k-editor-textarea k-input\\'></textarea>' + '<div class=\\'k-edit-buttons k-state-default\\'>' + '<button class=\\'k-dialog-update k-button k-primary\\'>#: dialogUpdate #</button>' + '<button class=\\'k-dialog-close k-button\\'>#: dialogCancel #</button>' + '</div>' + '</div>' + '</div>',\n            indent: function (content) {\n                return content.replace(/<\\/(p|li|ul|ol|h[1-6]|table|tr|td|th)>/gi, '</$1>\\n').replace(/<(ul|ol)([^>]*)><li/gi, '<$1$2>\\n<li').replace(/<br \\/>/gi, '<br />\\n').replace(/\\n$/, '');\n            }\n        });\n        kendo.ui.editor.ViewHtmlCommand = ViewHtmlCommand;\n        Editor.EditorUtils.registerTool('viewHtml', new Tool({\n            command: ViewHtmlCommand,\n            template: new ToolTemplate({\n                template: EditorUtils.buttonTemplate,\n                title: 'View HTML'\n            })\n        }));\n    }(window.kendo.jQuery));\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('editor/formatting', ['editor/viewhtml'], f);\n}(function () {\n    (function ($) {\n        var kendo = window.kendo, Editor = kendo.ui.editor, Tool = Editor.Tool, ToolTemplate = Editor.ToolTemplate, DelayedExecutionTool = Editor.DelayedExecutionTool, Command = Editor.Command, dom = Editor.Dom, EditorUtils = Editor.EditorUtils, RangeUtils = Editor.RangeUtils, registerTool = EditorUtils.registerTool;\n        var FormattingTool = DelayedExecutionTool.extend({\n            init: function (options) {\n                var that = this;\n                Tool.fn.init.call(that, kendo.deepExtend({}, that.options, options));\n                that.type = 'kendoSelectBox';\n                that.finder = {\n                    getFormat: function () {\n                        return '';\n                    }\n                };\n            },\n            options: {\n                items: [\n                    {\n                        text: 'Paragraph',\n                        value: 'p'\n                    },\n                    {\n                        text: 'Quotation',\n                        value: 'blockquote'\n                    },\n                    {\n                        text: 'Heading 1',\n                        value: 'h1'\n                    },\n                    {\n                        text: 'Heading 2',\n                        value: 'h2'\n                    },\n                    {\n                        text: 'Heading 3',\n                        value: 'h3'\n                    },\n                    {\n                        text: 'Heading 4',\n                        value: 'h4'\n                    },\n                    {\n                        text: 'Heading 5',\n                        value: 'h5'\n                    },\n                    {\n                        text: 'Heading 6',\n                        value: 'h6'\n                    }\n                ],\n                width: 110\n            },\n            toFormattingItem: function (item) {\n                var value = item.value;\n                if (!value) {\n                    return item;\n                }\n                if (item.tag || item.className) {\n                    return item;\n                }\n                var dot = value.indexOf('.');\n                if (dot === 0) {\n                    item.className = value.substring(1);\n                } else if (dot == -1) {\n                    item.tag = value;\n                } else {\n                    item.tag = value.substring(0, dot);\n                    item.className = value.substring(dot + 1);\n                }\n                return item;\n            },\n            command: function (args) {\n                var that = this;\n                var item = args.value;\n                item = this.toFormattingItem(item);\n                return new Editor.FormatCommand({\n                    range: args.range,\n                    formatter: function () {\n                        var formatter, tags = (item.tag || item.context || 'span').split(','), format = [{\n                                    tags: tags,\n                                    attr: { className: item.className || '' }\n                                }];\n                        if ($.inArray(tags[0], dom.inlineElements) >= 0) {\n                            formatter = new Editor.GreedyInlineFormatter(format);\n                        } else {\n                            formatter = new Editor.GreedyBlockFormatter(format);\n                        }\n                        formatter.editor = that.editor;\n                        return formatter;\n                    }\n                });\n            },\n            initialize: function (ui, initOptions) {\n                var editor = initOptions.editor;\n                var options = this.options;\n                var toolName = options.name;\n                var that = this;\n                that.editor = editor;\n                ui.width(options.width);\n                ui.kendoSelectBox({\n                    dataTextField: 'text',\n                    dataValueField: 'value',\n                    dataSource: options.items || editor.options[toolName],\n                    title: editor.options.messages[toolName],\n                    autoSize: true,\n                    change: function () {\n                        var dataItem = this.dataItem();\n                        if (dataItem) {\n                            Tool.exec(editor, toolName, dataItem.toJSON());\n                        }\n                    },\n                    dataBound: function () {\n                        var i, items = this.dataSource.data();\n                        for (i = 0; i < items.length; i++) {\n                            items[i] = that.toFormattingItem(items[i]);\n                        }\n                    },\n                    highlightFirst: false,\n                    template: kendo.template('<span unselectable=\"on\" style=\"display:block;#=(data.style||\"\")#\">#:data.text#</span>')\n                });\n                ui.addClass('k-decorated').closest('.k-widget').removeClass('k-' + toolName).find('*').addBack().attr('unselectable', 'on');\n            },\n            getFormattingValue: function (items, nodes) {\n                for (var i = 0; i < items.length; i++) {\n                    var item = items[i];\n                    var tag = item.tag || item.context || '';\n                    var className = item.className ? '.' + item.className : '';\n                    var selector = tag + className;\n                    var element = $(nodes[0]).closest(selector)[0];\n                    if (!element) {\n                        continue;\n                    }\n                    if (nodes.length == 1) {\n                        return item.value;\n                    }\n                    for (var n = 1; n < nodes.length; n++) {\n                        if (!$(nodes[n]).closest(selector)[0]) {\n                            break;\n                        } else if (n == nodes.length - 1) {\n                            return item.value;\n                        }\n                    }\n                }\n                return '';\n            },\n            update: function (ui, nodes) {\n                var selectBox = $(ui).data(this.type);\n                if (!selectBox) {\n                    return;\n                }\n                var dataSource = selectBox.dataSource, items = dataSource.data(), i, context, ancestor = dom.commonAncestor.apply(null, nodes);\n                if (ancestor != dom.closestEditable(ancestor) && this._ancestor == ancestor) {\n                    return;\n                } else {\n                    this._ancestor = ancestor;\n                }\n                for (i = 0; i < items.length; i++) {\n                    context = items[i].context;\n                    items[i].visible = !context || !!$(ancestor).closest(context).length;\n                }\n                dataSource.filter([{\n                        field: 'visible',\n                        operator: 'eq',\n                        value: true\n                    }]);\n                DelayedExecutionTool.fn.update.call(this, ui, nodes);\n                selectBox.value(this.getFormattingValue(dataSource.view(), nodes));\n                selectBox.wrapper.toggleClass('k-state-disabled', !dataSource.view().length);\n            },\n            destroy: function () {\n                this._ancestor = null;\n            }\n        });\n        var CleanFormatCommand = Command.extend({\n            exec: function () {\n                var range = this.lockRange(true);\n                this.tagsToClean = this.options.remove || 'strong,em,span,sup,sub,del,b,i,u,font'.split(',');\n                RangeUtils.wrapSelectedElements(range);\n                var nodes = RangeUtils.mapAll(range, function (node) {\n                    return node;\n                });\n                for (var c = nodes.length - 1; c >= 0; c--) {\n                    var node = nodes[c];\n                    if (!this.immutableParent(node)) {\n                        this.clean(node);\n                    }\n                }\n                this.releaseRange(range);\n            },\n            clean: function (node) {\n                if (!node || dom.isMarker(node)) {\n                    return;\n                }\n                var name = dom.name(node);\n                if (name == 'ul' || name == 'ol') {\n                    var listFormatter = new Editor.ListFormatter(name);\n                    var prev = node.previousSibling;\n                    var next = node.nextSibling;\n                    listFormatter.unwrap(node);\n                    for (; prev && prev != next; prev = prev.nextSibling) {\n                        this.clean(prev);\n                    }\n                } else if (name == 'blockquote') {\n                    dom.changeTag(node, 'p');\n                } else if (node.nodeType == 1 && !dom.insignificant(node)) {\n                    for (var i = node.childNodes.length - 1; i >= 0; i--) {\n                        this.clean(node.childNodes[i]);\n                    }\n                    node.removeAttribute('style');\n                    node.removeAttribute('class');\n                } else {\n                    unwrapListItem(node);\n                }\n                if ($.inArray(name, this.tagsToClean) > -1) {\n                    dom.unwrap(node);\n                }\n            },\n            immutableParent: function (node) {\n                return this.immutables() && Editor.Immutables.immutableParent(node);\n            }\n        });\n        function unwrapListItem(node) {\n            var li = dom.closestEditableOfType(node, ['li']);\n            if (li) {\n                var listFormatter = new Editor.ListFormatter(dom.name(li.parentNode));\n                var range = kendo.ui.editor.W3CRange.fromNode(node);\n                range.selectNode(li);\n                listFormatter.toggle(range);\n            }\n        }\n        $.extend(Editor, {\n            FormattingTool: FormattingTool,\n            CleanFormatCommand: CleanFormatCommand\n        });\n        registerTool('formatting', new FormattingTool({\n            template: new ToolTemplate({\n                template: EditorUtils.dropDownListTemplate,\n                title: 'Format'\n            })\n        }));\n        registerTool('cleanFormatting', new Tool({\n            command: CleanFormatCommand,\n            template: new ToolTemplate({\n                template: EditorUtils.buttonTemplate,\n                title: 'Clean formatting'\n            })\n        }));\n    }(window.kendo.jQuery));\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('editor/toolbar', ['editor/formatting'], f);\n}(function () {\n    (function ($, undefined) {\n        var kendo = window.kendo;\n        var ui = kendo.ui;\n        var editorNS = ui.editor;\n        var Widget = ui.Widget;\n        var extend = $.extend;\n        var proxy = $.proxy;\n        var keys = kendo.keys;\n        var NS = '.kendoEditor';\n        var EditorUtils = kendo.ui.editor.EditorUtils;\n        var ToolTemplate = kendo.ui.editor.ToolTemplate;\n        var Tool = kendo.ui.editor.Tool;\n        var outerWidth = kendo._outerWidth;\n        var outerHeight = kendo._outerHeight;\n        var OVERFLOWANCHOR = 'overflowAnchor';\n        var focusable = '.k-tool-group:visible a.k-tool:not(.k-state-disabled),' + '.k-tool.k-overflow-anchor,' + '.k-tool-group:visible .k-widget.k-colorpicker,' + '.k-tool-group:visible .k-selectbox,' + '.k-tool-group:visible .k-dropdown,' + '.k-tool-group:visible .k-combobox .k-input';\n        var toolNamesByCssClass = {\n            'k-i-sup-script': 'superscript',\n            'k-i-sub-script': 'subscript',\n            'k-i-align-left': 'justifyLeft',\n            'k-i-align-center': 'justifyCenter',\n            'k-i-align-right': 'justifyRight',\n            'k-i-align-justify': 'justifyFull',\n            'k-i-list-unordered': 'insertUnorderedList',\n            'k-i-list-ordered': 'insertOrderedList',\n            'k-i-login': 'import',\n            'k-i-indent-increase': 'indent',\n            'k-i-indent-decrease': 'outdent',\n            'k-i-link-horizontal': 'createLink',\n            'k-i-unlink-horizontal': 'unlink',\n            'k-i-image': 'insertImage',\n            'k-i-file-add': 'insertFile',\n            'k-i-html': 'viewHtml',\n            'k-i-foreground-color': 'foreColor',\n            'k-i-paint': 'backColor',\n            'k-i-table-insert': 'createTable',\n            'k-i-table-column-insert-left': 'addColumnLeft',\n            'k-i-table-column-insert-right': 'addColumnRight',\n            'k-i-table-row-insert-above': 'addRowAbove',\n            'k-i-table-row-insert-below': 'addRowBelow',\n            'k-i-table-row-delete': 'deleteRow',\n            'k-i-table-column-delete': 'deleteColumn',\n            'k-i-table-properties': 'tableWizard',\n            'k-i-table-wizard': 'tableWizardInsert',\n            'k-i-clear-css': 'cleanFormatting'\n        };\n        var OverflowAnchorTool = Tool.extend({\n            initialize: function (ui, options) {\n                ui.attr({ unselectable: 'on' });\n                var toolbar = options.editor.toolbar;\n                ui.attr('aria-controls', options.editor.element.attr('id')).on('click', $.proxy(function () {\n                    this.overflowPopup.toggle();\n                }, toolbar));\n            },\n            options: { name: OVERFLOWANCHOR },\n            command: $.noop,\n            update: $.noop,\n            destroy: $.noop\n        });\n        EditorUtils.registerTool(OVERFLOWANCHOR, new OverflowAnchorTool({\n            key: '',\n            ctrl: true,\n            template: new ToolTemplate({ template: EditorUtils.overflowAnchorTemplate })\n        }));\n        var Toolbar = Widget.extend({\n            init: function (element, options) {\n                var that = this;\n                options = extend({}, options, { name: 'EditorToolbar' });\n                Widget.fn.init.call(that, element, options);\n                if (options.popup) {\n                    that._initPopup();\n                }\n                if (options.resizable && options.resizable.toolbar) {\n                    that._resizeHandler = kendo.onResize(function () {\n                        that.resize();\n                    });\n                    that.element.addClass('k-toolbar-resizable');\n                }\n            },\n            events: ['execute'],\n            groups: {\n                basic: [\n                    'bold',\n                    'italic',\n                    'underline',\n                    'strikethrough'\n                ],\n                scripts: [\n                    'subscript',\n                    'superscript'\n                ],\n                alignment: [\n                    'justifyLeft',\n                    'justifyCenter',\n                    'justifyRight',\n                    'justifyFull'\n                ],\n                links: [\n                    'insertImage',\n                    'insertFile',\n                    'createLink',\n                    'unlink'\n                ],\n                lists: [\n                    'insertUnorderedList',\n                    'insertOrderedList',\n                    'indent',\n                    'outdent'\n                ],\n                tables: [\n                    'createTable',\n                    'addColumnLeft',\n                    'addColumnRight',\n                    'addRowAbove',\n                    'addRowBelow',\n                    'deleteRow',\n                    'deleteColumn'\n                ],\n                advanced: [\n                    'viewHtml',\n                    'cleanFormatting',\n                    'print',\n                    'pdf',\n                    'exportAs',\n                    'import'\n                ],\n                fonts: [\n                    'fontName',\n                    'fontSize'\n                ],\n                colors: [\n                    'foreColor',\n                    'backColor'\n                ]\n            },\n            overflowFlaseTools: [\n                'formatting',\n                'fontName',\n                'fontSize',\n                'foreColor',\n                'backColor',\n                'insertHtml'\n            ],\n            _initPopup: function () {\n                var that = this;\n                this.window = $(this.element).wrap('<div class=\\'editorToolbarWindow k-header\\' />').parent().prepend('<button class=\\'k-button k-bare k-editortoolbar-dragHandle\\'><span class=\\'k-icon k-i-handler-drag\\' /></button>').kendoWindow({\n                    title: false,\n                    resizable: false,\n                    draggable: { dragHandle: '.k-editortoolbar-dragHandle' },\n                    animation: {\n                        open: { effects: 'fade:in' },\n                        close: { effects: 'fade:out' }\n                    },\n                    minHeight: 42,\n                    visible: false,\n                    autoFocus: false,\n                    actions: [],\n                    dragend: function () {\n                        this._moved = true;\n                    }\n                }).on('mousedown', function (e) {\n                    if (!$(e.target).is('.k-icon')) {\n                        that.preventPopupHide = true;\n                    }\n                }).on('focusout', function () {\n                    that.options.editor.element.focusout();\n                }).data('kendoWindow');\n            },\n            _toggleOverflowStyles: function (element, show) {\n                element.find('li').toggleClass('k-item k-state-default', show).find('.k-tool:not(.k-state-disabled),.k-overflow-button').toggleClass('k-overflow-button k-button', show);\n            },\n            _initOverflowPopup: function (ui) {\n                var that = this;\n                var popupTemplate = '<ul class=\\'k-editor-overflow-popup k-overflow-container k-list-container\\'></ul>';\n                that.overflowPopup = $(popupTemplate).appendTo('body').kendoPopup({\n                    anchor: ui,\n                    origin: 'bottom right',\n                    position: 'top right',\n                    copyAnchorStyles: false,\n                    open: function (e) {\n                        if (this.element.is(':empty')) {\n                            e.preventDefault();\n                        }\n                        that._toggleOverflowStyles(this.element, true);\n                        ui.attr('aria-expanded', true);\n                    },\n                    close: function () {\n                        ui.attr('aria-expanded', false);\n                    },\n                    activate: proxy(that.focusOverflowPopup, that)\n                }).data('kendoPopup');\n            },\n            items: function () {\n                var isResizable = this.options.resizable && this.options.resizable.toolbar, popup, result;\n                result = this.element.children().find('> *, select');\n                if (isResizable) {\n                    popup = this.overflowPopup;\n                    result = result.add(popup.element.children().find('> *'));\n                }\n                return result;\n            },\n            focused: function () {\n                return this.element.find('.k-state-focused').length > 0 || this.preventPopupHide || this.overflowPopup && this.overflowPopup.visible();\n            },\n            toolById: function (name) {\n                var id, tools = this.tools;\n                for (id in tools) {\n                    if (id.toLowerCase() == name) {\n                        return tools[id];\n                    }\n                }\n            },\n            toolGroupFor: function (toolName) {\n                var i, groups = this.groups;\n                if (this.isCustomTool(toolName)) {\n                    return 'custom';\n                }\n                for (i in groups) {\n                    if ($.inArray(toolName, groups[i]) >= 0) {\n                        return i;\n                    }\n                }\n            },\n            bindTo: function (editor) {\n                var that = this, window = that.window;\n                if (that._editor) {\n                    that._editor.unbind('select', proxy(that.resize, that));\n                }\n                that._editor = editor;\n                if (that.options.resizable && that.options.resizable.toolbar) {\n                    editor.options.tools.push(OVERFLOWANCHOR);\n                }\n                that.tools = that.expandTools(editor.options.tools);\n                that.render();\n                that.element.find('.k-combobox .k-input').keydown(function (e) {\n                    var combobox = $(this).closest('.k-combobox').data('kendoComboBox'), key = e.keyCode;\n                    if (key == keys.RIGHT || key == keys.LEFT) {\n                        combobox.close();\n                    } else if (key == keys.DOWN) {\n                        if (!combobox.dropDown.isOpened()) {\n                            e.stopImmediatePropagation();\n                            combobox.open();\n                        }\n                    }\n                });\n                that._attachEvents();\n                that.items().each(function initializeTool() {\n                    var toolName = that._toolName(this), tool = toolName !== 'moreVertical' ? that.tools[toolName] : that.tools.overflowAnchor, options = tool && tool.options, messages = editor.options.messages, description = options && options.tooltip || messages[toolName], ui = $(this);\n                    if (!tool || !tool.initialize) {\n                        return;\n                    }\n                    if (toolName == 'fontSize' || toolName == 'fontName') {\n                        var inheritText = messages[toolName + 'Inherit'];\n                        ui.find('input').val(inheritText).end().find('span.k-input').text(inheritText).end();\n                    }\n                    tool.initialize(ui, {\n                        title: that._appendShortcutSequence(description, tool),\n                        editor: that._editor\n                    });\n                    ui.closest('.k-widget', that.element).addClass('k-editor-widget');\n                    ui.closest('.k-colorpicker', that.element).next('.k-colorpicker').addClass('k-editor-widget');\n                });\n                editor.bind('select', proxy(that.resize, that));\n                that.update();\n                if (window) {\n                    window.wrapper.css({\n                        top: '',\n                        left: '',\n                        width: ''\n                    });\n                }\n            },\n            show: function () {\n                var that = this, window = that.window, editorOptions = that.options.editor, wrapper, editorElement, editorOffset, browser = kendo.support.browser;\n                if (window) {\n                    wrapper = window.wrapper;\n                    editorElement = editorOptions.element;\n                    if (!wrapper.is(':visible') || !that.window.options.visible) {\n                        if (!wrapper[0].style.width) {\n                            wrapper.width(outerWidth(editorElement) - parseInt(wrapper.css('border-left-width'), 10) - parseInt(wrapper.css('border-right-width'), 10));\n                        }\n                        if (!window._moved) {\n                            editorOffset = editorElement.offset();\n                            wrapper.css({\n                                top: Math.max(0, parseInt(editorOffset.top, 10) - outerHeight(wrapper) - parseInt(that.window.element.css('padding-bottom'), 10)),\n                                left: Math.max(0, parseInt(editorOffset.left, 10))\n                            });\n                        }\n                        if ((browser.msie || browser.edge) && that._overlaps(editorElement)) {\n                            setTimeout(function () {\n                                window.open();\n                            }, 0);\n                        } else {\n                            window.open();\n                        }\n                    }\n                }\n            },\n            _overlaps: function (box) {\n                var toolbarWrapper = this.window.wrapper, toolbarWrapperOffset = toolbarWrapper.offset(), toolbarWrapperLeft = toolbarWrapperOffset.left, toolbarWrapperTop = toolbarWrapperOffset.top, boxOffset = box.offset(), boxOffsetLeft = boxOffset.left, boxOffsetTop = boxOffset.top;\n                return !(boxOffsetLeft + box.width() < toolbarWrapperLeft || boxOffsetLeft > toolbarWrapperLeft + toolbarWrapper.width() || boxOffsetTop + box.height() < toolbarWrapperTop || boxOffsetTop > toolbarWrapperTop + toolbarWrapper.height());\n            },\n            hide: function () {\n                if (this.window) {\n                    this.window.close();\n                }\n            },\n            focus: function () {\n                var TABINDEX = 'tabIndex';\n                var element = this.element;\n                var tabIndex = this._editor.element.attr(TABINDEX);\n                element.attr(TABINDEX, tabIndex || 0).focus().find(focusable).first().focus();\n                if (!tabIndex && tabIndex !== 0) {\n                    element.removeAttr(TABINDEX);\n                }\n            },\n            focusOverflowPopup: function () {\n                var TABINDEX = 'tabIndex';\n                var element = this.overflowPopup.element;\n                var tabIndex = this._editor.element.attr(TABINDEX);\n                element.closest('.k-animation-container').addClass('k-overflow-wrapper');\n                element.attr(TABINDEX, tabIndex || 0).find(focusable).first().focus();\n                if (!tabIndex && tabIndex !== 0) {\n                    element.removeAttr(TABINDEX);\n                }\n            },\n            _appendShortcutSequence: function (localizedText, tool) {\n                if (!tool.key) {\n                    return localizedText;\n                }\n                var res = localizedText + ' (';\n                if (tool.ctrl) {\n                    res += 'Ctrl + ';\n                }\n                if (tool.shift) {\n                    res += 'Shift + ';\n                }\n                if (tool.alt) {\n                    res += 'Alt + ';\n                }\n                res += tool.key + ')';\n                return res;\n            },\n            _nativeTools: [\n                'insertLineBreak',\n                'insertParagraph',\n                'redo',\n                'undo',\n                'autoLink'\n            ],\n            tools: {},\n            isCustomTool: function (toolName) {\n                return !(toolName in kendo.ui.Editor.defaultTools);\n            },\n            expandTools: function (tools) {\n                var currentTool, i, nativeTools = this._nativeTools, options, defaultTools = kendo.deepExtend({}, kendo.ui.Editor.defaultTools), result = {}, name;\n                for (i = 0; i < tools.length; i++) {\n                    currentTool = tools[i];\n                    name = currentTool.name;\n                    if ($.isPlainObject(currentTool)) {\n                        if (name && defaultTools[name]) {\n                            result[name] = extend({}, defaultTools[name]);\n                            extend(result[name].options, currentTool);\n                        } else {\n                            options = extend({\n                                cssClass: 'k-i-gear',\n                                type: 'button',\n                                title: ''\n                            }, currentTool);\n                            if (!options.name) {\n                                options.name = 'custom';\n                            }\n                            options.cssClass = 'k-' + options.name;\n                            if (!options.template && options.type == 'button') {\n                                options.template = editorNS.EditorUtils.buttonTemplate;\n                                options.title = options.title || options.tooltip;\n                            }\n                            result[name] = { options: options };\n                        }\n                    } else if (defaultTools[currentTool]) {\n                        result[currentTool] = defaultTools[currentTool];\n                    }\n                }\n                for (i = 0; i < nativeTools.length; i++) {\n                    if (!result[nativeTools[i]]) {\n                        result[nativeTools[i]] = defaultTools[nativeTools[i]];\n                    }\n                }\n                return result;\n            },\n            render: function () {\n                var that = this, tools = that.tools, options, template, toolElement, toolName, editorElement = that._editor.element, element = that.element.empty(), groupName, newGroupName, toolConfig = that._editor.options.tools, browser = kendo.support.browser, group, i, groupPosition = 0, resizable = that.options.resizable && that.options.resizable.toolbar, overflowFlaseTools = this.overflowFlaseTools;\n                function stringify(template) {\n                    var result;\n                    if (template.getHtml) {\n                        result = template.getHtml();\n                    } else {\n                        if (!$.isFunction(template)) {\n                            template = kendo.template(template);\n                        }\n                        result = template(options);\n                    }\n                    return $.trim(result);\n                }\n                function endGroup() {\n                    if (group.children().length) {\n                        if (resizable) {\n                            group.data('position', groupPosition);\n                            groupPosition++;\n                        }\n                        group.appendTo(element);\n                    }\n                }\n                function startGroup(toolName) {\n                    if (toolName !== OVERFLOWANCHOR) {\n                        group = $('<li class=\\'k-tool-group\\' role=\\'presentation\\' />');\n                        group.data('overflow', $.inArray(toolName, overflowFlaseTools) === -1 ? true : false);\n                    } else {\n                        group = $('<li class=\\'k-overflow-tools\\' />');\n                    }\n                }\n                element.empty();\n                if (toolConfig.length) {\n                    toolName = toolConfig[0].name || toolConfig[0];\n                }\n                startGroup(toolName, overflowFlaseTools);\n                for (i = 0; i < toolConfig.length; i++) {\n                    toolName = toolConfig[i].name || toolConfig[i];\n                    options = tools[toolName] && tools[toolName].options;\n                    if (!options && $.isPlainObject(toolName)) {\n                        options = toolName;\n                    }\n                    template = options && options.template;\n                    if (toolName == 'break') {\n                        endGroup();\n                        $('<li class=\\'k-row-break\\' />').appendTo(that.element);\n                        startGroup(toolName, overflowFlaseTools);\n                    }\n                    if (!template) {\n                        continue;\n                    }\n                    newGroupName = that.toolGroupFor(toolName);\n                    if (groupName != newGroupName || toolName == OVERFLOWANCHOR) {\n                        endGroup();\n                        startGroup(toolName, overflowFlaseTools);\n                        groupName = newGroupName;\n                    }\n                    if (toolName == OVERFLOWANCHOR) {\n                        template.options.title = that.options.messages.overflowAnchor;\n                    }\n                    template = stringify(template);\n                    toolElement = $(template).appendTo(group);\n                    if (newGroupName == 'custom') {\n                        endGroup();\n                        startGroup(toolName, overflowFlaseTools);\n                    }\n                    if (options.exec && toolElement.hasClass('k-tool')) {\n                        toolElement.click(proxy(options.exec, editorElement[0]));\n                    }\n                }\n                endGroup();\n                $(that.element).children(':has(> .k-tool)').addClass('k-button-group');\n                if (that.options.popup && browser.msie && browser.version < 9) {\n                    that.window.wrapper.find('*').attr('unselectable', 'on');\n                }\n                that.updateGroups();\n                if (resizable) {\n                    that._initOverflowPopup(that.element.find('.k-overflow-anchor'));\n                }\n                that.angular('compile', function () {\n                    return { elements: that.element };\n                });\n            },\n            updateGroups: function () {\n                $(this.element).children().each(function () {\n                    $(this).children().filter(function () {\n                        return !$(this).hasClass('k-state-disabled');\n                    }).removeClass('k-group-end').first().addClass('k-group-start').end().last().addClass('k-group-end').end();\n                });\n            },\n            decorateFrom: function (body) {\n                this.items().filter('.k-decorated').each(function () {\n                    var selectBox = $(this).data('kendoSelectBox');\n                    if (selectBox) {\n                        selectBox.decorate(body);\n                    }\n                });\n            },\n            destroy: function () {\n                Widget.fn.destroy.call(this);\n                var id, tools = this.tools;\n                for (id in tools) {\n                    if (tools[id].destroy) {\n                        tools[id].destroy();\n                    }\n                }\n                if (this.window) {\n                    this.window.destroy();\n                }\n                if (this._resizeHandler) {\n                    kendo.unbindResize(this._resizeHandler);\n                }\n                if (this.overflowPopup) {\n                    this.overflowPopup.destroy();\n                }\n            },\n            _attachEvents: function () {\n                var that = this, popupElement = that.overflowPopup ? that.overflowPopup.element : $([]);\n                that.attachToolsEvents(that.element.add(popupElement));\n            },\n            attachToolsEvents: function (element) {\n                var that = this, buttons = '[role=button].k-tool', enabledButtons = buttons + ':not(.k-state-disabled)', disabledButtons = buttons + '.k-state-disabled', dropdown = '.k-dropdown', colorpicker = '.k-colorpicker', editorTools = [\n                        buttons,\n                        dropdown,\n                        colorpicker\n                    ].join(',');\n                element.off(NS).on('mouseenter' + NS, enabledButtons, function () {\n                    $(this).addClass('k-state-hover');\n                }).on('mouseleave' + NS, enabledButtons, function () {\n                    $(this).removeClass('k-state-hover');\n                }).on('mousedown' + NS, editorTools, function (e) {\n                    e.preventDefault();\n                }).on('keydown' + NS, focusable, function (e) {\n                    var current = this;\n                    var resizable = that.options.resizable && that.options.resizable.toolbar;\n                    var focusElement, currentContainer, keyCode = e.keyCode;\n                    function move(direction, container, constrain) {\n                        var tools = container.find(focusable);\n                        var index = tools.index(current) + direction;\n                        if (constrain) {\n                            index = Math.max(0, Math.min(tools.length - 1, index));\n                        }\n                        return tools[index];\n                    }\n                    if (keyCode == keys.RIGHT || keyCode == keys.LEFT) {\n                        if (!$(current).hasClass('.k-dropdown')) {\n                            focusElement = move(keyCode == keys.RIGHT ? 1 : -1, that.element, true);\n                        }\n                    } else if (resizable && (keyCode == keys.UP || keyCode == keys.DOWN)) {\n                        focusElement = move(keyCode == keys.DOWN ? 1 : -1, that.overflowPopup.element, true);\n                    } else if (keyCode == keys.ESC) {\n                        if (that.overflowPopup && that.overflowPopup.visible()) {\n                            that.overflowPopup.close();\n                        }\n                        focusElement = that._editor;\n                    } else if (keyCode == keys.TAB && !(e.ctrlKey || e.altKey)) {\n                        if (resizable) {\n                            currentContainer = $(current.parentElement).hasClass('k-overflow-tool-group') ? that.overflowPopup.element : that.element;\n                        } else {\n                            currentContainer = that.element;\n                        }\n                        if (e.shiftKey) {\n                            focusElement = move(-1, currentContainer);\n                        } else {\n                            focusElement = move(1, currentContainer);\n                            if (!focusElement) {\n                                focusElement = that._editor;\n                            }\n                        }\n                    }\n                    if (focusElement) {\n                        e.preventDefault();\n                        focusElement.focus();\n                    }\n                    if (keyCode === keys.ENTER && $(current).is('a') && !$(current).attr('href')) {\n                        that._executeToolCommand(current, e);\n                    }\n                }).on('click' + NS, enabledButtons, function (e) {\n                    that._executeToolCommand(this, e);\n                }).on('click' + NS, disabledButtons, function (e) {\n                    e.preventDefault();\n                });\n            },\n            _executeToolCommand: function (toolElement, e) {\n                var that = this;\n                var button = $(toolElement);\n                e.preventDefault();\n                e.stopPropagation();\n                button.removeClass('k-state-hover');\n                if (!button.is('[data-popup]')) {\n                    that._editor.exec(that._toolName(toolElement));\n                }\n            },\n            _toolName: function (element) {\n                if (!element) {\n                    return;\n                }\n                var className = element.className;\n                if (/k-tool\\b/i.test(className)) {\n                    className = element.firstChild.className;\n                }\n                var tool = $.grep(className.split(' '), function (x) {\n                    return !/^k-(widget|tool|tool-icon|icon|state-hover|header|combobox|dropdown|selectbox|colorpicker)$/i.test(x);\n                });\n                if (tool[0]) {\n                    var toolname = tool[0];\n                    if (toolNamesByCssClass[toolname]) {\n                        toolname = toolNamesByCssClass[toolname];\n                    }\n                    if (toolname.indexOf('k-i-') >= 0) {\n                        return kendo.toCamelCase(toolname.substring(toolname.indexOf('k-i-') + 4));\n                    } else {\n                        return toolname.substring(toolname.lastIndexOf('-') + 1);\n                    }\n                }\n                return 'custom';\n            },\n            refreshTools: function () {\n                var that = this, editorNS = kendo.ui.editor, editor = that._editor, range = editor.getRange(), nodes = editorNS.RangeUtils.textNodes(range), immutables = editor.options.immutables, immutablesContext = that._immutablesContext(range);\n                nodes = editorNS.Dom.filterBy(nodes, editorNS.Dom.htmlIndentSpace, true);\n                if (!nodes.length) {\n                    nodes = [range.startContainer];\n                }\n                that.items().each(function () {\n                    var tool = that.tools[that._toolName(this)];\n                    if (tool) {\n                        var ui = $(this);\n                        if (tool.update) {\n                            tool.update(ui, nodes);\n                        }\n                        if (immutables) {\n                            that._updateImmutablesState(tool, ui, immutablesContext);\n                        }\n                    }\n                });\n                this.update();\n            },\n            _immutablesContext: function (range) {\n                if (this._editor.options.immutables) {\n                    var editorNS = kendo.ui.editor;\n                    if (range.collapsed) {\n                        return editorNS.Immutables.immutablesContext(range);\n                    } else {\n                        return editorNS.RangeUtils.editableTextNodes(range).length === 0;\n                    }\n                }\n            },\n            _updateImmutablesState: function (tool, ui, immutablesContext) {\n                var name = tool.name;\n                var uiElement = ui;\n                var trackImmutables = tool.options.trackImmutables;\n                if (trackImmutables === undefined) {\n                    trackImmutables = $.inArray(name, editorNS.Immutables.toolsToBeUpdated) > -1;\n                }\n                if (trackImmutables) {\n                    var display = immutablesContext ? 'none' : '';\n                    if (!ui.is('.k-tool')) {\n                        var uiData = ui.data();\n                        for (var key in uiData) {\n                            if (key.match(/^kendo[A-Z][a-zA-Z]*/)) {\n                                var widget = uiData[key];\n                                uiElement = widget.wrapper;\n                                break;\n                            }\n                        }\n                    }\n                    uiElement.css('display', display);\n                    var groupUi = uiElement.closest('li');\n                    if (groupUi.children(':visible').length === 0) {\n                        groupUi.css('display', display);\n                    }\n                }\n            },\n            update: function () {\n                this.updateGroups();\n            },\n            _resize: function (e) {\n                var containerWidth = e.width;\n                var resizable = this.options.resizable && this.options.resizable.toolbar;\n                var popup = this.overflowPopup;\n                this.refreshTools();\n                if (!resizable) {\n                    return;\n                }\n                if (popup.visible()) {\n                    popup.close(true);\n                }\n                this._refreshWidths();\n                this._shrink(containerWidth);\n                this._stretch(containerWidth);\n                this._toggleOverflowStyles(this.element, false);\n                this._toggleOverflowStyles(this.overflowPopup.element, true);\n                this.element.children('li.k-overflow-tools').css('visibility', popup.element.is(':empty') ? 'hidden' : 'visible');\n            },\n            _refreshWidths: function () {\n                this.element.children('li').each(function (idx, element) {\n                    var group = $(element);\n                    group.data('outerWidth', outerWidth(group, true));\n                });\n            },\n            _shrink: function (width) {\n                var group, visibleGroups;\n                if (width < this._groupsWidth()) {\n                    visibleGroups = this._visibleGroups().filter(':not(.k-overflow-tools)');\n                    for (var i = visibleGroups.length - 1; i >= 0; i--) {\n                        group = visibleGroups.eq(i);\n                        if (width > this._groupsWidth()) {\n                            break;\n                        } else {\n                            this._hideGroup(group);\n                        }\n                    }\n                }\n            },\n            _stretch: function (width) {\n                var group, hiddenGroups;\n                if (width > this._groupsWidth()) {\n                    hiddenGroups = this._hiddenGroups();\n                    for (var i = 0; i < hiddenGroups.length; i++) {\n                        group = hiddenGroups.eq(i);\n                        if (width < this._groupsWidth() || !this._showGroup(group, width)) {\n                            break;\n                        }\n                    }\n                }\n            },\n            _hiddenGroups: function () {\n                var popup = this.overflowPopup;\n                var hiddenGroups = this.element.children('li.k-tool-group').filter(':hidden');\n                hiddenGroups = hiddenGroups.add(popup.element.children('li'));\n                hiddenGroups.sort(function (a, b) {\n                    return $(a).data('position') > $(b).data('position') ? 1 : -1;\n                });\n                return hiddenGroups;\n            },\n            _visibleGroups: function () {\n                return this.element.children('li.k-tool-group, li.k-overflow-tools').filter(':visible');\n            },\n            _groupsWidth: function () {\n                var width = 0;\n                this._visibleGroups().each(function () {\n                    width += $(this).data('outerWidth');\n                });\n                return Math.ceil(width);\n            },\n            _hideGroup: function (group) {\n                if (group.data('overflow')) {\n                    var popup = this.overflowPopup;\n                    group.detach().prependTo(popup.element).addClass('k-overflow-tool-group');\n                } else {\n                    group.hide();\n                }\n            },\n            _showGroup: function (group, width) {\n                var position, previous;\n                if (group.length && width > this._groupsWidth() + group.data('outerWidth')) {\n                    if (group.hasClass('k-overflow-tool-group')) {\n                        position = group.data('position');\n                        if (position === 0) {\n                            group.detach().prependTo(this.element);\n                        } else {\n                            previous = this.element.children().filter(function (idx, element) {\n                                return $(element).data('position') === position - 1;\n                            });\n                            group.detach().insertAfter(previous);\n                        }\n                        group.removeClass('k-overflow-tool-group');\n                    } else {\n                        group.show();\n                    }\n                    return true;\n                }\n                return false;\n            }\n        });\n        $.extend(editorNS, { Toolbar: Toolbar });\n    }(window.jQuery || window.kendo.jQuery));\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('editor/tables', ['editor/toolbar'], f);\n}(function () {\n    (function ($, undefined) {\n        var kendo = window.kendo, extend = $.extend, proxy = $.proxy, Editor = kendo.ui.editor, dom = Editor.Dom, EditorUtils = Editor.EditorUtils, RangeUtils = Editor.RangeUtils, Command = Editor.Command, NS = 'kendoEditor', ACTIVESTATE = 'k-state-active', SELECTEDSTATE = 'k-state-selected', Tool = Editor.Tool, ToolTemplate = Editor.ToolTemplate, InsertHtmlCommand = Editor.InsertHtmlCommand, BlockFormatFinder = Editor.BlockFormatFinder, registerTool = Editor.EditorUtils.registerTool, getTouches = kendo.getTouches;\n        var template = kendo.template;\n        var columnTemplate = '<td style=\\'width:#=width#%;\\'>#=content#</td>';\n        var tableFormatFinder = new BlockFormatFinder([{ tags: ['table'] }]);\n        var TableCommand = InsertHtmlCommand.extend({\n            init: function (options) {\n                var o = $.extend({\n                    postProcess: this.postProcess,\n                    skipCleaners: true\n                }, options || {});\n                InsertHtmlCommand.fn.init.call(this, o);\n            },\n            _tableHtml: function (rows, columns) {\n                rows = rows || 1;\n                columns = columns || 1;\n                var columnHtml = template(columnTemplate)({\n                    width: 100 / columns,\n                    content: Editor.emptyTableCellContent\n                });\n                var rowHeight = 100 / rows;\n                return '<table class=\\'k-table\\' data-last>' + new Array(rows + 1).join('<tr style=\\'height:' + rowHeight + '%;\\'>' + new Array(columns + 1).join(columnHtml) + '</tr>') + '</table>';\n            },\n            postProcess: function (editor, range) {\n                var insertedTable = $('table[data-last]', editor.document).removeAttr('data-last');\n                range.setStart(insertedTable.find('td')[0], 0);\n                range.collapse(true);\n                editor.selectRange(range);\n            },\n            exec: function () {\n                var options = this.options;\n                options.html = this._tableHtml(options.rows, options.columns);\n                InsertHtmlCommand.fn.exec.call(this);\n            }\n        });\n        var PopupTool = Tool.extend({\n            initialize: function (ui, options) {\n                Tool.fn.initialize.call(this, ui, options);\n                var popup = $(this.options.popupTemplate).appendTo('body').kendoPopup({\n                    anchor: ui,\n                    copyAnchorStyles: false,\n                    open: proxy(this._open, this),\n                    activate: proxy(this._activate, this),\n                    close: proxy(this._close, this)\n                }).data('kendoPopup');\n                ui.click(proxy(this._toggle, this)).keydown(proxy(this._keydown, this));\n                var editor = this._editor = options.editor;\n                this._popup = popup;\n                var tableWizard = new Editor.TableWizardTool({\n                    template: new ToolTemplate({\n                        template: EditorUtils.buttonTemplate,\n                        title: editor.options.messages.tableWizard\n                    }),\n                    command: Editor.TableWizardCommand,\n                    insertNewTable: true\n                });\n                registerTool('tableWizardInsert', tableWizard);\n                var twTool = $('<div class=\\'k-editor-toolbar\\'>' + tableWizard.options.template.getHtml() + '</div>');\n                twTool.appendTo(popup.element);\n                if (editor.toolbar) {\n                    editor.toolbar.attachToolsEvents(twTool);\n                }\n            },\n            popup: function () {\n                return this._popup;\n            },\n            _activate: $.noop,\n            _open: function () {\n                this._popup.options.anchor.addClass(ACTIVESTATE);\n            },\n            _close: function () {\n                this._popup.options.anchor.removeClass(ACTIVESTATE);\n            },\n            _keydown: function (e) {\n                var keys = kendo.keys;\n                var key = e.keyCode;\n                if (key == keys.DOWN && e.altKey) {\n                    this._popup.open();\n                } else if (key == keys.ESC) {\n                    this._popup.close();\n                }\n            },\n            _toggle: function (e) {\n                var button = $(e.target).closest('.k-tool');\n                if (!button.hasClass('k-state-disabled')) {\n                    this.popup().toggle();\n                }\n            },\n            update: function (ui) {\n                var popup = this.popup();\n                if (popup.wrapper && popup.wrapper.css('display') == 'block') {\n                    popup.close();\n                }\n                ui.removeClass('k-state-hover');\n            },\n            destroy: function () {\n                this._popup.destroy();\n            }\n        });\n        var InsertTableTool = PopupTool.extend({\n            init: function (options) {\n                this.cols = 8;\n                this.rows = 6;\n                PopupTool.fn.init.call(this, $.extend(options, {\n                    command: TableCommand,\n                    popupTemplate: '<div class=\\'k-ct-popup\\'>' + new Array(this.cols * this.rows + 1).join('<span class=\\'k-ct-cell k-state-disabled\\' />') + '<div class=\\'k-status\\'></div>' + '</div>'\n                }));\n            },\n            _activate: function () {\n                var that = this, element = that._popup.element, cells = element.find('.k-ct-cell'), firstCell = cells.eq(0), lastCell = cells.eq(cells.length - 1), start = kendo.getOffset(firstCell), end = kendo.getOffset(lastCell), cols = that.cols, rows = that.rows, cellWidth, cellHeight;\n                element.find('*').addBack().attr('unselectable', 'on');\n                end.left += lastCell[0].offsetWidth;\n                end.top += lastCell[0].offsetHeight;\n                cellWidth = (end.left - start.left) / cols;\n                cellHeight = (end.top - start.top) / rows;\n                function tableFromLocation(e) {\n                    var w = $(window);\n                    return {\n                        row: Math.floor((e.clientY + w.scrollTop() - start.top) / cellHeight) + 1,\n                        col: Math.floor((e.clientX + w.scrollLeft() - start.left) / cellWidth) + 1\n                    };\n                }\n                element.autoApplyNS(NS).on('mousemove', function (e) {\n                    that._setTableSize(tableFromLocation(e));\n                }).on('mouseleave', function () {\n                    that._setTableSize();\n                }).on('down', function (e) {\n                    e.preventDefault();\n                    var touch = getTouches(e)[0];\n                    that._exec(tableFromLocation(touch.location));\n                });\n            },\n            _valid: function (size) {\n                return size && size.row > 0 && size.col > 0 && size.row <= this.rows && size.col <= this.cols;\n            },\n            _exec: function (size) {\n                if (this._valid(size)) {\n                    this._editor.exec('createTable', {\n                        rows: size.row,\n                        columns: size.col\n                    });\n                    this._popup.close();\n                }\n            },\n            _setTableSize: function (size) {\n                var element = this._popup.element;\n                var status = element.find('.k-status');\n                var cells = element.find('.k-ct-cell');\n                var cols = this.cols;\n                var messages = this._editor.options.messages;\n                if (this._valid(size)) {\n                    status.text(kendo.format(messages.createTableHint, size.row, size.col));\n                    cells.each(function (i) {\n                        $(this).toggleClass(SELECTEDSTATE, i % cols < size.col && i / cols < size.row);\n                    });\n                } else {\n                    status.text(messages.createTable);\n                    cells.removeClass(SELECTEDSTATE);\n                }\n            },\n            _keydown: function (e) {\n                PopupTool.fn._keydown.call(this, e);\n                if (!this._popup.visible()) {\n                    return;\n                }\n                var keys = kendo.keys;\n                var key = e.keyCode;\n                var cells = this._popup.element.find('.k-ct-cell');\n                var focus = Math.max(cells.filter('.k-state-selected').last().index(), 0);\n                var selectedRows = Math.floor(focus / this.cols);\n                var selectedColumns = focus % this.cols;\n                var changed = false;\n                if (key == keys.DOWN && !e.altKey) {\n                    changed = true;\n                    selectedRows++;\n                } else if (key == keys.UP) {\n                    changed = true;\n                    selectedRows--;\n                } else if (key == keys.RIGHT) {\n                    changed = true;\n                    selectedColumns++;\n                } else if (key == keys.LEFT) {\n                    changed = true;\n                    selectedColumns--;\n                }\n                var tableSize = {\n                    row: Math.max(1, Math.min(this.rows, selectedRows + 1)),\n                    col: Math.max(1, Math.min(this.cols, selectedColumns + 1))\n                };\n                if (key == keys.ENTER) {\n                    this._exec(tableSize);\n                } else {\n                    this._setTableSize(tableSize);\n                }\n                if (changed) {\n                    e.preventDefault();\n                    e.stopImmediatePropagation();\n                }\n            },\n            _open: function () {\n                var messages = this._editor.options.messages;\n                PopupTool.fn._open.call(this);\n                this.popup().element.find('.k-status').text(messages.createTable).end().find('.k-ct-cell').removeClass(SELECTEDSTATE);\n            },\n            _close: function () {\n                PopupTool.fn._close.call(this);\n                this.popup().element.off('.' + NS);\n            }\n        });\n        var InsertRowCommand = Command.extend({\n            exec: function () {\n                var range = this.lockRange(true), td = range.endContainer, cellCount, row, newRow;\n                while (dom.name(td) != 'td') {\n                    td = td.parentNode;\n                }\n                if (this.immutables() && Editor.Immutables.immutableParent(td)) {\n                    return;\n                }\n                row = td.parentNode;\n                cellCount = row.children.length;\n                newRow = row.cloneNode(true);\n                for (var i = 0; i < row.cells.length; i++) {\n                    newRow.cells[i].innerHTML = Editor.emptyTableCellContent;\n                }\n                if (this.options.position == 'before') {\n                    dom.insertBefore(newRow, row);\n                } else {\n                    dom.insertAfter(newRow, row);\n                }\n                this.releaseRange(range);\n            }\n        });\n        var InsertColumnCommand = Command.extend({\n            exec: function () {\n                var range = this.lockRange(true), td = dom.closest(range.endContainer, 'td'), table = dom.closest(td, 'table'), columnIndex, i, rows = table.rows, cell, newCell, position = this.options.position;\n                if (this.immutables() && Editor.Immutables.immutableParent(td)) {\n                    return;\n                }\n                columnIndex = dom.findNodeIndex(td, true);\n                for (i = 0; i < rows.length; i++) {\n                    cell = rows[i].cells[columnIndex];\n                    newCell = cell.cloneNode();\n                    newCell.innerHTML = Editor.emptyTableCellContent;\n                    if (position == 'before') {\n                        dom.insertBefore(newCell, cell);\n                    } else {\n                        dom.insertAfter(newCell, cell);\n                    }\n                }\n                this.releaseRange(range);\n            }\n        });\n        var DeleteRowCommand = Command.extend({\n            exec: function () {\n                var range = this.lockRange();\n                var rows = RangeUtils.mapAll(range, function (node) {\n                    return $(node).closest('tr')[0];\n                });\n                var row = rows[0];\n                if (this.immutables() && Editor.Immutables.immutableParent(row)) {\n                    return;\n                }\n                var table = dom.closest(row, 'table');\n                var focusElement;\n                if (table.rows.length <= rows.length) {\n                    focusElement = dom.next(table);\n                    if (!focusElement || dom.insignificant(focusElement)) {\n                        focusElement = dom.prev(table);\n                    }\n                    dom.remove(table);\n                } else {\n                    for (var i = 0; i < rows.length; i++) {\n                        row = rows[i];\n                        dom.removeTextSiblings(row);\n                        focusElement = dom.next(row) || dom.prev(row);\n                        focusElement = focusElement.cells[0];\n                        dom.remove(row);\n                    }\n                }\n                if (focusElement) {\n                    range.setStart(focusElement, 0);\n                    range.collapse(true);\n                    this.editor.selectRange(range);\n                }\n            }\n        });\n        var DeleteColumnCommand = Command.extend({\n            exec: function () {\n                var range = this.lockRange(), td = dom.closest(range.endContainer, 'td'), table = dom.closest(td, 'table'), rows = table.rows, columnIndex = dom.findNodeIndex(td, true), columnCount = rows[0].cells.length, focusElement, i;\n                if (this.immutables() && Editor.Immutables.immutableParent(td)) {\n                    return;\n                }\n                if (columnCount == 1) {\n                    focusElement = dom.next(table);\n                    if (!focusElement || dom.insignificant(focusElement)) {\n                        focusElement = dom.prev(table);\n                    }\n                    dom.remove(table);\n                } else {\n                    dom.removeTextSiblings(td);\n                    focusElement = dom.next(td) || dom.prev(td);\n                    for (i = 0; i < rows.length; i++) {\n                        dom.remove(rows[i].cells[columnIndex]);\n                    }\n                }\n                if (focusElement) {\n                    range.setStart(focusElement, 0);\n                    range.collapse(true);\n                    this.editor.selectRange(range);\n                }\n            }\n        });\n        var TableModificationTool = Tool.extend({\n            command: function (options) {\n                options = extend(options, this.options);\n                if (options.action == 'delete') {\n                    if (options.type == 'row') {\n                        return new DeleteRowCommand(options);\n                    } else {\n                        return new DeleteColumnCommand(options);\n                    }\n                } else {\n                    if (options.type == 'row') {\n                        return new InsertRowCommand(options);\n                    } else {\n                        return new InsertColumnCommand(options);\n                    }\n                }\n            },\n            initialize: function (ui, options) {\n                Tool.fn.initialize.call(this, ui, options);\n                ui.addClass('k-state-disabled');\n            },\n            update: function (ui, nodes) {\n                var isFormatted = !tableFormatFinder.isFormatted(nodes);\n                ui.toggleClass('k-state-disabled', isFormatted);\n            }\n        });\n        extend(kendo.ui.editor, {\n            PopupTool: PopupTool,\n            TableCommand: TableCommand,\n            InsertTableTool: InsertTableTool,\n            TableModificationTool: TableModificationTool,\n            InsertRowCommand: InsertRowCommand,\n            InsertColumnCommand: InsertColumnCommand,\n            DeleteRowCommand: DeleteRowCommand,\n            DeleteColumnCommand: DeleteColumnCommand\n        });\n        registerTool('createTable', new InsertTableTool({\n            template: new ToolTemplate({\n                template: EditorUtils.buttonTemplate,\n                popup: true,\n                title: 'Create table'\n            })\n        }));\n        registerTool('addColumnLeft', new TableModificationTool({\n            type: 'column',\n            position: 'before',\n            template: new ToolTemplate({\n                template: EditorUtils.buttonTemplate,\n                title: 'Add column on the left'\n            })\n        }));\n        registerTool('addColumnRight', new TableModificationTool({\n            type: 'column',\n            template: new ToolTemplate({\n                template: EditorUtils.buttonTemplate,\n                title: 'Add column on the right'\n            })\n        }));\n        registerTool('addRowAbove', new TableModificationTool({\n            type: 'row',\n            position: 'before',\n            template: new ToolTemplate({\n                template: EditorUtils.buttonTemplate,\n                title: 'Add row above'\n            })\n        }));\n        registerTool('addRowBelow', new TableModificationTool({\n            type: 'row',\n            template: new ToolTemplate({\n                template: EditorUtils.buttonTemplate,\n                title: 'Add row below'\n            })\n        }));\n        registerTool('deleteRow', new TableModificationTool({\n            type: 'row',\n            action: 'delete',\n            template: new ToolTemplate({\n                template: EditorUtils.buttonTemplate,\n                title: 'Delete row'\n            })\n        }));\n        registerTool('deleteColumn', new TableModificationTool({\n            type: 'column',\n            action: 'delete',\n            template: new ToolTemplate({\n                template: EditorUtils.buttonTemplate,\n                title: 'Delete column'\n            })\n        }));\n    }(window.kendo.jQuery));\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('editor/export', ['editor/main'], f);\n}(function () {\n    (function ($, undefined) {\n        var kendo = window.kendo, extend = $.extend, proxy = $.proxy, Editor = kendo.ui.editor, EditorUtils = Editor.EditorUtils, Command = Editor.Command, Tool = Editor.Tool, registerTool = EditorUtils.registerTool, ToolTemplate = Editor.ToolTemplate, defaultExportAsItems = [\n                {\n                    text: 'Docx',\n                    value: 'docx'\n                },\n                {\n                    text: 'Rtf',\n                    value: 'rtf'\n                },\n                {\n                    text: 'Pdf',\n                    value: 'pdf'\n                },\n                {\n                    text: 'Html',\n                    value: 'html'\n                },\n                {\n                    text: 'Plain Text',\n                    value: 'txt'\n                }\n            ];\n        var ExportAsCommand = Command.extend({\n            init: function (options) {\n                var cmd = this;\n                cmd.options = options;\n                Command.fn.init.call(cmd, options);\n                cmd.attributes = null;\n                cmd.exportType = options.exportType;\n            },\n            exec: function () {\n                var cmd = this;\n                var range = this.lockRange(true);\n                cmd.postToProxy();\n                cmd.releaseRange(range);\n            },\n            postToProxy: function () {\n                this.generateForm().appendTo('body').submit().remove();\n            },\n            generateForm: function () {\n                var cmd = this;\n                var exportAsOptions = cmd.editor.options.exportAs;\n                var form = $('<form>').attr({\n                    action: exportAsOptions && exportAsOptions.proxyURL || '',\n                    method: 'POST'\n                });\n                form.append([\n                    cmd.valueInput(),\n                    cmd.exportTypeInput(),\n                    cmd.fileNameInput()\n                ]);\n                return form;\n            },\n            valueInput: function () {\n                var editor = this.editor;\n                return $('<input>').attr({\n                    value: editor.encodedValue(),\n                    name: 'value',\n                    type: 'hidden'\n                });\n            },\n            exportTypeInput: function () {\n                var cmd = this;\n                return $('<input>').attr({\n                    value: cmd.exportType,\n                    name: 'exportType',\n                    type: 'hidden'\n                });\n            },\n            fileNameInput: function () {\n                var editor = this.editor;\n                var exportAsOptions = editor.options.exportAs;\n                var fileName = exportAsOptions && exportAsOptions.fileName || editor.element.attr('id') || 'editor';\n                return $('<input>').attr({\n                    value: fileName,\n                    name: 'fileName',\n                    type: 'hidden'\n                });\n            }\n        });\n        var ExportAsTool = Tool.extend({\n            init: function (options) {\n                var tool = this;\n                Tool.fn.init.call(tool, kendo.deepExtend({}, tool.options, options));\n                tool.type = 'kendoSelectBox';\n            },\n            options: {\n                items: defaultExportAsItems,\n                width: 115\n            },\n            command: function (args) {\n                var value = args.value;\n                return new Editor.ExportAsCommand({\n                    range: args.range,\n                    exportType: value.exportType\n                });\n            },\n            initialize: function (ui, initOptions) {\n                var tool = this;\n                var editor = initOptions.editor;\n                var options = tool.options;\n                var toolName = options.name;\n                var changeHandler = proxy(tool.changeHandler, tool);\n                var dataSource = options.items || editor.options[toolName];\n                dataSource.unshift({\n                    text: editor.options.messages[toolName],\n                    value: ''\n                });\n                tool.editor = editor;\n                ui.width(options.width);\n                ui.kendoSelectBox({\n                    dataTextField: 'text',\n                    dataValueField: 'value',\n                    dataSource: dataSource,\n                    autoSize: true,\n                    change: changeHandler,\n                    open: function (e) {\n                        var sender = e.sender;\n                        sender.items()[0].style.display = 'none';\n                        sender.unbind('open');\n                    },\n                    highlightFirst: false,\n                    template: kendo.template('<span unselectable=\"on\" style=\"display:block;#=(data.style||\"\")#\">#:data.text#</span>')\n                });\n                ui.addClass('k-decorated').closest('.k-widget').removeClass('k-' + toolName).find('*').addBack().attr('unselectable', 'on');\n            },\n            changeHandler: function (e) {\n                var sender = e.sender;\n                var dataItem = sender.dataItem();\n                var value = dataItem && dataItem.value;\n                this._exec(value);\n                sender.value('');\n            },\n            _exec: function (value) {\n                if (value) {\n                    Tool.exec(this.editor, this.options.name, { exportType: value });\n                }\n            },\n            destroy: function () {\n                this._ancestor = null;\n            }\n        });\n        extend(Editor, {\n            ExportAsTool: ExportAsTool,\n            ExportAsCommand: ExportAsCommand\n        });\n        registerTool('exportAs', new ExportAsTool({\n            template: new ToolTemplate({\n                template: EditorUtils.dropDownListTemplate,\n                title: 'Export As'\n            })\n        }));\n    }(window.kendo.jQuery));\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('editor/import', ['editor/main'], f);\n}(function () {\n    (function ($, undefined) {\n        var kendo = window.kendo, extend = $.extend, proxy = $.proxy, Editor = kendo.ui.editor, EditorUtils = Editor.EditorUtils, Command = Editor.Command, Tool = Editor.Tool, registerTool = EditorUtils.registerTool, ToolTemplate = Editor.ToolTemplate, loadingOverlay = '<div contenteditable=\"false\" class=\"k-loading-mask\" style=\"width: 100%; height: 100%; position: absolute; top: 0px; left: 0px;\"><div class=\"k-loading-image\"></div><div class=\"k-loading-color\"></div></div>';\n        var ImportCommand = Command.extend({\n            exec: function () {\n                (this.editor._uploadWidget || this._initializeUploadWidget()).element.click();\n            },\n            _initializeUploadWidget: function () {\n                var cmd = this;\n                var editor = cmd.editor;\n                var importOptions = editor.options['import'];\n                var upload = $('<input id=\"editorImport\" name=\"files\" type=\"file\" />').kendoUpload({\n                    success: proxy(cmd._onUploadSuccess, cmd),\n                    progress: proxy(cmd._onUploadProgress, cmd),\n                    select: proxy(cmd._onUploadSelect, cmd),\n                    error: proxy(cmd._onUploadError, cmd),\n                    complete: proxy(cmd._onUploadComplete, cmd),\n                    showFileList: false,\n                    multiple: false,\n                    async: {\n                        saveUrl: importOptions.proxyUrl,\n                        autoUpload: true,\n                        saveField: 'file'\n                    },\n                    validation: {\n                        allowedExtensions: importOptions.allowedExtensions,\n                        maxFileSize: importOptions.maxFileSize\n                    }\n                }).getKendoUpload();\n                editor._uploadWidget = upload;\n                return upload;\n            },\n            _onUploadComplete: function (ev) {\n                this._trigger('complete', ev);\n                ev.sender.clearAllFiles();\n                this._removeLoadingOverlay();\n            },\n            _onUploadSuccess: function (ev) {\n                this.editor.value(ev.response.html.replace(/<\\/?body>/gi, ''));\n                this._trigger('success', ev);\n            },\n            _onUploadProgress: function (ev) {\n                this._trigger('progress', ev);\n            },\n            _onUploadSelect: function (ev) {\n                this._trigger('select', ev);\n                if (!ev.files[0].validationErrors) {\n                    this._initLoadingOverlay();\n                }\n            },\n            _onUploadError: function (ev) {\n                this._trigger('error', ev);\n            },\n            _trigger: function (eventType, uploadEvent) {\n                var editor = this.editor;\n                var importOptions = editor.options['import'];\n                if (typeof importOptions[eventType] === 'function') {\n                    importOptions[eventType].call(editor, uploadEvent);\n                }\n            },\n            _initLoadingOverlay: function () {\n                var editable = this.editor.body;\n                if (Editor.Dom.is(editable, 'body')) {\n                    this._iframeWrapper = this._container = this.editor.wrapper.find('iframe').parent().css({ position: 'relative' }).append(loadingOverlay);\n                } else {\n                    this._container = $(editable).append(loadingOverlay);\n                }\n                kendo.ui.progress(this._container, true);\n            },\n            _removeLoadingOverlay: function () {\n                kendo.ui.progress(this._container, false);\n                $(this._iframeWrapper).css({ position: '' });\n                delete this._container;\n                delete this._iframeWrapper;\n            }\n        });\n        extend(Editor, { ImportCommand: ImportCommand });\n        registerTool('import', new Tool({\n            command: ImportCommand,\n            template: new ToolTemplate({\n                template: EditorUtils.buttonTemplate,\n                title: 'Import'\n            })\n        }));\n    }(window.kendo.jQuery));\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('editor/resizing/resizing-utils', ['editor/main'], f);\n}(function () {\n    (function (kendo, undefined) {\n        var global = window;\n        var math = global.Math;\n        var min = math.min;\n        var max = math.max;\n        var parseFloat = global.parseFloat;\n        var $ = kendo.jQuery;\n        var extend = $.extend;\n        var Editor = kendo.ui.editor;\n        var PERCENTAGE = '%';\n        var PIXEL = 'px';\n        var REGEX_NUMBER_IN_PERCENTAGES = /(\\d+)(\\.?)(\\d*)%/;\n        var REGEX_NUMBER_IN_PIXELS = /(\\d+)(\\.?)(\\d*)px/;\n        var STRING = 'string';\n        function constrain(options) {\n            var value = options.value;\n            var lowerBound = options.min;\n            var upperBound = options.max;\n            return max(min(parseFloat(value), parseFloat(upperBound)), parseFloat(lowerBound));\n        }\n        function getScrollBarWidth(element) {\n            if (element && !$(element).is('body') && element.scrollHeight > element.clientHeight) {\n                return kendo.support.scrollbar();\n            }\n            return 0;\n        }\n        function calculatePercentageRatio(value, total) {\n            if (inPercentages(value)) {\n                return parseFloat(value);\n            } else {\n                return parseFloat(value) / total * 100;\n            }\n        }\n        function inPercentages(value) {\n            return typeof value === STRING && REGEX_NUMBER_IN_PERCENTAGES.test(value);\n        }\n        function inPixels(value) {\n            return typeof value === STRING && REGEX_NUMBER_IN_PIXELS.test(value);\n        }\n        function toPercentages(value) {\n            return parseFloat(value) + PERCENTAGE;\n        }\n        function toPixels(value) {\n            return parseFloat(value) + PIXEL;\n        }\n        var ResizingUtils = {\n            constrain: constrain,\n            getScrollBarWidth: getScrollBarWidth,\n            calculatePercentageRatio: calculatePercentageRatio,\n            inPercentages: inPercentages,\n            inPixels: inPixels,\n            toPercentages: toPercentages,\n            toPixels: toPixels\n        };\n        extend(Editor, { ResizingUtils: ResizingUtils });\n    }(window.kendo));\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('editor/resizing/table-element-resizing', [\n        'editor/main',\n        'kendo.resizable',\n        'editor/resizing/resizing-utils'\n    ], f);\n}(function () {\n    (function (kendo, undefined) {\n        var $ = kendo.jQuery;\n        var extend = $.extend;\n        var noop = $.noop;\n        var proxy = $.proxy;\n        var Editor = kendo.ui.editor;\n        var Class = kendo.Class;\n        var KEY_DOWN = 'keydown';\n        var MOUSE_DOWN = 'mousedown';\n        var MOUSE_ENTER = 'mouseenter';\n        var MOUSE_LEAVE = 'mouseleave';\n        var MOUSE_MOVE = 'mousemove';\n        var MOUSE_UP = 'mouseup';\n        var COMMA = ',';\n        var DOT = '.';\n        var LAST_CHILD = ':last-child';\n        var TABLE = 'table';\n        var TableElementResizing = Class.extend({\n            init: function (element, options) {\n                var that = this;\n                that.options = extend({}, that.options, options);\n                that.options.tags = $.isArray(that.options.tags) ? that.options.tags : [that.options.tags];\n                if ($(element).is(TABLE)) {\n                    that.element = element;\n                    that._attachEventHandlers();\n                }\n            },\n            destroy: function () {\n                var that = this;\n                var eventNamespace = that.options.eventNamespace;\n                if (that.element) {\n                    $(that.element).off(eventNamespace);\n                    that.element = null;\n                }\n                $(that.options.rootElement).off(KEY_DOWN + eventNamespace);\n                that._destroyResizeHandle();\n            },\n            options: {\n                tags: [],\n                min: 0,\n                rootElement: null,\n                eventNamespace: '',\n                rtl: false,\n                handle: {\n                    dataAttribute: '',\n                    height: 0,\n                    width: 0,\n                    classNames: {},\n                    template: ''\n                }\n            },\n            _attachEventHandlers: function () {\n                var that = this;\n                var options = that.options;\n                $(that.element).on(MOUSE_MOVE + options.eventNamespace, options.tags.join(COMMA), proxy(that.detectElementBorderHovering, that));\n            },\n            resizingInProgress: function () {\n                var that = this;\n                var resizable = that._resizable;\n                if (resizable) {\n                    return !!resizable.resizing;\n                }\n                return false;\n            },\n            resize: noop,\n            detectElementBorderHovering: function (e) {\n                var that = this;\n                var options = that.options;\n                var handleOptions = options.handle;\n                var tableElement = $(e.currentTarget);\n                var resizeHandle = that.resizeHandle;\n                var dataAttribute = handleOptions.dataAttribute;\n                if (!that.resizingInProgress()) {\n                    if (!tableElement.is(LAST_CHILD) && that.elementBorderHovered(tableElement, e)) {\n                        if (resizeHandle) {\n                            if (resizeHandle.data(dataAttribute) && resizeHandle.data(dataAttribute) !== tableElement[0]) {\n                                that.showResizeHandle(tableElement, e);\n                            }\n                        } else {\n                            that.showResizeHandle(tableElement, e);\n                        }\n                    } else {\n                        if (resizeHandle) {\n                            that._destroyResizeHandle();\n                        }\n                    }\n                }\n            },\n            elementBorderHovered: noop,\n            showResizeHandle: function (tableElement, e) {\n                var that = this;\n                if (e.buttons !== 0) {\n                    return;\n                }\n                that._initResizeHandle();\n                that.setResizeHandlePosition(tableElement);\n                that.setResizeHandleDimensions();\n                that.setResizeHandleDataAttributes(tableElement[0]);\n                that._attachResizeHandleEventHandlers();\n                that._initResizable(tableElement);\n                that._hideResizeMarker();\n                that.resizeHandle.show();\n            },\n            _initResizeHandle: function () {\n                var that = this;\n                var options = that.options;\n                that._destroyResizeHandle();\n                that.resizeHandle = $(options.handle.template).appendTo(options.rootElement);\n            },\n            setResizeHandlePosition: noop,\n            setResizeHandleDimensions: noop,\n            setResizeHandleDataAttributes: function (tableElement) {\n                var that = this;\n                that.resizeHandle.data(that.options.handle.dataAttribute, tableElement);\n            },\n            _attachResizeHandleEventHandlers: function () {\n                var that = this;\n                var options = that.options;\n                var eventNamespace = options.eventNamespace;\n                var markerClass = options.handle.classNames.marker;\n                var resizeHandle = that.resizeHandle;\n                that.resizeHandle.on(MOUSE_DOWN + eventNamespace, function () {\n                    resizeHandle.find(DOT + markerClass).show();\n                }).on(MOUSE_UP + eventNamespace, function () {\n                    resizeHandle.find(DOT + markerClass).hide();\n                });\n            },\n            _hideResizeMarker: function () {\n                var that = this;\n                that.resizeHandle.find(DOT + that.options.handle.classNames.marker).hide();\n            },\n            _destroyResizeHandle: function () {\n                var that = this;\n                if (that.resizeHandle) {\n                    that._destroyResizable();\n                    that.resizeHandle.off(that.options.eventNamespace).remove();\n                    that.resizeHandle = null;\n                }\n            },\n            _initResizable: function (tableElement) {\n                var that = this;\n                if (!that.resizeHandle) {\n                    return;\n                }\n                that._destroyResizable();\n                that._resizable = new kendo.ui.Resizable(tableElement, {\n                    draggableElement: that.resizeHandle[0],\n                    start: proxy(that.onResizeStart, that),\n                    resize: proxy(that.onResize, that),\n                    resizeend: proxy(that.onResizeEnd, that)\n                });\n            },\n            _destroyResizable: function () {\n                var that = this;\n                if (that._resizable) {\n                    that._resizable.destroy();\n                    that._resizable = null;\n                }\n            },\n            onResizeStart: function () {\n                this._disableKeyboard();\n            },\n            onResize: function (e) {\n                this.setResizeHandleDragPosition(e);\n            },\n            setResizeHandleDragPosition: noop,\n            onResizeEnd: function (e) {\n                var that = this;\n                that.resize(e);\n                that._destroyResizeHandle();\n                that._enableKeyboard();\n            },\n            _enableKeyboard: function () {\n                var options = this.options;\n                $(options.rootElement).off(KEY_DOWN + options.eventNamespace);\n            },\n            _disableKeyboard: function () {\n                var options = this.options;\n                $(options.rootElement).on(KEY_DOWN + options.eventNamespace, function (e) {\n                    e.preventDefault();\n                });\n            },\n            _forceResizing: function (e) {\n                var resizable = this._resizable;\n                if (resizable && resizable.userEvents) {\n                    resizable.userEvents._end(e);\n                }\n            }\n        });\n        var ResizingFactory = Class.extend({\n            create: function (editor, options) {\n                var that = this;\n                var resizingName = options.name;\n                var NS = options.eventNamespace;\n                $(editor.body).on(MOUSE_ENTER + NS, TABLE, function (e) {\n                    var table = e.currentTarget;\n                    var resizing = editor[resizingName];\n                    e.stopPropagation();\n                    if (resizing) {\n                        if (resizing.element !== table && !resizing.resizingInProgress()) {\n                            that._destroyResizing(editor, options);\n                            that._initResizing(editor, table, options);\n                        }\n                    } else {\n                        that._initResizing(editor, table, options);\n                    }\n                }).on(MOUSE_LEAVE + NS, TABLE, function (e) {\n                    var parentTable;\n                    var resizing = editor[resizingName];\n                    e.stopPropagation();\n                    if (resizing && !resizing.resizingInProgress() && !resizing.resizeHandle) {\n                        parentTable = $(resizing.element).parents(TABLE)[0];\n                        if (parentTable) {\n                            that._destroyResizing(editor, options);\n                            that._initResizing(editor, parentTable, options);\n                        }\n                    }\n                }).on(MOUSE_LEAVE + NS, function () {\n                    var resizing = editor[resizingName];\n                    if (resizing && !resizing.resizingInProgress()) {\n                        that._destroyResizing(editor, options);\n                    }\n                }).on(MOUSE_UP + NS, function (e) {\n                    var resizing = editor[resizingName];\n                    var parentTable;\n                    if (resizing && resizing.resizingInProgress()) {\n                        parentTable = $(e.target).parents(TABLE)[0];\n                        if (parentTable) {\n                            resizing._forceResizing(e);\n                            that._destroyResizing(editor, options);\n                            that._initResizing(editor, parentTable, options);\n                        }\n                    }\n                });\n            },\n            dispose: function (editor, options) {\n                $(editor.body).off(options.eventNamespace);\n            },\n            _initResizing: function (editor, tableElement, options) {\n                var resizingName = options.name;\n                var resizingType = options.type;\n                editor[resizingName] = new resizingType(tableElement, {\n                    rtl: kendo.support.isRtl(editor.element),\n                    rootElement: editor.body\n                });\n            },\n            _destroyResizing: function (editor, options) {\n                var resizingName = options.name;\n                if (editor[resizingName]) {\n                    editor[resizingName].destroy();\n                    editor[resizingName] = null;\n                }\n            }\n        });\n        ResizingFactory.current = new ResizingFactory();\n        TableElementResizing.create = function (editor, options) {\n            ResizingFactory.current.create(editor, options);\n        };\n        TableElementResizing.dispose = function (editor, options) {\n            ResizingFactory.current.dispose(editor, options);\n        };\n        extend(Editor, { TableElementResizing: TableElementResizing });\n    }(window.kendo));\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('editor/resizing/column-resizing', [\n        'editor/main',\n        'editor/resizing/resizing-utils',\n        'editor/resizing/table-element-resizing'\n    ], f);\n}(function () {\n    (function (kendo, undefined) {\n        var global = window;\n        var math = global.Math;\n        var abs = math.abs;\n        var $ = kendo.jQuery;\n        var extend = $.extend;\n        var Editor = kendo.ui.editor;\n        var TableElementResizing = Editor.TableElementResizing;\n        var ResizingUtils = Editor.ResizingUtils;\n        var constrain = ResizingUtils.constrain;\n        var calculatePercentageRatio = ResizingUtils.calculatePercentageRatio;\n        var getScrollBarWidth = ResizingUtils.getScrollBarWidth;\n        var inPercentages = ResizingUtils.inPercentages;\n        var toPercentages = ResizingUtils.toPercentages;\n        var toPixels = ResizingUtils.toPixels;\n        var outerWidth = kendo._outerWidth;\n        var NS = '.kendoEditorColumnResizing';\n        var RESIZE_HANDLE_CLASS = 'k-column-resize-handle';\n        var RESIZE_MARKER_CLASS = 'k-column-resize-marker';\n        var BODY = 'body';\n        var TBODY = 'tbody';\n        var TD = 'td';\n        var TH = 'th';\n        var TR = 'tr';\n        var COMMA = ',';\n        var WIDTH = 'width';\n        var ColumnResizing = TableElementResizing.extend({\n            options: {\n                tags: [\n                    TD,\n                    TH\n                ],\n                min: 20,\n                rootElement: null,\n                eventNamespace: NS,\n                rtl: false,\n                handle: {\n                    dataAttribute: 'column',\n                    width: 10,\n                    height: 0,\n                    classNames: {\n                        handle: RESIZE_HANDLE_CLASS,\n                        marker: RESIZE_MARKER_CLASS\n                    },\n                    template: '<div class=\"k-column-resize-handle-wrapper\" unselectable=\"on\" contenteditable=\"false\">' + '<div class=\"' + RESIZE_HANDLE_CLASS + '\">' + '<div class=\"' + RESIZE_MARKER_CLASS + '\"></div>' + '</div>' + '</div>'\n                }\n            },\n            elementBorderHovered: function (column, e) {\n                var that = this;\n                var options = that.options;\n                var handleWidth = options.handle.width;\n                var borderOffset = column.offset().left + (options.rtl ? 0 : outerWidth(column));\n                var mousePosition = e.clientX + $(column[0].ownerDocument).scrollLeft();\n                if (mousePosition > borderOffset - handleWidth && mousePosition < borderOffset + handleWidth) {\n                    return true;\n                } else {\n                    return false;\n                }\n            },\n            setResizeHandlePosition: function (column) {\n                var that = this;\n                var tableBody = $(that.element).children(TBODY);\n                var options = that.options;\n                var rtl = options.rtl;\n                var handleWidth = options.handle.width;\n                var rootElement = $(options.rootElement);\n                var scrollTopOffset = rootElement.is(BODY) ? 0 : rootElement.scrollTop();\n                var scrollLeftOffset = rootElement.is(BODY) ? 0 : rootElement.scrollLeft();\n                var columnWidthOffset = rtl ? 0 : outerWidth(column);\n                var scrollBarWidth = rtl ? getScrollBarWidth(rootElement[0]) : 0;\n                that.resizeHandle.css({\n                    top: tableBody.position().top + scrollTopOffset,\n                    left: column.position().left + columnWidthOffset + (scrollLeftOffset - scrollBarWidth) - handleWidth / 2,\n                    position: 'absolute'\n                });\n            },\n            setResizeHandleDimensions: function () {\n                var that = this;\n                var tableBody = $(that.element).children(TBODY);\n                that.resizeHandle.css({\n                    width: that.options.handle.width,\n                    height: tableBody.height()\n                });\n            },\n            setResizeHandleDragPosition: function (e) {\n                var that = this;\n                var column = $($(e.currentTarget).data(that.options.handle.dataAttribute));\n                var options = that.options;\n                var handleWidth = options.handle ? options.handle.width : 0;\n                var min = options.min;\n                var rtl = options.rtl;\n                var columnWidth = outerWidth(column);\n                var columnLeftOffset = column.position().left;\n                var adjacentColumnWidth = outerWidth(column.next());\n                var resizeHandle = $(that.resizeHandle);\n                var rootElement = $(options.rootElement);\n                var scrollLeftOffset = rootElement.is(BODY) ? 0 : rootElement.scrollLeft();\n                var scrollBarWidth = rtl ? getScrollBarWidth(rootElement[0]) : 0;\n                var handleOffset = constrain({\n                    value: resizeHandle.position().left + (scrollLeftOffset - scrollBarWidth) + e.x.delta,\n                    min: columnLeftOffset + (scrollLeftOffset - scrollBarWidth) - (rtl ? adjacentColumnWidth : 0) + min,\n                    max: columnLeftOffset + columnWidth + (scrollLeftOffset - scrollBarWidth) + (rtl ? 0 : adjacentColumnWidth) - handleWidth - min\n                });\n                resizeHandle.css({ left: handleOffset });\n            },\n            resize: function (e) {\n                var that = this;\n                var column = $($(e.currentTarget).data(that.options.handle.dataAttribute));\n                var options = that.options;\n                var rtlModifier = options.rtl ? -1 : 1;\n                var min = options.min;\n                var initialDeltaX = rtlModifier * e.x.initialDelta;\n                var newWidth;\n                var initialAdjacentColumnWidth;\n                var initialColumnWidth;\n                that._setTableComputedWidth();\n                that._setColumnsComputedWidth();\n                initialColumnWidth = outerWidth(column);\n                initialAdjacentColumnWidth = outerWidth(column.next());\n                newWidth = constrain({\n                    value: initialColumnWidth + initialDeltaX,\n                    min: min,\n                    max: initialColumnWidth + initialAdjacentColumnWidth - min\n                });\n                that._resizeColumn(column[0], newWidth);\n                that._resizeTopAndBottomColumns(column[0], newWidth);\n                that._resizeAdjacentColumns(column.index(), initialAdjacentColumnWidth, initialColumnWidth, initialColumnWidth - newWidth);\n            },\n            _setTableComputedWidth: function () {\n                var element = this.element;\n                if (element.style[WIDTH] === '') {\n                    element.style[WIDTH] = toPixels(outerWidth($(element)));\n                }\n            },\n            _setColumnsComputedWidth: function () {\n                var that = this;\n                var tableBody = $(that.element).children(TBODY);\n                var tableBodyWidth = outerWidth(tableBody);\n                var columns = tableBody.children(TR).children(TD);\n                var length = columns.length;\n                var currentColumnsWidths = columns.map(function () {\n                    return outerWidth($(this));\n                });\n                var i;\n                for (i = 0; i < length; i++) {\n                    if (inPercentages(columns[i].style[WIDTH])) {\n                        columns[i].style[WIDTH] = toPercentages(calculatePercentageRatio(currentColumnsWidths[i], tableBodyWidth));\n                    } else {\n                        columns[i].style[WIDTH] = toPixels(currentColumnsWidths[i]);\n                    }\n                }\n            },\n            _resizeTopAndBottomColumns: function (column, newWidth) {\n                var that = this;\n                var columnIndex = $(column).index();\n                var topAndBottomColumns = $(that.element).children(TBODY).children(TR).children(that.options.tags.join(COMMA)).filter(function () {\n                    var cell = this;\n                    return $(cell).index() === columnIndex && cell !== column;\n                });\n                var length = topAndBottomColumns.length;\n                var i;\n                for (i = 0; i < length; i++) {\n                    that._resizeColumn(topAndBottomColumns[i], newWidth);\n                }\n            },\n            _resizeColumn: function (column, newWidth) {\n                if (inPercentages(column.style[WIDTH])) {\n                    column.style[WIDTH] = toPercentages(calculatePercentageRatio(newWidth, outerWidth($(this.element).children(TBODY))));\n                } else {\n                    column.style[WIDTH] = toPixels(newWidth);\n                }\n            },\n            _resizeAdjacentColumns: function (columnIndex, initialAdjacentColumnWidth, initialColumnWidth, deltaWidth) {\n                var that = this;\n                var adjacentColumns = $(that.element).children(TBODY).children(TR).children(that.options.tags.join(COMMA)).filter(function () {\n                    return $(this).index() === columnIndex + 1;\n                });\n                var length = adjacentColumns.length;\n                var i;\n                for (i = 0; i < length; i++) {\n                    that._resizeAdjacentColumn(adjacentColumns[i], initialAdjacentColumnWidth, initialColumnWidth, deltaWidth);\n                }\n            },\n            _resizeAdjacentColumn: function (adjacentColumn, initialAdjacentColumnWidth, initialColumnWidth, deltaWidth) {\n                var that = this;\n                var min = that.options.min;\n                var newWidth;\n                newWidth = constrain({\n                    value: initialAdjacentColumnWidth + deltaWidth,\n                    min: min,\n                    max: abs(initialColumnWidth + initialAdjacentColumnWidth - min)\n                });\n                that._resizeColumn(adjacentColumn, newWidth);\n            }\n        });\n        ColumnResizing.create = function (editor) {\n            TableElementResizing.create(editor, {\n                name: 'columnResizing',\n                type: ColumnResizing,\n                eventNamespace: NS\n            });\n        };\n        ColumnResizing.dispose = function (editor) {\n            TableElementResizing.dispose(editor, { eventNamespace: NS });\n        };\n        extend(Editor, { ColumnResizing: ColumnResizing });\n    }(window.kendo));\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('editor/resizing/row-resizing', [\n        'editor/main',\n        'editor/resizing/resizing-utils',\n        'editor/resizing/table-element-resizing'\n    ], f);\n}(function () {\n    (function (kendo, undefined) {\n        var math = window.Math;\n        var abs = math.abs;\n        var $ = kendo.jQuery;\n        var extend = $.extend;\n        var Editor = kendo.ui.editor;\n        var TableElementResizing = Editor.TableElementResizing;\n        var ResizingUtils = Editor.ResizingUtils;\n        var getScrollBarWidth = ResizingUtils.getScrollBarWidth;\n        var constrain = ResizingUtils.constrain;\n        var calculatePercentageRatio = ResizingUtils.calculatePercentageRatio;\n        var inPercentages = ResizingUtils.inPercentages;\n        var toPercentages = ResizingUtils.toPercentages;\n        var toPixels = ResizingUtils.toPixels;\n        var outerHeight = kendo._outerHeight;\n        var NS = '.kendoEditorRowResizing';\n        var RESIZE_HANDLE_CLASS = 'k-row-resize-handle';\n        var RESIZE_HANDLE_MARKER_WRAPPER_CLASS = 'k-row-resize-marker-wrapper';\n        var RESIZE_MARKER_CLASS = 'k-row-resize-marker';\n        var BODY = 'body';\n        var TR = 'tr';\n        var TBODY = 'tbody';\n        var HEIGHT = 'height';\n        var RowResizing = TableElementResizing.extend({\n            options: {\n                tags: [TR],\n                min: 20,\n                rootElement: null,\n                eventNamespace: NS,\n                rtl: false,\n                handle: {\n                    dataAttribute: 'row',\n                    width: 0,\n                    height: 10,\n                    classNames: {\n                        handle: RESIZE_HANDLE_CLASS,\n                        marker: RESIZE_MARKER_CLASS\n                    },\n                    template: '<div class=\"k-row-resize-handle-wrapper\" unselectable=\"on\" contenteditable=\"false\">' + '<div class=\"' + RESIZE_HANDLE_CLASS + '\">' + '<div class=\"' + RESIZE_HANDLE_MARKER_WRAPPER_CLASS + '\">' + '<div class=\"' + RESIZE_MARKER_CLASS + '\"></div>' + '</div>' + '</div>' + '</div>'\n                }\n            },\n            elementBorderHovered: function (tableElement, e) {\n                var that = this;\n                var handleHeight = that.options.handle[HEIGHT];\n                var borderOffset = tableElement.offset().top + outerHeight(tableElement);\n                var mousePosition = e.clientY + $(tableElement[0].ownerDocument).scrollTop();\n                if (mousePosition > borderOffset - handleHeight && mousePosition < borderOffset + handleHeight) {\n                    return true;\n                } else {\n                    return false;\n                }\n            },\n            setResizeHandlePosition: function (row) {\n                var that = this;\n                var options = that.options;\n                var handleHeight = options.handle[HEIGHT];\n                var rowPosition = row.position();\n                var rootElement = $(options.rootElement);\n                var scrollTopOffset = rootElement.is(BODY) ? 0 : rootElement.scrollTop();\n                var scrollLeftOffset = rootElement.is(BODY) ? 0 : rootElement.scrollLeft();\n                var scrollBarWidth = options.rtl ? getScrollBarWidth(rootElement[0]) : 0;\n                that.resizeHandle.css({\n                    top: rowPosition.top + outerHeight(row) + scrollTopOffset - handleHeight / 2,\n                    left: rowPosition.left + (scrollLeftOffset - scrollBarWidth),\n                    position: 'absolute'\n                });\n            },\n            setResizeHandleDimensions: function () {\n                var that = this;\n                that.resizeHandle.css({\n                    width: $(that.element).children(TBODY).width(),\n                    height: that.options.handle[HEIGHT]\n                });\n            },\n            setResizeHandleDragPosition: function (e) {\n                var that = this;\n                var options = that.options;\n                var min = options.min;\n                var tableBody = $(that.element).children(TBODY);\n                var tableBodyTopOffset = tableBody.position().top;\n                var resizeHandle = $(that.resizeHandle);\n                var row = $(e.currentTarget).data(options.handle.dataAttribute);\n                var rootElement = $(options.rootElement);\n                var scrollTopOffset = rootElement.is(BODY) ? 0 : rootElement.scrollTop();\n                var handleOffset = constrain({\n                    value: resizeHandle.position().top + scrollTopOffset + e.y.delta,\n                    min: $(row).position().top + scrollTopOffset + min,\n                    max: tableBodyTopOffset + outerHeight(tableBody) + scrollTopOffset - options.handle[HEIGHT] - min\n                });\n                resizeHandle.css({ top: handleOffset });\n            },\n            resize: function (e) {\n                var that = this;\n                var options = that.options;\n                var row = $(e.currentTarget).data(options.handle.dataAttribute);\n                var currentRowHeight = outerHeight($(row));\n                var element = $(that.element);\n                var initialTableHeight = outerHeight(element);\n                var tableBody = element.children(TBODY);\n                var tableBodyHeight = tableBody.height();\n                var initialStyleHeight = row.style[HEIGHT];\n                var newRowHeight = constrain({\n                    value: currentRowHeight + e.y.initialDelta,\n                    min: options.min,\n                    max: abs(tableBodyHeight - options.min)\n                });\n                that._setRowsHeightInPixels();\n                row.style[HEIGHT] = toPixels(newRowHeight);\n                that._setTableHeight(initialTableHeight + (newRowHeight - currentRowHeight));\n                if (inPercentages(initialStyleHeight)) {\n                    that._setRowsHeightInPercentages();\n                }\n            },\n            _setRowsHeightInPixels: function () {\n                var that = this;\n                var rows = $(that.element).children(TBODY).children(TR);\n                var length = rows.length;\n                var currentRowsHeights = rows.map(function () {\n                    return outerHeight($(this));\n                });\n                var i;\n                for (i = 0; i < length; i++) {\n                    rows[i].style[HEIGHT] = toPixels(currentRowsHeights[i]);\n                }\n            },\n            _setRowsHeightInPercentages: function () {\n                var that = this;\n                var tableBody = $(that.element).children(TBODY);\n                var tableBodyHeight = tableBody.height();\n                var rows = tableBody.children(TR);\n                var length = rows.length;\n                var currentRowsHeights = rows.map(function () {\n                    return outerHeight($(this));\n                });\n                var i;\n                for (i = 0; i < length; i++) {\n                    rows[i].style[HEIGHT] = toPercentages(calculatePercentageRatio(currentRowsHeights[i], tableBodyHeight));\n                }\n            },\n            _setTableHeight: function (newHeight) {\n                var element = this.element;\n                if (inPercentages(element.style[HEIGHT])) {\n                    element.style[HEIGHT] = toPercentages(calculatePercentageRatio(newHeight, $(element).parent().height()));\n                } else {\n                    element.style[HEIGHT] = toPixels(newHeight);\n                }\n            }\n        });\n        RowResizing.create = function (editor) {\n            TableElementResizing.create(editor, {\n                name: 'rowResizing',\n                type: RowResizing,\n                eventNamespace: NS\n            });\n        };\n        RowResizing.dispose = function (editor) {\n            TableElementResizing.dispose(editor, { eventNamespace: NS });\n        };\n        extend(Editor, { RowResizing: RowResizing });\n    }(window.kendo));\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('editor/resizing/table-resize-handle', [\n        'editor/main',\n        'kendo.draganddrop',\n        'editor/resizing/resizing-utils'\n    ], f);\n}(function () {\n    (function (kendo, undefined) {\n        var $ = kendo.jQuery;\n        var extend = $.extend;\n        var noop = $.noop;\n        var proxy = $.proxy;\n        var Editor = kendo.ui.editor;\n        var Class = kendo.Class;\n        var Draggable = kendo.ui.Draggable;\n        var Observable = kendo.Observable;\n        var getScrollBarWidth = Editor.ResizingUtils.getScrollBarWidth;\n        var outerWidth = kendo._outerWidth;\n        var outerHeight = kendo._outerHeight;\n        var NS = '.kendoEditorTableResizeHandle';\n        var RESIZE_HANDLE_CLASS = 'k-table-resize-handle';\n        var DRAG_START = 'dragStart';\n        var DRAG = 'drag';\n        var DRAG_END = 'dragEnd';\n        var HALF_INSIDE = 'halfInside';\n        var MOUSE_OVER = 'mouseover';\n        var MOUSE_OUT = 'mouseout';\n        var BODY = 'body';\n        var TABLE = 'table';\n        var EAST = 'east';\n        var NORTH = 'north';\n        var NORTHEAST = 'northeast';\n        var NORTHWEST = 'northwest';\n        var SOUTH = 'south';\n        var SOUTHEAST = 'southeast';\n        var SOUTHWEST = 'southwest';\n        var WEST = 'west';\n        var DOT = '.';\n        var TableResizeHandle = Observable.extend({\n            init: function (options) {\n                var that = this;\n                Observable.fn.init.call(that);\n                that.options = extend({}, that.options, options);\n                that.element = $(that.options.template).appendTo(that.options.appendTo)[0];\n                that._attachEventHandlers();\n                that._addStyles();\n                that._initDraggable();\n                that._initPositioningStrategy();\n                that._initDraggingStrategy();\n                $(that.element).data(TABLE, that.options.resizableElement);\n            },\n            destroy: function () {\n                var that = this;\n                $(that.element).off(NS).remove();\n                that.element = null;\n                that._destroyDraggable();\n                that.unbind();\n            },\n            options: {\n                appendTo: null,\n                direction: SOUTHEAST,\n                resizableElement: null,\n                rtl: false,\n                template: '<div class=\\'k-table-resize-handle-wrapper\\' unselectable=\\'on\\' contenteditable=\\'false\\'>' + '<div class=\\'' + RESIZE_HANDLE_CLASS + '\\'></div>' + '</div>'\n            },\n            events: [\n                DRAG_START,\n                DRAG,\n                DRAG_END,\n                MOUSE_OVER,\n                MOUSE_OUT\n            ],\n            show: function () {\n                this._setPosition();\n            },\n            _setPosition: function () {\n                var that = this;\n                var position = that._positioningStrategy.getPosition();\n                $(that.element).css({\n                    top: position.top,\n                    left: position.left,\n                    position: 'absolute'\n                });\n            },\n            _attachEventHandlers: function () {\n                var that = this;\n                $(that.element).on(MOUSE_OVER + NS, proxy(that._onMouseOver, that)).on(MOUSE_OUT + NS, proxy(that._onMouseOut, that));\n            },\n            _onMouseOver: function () {\n                this.trigger(MOUSE_OVER);\n            },\n            _onMouseOut: function () {\n                this.trigger(MOUSE_OUT);\n            },\n            _addStyles: function () {\n                var that = this;\n                $(that.element).children(DOT + RESIZE_HANDLE_CLASS).addClass('k-resize-' + that.options.direction);\n            },\n            _initPositioningStrategy: function () {\n                var that = this;\n                var options = that.options;\n                that._positioningStrategy = HandlePositioningStrategy.create({\n                    name: options.direction,\n                    handle: that.element,\n                    resizableElement: options.resizableElement,\n                    rootElement: options.rootElement,\n                    rtl: options.rtl\n                });\n            },\n            _initDraggable: function () {\n                var that = this;\n                var element = that.element;\n                if (that._draggable || !element) {\n                    return;\n                }\n                that._draggable = new Draggable(element, {\n                    dragstart: proxy(that._onDragStart, that),\n                    drag: proxy(that._onDrag, that),\n                    dragend: proxy(that._onDragEnd, that)\n                });\n            },\n            _onDragStart: function () {\n                this.trigger(DRAG_START);\n            },\n            _onDrag: function (e) {\n                var that = this;\n                that.trigger(DRAG, that._draggingStrategy.adjustDragDelta({\n                    deltaX: e.x.delta,\n                    deltaY: e.y.delta,\n                    initialDeltaX: e.x.initialDelta,\n                    initialDeltaY: e.y.initialDelta\n                }));\n            },\n            _onDragEnd: function () {\n                this.trigger(DRAG_END);\n            },\n            _destroyDraggable: function () {\n                var that = this;\n                if (that._draggable) {\n                    that._draggable.destroy();\n                    that._draggable = null;\n                }\n            },\n            _initDraggingStrategy: function () {\n                var that = this;\n                that._draggingStrategy = HandleDraggingStrategy.create({ name: that.options.direction });\n            }\n        });\n        var StrategyFactory = Class.extend({\n            init: function () {\n                this._items = [];\n            },\n            register: function (name, type) {\n                this._items.push({\n                    name: name,\n                    type: type\n                });\n            },\n            create: function (options) {\n                var items = this._items;\n                var itemsLength = items.length;\n                var name = options.name ? options.name.toLowerCase() : '';\n                var match;\n                var item;\n                var i;\n                for (i = 0; i < itemsLength; i++) {\n                    item = items[i];\n                    if (item.name.toLowerCase() === name) {\n                        match = item;\n                        break;\n                    }\n                }\n                if (match) {\n                    return new match.type(options);\n                }\n            }\n        });\n        var PositioningStrategyFactory = StrategyFactory.extend({});\n        PositioningStrategyFactory.current = new PositioningStrategyFactory();\n        var HandlePositioningStrategy = Class.extend({\n            init: function (options) {\n                var that = this;\n                that.options = extend({}, that.options, options);\n            },\n            options: {\n                handle: null,\n                offset: HALF_INSIDE,\n                resizableElement: null,\n                rootElement: null,\n                rtl: false\n            },\n            getPosition: function () {\n                var that = this;\n                var position = that.calculatePosition();\n                var handleOffsetPosition = that.applyHandleOffset(position);\n                var scrollOffsetPosition = that.applyScrollOffset(handleOffsetPosition);\n                return scrollOffsetPosition;\n            },\n            calculatePosition: noop,\n            applyHandleOffset: function (position) {\n                var options = this.options;\n                var handle = $(options.handle);\n                if (options.offset === HALF_INSIDE) {\n                    return {\n                        top: position.top - outerHeight(handle) / 2,\n                        left: position.left - outerWidth(handle) / 2\n                    };\n                }\n                return position;\n            },\n            applyScrollOffset: function (position) {\n                var options = this.options;\n                var rootElement = $(options.rootElement);\n                var scrollBarWidth = options.rtl ? getScrollBarWidth(rootElement[0]) : 0;\n                if (!rootElement.is(BODY)) {\n                    return {\n                        top: position.top + (rootElement.scrollTop() || 0),\n                        left: position.left + (rootElement.scrollLeft() || 0) - scrollBarWidth\n                    };\n                }\n                return position;\n            }\n        });\n        HandlePositioningStrategy.create = function (options) {\n            return PositioningStrategyFactory.current.create(options);\n        };\n        var EastPositioningStrategy = HandlePositioningStrategy.extend({\n            calculatePosition: function () {\n                var resizableElement = $(this.options.resizableElement);\n                var offset = resizableElement.position();\n                return {\n                    top: offset.top + outerHeight(resizableElement) / 2,\n                    left: offset.left + outerWidth(resizableElement)\n                };\n            }\n        });\n        PositioningStrategyFactory.current.register(EAST, EastPositioningStrategy);\n        var NorthPositioningStrategy = HandlePositioningStrategy.extend({\n            calculatePosition: function () {\n                var resizableElement = $(this.options.resizableElement);\n                var offset = resizableElement.position();\n                return {\n                    top: offset.top,\n                    left: offset.left + outerWidth(resizableElement) / 2\n                };\n            }\n        });\n        PositioningStrategyFactory.current.register(NORTH, NorthPositioningStrategy);\n        var NortheastPositioningStrategy = HandlePositioningStrategy.extend({\n            calculatePosition: function () {\n                var resizableElement = $(this.options.resizableElement);\n                var offset = resizableElement.position();\n                return {\n                    top: offset.top,\n                    left: offset.left + outerWidth(resizableElement)\n                };\n            }\n        });\n        PositioningStrategyFactory.current.register(NORTHEAST, NortheastPositioningStrategy);\n        var NorthwestPositioningStrategy = HandlePositioningStrategy.extend({\n            calculatePosition: function () {\n                var resizableElement = $(this.options.resizableElement);\n                var offset = resizableElement.position();\n                return {\n                    top: offset.top,\n                    left: offset.left\n                };\n            }\n        });\n        PositioningStrategyFactory.current.register(NORTHWEST, NorthwestPositioningStrategy);\n        var SouthPositioningStrategy = HandlePositioningStrategy.extend({\n            calculatePosition: function () {\n                var resizableElement = $(this.options.resizableElement);\n                var offset = resizableElement.position();\n                return {\n                    top: offset.top + outerHeight(resizableElement),\n                    left: offset.left + outerWidth(resizableElement) / 2\n                };\n            }\n        });\n        PositioningStrategyFactory.current.register(SOUTH, SouthPositioningStrategy);\n        var SoutheastPositioningStrategy = HandlePositioningStrategy.extend({\n            calculatePosition: function () {\n                var resizableElement = $(this.options.resizableElement);\n                var offset = resizableElement.position();\n                return {\n                    top: offset.top + outerHeight(resizableElement),\n                    left: offset.left + outerWidth(resizableElement)\n                };\n            }\n        });\n        PositioningStrategyFactory.current.register(SOUTHEAST, SoutheastPositioningStrategy);\n        var SouthwestPositioningStrategy = HandlePositioningStrategy.extend({\n            calculatePosition: function () {\n                var resizableElement = $(this.options.resizableElement);\n                var offset = resizableElement.position();\n                return {\n                    top: offset.top + outerHeight(resizableElement),\n                    left: offset.left\n                };\n            }\n        });\n        PositioningStrategyFactory.current.register(SOUTHWEST, SouthwestPositioningStrategy);\n        var WestPositioningStrategy = HandlePositioningStrategy.extend({\n            calculatePosition: function () {\n                var resizableElement = $(this.options.resizableElement);\n                var offset = resizableElement.position();\n                return {\n                    top: offset.top + outerHeight(resizableElement) / 2,\n                    left: offset.left\n                };\n            }\n        });\n        PositioningStrategyFactory.current.register(WEST, WestPositioningStrategy);\n        var DraggingStrategyFactory = StrategyFactory.extend({});\n        DraggingStrategyFactory.current = new DraggingStrategyFactory();\n        var HandleDraggingStrategy = Class.extend({\n            init: function (options) {\n                var that = this;\n                that.options = extend({}, that.options, options);\n            },\n            options: {\n                deltaX: {\n                    adjustment: null,\n                    modifier: null\n                },\n                deltaY: {\n                    adjustment: null,\n                    modifier: null\n                }\n            },\n            adjustDragDelta: function (deltas) {\n                var options = this.options;\n                var xAxisAdjustment = options.deltaX.adjustment * options.deltaX.modifier;\n                var yAxisAdjustment = options.deltaY.adjustment * options.deltaY.modifier;\n                return {\n                    deltaX: deltas.deltaX * xAxisAdjustment,\n                    deltaY: deltas.deltaY * yAxisAdjustment,\n                    initialDeltaX: deltas.initialDeltaX * xAxisAdjustment,\n                    initialDeltaY: deltas.initialDeltaY * yAxisAdjustment\n                };\n            }\n        });\n        HandleDraggingStrategy.create = function (options) {\n            return DraggingStrategyFactory.current.create(options);\n        };\n        var HorizontalDraggingStrategy = HandleDraggingStrategy.extend({\n            options: {\n                deltaX: {\n                    adjustment: 1,\n                    modifier: 1\n                },\n                deltaY: {\n                    adjustment: 0,\n                    modifier: 0\n                }\n            }\n        });\n        var EastDraggingStrategy = HorizontalDraggingStrategy.extend({ options: { deltaX: { modifier: 1 } } });\n        DraggingStrategyFactory.current.register(EAST, EastDraggingStrategy);\n        var WestDraggingStrategy = HorizontalDraggingStrategy.extend({ options: { deltaX: { modifier: -1 } } });\n        DraggingStrategyFactory.current.register(WEST, WestDraggingStrategy);\n        var VerticalDraggingStrategy = HandleDraggingStrategy.extend({\n            options: {\n                deltaX: {\n                    adjustment: 0,\n                    modifier: 0\n                },\n                deltaY: {\n                    adjustment: 1,\n                    modifier: 1\n                }\n            }\n        });\n        var NorthDraggingStrategy = VerticalDraggingStrategy.extend({ options: { deltaY: { modifier: -1 } } });\n        DraggingStrategyFactory.current.register(NORTH, NorthDraggingStrategy);\n        var SouthDraggingStrategy = VerticalDraggingStrategy.extend({ options: { deltaY: { modifier: 1 } } });\n        DraggingStrategyFactory.current.register(SOUTH, SouthDraggingStrategy);\n        var HorizontalAndVerticalDraggingStrategy = HandleDraggingStrategy.extend({\n            options: {\n                deltaX: {\n                    adjustment: 1,\n                    modifier: 1\n                },\n                deltaY: {\n                    adjustment: 1,\n                    modifier: 1\n                }\n            }\n        });\n        var NorthEastDraggingStrategy = HorizontalAndVerticalDraggingStrategy.extend({\n            options: {\n                deltaX: { modifier: 1 },\n                deltaY: { modifier: -1 }\n            }\n        });\n        DraggingStrategyFactory.current.register(NORTHEAST, NorthEastDraggingStrategy);\n        var NorthWestDraggingStrategy = HorizontalAndVerticalDraggingStrategy.extend({\n            options: {\n                deltaX: { modifier: -1 },\n                deltaY: { modifier: -1 }\n            }\n        });\n        DraggingStrategyFactory.current.register(NORTHWEST, NorthWestDraggingStrategy);\n        var SouthEastDraggingStrategy = HorizontalAndVerticalDraggingStrategy.extend({\n            options: {\n                deltaX: { modifier: 1 },\n                deltaY: { modifier: 1 }\n            }\n        });\n        DraggingStrategyFactory.current.register(SOUTHEAST, SouthEastDraggingStrategy);\n        var SouthWestDraggingStrategy = HorizontalAndVerticalDraggingStrategy.extend({\n            options: {\n                deltaX: { modifier: -1 },\n                deltaY: { modifier: 1 }\n            }\n        });\n        DraggingStrategyFactory.current.register(SOUTHWEST, SouthWestDraggingStrategy);\n        extend(Editor, { TableResizeHandle: TableResizeHandle });\n    }(window.kendo));\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('editor/resizing/table-resizing', [\n        'editor/main',\n        'editor/resizing/table-resize-handle',\n        'editor/resizing/resizing-utils'\n    ], f);\n}(function () {\n    (function (kendo, undefined) {\n        var global = window;\n        var math = global.Math;\n        var min = math.min;\n        var max = math.max;\n        var $ = kendo.jQuery;\n        var contains = $.contains;\n        var extend = $.extend;\n        var proxy = $.proxy;\n        var browser = kendo.support.browser;\n        var Editor = kendo.ui.editor;\n        var Class = kendo.Class;\n        var TableResizeHandle = Editor.TableResizeHandle;\n        var ResizingUtils = Editor.ResizingUtils;\n        var calculatePercentageRatio = ResizingUtils.calculatePercentageRatio;\n        var constrain = ResizingUtils.constrain;\n        var inPercentages = ResizingUtils.inPercentages;\n        var inPixels = ResizingUtils.inPixels;\n        var toPercentages = ResizingUtils.toPercentages;\n        var toPixels = ResizingUtils.toPixels;\n        var outerWidth = kendo._outerWidth;\n        var outerHeight = kendo._outerHeight;\n        var NS = '.kendoEditorTableResizing';\n        var RESIZE_HANDLE_WRAPPER_CLASS = 'k-table-resize-handle-wrapper';\n        var TABLE_CLASS = 'k-table';\n        var TABLE_RESIZING_CLASS = 'k-table-resizing';\n        var DRAG_START = 'dragStart';\n        var DRAG = 'drag';\n        var DRAG_END = 'dragEnd';\n        var KEY_DOWN = 'keydown';\n        var MOUSE_DOWN = 'mousedown';\n        var MOUSE_OVER = 'mouseover';\n        var MOUSE_OUT = 'mouseout';\n        var COLUMN = 'td';\n        var ROW = 'tr';\n        var TBODY = 'tbody';\n        var TABLE = 'table';\n        var WIDTH = 'width';\n        var HEIGHT = 'height';\n        var EAST = 'east';\n        var NORTH = 'north';\n        var NORTHEAST = 'northeast';\n        var NORTHWEST = 'northwest';\n        var SOUTH = 'south';\n        var SOUTHEAST = 'southeast';\n        var SOUTHWEST = 'southwest';\n        var WEST = 'west';\n        var DOT = '.';\n        function isUndefined(value) {\n            return typeof value === 'undefined';\n        }\n        var TableResizing = Class.extend({\n            init: function (element, options) {\n                var that = this;\n                that.options = extend({}, that.options, options);\n                that.handles = [];\n                if ($(element).is(TABLE)) {\n                    that.element = element;\n                }\n            },\n            destroy: function () {\n                var that = this;\n                $(that.element).off(NS);\n                that.element = null;\n                $(that.options.rootElement).off(KEY_DOWN + NS);\n                that._destroyResizeHandles();\n            },\n            options: {\n                appendHandlesTo: null,\n                rtl: false,\n                rootElement: null,\n                minWidth: 10,\n                minHeight: 10,\n                handles: [\n                    { direction: NORTHWEST },\n                    { direction: NORTH },\n                    { direction: NORTHEAST },\n                    { direction: EAST },\n                    { direction: SOUTHEAST },\n                    { direction: SOUTH },\n                    { direction: SOUTHWEST },\n                    { direction: WEST }\n                ]\n            },\n            resize: function (args) {\n                var that = this;\n                var deltas = extend({}, {\n                    deltaX: 0,\n                    deltaY: 0,\n                    initialDeltaX: 0,\n                    initialDeltaY: 0\n                }, args);\n                that._resizeWidth(deltas.deltaX, deltas.initialDeltaX);\n                that._resizeHeight(deltas.deltaY, deltas.initialDeltaY);\n                that.showResizeHandles();\n            },\n            _resizeWidth: function (delta, initialDelta) {\n                var that = this;\n                var element = $(that.element);\n                var styleWidth = element[0].style[WIDTH];\n                var currentWidth = outerWidth(element);\n                var parentWidth = element.parent().width();\n                var maxWidth = that._getMaxDimensionValue(WIDTH);\n                var newWidth;\n                var ratioValue;\n                var ratioTotalValue;\n                var constrainedWidth;\n                if (delta === 0) {\n                    return;\n                }\n                if (isUndefined(that._initialElementWidth)) {\n                    that._initialElementWidth = currentWidth;\n                }\n                constrainedWidth = constrain({\n                    value: that._initialElementWidth + initialDelta,\n                    min: that.options.minWidth,\n                    max: maxWidth\n                });\n                if (inPercentages(styleWidth)) {\n                    if (currentWidth + delta > parentWidth) {\n                        ratioValue = max(constrainedWidth, parentWidth);\n                        ratioTotalValue = min(constrainedWidth, parentWidth);\n                    } else {\n                        ratioValue = min(constrainedWidth, parentWidth);\n                        ratioTotalValue = max(constrainedWidth, parentWidth);\n                    }\n                    newWidth = toPercentages(calculatePercentageRatio(ratioValue, ratioTotalValue));\n                } else {\n                    newWidth = toPixels(constrainedWidth);\n                }\n                that._setColumnsWidth();\n                element[0].style[WIDTH] = newWidth;\n            },\n            _resizeHeight: function (delta, initialDelta) {\n                var that = this;\n                var element = $(that.element);\n                var styleHeight = element[0].style[HEIGHT];\n                var currentHeight = outerHeight(element);\n                var parent = element.parent();\n                var parentHeight = parent.height();\n                var maxHeight = that._getMaxDimensionValue(HEIGHT);\n                var newHeight;\n                var ratioValue;\n                var ratioTotalValue;\n                var constrainedHeight;\n                var minHeight = that.options.minHeight;\n                var hasRowsInPixels = that._hasRowsInPixels();\n                if (delta === 0) {\n                    return;\n                }\n                if (isUndefined(that._initialElementHeight)) {\n                    that._initialElementHeight = currentHeight;\n                }\n                constrainedHeight = constrain({\n                    value: that._initialElementHeight + initialDelta,\n                    min: minHeight,\n                    max: maxHeight\n                });\n                if (hasRowsInPixels && delta < 0) {\n                    that._setRowsHeightInPercentages();\n                }\n                if (inPercentages(styleHeight)) {\n                    if (currentHeight + delta > parentHeight) {\n                        ratioValue = max(constrainedHeight, parentHeight);\n                        ratioTotalValue = min(constrainedHeight, parentHeight);\n                    } else {\n                        ratioValue = min(constrainedHeight, parentHeight);\n                        ratioTotalValue = max(constrainedHeight, parentHeight);\n                    }\n                    newHeight = toPercentages(calculatePercentageRatio(ratioValue, ratioTotalValue));\n                } else {\n                    newHeight = toPixels(constrainedHeight);\n                }\n                element[0].style[HEIGHT] = newHeight;\n                if (hasRowsInPixels && delta < 0) {\n                    that._setRowsHeightInPixels();\n                }\n            },\n            _getMaxDimensionValue: function (dimension) {\n                var that = this;\n                var element = $(that.element);\n                var dimensionLowercase = dimension.toLowerCase();\n                var rtlModifier = that.options.rtl ? -1 : 1;\n                var parent = $(that.element).parent();\n                var parentElement = parent[0];\n                var parentDimension = parent[dimensionLowercase]();\n                var parentScrollOffset = rtlModifier * (dimension === WIDTH ? parent.scrollLeft() : parent.scrollTop());\n                if (parentElement === element.closest(COLUMN)[0]) {\n                    if (parentElement.style[dimensionLowercase] === '' && !inPercentages(that.element.style[dimensionLowercase])) {\n                        return Infinity;\n                    } else {\n                        return parentDimension + parentScrollOffset;\n                    }\n                } else {\n                    return parentDimension + parentScrollOffset;\n                }\n            },\n            _setColumnsWidth: function () {\n                var that = this;\n                var element = $(that.element);\n                var parentElement = element.parent()[0];\n                var parentColumn = element.closest(COLUMN);\n                var columns = parentColumn.closest(ROW).children();\n                var columnsLength = columns.length;\n                var i;\n                function isWidthInPercentages(element) {\n                    var styleWidth = element.style.width;\n                    if (styleWidth !== '') {\n                        return inPercentages(styleWidth) ? true : false;\n                    } else {\n                        return $(element).hasClass(TABLE_CLASS) ? true : false;\n                    }\n                }\n                if (isWidthInPercentages(element[0]) && parentElement === parentColumn[0] && parentElement.style[WIDTH] === '') {\n                    for (i = 0; i < columnsLength; i++) {\n                        columns[i].style[WIDTH] = toPixels($(columns[i]).width());\n                    }\n                }\n            },\n            _hasRowsInPixels: function () {\n                var that = this;\n                var rows = $(that.element).children(TBODY).children(ROW);\n                for (var i = 0; i < rows.length; i++) {\n                    if (rows[i].style.height === '' || inPixels(rows[i].style.height)) {\n                        return true;\n                    }\n                }\n                return false;\n            },\n            _setRowsHeightInPercentages: function () {\n                var that = this;\n                var tableBody = $(that.element).children(TBODY);\n                var tableBodyHeight = tableBody.height();\n                var rows = tableBody.children(ROW);\n                var length = rows.length;\n                var currentRowsHeights = rows.map(function () {\n                    return outerHeight($(this));\n                });\n                var i;\n                for (i = 0; i < length; i++) {\n                    rows[i].style[HEIGHT] = toPercentages(calculatePercentageRatio(currentRowsHeights[i], tableBodyHeight));\n                }\n            },\n            _setRowsHeightInPixels: function () {\n                var that = this;\n                var rows = $(that.element).children(TBODY).children(ROW);\n                var length = rows.length;\n                var currentRowsHeights = rows.map(function () {\n                    return outerHeight($(this));\n                });\n                var i;\n                for (i = 0; i < length; i++) {\n                    rows[i].style[HEIGHT] = toPixels(currentRowsHeights[i]);\n                }\n            },\n            showResizeHandles: function () {\n                var that = this;\n                that._initResizeHandles();\n                that._showResizeHandles();\n            },\n            _initResizeHandles: function () {\n                var that = this;\n                var handles = that.handles;\n                var options = that.options;\n                var handleOptions = that.options.handles;\n                var length = handleOptions.length;\n                var i;\n                if (handles && handles.length > 0) {\n                    return;\n                }\n                for (i = 0; i < length; i++) {\n                    that.handles.push(new TableResizeHandle(extend({\n                        appendTo: options.appendHandlesTo,\n                        resizableElement: that.element,\n                        rootElement: options.rootElement,\n                        rtl: options.rtl\n                    }, handleOptions[i])));\n                }\n                that._bindToResizeHandlesEvents();\n            },\n            _destroyResizeHandles: function () {\n                var that = this;\n                var length = that.handles ? that.handles.length : 0;\n                for (var i = 0; i < length; i++) {\n                    that.handles[i].destroy();\n                }\n            },\n            _showResizeHandles: function () {\n                var that = this;\n                var handles = that.handles || [];\n                var length = handles.length;\n                var i;\n                for (i = 0; i < length; i++) {\n                    that.handles[i].show();\n                }\n            },\n            _bindToResizeHandlesEvents: function () {\n                var that = this;\n                var handles = that.handles || [];\n                var length = handles.length;\n                var i;\n                var handle;\n                for (i = 0; i < length; i++) {\n                    handle = handles[i];\n                    handle.bind(DRAG_START, proxy(that._onResizeHandleDragStart, that));\n                    handle.bind(DRAG, proxy(that._onResizeHandleDrag, that));\n                    handle.bind(DRAG_END, proxy(that._onResizeHandleDragEnd, that));\n                    handle.bind(MOUSE_OVER, proxy(that._onResizeHandleMouseOver, that));\n                    handle.bind(MOUSE_OUT, proxy(that._onResizeHandleMouseOut, that));\n                }\n            },\n            _onResizeHandleDragStart: function () {\n                var that = this;\n                var element = $(that.element);\n                element.addClass(TABLE_RESIZING_CLASS);\n                that._initialElementHeight = outerHeight(element);\n                that._initialElementWidth = outerWidth(element);\n                that._disableKeyboard();\n            },\n            _onResizeHandleDrag: function (e) {\n                this.resize(e);\n            },\n            _onResizeHandleDragEnd: function () {\n                var that = this;\n                $(that.element).removeClass(TABLE_RESIZING_CLASS);\n                that._enableKeyboard();\n            },\n            _enableKeyboard: function () {\n                $(this.options.rootElement).off(KEY_DOWN + NS);\n            },\n            _disableKeyboard: function () {\n                $(this.options.rootElement).on(KEY_DOWN + NS, function (e) {\n                    e.preventDefault();\n                });\n            }\n        });\n        var TableResizingFactory = Class.extend({\n            create: function (editor) {\n                var factory = this;\n                $(editor.body).on(MOUSE_DOWN + NS, TABLE, function (e) {\n                    var eventTarget = e.target;\n                    var eventCurrentTarget = e.currentTarget;\n                    var tableResizing = editor.tableResizing;\n                    var element = tableResizing ? tableResizing.element : null;\n                    if (tableResizing) {\n                        if (element && eventCurrentTarget !== element) {\n                            if (contains(eventCurrentTarget, element) && element !== eventTarget && contains(element, eventTarget)) {\n                                return;\n                            } else {\n                                if (element !== eventTarget) {\n                                    editor._destroyTableResizing();\n                                    factory._initResizing(editor, eventCurrentTarget);\n                                }\n                            }\n                        }\n                    } else {\n                        factory._initResizing(editor, eventCurrentTarget);\n                    }\n                    editor._showTableResizeHandles();\n                }).on(MOUSE_DOWN + NS, function (e) {\n                    var tableResizing = editor.tableResizing;\n                    var element = tableResizing ? tableResizing.element : null;\n                    var target = e.target;\n                    var isResizeHandleOrChild = $(target).hasClass(RESIZE_HANDLE_WRAPPER_CLASS) || $(target).parents(DOT + RESIZE_HANDLE_WRAPPER_CLASS).length > 0;\n                    if (tableResizing && element !== target && !contains(element, target) && !isResizeHandleOrChild) {\n                        editor._destroyTableResizing();\n                    }\n                });\n            },\n            dispose: function (editor) {\n                $(editor.body).off(NS);\n            },\n            _initResizing: function (editor, table) {\n                if (!browser.msie && !browser.mozilla) {\n                    editor.tableResizing = new TableResizing(table, {\n                        appendHandlesTo: editor.body,\n                        rtl: kendo.support.isRtl(editor.element),\n                        rootElement: editor.body\n                    });\n                }\n            }\n        });\n        TableResizingFactory.current = new TableResizingFactory();\n        TableResizing.create = function (editor) {\n            TableResizingFactory.current.create(editor);\n        };\n        TableResizing.dispose = function (editor) {\n            TableResizingFactory.current.dispose(editor);\n        };\n        extend(Editor, { TableResizing: TableResizing });\n    }(window.kendo));\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('editor/immutables', ['editor/tables'], f);\n}(function () {\n    (function ($, undefined) {\n        var kendo = window.kendo, Class = kendo.Class, Editor = kendo.ui.editor, dom = Editor.Dom, template = kendo.template, RangeUtils = Editor.RangeUtils, complexBlocks = [\n                'ul',\n                'ol',\n                'tbody',\n                'thead',\n                'table'\n            ], toolsToBeUpdated = [\n                'bold',\n                'italic',\n                'underline',\n                'strikethrough',\n                'superscript',\n                'subscript',\n                'forecolor',\n                'backcolor',\n                'fontname',\n                'fontsize',\n                'createlink',\n                'unlink',\n                'autolink',\n                'addcolumnleft',\n                'addcolumnright',\n                'addrowabove',\n                'addrowbelow',\n                'deleterow',\n                'deletecolumn',\n                'mergecells',\n                'formatting',\n                'cleanformatting'\n            ], IMMUTABALE = 'k-immutable', IMMUTABALE_MARKER_SELECTOR = '[' + IMMUTABALE + ']', IMMUTABLE_SELECTOR = '[contenteditable=\\'false\\']';\n        var rootCondition = function (node) {\n            return $(node).is('body,.k-editor');\n        };\n        var immutable = function (node) {\n            return node.getAttribute && node.getAttribute('contenteditable') == 'false';\n        };\n        var immutableParent = function (node) {\n            return dom.closestBy(node, immutable, rootCondition);\n        };\n        var expandImmutablesIn = function (range) {\n            var startImmutableParent = immutableParent(range.startContainer);\n            var endImmutableParent = immutableParent(range.endContainer);\n            if (startImmutableParent || endImmutableParent) {\n                if (startImmutableParent) {\n                    range.setStartBefore(startImmutableParent);\n                }\n                if (endImmutableParent) {\n                    range.setEndAfter(endImmutableParent);\n                }\n            }\n        };\n        var immutablesContext = function (range) {\n            if (immutableParent(range.commonAncestorContainer)) {\n                return true;\n            } else if (immutableParent(range.startContainer) || immutableParent(range.endContainer)) {\n                var editableNodes = RangeUtils.editableTextNodes(range);\n                if (editableNodes.length === 0) {\n                    return true;\n                }\n            }\n            return false;\n        };\n        var randomId = function (length) {\n            var result = '';\n            var chars = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';\n            for (var i = length || 10; i > 0; --i) {\n                result += chars.charAt(Math.round(Math.random() * (chars.length - 1)));\n            }\n            return result;\n        };\n        var removeImmutables = function (root) {\n            var serializedImmutables = { empty: true }, nodeName, id, serialized;\n            $(root).find(IMMUTABLE_SELECTOR).each(function (i, node) {\n                nodeName = dom.name(node);\n                id = randomId();\n                serialized = '<' + nodeName + ' ' + IMMUTABALE + '=\\'' + id + '\\'></' + nodeName + '>';\n                serializedImmutables[id] = {\n                    node: node,\n                    style: $(node).attr('style')\n                };\n                serializedImmutables.empty = false;\n                $(node).replaceWith(serialized);\n            });\n            return serializedImmutables;\n        };\n        var restoreImmutables = function (root, serializedImmutables) {\n            var id, immutable;\n            $(root).find(IMMUTABALE_MARKER_SELECTOR).each(function (i, node) {\n                id = node.getAttribute(IMMUTABALE);\n                immutable = serializedImmutables[id];\n                $(node).replaceWith(immutable.node);\n                if (immutable.style != $(immutable.node).attr('style')) {\n                    $(immutable.node).removeAttr('style').attr('style', immutable.style);\n                }\n            });\n        };\n        var deletingKey = function (keyCode) {\n            var keys = kendo.keys;\n            return keyCode === keys.BACKSPACE || keyCode == keys.DELETE;\n        };\n        var updateToolOptions = function (tool) {\n            var options = tool ? tool.options : undefined;\n            if (options && options.finder) {\n                options.finder._initOptions({ immutables: true });\n            }\n        };\n        var Immutables = Class.extend({\n            init: function (editor) {\n                this.editor = editor;\n                this.serializedImmutables = {};\n                this.options = $.extend({}, editor && editor.options && editor.options.immutables);\n                var tools = editor.toolbar.tools;\n                updateToolOptions(tools.justifyLeft);\n                updateToolOptions(tools.justifyCenter);\n                updateToolOptions(tools.justifyRight);\n                updateToolOptions(tools.justifyFull);\n            },\n            serialize: function (node) {\n                var result = this._toHtml(node), id;\n                if (result.indexOf(IMMUTABALE) === -1) {\n                    id = this.randomId();\n                    result = result.replace(/>/, ' ' + IMMUTABALE + '=\"' + id + '\">');\n                } else {\n                    id = result.match(/k-immutable\\s*=\\s*['\"](.*)['\"]/)[1];\n                }\n                this.serializedImmutables[id] = node;\n                return result;\n            },\n            _toHtml: function (node) {\n                var serialization = this.options.serialization;\n                var serializationType = typeof serialization;\n                var nodeName;\n                switch (serializationType) {\n                case 'string':\n                    return template(serialization)(node);\n                case 'function':\n                    return serialization(node);\n                default:\n                    nodeName = dom.name(node);\n                    return '<' + nodeName + '></' + nodeName + '>';\n                }\n            },\n            deserialize: function (node) {\n                var that = this;\n                var deserialization = this.options.deserialization;\n                $(IMMUTABALE_MARKER_SELECTOR, node).each(function () {\n                    var id = this.getAttribute(IMMUTABALE);\n                    var immutable = that.serializedImmutables[id];\n                    if (kendo.isFunction(deserialization)) {\n                        deserialization(this, immutable);\n                    }\n                    $(this).replaceWith(immutable);\n                });\n                that.serializedImmutables = {};\n            },\n            randomId: function (length) {\n                return randomId(length);\n            },\n            keydown: function (e, range) {\n                var isDeleting = deletingKey(e.keyCode);\n                var shouldCancelEvent = isDeleting && this._cancelDeleting(e, range) || !isDeleting && this._cancelTyping(e, range);\n                if (shouldCancelEvent) {\n                    e.preventDefault();\n                    return true;\n                }\n            },\n            _cancelTyping: function (e, range) {\n                var editor = this.editor;\n                var keyboard = editor.keyboard;\n                return range.collapsed && !keyboard.typingInProgress && keyboard.isTypingKey(e) && immutablesContext(range);\n            },\n            _cancelDeleting: function (e, range) {\n                var keys = kendo.keys;\n                var backspace = e.keyCode === keys.BACKSPACE;\n                var del = e.keyCode == keys.DELETE;\n                if (!backspace && !del) {\n                    return false;\n                }\n                var cancelDeleting = false;\n                if (range.collapsed) {\n                    if (immutablesContext(range)) {\n                        return true;\n                    }\n                    var immutable = this.nextImmutable(range, del);\n                    if (immutable && backspace) {\n                        var closestSelectionLi = dom.closest(range.commonAncestorContainer, 'li');\n                        if (closestSelectionLi) {\n                            var closestImmutableLi = dom.closest(immutable, 'li');\n                            if (closestImmutableLi && closestImmutableLi !== closestSelectionLi) {\n                                return cancelDeleting;\n                            }\n                        }\n                    }\n                    if (immutable && !dom.tableCell(immutable)) {\n                        if (dom.parentOfType(immutable, complexBlocks) === dom.parentOfType(range.commonAncestorContainer, complexBlocks)) {\n                            while (immutable && immutable.parentNode.childNodes.length == 1) {\n                                immutable = immutable.parentNode;\n                            }\n                            if (dom.tableCell(immutable)) {\n                                return cancelDeleting;\n                            }\n                            this._removeImmutable(immutable, range);\n                        }\n                        cancelDeleting = true;\n                    }\n                }\n                return cancelDeleting;\n            },\n            nextImmutable: function (range, forwards) {\n                var commonContainer = range.commonAncestorContainer;\n                if (dom.isBom(commonContainer) || (forwards && RangeUtils.isEndOf(range, commonContainer) || !forwards && RangeUtils.isStartOf(range, commonContainer))) {\n                    var next = this._nextNode(commonContainer, forwards);\n                    if (next && dom.isBlock(next) && !immutableParent(next)) {\n                        while (next && next.children && next.children[forwards ? 0 : next.children.length - 1]) {\n                            next = next.children[forwards ? 0 : next.children.length - 1];\n                        }\n                    }\n                    return immutableParent(next);\n                }\n            },\n            _removeImmutable: function (immutable, range) {\n                var editor = this.editor;\n                var startRestorePoint = new Editor.RestorePoint(range, editor.body);\n                dom.remove(immutable);\n                Editor._finishUpdate(editor, startRestorePoint);\n            },\n            _nextNode: function (node, forwards) {\n                var sibling = forwards ? 'nextSibling' : 'previousSibling';\n                var current = node, next;\n                while (current && !next) {\n                    next = current[sibling];\n                    if (next && dom.isDataNode(next) && /^\\s|[\\ufeff]$/.test(next.nodeValue)) {\n                        current = next;\n                        next = current[sibling];\n                    }\n                    if (!next) {\n                        current = current.parentNode;\n                    }\n                }\n                return next;\n            }\n        });\n        Immutables.immutable = immutable;\n        Immutables.immutableParent = immutableParent;\n        Immutables.expandImmutablesIn = expandImmutablesIn;\n        Immutables.immutablesContext = immutablesContext;\n        Immutables.toolsToBeUpdated = toolsToBeUpdated;\n        Immutables.removeImmutables = removeImmutables;\n        Immutables.restoreImmutables = restoreImmutables;\n        Editor.Immutables = Immutables;\n    }(window.kendo.jQuery));\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('editor/table-wizard/table-wizard-command', ['editor/tables'], f);\n}(function () {\n    (function ($, undefined) {\n        var kendo = window.kendo, Editor = kendo.ui.editor, EditorUtils = Editor.EditorUtils, RangeUtils = Editor.RangeUtils, dom = Editor.Dom, registerTool = EditorUtils.registerTool, ToolTemplate = Editor.ToolTemplate, Command = Editor.Command;\n        var tableFormatFinder = new Editor.BlockFormatFinder([{ tags: ['table'] }]);\n        var cellsFormatFinder = new Editor.BlockFormatFinder([{\n                tags: [\n                    'td',\n                    'th'\n                ]\n            }]);\n        var reUnit = /([a-z]+|%)$/i;\n        var TableWizardCommand = Command.extend({\n            exec: function () {\n                var cmd = this;\n                var editor = cmd.editor;\n                var range = cmd.range = cmd.lockRange();\n                var selectedTable = cmd._sourceTable = !cmd.options.insertNewTable ? cmd._selectedTable(range) : undefined;\n                var selectedCells = cmd._selectedTableCells = selectedTable ? cmd._selectedCells(range) : undefined;\n                var options = {\n                    visible: false,\n                    messages: editor.options.messages,\n                    closeCallback: $.proxy(cmd.onDialogClose, cmd),\n                    table: cmd.parseTable(selectedTable, selectedCells),\n                    dialogOptions: editor.options.dialogOptions,\n                    isRtl: kendo.support.isRtl(editor.wrapper)\n                };\n                var dialog = new Editor.TableWizardDialog(options);\n                dialog.open();\n            },\n            onDialogClose: function (data) {\n                var cmd = this;\n                cmd.releaseRange(cmd.range);\n                if (data) {\n                    if (cmd.options.insertNewTable) {\n                        cmd.insertTable(cmd.createNewTable(data));\n                    } else {\n                        cmd.updateTable(data, cmd._sourceTable, cmd._selectedTableCells);\n                    }\n                }\n            },\n            releaseRange: function (range) {\n                var cmd = this;\n                var doc = cmd.editor.document;\n                dom.windowFromDocument(doc).focus();\n                Command.fn.releaseRange.call(cmd, range);\n            },\n            insertTable: function (table) {\n                var range = this.range;\n                range.insertNode(table);\n                range.collapse(true);\n                this.editor.selectRange(range);\n            },\n            updateTable: function (data, table, selectedCells) {\n                var cmd = this;\n                var tableRows = $(table.rows).toArray();\n                var tableProp = data.tableProperties;\n                var rows = tableProp.rows;\n                var columns = tableProp.columns;\n                var last = function (collection) {\n                    return collection[collection.length - 1];\n                };\n                while (selectedCells.length > 1) {\n                    selectedCells.pop();\n                }\n                var lastSelectedRow = selectedCells.length ? last(selectedCells).parentNode : last(tableRows);\n                var row, parent;\n                cmd._deleteTableRows(tableRows, tableRows.length - rows);\n                if (tableRows.length < rows) {\n                    var rowIndex = $(lastSelectedRow).index();\n                    var cellsLength = lastSelectedRow.cells.length;\n                    var newRowsCount = rows - tableRows.length;\n                    parent = lastSelectedRow.parentNode;\n                    while (newRowsCount) {\n                        row = parent.insertRow(rowIndex + 1);\n                        cmd._insertCells(cellsLength - row.cells.length, row);\n                        newRowsCount--;\n                    }\n                }\n                if (tableRows[0].cells.length > columns) {\n                    $(tableRows).each(function (i, row) {\n                        while (row.cells.length > columns) {\n                            row.deleteCell(-1);\n                        }\n                    });\n                }\n                if (tableRows[0].cells.length < columns) {\n                    var cellIndex = $(last(selectedCells) || last(lastSelectedRow.cells)).index();\n                    $(tableRows).each(function (i, row) {\n                        cmd._insertCells(columns - row.cells.length, row, cellIndex + 1);\n                    });\n                }\n                cmd._updateTableProperties(table, tableProp);\n                var cellProp = data.cellProperties;\n                if (selectedCells[0]) {\n                    dom.attr(selectedCells[0], { id: cellProp.id || null });\n                }\n                (cellProp.selectAllCells ? $(tableRows).children() : $(selectedCells)).each(function (i, cell) {\n                    cmd._updateCellProperties(cell, cellProp);\n                });\n                cmd._updateCaption(table, tableProp);\n                tableProp.cellsWithHeaders = tableProp.cellsWithHeaders || false;\n                if (cmd.cellsWithHeadersAssociated(table) != tableProp.cellsWithHeaders) {\n                    cmd.associateCellsWithHeader(table, tableProp.cellsWithHeaders);\n                }\n            },\n            _isHeadingRow: function (row) {\n                return dom.is(row.parentNode, 'thead') || dom.is(row.cells[0], 'th');\n            },\n            associateCellsWithHeader: function (table, associate) {\n                var timestamp = new Date().getTime();\n                var ids = [];\n                var columns = table.rows[0].cells.length;\n                var index, nextRow, isDataRow;\n                var generateIds = function () {\n                    for (var i = 0; i < columns; i++) {\n                        ids[i] = 'table' + ++timestamp;\n                    }\n                };\n                var modifySellsIds = function (c, cell) {\n                    $(cell)[associate ? 'attr' : 'removeAttr']('id', ids[c]);\n                };\n                var modifyCellsHeadings = function (c, cell) {\n                    $(cell)[associate ? 'attr' : 'removeAttr']('headers', ids[c]);\n                };\n                var isHeadingRow = this._isHeadingRow;\n                $(table.rows).each(function (r, row) {\n                    if (isHeadingRow(row)) {\n                        index = r;\n                        nextRow = table.rows[++index];\n                        isDataRow = nextRow && !isHeadingRow(nextRow);\n                        if (isDataRow) {\n                            generateIds();\n                            $(row.cells).each(modifySellsIds);\n                        }\n                        while (isDataRow) {\n                            $(nextRow.cells).each(modifyCellsHeadings);\n                            nextRow = table.rows[++index];\n                            isDataRow = nextRow && !isHeadingRow(nextRow);\n                        }\n                    }\n                });\n            },\n            cellsWithHeadersAssociated: function (table) {\n                var cells = $(table.rows).children();\n                var isHeadingRow = this._isHeadingRow;\n                var headingIds = [];\n                cells.each(function (c, cell) {\n                    if (cell.id && isHeadingRow(cell.parentNode)) {\n                        headingIds.push(cell.id);\n                    }\n                });\n                var associatedCells = cells.filter(function (c, cell) {\n                    var headersAttr = cell.getAttribute('headers');\n                    return headersAttr && !isHeadingRow(cell.parentNode) && $.inArray(headersAttr, headingIds) > -1;\n                });\n                return !!associatedCells.length;\n            },\n            _insertCells: function (count, row, index) {\n                index = isNaN(index) ? -1 : index;\n                for (var i = 0, cell; i < count; i++) {\n                    cell = row.insertCell(index);\n                    cell.innerHTML = '&nbsp;';\n                }\n            },\n            _deleteTableRows: function (rows, count) {\n                for (var i = 0, row, rowParent; i < count; i++) {\n                    row = rows.pop();\n                    rowParent = row.parentNode;\n                    rowParent.removeChild(row);\n                    if (!rowParent.rows.length) {\n                        dom.remove(rowParent);\n                    }\n                }\n            },\n            createNewTable: function (data) {\n                var cmd = this;\n                var doc = cmd.editor.document;\n                var tableProp = data.tableProperties;\n                var cellProp = data.cellProperties;\n                var cellPropToAll = cellProp.selectAllCells;\n                var table = dom.create(doc, 'table');\n                cmd._updateTableProperties(table, tableProp);\n                cmd._updateCaption(table, tableProp);\n                var tbody = table.createTBody();\n                for (var r = 0, row; r < tableProp.rows; r++) {\n                    row = tbody.insertRow();\n                    for (var c = 0, cell; c < tableProp.columns; c++) {\n                        cell = row.insertCell();\n                        cell.innerHTML = '&nbsp;';\n                        if (r === 0 && c === 0 && cellProp.id) {\n                            cell.id = cellProp.id;\n                        }\n                        cmd._updateCellProperties(cell, cellPropToAll || r === 0 && c === 0 ? cellProp : {});\n                    }\n                }\n                if (tableProp.cellsWithHeaders) {\n                    cmd.associateCellsWithHeader(table, tableProp.cellsWithHeaders);\n                }\n                return table;\n            },\n            _updateTableProperties: function (table, data) {\n                var style = this._getStylesData(data);\n                dom.attr(table, {\n                    cellSpacing: data.cellSpacing || null,\n                    cellPadding: data.cellPadding || null,\n                    className: data.className || null,\n                    id: data.id || null,\n                    summary: data.summary || null,\n                    style: style || null\n                });\n                $(table).addClass('k-table');\n            },\n            _updateCellProperties: function (cell, data) {\n                var style = this._getStylesData(data);\n                style.padding = data.cellPadding || null;\n                style.margin = data.cellMargin || null;\n                dom.attr(cell, {\n                    style: style || null,\n                    className: data.className || null\n                });\n            },\n            _updateCaption: function (table, data) {\n                if (table.caption && !data.captionContent) {\n                    table.deleteCaption();\n                } else if (data.captionContent) {\n                    var caption = table.createCaption();\n                    caption.innerHTML = data.captionContent;\n                    var alignment = this._getAlignmentData(data.captionAlignment);\n                    dom.attr(caption, {\n                        style: {\n                            textAlign: alignment.textAlign,\n                            verticalAlign: alignment.verticalAlign\n                        }\n                    });\n                }\n            },\n            _getStylesData: function (data) {\n                var alignment = this._getAlignmentData(data.alignment);\n                var whiteSpace = 'wrapText' in data ? data.wrapText ? '' : 'nowrap' : null;\n                return {\n                    width: data.width ? data.width + data.widthUnit : null,\n                    height: data.height ? data.height + data.heightUnit : null,\n                    textAlign: alignment.textAlign,\n                    verticalAlign: alignment.verticalAlign,\n                    backgroundColor: data.bgColor || null,\n                    borderWidth: data.borderWidth,\n                    borderStyle: data.borderStyle,\n                    borderColor: data.borderColor,\n                    borderCollapse: data.collapseBorders ? 'collapse' : null,\n                    whiteSpace: whiteSpace\n                };\n            },\n            _getAlignmentData: function (alignment) {\n                var textAlign = '';\n                var verticalAlign = textAlign;\n                if (alignment) {\n                    if (alignment.indexOf(' ') != -1) {\n                        var align = alignment.split(' ');\n                        textAlign = align[0];\n                        verticalAlign = align[1];\n                    } else {\n                        textAlign = alignment;\n                    }\n                }\n                return {\n                    textAlign: textAlign,\n                    verticalAlign: verticalAlign\n                };\n            },\n            parseTable: function (table, selectedCells) {\n                if (!table) {\n                    return {\n                        tableProperties: {},\n                        selectedCells: []\n                    };\n                }\n                var cmd = this;\n                var tStyle = table.style;\n                var rows = table.rows;\n                var caption = table.caption;\n                var captionClone = $(caption ? caption.cloneNode(true) : undefined);\n                captionClone.find('.k-marker').remove();\n                var cssClass = table.className;\n                cssClass = cssClass.replace(/^k-table\\s|\\sk-table$/, '');\n                cssClass = cssClass.replace(/\\sk-table\\s/, ' ');\n                cssClass = cssClass.replace(/^k-table$/, '');\n                var tableAlignment = cmd._getAlignment(table, true);\n                var captionAlignment = caption ? cmd._getAlignment(caption) : undefined;\n                var cellsWithHeaders = cmd.cellsWithHeadersAssociated(table);\n                var tableJson = {\n                    tableProperties: {\n                        width: tStyle.width || table.width ? parseFloat(tStyle.width || table.width) : null,\n                        height: tStyle.height || table.height ? parseFloat(tStyle.height || table.height) : null,\n                        columns: rows[0] ? rows[0].children.length : 0,\n                        rows: rows.length,\n                        widthUnit: cmd._getUnit(tStyle.width),\n                        heightUnit: cmd._getUnit(tStyle.height),\n                        cellSpacing: table.cellSpacing,\n                        cellPadding: table.cellPadding,\n                        alignment: tableAlignment.textAlign,\n                        bgColor: tStyle.backgroundColor || table.bgColor,\n                        className: cssClass,\n                        id: table.id,\n                        borderWidth: tStyle.borderWidth || table.border,\n                        borderColor: tStyle.borderColor,\n                        borderStyle: tStyle.borderStyle || '',\n                        collapseBorders: !!tStyle.borderCollapse,\n                        summary: table.summary,\n                        captionContent: caption ? captionClone.html() : '',\n                        captionAlignment: caption && captionAlignment.textAlign ? captionAlignment.textAlign + ' ' + captionAlignment.verticalAlign : '',\n                        cellsWithHeaders: cellsWithHeaders\n                    },\n                    selectedCells: []\n                };\n                tableJson.rows = cmd.parseTableRows(rows, selectedCells, tableJson);\n                return tableJson;\n            },\n            parseTableRows: function (rows, selectedCells, tableJson) {\n                var cmd = this;\n                var data = [], row, rowData, cells, cell, cellData;\n                for (var i = 0; i < rows.length; i++) {\n                    row = rows[i];\n                    rowData = { cells: [] };\n                    cells = row.cells;\n                    data.push(rowData);\n                    for (var j = 0; j < cells.length; j++) {\n                        cell = cells[j];\n                        cellData = cmd.parseCell(cell);\n                        if ($.inArray(cell, selectedCells) != -1) {\n                            tableJson.selectedCells.push(cellData);\n                        }\n                        rowData.cells.push(cellData);\n                    }\n                }\n                return data;\n            },\n            parseCell: function (cell) {\n                var cmd = this;\n                var cStyle = cell.style;\n                var alignment = cmd._getAlignment(cell);\n                alignment = alignment.textAlign ? alignment.textAlign + ' ' + alignment.verticalAlign : '';\n                var data = {\n                    width: cStyle.width || cell.width ? parseFloat(cStyle.width || cell.width) : null,\n                    height: cStyle.height || cell.height ? parseFloat(cStyle.height || cell.height) : null,\n                    widthUnit: cmd._getUnit(cStyle.width),\n                    heightUnit: cmd._getUnit(cStyle.height),\n                    cellMargin: cStyle.margin,\n                    cellPadding: cStyle.padding,\n                    alignment: alignment,\n                    bgColor: cStyle.backgroundColor || cell.bgColor,\n                    className: cell.className,\n                    id: cell.id,\n                    borderWidth: cStyle.borderWidth || cell.border,\n                    borderColor: cStyle.borderColor,\n                    borderStyle: cStyle.borderStyle,\n                    wrapText: cStyle.whiteSpace != 'nowrap'\n                };\n                return data;\n            },\n            _getAlignment: function (element, horizontalOnly) {\n                var style = element.style;\n                var hAlign = style.textAlign || element.align || '';\n                if (horizontalOnly) {\n                    return { textAlign: hAlign };\n                }\n                var vAlign = style.verticalAlign || element.vAlign || '';\n                if (hAlign && vAlign) {\n                    return {\n                        textAlign: hAlign,\n                        verticalAlign: vAlign\n                    };\n                }\n                if (!hAlign && vAlign) {\n                    return {\n                        textAlign: 'left',\n                        verticalAlign: vAlign\n                    };\n                }\n                if (hAlign && !vAlign) {\n                    return {\n                        textAlign: hAlign,\n                        verticalAlign: 'top'\n                    };\n                }\n                return {\n                    textAlign: '',\n                    verticalAlign: ''\n                };\n            },\n            _getUnit: function (value) {\n                var unit = (value || '').match(reUnit);\n                return unit ? unit[0] : 'px';\n            },\n            _selectedTable: function (range) {\n                var nodes = dom.filterBy(RangeUtils.nodes(range), dom.htmlIndentSpace, true);\n                return tableFormatFinder.findSuitable(nodes)[0];\n            },\n            _selectedCells: function (range) {\n                var nodes = dom.filterBy(RangeUtils.nodes(range), dom.htmlIndentSpace, true);\n                return cellsFormatFinder.findSuitable(nodes);\n            }\n        });\n        var TableWizardTool = Editor.Tool.extend({\n            command: function (options) {\n                options.insertNewTable = this.options.insertNewTable;\n                return new TableWizardCommand(options);\n            }\n        });\n        var TableWizardEditTool = TableWizardTool.extend({\n            update: function (ui, nodes) {\n                var isFormatted = !tableFormatFinder.isFormatted(nodes);\n                ui.toggleClass('k-state-disabled', isFormatted);\n            }\n        });\n        kendo.ui.editor.TableWizardTool = TableWizardTool;\n        kendo.ui.editor.TableWizardCommand = TableWizardCommand;\n        registerTool('tableWizard', new TableWizardEditTool({\n            command: TableWizardCommand,\n            insertNewTable: false,\n            template: new ToolTemplate({\n                template: EditorUtils.buttonTemplate,\n                title: 'Table Wizard'\n            })\n        }));\n    }(window.kendo.jQuery));\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('editor/table-wizard/table-wizard-dialog', ['editor/table-wizard/table-wizard-command'], f);\n}(function () {\n    (function ($, undefined) {\n        var kendo = window.kendo, numericTextBoxSettings = {\n                format: '0',\n                min: 0\n            }, units = [\n                'px',\n                'em'\n            ], borderStyles = [\n                'solid',\n                'dotted',\n                'dashed',\n                'double',\n                'groove',\n                'ridge',\n                'inset',\n                'outset',\n                'initial',\n                'inherit',\n                'none',\n                'hidden'\n            ];\n        var tableAlignmentDropDownSettings = {\n            dataSource: [\n                {\n                    className: 'k-icon k-i-table-align-middle-left',\n                    value: 'left'\n                },\n                {\n                    className: 'k-icon k-i-table-align-middle-center',\n                    value: 'center'\n                },\n                {\n                    className: 'k-icon k-i-table-align-middle-right',\n                    value: 'right'\n                },\n                {\n                    className: 'k-icon k-i-align-remove',\n                    value: ''\n                }\n            ],\n            dataTextField: 'className',\n            dataValueField: 'value',\n            template: '<span class=\\'#: className #\\' title=\\'#: tooltip #\\'></span>',\n            valueTemplate: '<span class=\\'k-align-group #: className #\\' title=\\'#: tooltip #\\'></span>'\n        };\n        var cellAlignmentDropDownSettings = {\n            dataSource: [\n                {\n                    className: 'k-icon k-i-table-align-top-left',\n                    value: 'left top'\n                },\n                {\n                    className: 'k-icon k-i-table-align-top-center',\n                    value: 'center top'\n                },\n                {\n                    className: 'k-icon k-i-table-align-top-right',\n                    value: 'right top'\n                },\n                {\n                    className: 'k-icon k-i-table-align-middle-left',\n                    value: 'left middle'\n                },\n                {\n                    className: 'k-icon k-i-table-align-middle-center',\n                    value: 'center middle'\n                },\n                {\n                    className: 'k-icon k-i-table-align-middle-right',\n                    value: 'right middle'\n                },\n                {\n                    className: 'k-icon k-i-table-align-bottom-left',\n                    value: 'left bottom'\n                },\n                {\n                    className: 'k-icon k-i-table-align-bottom-center',\n                    value: 'center bottom'\n                },\n                {\n                    className: 'k-icon k-i-table-align-bottom-right',\n                    value: 'right bottom'\n                },\n                {\n                    className: 'k-icon k-i-align-remove',\n                    value: ''\n                }\n            ],\n            dataTextField: 'className',\n            dataValueField: 'value',\n            template: '<span class=\\'#: className #\\' title=\\'#: tooltip #\\'></span>',\n            valueTemplate: '<span class=\\'k-align-group #: className #\\' title=\\'#: tooltip #\\'></span>'\n        };\n        var accessibilityAlignmentDropDownSettings = {\n            dataSource: [\n                {\n                    className: 'k-icon k-i-table-align-top-left',\n                    value: 'left top'\n                },\n                {\n                    className: 'k-icon k-i-table-align-top-center',\n                    value: 'center top'\n                },\n                {\n                    className: 'k-icon k-i-table-align-top-right',\n                    value: 'right top'\n                },\n                {\n                    className: 'k-icon k-i-table-align-bottom-left',\n                    value: 'left bottom'\n                },\n                {\n                    className: 'k-icon k-i-table-align-bottom-center',\n                    value: 'center bottom'\n                },\n                {\n                    className: 'k-icon k-i-table-align-bottom-right',\n                    value: 'right bottom'\n                },\n                {\n                    className: 'k-icon k-i-align-remove',\n                    value: ''\n                }\n            ],\n            dataTextField: 'className',\n            dataValueField: 'value',\n            template: '<span class=\\'#: className #\\' title=\\'#: tooltip #\\'></span>',\n            valueTemplate: '<span class=\\'k-align-group #: className #\\' title=\\'#: tooltip #\\'></span>'\n        };\n        var dialogTemplate = '<div class=\"k-editor-dialog k-editor-table-wizard-dialog k-action-window k-popup-edit-form\">' + '<div class=\"k-edit-form-container\">' + '<div id=\"k-table-wizard-tabs\" class=\"k-root-tabs\">' + '<ul>' + '<li class=\"k-state-active\">#= messages.tableTab #</li>' + '<li>#= messages.cellTab #</li>' + '<li>#= messages.accessibilityTab #</li>' + '</ul>' + '<div id=\"k-table-properties\">' + '<div class=\"k-edit-label\">' + '<label for=\"k-editor-table-width\">#= messages.width #</label>' + '</div>' + '<div class=\"k-edit-field\">' + '<input type=\"numeric\" id=\"k-editor-table-width\" />' + '<input id=\"k-editor-table-width-type\" aria-label=\"#= messages.units #\" />' + '</div>' + '<div class=\"k-edit-label\">' + '<label for=\"k-editor-table-height\">#= messages.height #</label>' + '</div>' + '<div class=\"k-edit-field\">' + '<input type=\"numeric\" id=\"k-editor-table-height\" />' + '<input id=\"k-editor-table-height-type\" aria-label=\"#= messages.units #\" />' + '</div>' + '<div class=\"k-edit-label\">' + '<label for=\"k-editor-table-columns\">#= messages.columns #</label>' + '</div>' + '<div class=\"k-edit-field\">' + '<input type=\"numeric\" id=\"k-editor-table-columns\" />' + '</div>' + '<div class=\"k-edit-label\">' + '<label for=\"k-editor-table-rows\">#= messages.rows #</label>' + '</div>' + '<div class=\"k-edit-field\">' + '<input type=\"numeric\" id=\"k-editor-table-rows\" />' + '</div>' + '<div class=\"k-edit-label\">' + '<label for=\"k-editor-table-cell-spacing\">#= messages.cellSpacing #</label>' + '</div>' + '<div class=\"k-edit-field\">' + '<input type=\"numeric\" id=\"k-editor-table-cell-spacing\" />' + '</div>' + '<div class=\"k-edit-label\">' + '<label for=\"k-editor-table-cell-padding\">#= messages.cellPadding #</label>' + '</div>' + '<div class=\"k-edit-field\">' + '<input type=\"numeric\" id=\"k-editor-table-cell-padding\" />' + '</div>' + '<div class=\"k-edit-label\">' + '<label for=\"k-editor-table-alignment\">#= messages.alignment #</label>' + '</div>' + '<div class=\"k-edit-field\">' + '<input id=\"k-editor-table-alignment\" class=\"k-align\" />' + '</div>' + '<div class=\"k-edit-label\">' + '<label for=\"k-editor-table-bg\">#= messages.background #</label>' + '</div>' + '<div class=\"k-edit-field\">' + '<input id=\"k-editor-table-bg\" />' + '</div>' + '<div class=\"k-edit-label\">' + '<label for=\"k-editor-css-class\">#= messages.cssClass #</label>' + '</div>' + '<div class=\"k-edit-field\">' + '<input id=\"k-editor-css-class\" class=\"k-input k-textbox\" type=\"text\" />' + '</div>' + '<div class=\"k-edit-label\">' + '<label for=\"k-editor-id\">#= messages.id #</label>' + '</div>' + '<div class=\"k-edit-field\">' + '<input id=\"k-editor-id\" class=\"k-input k-textbox\" type=\"text\" />' + '</div>' + '<div class=\"k-edit-label\">' + '<label for=\"k-editor-border-width\">#= messages.border #</label>' + '</div>' + '<div class=\"k-edit-field\">' + '<input type=\"numeric\" id=\"k-editor-border-width\" />' + '<input id=\"k-editor-border-color\" />' + '</div>' + '<div class=\"k-edit-label\">' + '<label for=\"k-editor-border-style\">#= messages.borderStyle #</label>' + '</div>' + '<div class=\"k-edit-field\">' + '<input id=\"k-editor-border-style\" />' + '</div>' + '<div class=\"k-edit-label\">&nbsp;</div>' + '<div class=\"k-edit-field\">' + '<input id=\"k-editor-collapse-borders\" type=\"checkbox\" class=\"k-checkbox\" />' + '<label for=\"k-editor-collapse-borders\" class=\"k-checkbox-label\">#= messages.collapseBorders #</label>' + '</div>' + '</div>' + '<div id=\"k-cell-properties\">' + '<div class=\"k-edit-field\">' + '<input id=\"k-editor-selectAllCells\" type=\"checkbox\" class=\"k-checkbox\" />' + '<label for=\"k-editor-selectAllCells\" class=\"k-checkbox-label\">#= messages.selectAllCells #</label>' + '</div>' + '<div class=\"k-edit-label\">' + '<label for=\"k-editor-cell-width\">#= messages.width #</label>' + '</div>' + '<div class=\"k-edit-field\">' + '<input type=\"numeric\" id=\"k-editor-cell-width\" />' + '<input id=\"k-editor-cell-width-type\" aria-label=\"#= messages.units #\" />' + '</div>' + '<div class=\"k-edit-label\">' + '<label for=\"k-editor-cell-height\">#= messages.height #</label>' + '</div>' + '<div class=\"k-edit-field\">' + '<input type=\"numeric\" id=\"k-editor-cell-height\" />' + '<input id=\"k-editor-cell-height-type\" aria-label=\"#= messages.units #\" />' + '</div>' + '<div class=\"k-edit-label\">' + '<label for=\"k-editor-table-cell-margin\">#= messages.cellMargin #</label>' + '</div>' + '<div class=\"k-edit-field\">' + '<input type=\"numeric\" id=\"k-editor-table-cell-margin\" />' + '</div>' + '<div class=\"k-edit-label\">' + '<label for=\"k-editor-table-cells-padding\">#= messages.cellPadding #</label>' + '</div>' + '<div class=\"k-edit-field\">' + '<input type=\"numeric\" id=\"k-editor-table-cells-padding\" />' + '</div>' + '<div class=\"k-edit-label\">' + '<label for=\"k-editor-cell-alignment\">#= messages.alignment #</label>' + '</div>' + '<div class=\"k-edit-field\">' + '<input id=\"k-editor-cell-alignment\" class=\"k-align\" />' + '</div>' + '<div class=\"k-edit-label\">' + '<label for=\"k-editor-cell-bg\">#= messages.background #</label>' + '</div>' + '<div class=\"k-edit-field\">' + '<input id=\"k-editor-cell-bg\" />' + '</div>' + '<div class=\"k-edit-label\">' + '<label for=\"k-editor-cell-css-class\">#= messages.cssClass #</label>' + '</div>' + '<div class=\"k-edit-field\">' + '<input id=\"k-editor-cell-css-class\" class=\"k-input k-textbox\" type=\"text\" />' + '</div>' + '<div class=\"k-edit-label\">' + '<label for=\"k-editor-cell-id\">#= messages.id #</label>' + '</div>' + '<div class=\"k-edit-field\">' + '<input id=\"k-editor-cell-id\" class=\"k-input k-textbox\" type=\"text\" />' + '</div>' + '<div class=\"k-edit-label\">' + '<label for=\"k-editor-cell-border-width\">#= messages.border #</label>' + '</div>' + '<div class=\"k-edit-field\">' + '<input type=\"numeric\" id=\"k-editor-cell-border-width\" />' + '<input id=\"k-editor-cell-border-color\" />' + '</div>' + '<div class=\"k-edit-label\">' + '<label for=\"k-editor-cell-border-style\">#= messages.borderStyle #</label>' + '</div>' + '<div class=\"k-edit-field\">' + '<input id=\"k-editor-cell-border-style\" />' + '</div>' + '<div class=\"k-edit-label\">&nbsp;</div>' + '<div class=\"k-edit-field\">' + '<input id=\"k-editor-wrap-text\" type=\"checkbox\" class=\"k-checkbox\" />' + '<label for=\"k-editor-wrap-text\" class=\"k-checkbox-label\">#= messages.wrapText #</label>' + '</div>' + '</div>' + '<div id=\"k-accessibility-properties\">' + '<div class=\"k-edit-label\">' + '<label for=\"k-editor-table-caption\">#= messages.caption #</label>' + '</div>' + '<div class=\"k-edit-field\">' + '<input id=\"k-editor-table-caption\" class=\"k-input k-textbox\" type=\"text\" />' + '</div>' + '<div class=\"k-edit-label\">' + '<label for=\"k-editor-accessibility-alignment\">#= messages.alignment #</label>' + '</div>' + '<div class=\"k-edit-field\">' + '<input id=\"k-editor-accessibility-alignment\" class=\"k-align\" />' + '</div>' + '<div class=\"k-edit-label\">' + '<label for=\"k-editor-accessibility-summary\">#= messages.summary #</label>' + '</div>' + '<div class=\"k-edit-field\">' + '<textarea id=\"k-editor-accessibility-summary\" class=\"k-input k-textbox\"></textarea>' + '</div>' + '<div class=\"k-edit-label\">&nbsp;</div>' + '<div class=\"k-edit-field\">' + '<input id=\"k-editor-cells-headers\" type=\"checkbox\" class=\"k-checkbox\" />' + '<label for=\"k-editor-cells-headers\" class=\"k-checkbox-label\">#= messages.associateCellsWithHeaders #</label>' + '</div>' + '</div>' + '</div>' + '<div class=\"k-edit-buttons k-state-default\">' + '<button class=\"k-button k-primary k-dialog-ok\">#= messages.dialogOk #</button>' + '<button class=\"k-button k-dialog-close\">#= messages.dialogCancel #</button>' + '</div>' + '</div>' + '</div>';\n        var TableWizardDialog = kendo.Class.extend({\n            init: function (options) {\n                this.options = options;\n            },\n            open: function () {\n                var that = this, options = that.options, dialogOptions = options.dialogOptions, tableData = options.table, dialog, messages = options.messages;\n                function close(e) {\n                    e.preventDefault();\n                    that.destroy();\n                    dialog.destroy();\n                }\n                function okHandler(e) {\n                    that.collectDialogValues(tableData);\n                    close(e);\n                    if (that.change) {\n                        that.change();\n                    }\n                    options.closeCallback(tableData);\n                }\n                function closeHandler(e) {\n                    close(e);\n                    options.closeCallback();\n                }\n                dialogOptions.close = closeHandler;\n                dialogOptions.title = messages.tableWizard;\n                dialogOptions.visible = options.visible;\n                dialog = $(that._dialogTemplate(messages)).appendTo(document.body).kendoWindow(dialogOptions).closest('.k-window').toggleClass('k-rtl', options.isRtl).end().find('.k-dialog-ok').click(okHandler).end().find('.k-dialog-close').click(closeHandler).end().data('kendoWindow');\n                var element = dialog.element;\n                that._initTabStripComponent(element);\n                that._initTableViewComponents(element, tableData);\n                that._initCellViewComponents(element, tableData);\n                that._initAccessibilityViewComponents(element, tableData);\n                dialog.center();\n                dialog.open();\n            },\n            _initTabStripComponent: function (element) {\n                var components = this.components = {};\n                components.tabStrip = element.find('#k-table-wizard-tabs').kendoTabStrip({ animation: false }).data('kendoTabStrip');\n            },\n            collectDialogValues: function () {\n                var that = this;\n                var data = that.options.table;\n                that._collectTableViewValues(data);\n                that._collectCellViewValues(data);\n                that._collectAccessibilityViewValues(data);\n            },\n            _collectTableViewValues: function (tableData) {\n                var tableView = this.components.tableView;\n                var tableProperties = tableData.tableProperties;\n                tableProperties.width = tableView.width.value();\n                tableProperties.widthUnit = tableView.widthUnit.value();\n                tableProperties.height = tableView.height.value();\n                tableProperties.columns = tableView.columns.value();\n                tableProperties.rows = tableView.rows.value();\n                tableProperties.heightUnit = tableView.heightUnit.value();\n                tableProperties.cellSpacing = tableView.cellSpacing.value();\n                tableProperties.cellPadding = tableView.cellPadding.value();\n                tableProperties.alignment = tableView.alignment.value();\n                tableProperties.bgColor = tableView.bgColor.value();\n                tableProperties.className = tableView.className.value;\n                tableProperties.id = tableView.id.value;\n                tableProperties.borderWidth = tableView.borderWidth.value();\n                tableProperties.borderColor = tableView.borderColor.value();\n                tableProperties.borderStyle = tableView.borderStyle.value();\n                tableProperties.collapseBorders = tableView.collapseBorders.checked;\n            },\n            _collectCellViewValues: function (table) {\n                var cellData = table.cellProperties = {};\n                var cellView = this.components.cellView;\n                cellData.selectAllCells = cellView.selectAllCells.checked;\n                cellData.width = cellView.width.value();\n                cellData.widthUnit = cellView.widthUnit.value();\n                cellData.height = cellView.height.value();\n                cellData.heightUnit = cellView.heightUnit.value();\n                cellData.cellMargin = cellView.cellMargin.value();\n                cellData.cellPadding = cellView.cellPadding.value();\n                cellData.alignment = cellView.alignment.value();\n                cellData.bgColor = cellView.bgColor.value();\n                cellData.className = cellView.className.value;\n                cellData.id = cellView.id.value;\n                cellData.borderWidth = cellView.borderWidth.value();\n                cellData.borderColor = cellView.borderColor.value();\n                cellData.borderStyle = cellView.borderStyle.value();\n                cellData.wrapText = cellView.wrapText.checked;\n            },\n            _collectAccessibilityViewValues: function (table) {\n                var tableProperties = table.tableProperties;\n                var accessibilityView = this.components.accessibilityView;\n                tableProperties.captionContent = accessibilityView.captionContent.value;\n                tableProperties.captionAlignment = accessibilityView.captionAlignment.value();\n                tableProperties.summary = accessibilityView.summary.value;\n                tableProperties.cellsWithHeaders = accessibilityView.cellsWithHeaders.checked;\n            },\n            _addUnit: function (units, value) {\n                if (value && $.inArray(value, units) == -1) {\n                    units.push(value);\n                }\n            },\n            _initTableViewComponents: function (element, table) {\n                var components = this.components;\n                var tableView = components.tableView = {};\n                var tableProperties = table.tableProperties = table.tableProperties || {};\n                tableProperties.borderStyle = tableProperties.borderStyle || '';\n                this._addUnit(units, tableProperties.widthUnit);\n                this._addUnit(units, tableProperties.heightUnit);\n                this._initNumericTextbox(element.find('#k-editor-table-width'), 'width', tableProperties, tableView);\n                this._initNumericTextbox(element.find('#k-editor-table-height'), 'height', tableProperties, tableView);\n                this._initNumericTextbox(element.find('#k-editor-table-columns'), 'columns', tableProperties, tableView, {\n                    min: 1,\n                    value: 4\n                });\n                this._initNumericTextbox(element.find('#k-editor-table-rows'), 'rows', tableProperties, tableView, {\n                    min: 1,\n                    value: 4\n                });\n                this._initDropDownList(element.find('#k-editor-table-width-type'), 'widthUnit', tableProperties, tableView, units);\n                this._initDropDownList(element.find('#k-editor-table-height-type'), 'heightUnit', tableProperties, tableView, units);\n                this._initNumericTextbox(element.find('#k-editor-table-cell-spacing'), 'cellSpacing', tableProperties, tableView);\n                this._initNumericTextbox(element.find('#k-editor-table-cell-padding'), 'cellPadding', tableProperties, tableView);\n                this._initTableAlignmentDropDown(element.find('#k-editor-table-alignment'), tableProperties);\n                this._initColorPicker(element.find('#k-editor-table-bg'), 'bgColor', tableProperties, tableView);\n                this._initInput(element.find('#k-editor-css-class'), 'className', tableProperties, tableView);\n                this._initInput(element.find('#k-editor-id'), 'id', tableProperties, tableView);\n                this._initNumericTextbox(element.find('#k-editor-border-width'), 'borderWidth', tableProperties, tableView);\n                this._initColorPicker(element.find('#k-editor-border-color'), 'borderColor', tableProperties, tableView);\n                this._initDropDownList(element.find('#k-editor-border-style'), 'borderStyle', tableProperties, tableView, borderStyles);\n                this._initCheckbox(element.find('#k-editor-collapse-borders'), 'collapseBorders', tableProperties, tableView);\n            },\n            _initCellViewComponents: function (element, table) {\n                var components = this.components;\n                var cellView = components.cellView = {};\n                table.selectedCells = table.selectedCells = table.selectedCells || [];\n                var cellProperties = table.selectedCells[0] || {\n                    borderStyle: '',\n                    wrapText: true\n                };\n                this._addUnit(units, cellProperties.widthUnit);\n                this._addUnit(units, cellProperties.heightUnit);\n                this._initCheckbox(element.find('#k-editor-selectAllCells'), 'selectAllCells', table.tableProperties, cellView);\n                this._initNumericTextbox(element.find('#k-editor-cell-width'), 'width', cellProperties, cellView);\n                this._initNumericTextbox(element.find('#k-editor-cell-height'), 'height', cellProperties, cellView);\n                this._initDropDownList(element.find('#k-editor-cell-width-type'), 'widthUnit', cellProperties, cellView, units);\n                this._initDropDownList(element.find('#k-editor-cell-height-type'), 'heightUnit', cellProperties, cellView, units);\n                this._initNumericTextbox(element.find('#k-editor-table-cell-margin'), 'cellMargin', cellProperties, cellView);\n                this._initNumericTextbox(element.find('#k-editor-table-cells-padding'), 'cellPadding', cellProperties, cellView);\n                this._initCellAlignmentDropDown(element.find('#k-editor-cell-alignment'), cellProperties);\n                this._initColorPicker(element.find('#k-editor-cell-bg'), 'bgColor', cellProperties, cellView);\n                this._initInput(element.find('#k-editor-cell-css-class'), 'className', cellProperties, cellView);\n                this._initInput(element.find('#k-editor-cell-id'), 'id', cellProperties, cellView);\n                this._initNumericTextbox(element.find('#k-editor-cell-border-width'), 'borderWidth', cellProperties, cellView);\n                this._initColorPicker(element.find('#k-editor-cell-border-color'), 'borderColor', cellProperties, cellView);\n                this._initDropDownList(element.find('#k-editor-cell-border-style'), 'borderStyle', cellProperties, cellView, borderStyles);\n                this._initCheckbox(element.find('#k-editor-wrap-text'), 'wrapText', cellProperties, cellView);\n            },\n            _initAccessibilityViewComponents: function (element, table) {\n                var components = this.components;\n                var accessibilityView = components.accessibilityView = {};\n                var tableProperties = table.tableProperties;\n                this._initInput(element.find('#k-editor-table-caption'), 'captionContent', tableProperties, accessibilityView);\n                this._initAccessibilityAlignmentDropDown(element.find('#k-editor-accessibility-alignment'), tableProperties);\n                this._initInput(element.find('#k-editor-accessibility-summary'), 'summary', tableProperties, accessibilityView);\n                this._initCheckbox(element.find('#k-editor-cells-headers'), 'cellsWithHeaders', tableProperties, accessibilityView);\n            },\n            _initNumericTextbox: function (element, property, data, storage, settings) {\n                var component = storage[property] = element.kendoNumericTextBox(settings ? $.extend({}, numericTextBoxSettings, settings) : numericTextBoxSettings).data('kendoNumericTextBox');\n                if (property in data) {\n                    component.value(parseInt(data[property], 10));\n                }\n            },\n            _initDropDownList: function (element, property, data, storage, dataSource) {\n                var component = storage[property] = element.kendoDropDownList({ dataSource: dataSource }).data('kendoDropDownList');\n                this._setComponentValue(component, data, property);\n            },\n            _initTableAlignmentDropDown: function (element, data) {\n                var messages = this.options.messages;\n                var tableView = this.components.tableView;\n                var dataSource = tableAlignmentDropDownSettings.dataSource;\n                dataSource[0].tooltip = messages.alignLeft;\n                dataSource[1].tooltip = messages.alignCenter;\n                dataSource[2].tooltip = messages.alignRight;\n                dataSource[3].tooltip = messages.alignRemove;\n                this._initAlignmentDropDown(element, tableAlignmentDropDownSettings, 'alignment', data, tableView);\n            },\n            _initCellAlignmentDropDown: function (element, data) {\n                var messages = this.options.messages;\n                var cellView = this.components.cellView;\n                var dataSource = cellAlignmentDropDownSettings.dataSource;\n                dataSource[0].tooltip = messages.alignLeftTop;\n                dataSource[1].tooltip = messages.alignCenterTop;\n                dataSource[2].tooltip = messages.alignRightTop;\n                dataSource[3].tooltip = messages.alignLeftMiddle;\n                dataSource[4].tooltip = messages.alignCenterMiddle;\n                dataSource[5].tooltip = messages.alignRightMiddle;\n                dataSource[6].tooltip = messages.alignLeftBottom;\n                dataSource[7].tooltip = messages.alignCenterBottom;\n                dataSource[8].tooltip = messages.alignRightBottom;\n                dataSource[9].tooltip = messages.alignRemove;\n                this._initAlignmentDropDown(element, cellAlignmentDropDownSettings, 'alignment', data, cellView);\n            },\n            _initAccessibilityAlignmentDropDown: function (element, data) {\n                var messages = this.options.messages;\n                var accessibilityView = this.components.accessibilityView;\n                var dataSource = accessibilityAlignmentDropDownSettings.dataSource;\n                dataSource[0].tooltip = messages.alignLeftTop;\n                dataSource[1].tooltip = messages.alignCenterTop;\n                dataSource[2].tooltip = messages.alignRightTop;\n                dataSource[3].tooltip = messages.alignLeftBottom;\n                dataSource[4].tooltip = messages.alignCenterBottom;\n                dataSource[5].tooltip = messages.alignRightBottom;\n                dataSource[6].tooltip = messages.alignRemove;\n                this._initAlignmentDropDown(element, accessibilityAlignmentDropDownSettings, 'captionAlignment', data, accessibilityView);\n            },\n            _initAlignmentDropDown: function (element, settings, name, data, storage) {\n                var component = storage[name] = element.kendoDropDownList(settings).data('kendoDropDownList');\n                component.list.addClass('k-align').css('width', '110px');\n                this._setComponentValue(component, data, name);\n            },\n            _setComponentValue: function (component, data, property) {\n                if (property in data) {\n                    component.value(data[property]);\n                }\n            },\n            _initColorPicker: function (element, property, data, storage) {\n                var component = storage[property] = element.kendoColorPicker({\n                    buttons: false,\n                    clearButton: true\n                }).data('kendoColorPicker');\n                if (data[property]) {\n                    component.value(data[property]);\n                }\n            },\n            _initInput: function (element, property, data, storage) {\n                var component = storage[property] = element.get(0);\n                if (property in data) {\n                    component.value = data[property];\n                }\n            },\n            _initCheckbox: function (element, property, data, storage) {\n                var component = storage[property] = element.get(0);\n                if (property in data) {\n                    component.checked = data[property];\n                }\n            },\n            destroy: function () {\n                this._destroyComponents(this.components.tableView);\n                this._destroyComponents(this.components.cellView);\n                this._destroyComponents(this.components.accessibilityView);\n                this._destroyComponents(this.components);\n                delete this.components;\n            },\n            _destroyComponents: function (components) {\n                for (var widget in components) {\n                    if (components[widget].destroy) {\n                        components[widget].destroy();\n                    }\n                    delete components[widget];\n                }\n            },\n            _dialogTemplate: function (messages) {\n                return kendo.template(dialogTemplate)({ messages: messages });\n            }\n        });\n        kendo.ui.editor.TableWizardDialog = TableWizardDialog;\n    }(window.kendo.jQuery));\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.editor', [\n        'kendo.combobox',\n        'kendo.dropdownlist',\n        'kendo.resizable',\n        'kendo.window',\n        'kendo.colorpicker',\n        'kendo.imagebrowser',\n        'kendo.tabstrip',\n        'kendo.numerictextbox',\n        'util/undoredostack',\n        'editor/main',\n        'editor/dom',\n        'editor/serializer',\n        'editor/range',\n        'editor/system',\n        'editor/inlineformat',\n        'editor/formatblock',\n        'editor/linebreak',\n        'editor/lists',\n        'editor/link',\n        'editor/file',\n        'editor/image',\n        'editor/components',\n        'editor/indent',\n        'editor/viewhtml',\n        'editor/formatting',\n        'editor/toolbar',\n        'editor/tables',\n        'editor/export',\n        'editor/import',\n        'editor/resizing/column-resizing',\n        'editor/resizing/row-resizing',\n        'editor/resizing/table-resizing',\n        'editor/resizing/table-resize-handle',\n        'editor/immutables',\n        'editor/table-wizard/table-wizard-command',\n        'editor/table-wizard/table-wizard-dialog'\n    ], f);\n}(function () {\n    var __meta__ = {\n        id: 'editor',\n        name: 'Editor',\n        category: 'web',\n        description: 'Rich text editor component',\n        depends: [\n            'combobox',\n            'dropdownlist',\n            'window',\n            'colorpicker'\n        ],\n        features: [\n            {\n                id: 'editor-imagebrowser',\n                name: 'Image Browser',\n                description: 'Support for uploading and inserting images',\n                depends: ['imagebrowser']\n            },\n            {\n                id: 'editor-resizable',\n                name: 'Resize handle',\n                description: 'Support for resizing the content area via a resize handle',\n                depends: ['resizable']\n            },\n            {\n                id: 'editor-tablewizard',\n                name: 'Table wizard dialog',\n                description: 'Support for table properties configuration',\n                depends: [\n                    'tabstrip',\n                    'button',\n                    'numerictextbox'\n                ]\n            },\n            {\n                id: 'editor-pdf-export',\n                name: 'PDF export',\n                description: 'Export Editor content as PDF',\n                depends: [\n                    'pdf',\n                    'drawing'\n                ]\n            }\n        ]\n    };\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.maskedtextbox', ['kendo.core'], f);\n}(function () {\n    var __meta__ = {\n        id: 'maskedtextbox',\n        name: 'MaskedTextBox',\n        category: 'web',\n        description: 'The MaskedTextBox widget allows to specify a mask type on an input field.',\n        depends: ['core']\n    };\n    (function ($, undefined) {\n        var global = window;\n        var min = global.Math.min;\n        var kendo = global.kendo;\n        var caret = kendo.caret;\n        var keys = kendo.keys;\n        var ui = kendo.ui;\n        var Widget = ui.Widget;\n        var NS = '.kendoMaskedTextBox';\n        var proxy = $.proxy;\n        var setTimeout = window.setTimeout;\n        var STATEDISABLED = 'k-state-disabled';\n        var STATEINVALID = 'k-state-invalid';\n        var DISABLED = 'disabled';\n        var READONLY = 'readonly';\n        var CHANGE = 'change';\n        var MOUSEUP = 'mouseup';\n        var DROP = 'drop';\n        var KEYDOWN = 'keydown';\n        var PASTE = 'paste';\n        var INPUT = 'input';\n        function ns(name) {\n            return name + NS;\n        }\n        var INPUT_EVENT_NAME = ns(kendo.support.propertyChangeEvent ? 'propertychange' : INPUT);\n        function stringDiffStart(str1, str2) {\n            var i = 0;\n            while (i < str2.length) {\n                if (str1[i] !== str2[i]) {\n                    break;\n                }\n                i++;\n            }\n            return i;\n        }\n        var MaskedTextBox = Widget.extend({\n            init: function (element, options) {\n                var that = this;\n                var DOMElement;\n                Widget.fn.init.call(that, element, options);\n                that._rules = $.extend({}, that.rules, that.options.rules);\n                element = that.element;\n                DOMElement = element[0];\n                that._wrapper();\n                that._tokenize();\n                that._form();\n                that.element.addClass('k-textbox').attr('autocomplete', 'off').on('focus' + NS, function () {\n                    var value = DOMElement.value;\n                    if (!value) {\n                        DOMElement.value = that._old = that._emptyMask;\n                    } else {\n                        that._togglePrompt(true);\n                    }\n                    that._oldValue = value;\n                    that._timeoutId = setTimeout(function () {\n                        caret(element, 0, value ? that._maskLength : 0);\n                    });\n                }).on('focusout' + NS, function () {\n                    var value = element.val();\n                    clearTimeout(that._timeoutId);\n                    DOMElement.value = that._old = '';\n                    if (value !== that._emptyMask) {\n                        DOMElement.value = that._old = value;\n                    }\n                    that._change();\n                    that._togglePrompt();\n                });\n                var disabled = element.is('[disabled]') || $(that.element).parents('fieldset').is(':disabled');\n                if (disabled) {\n                    that.enable(false);\n                } else {\n                    that.readonly(element.is('[readonly]'));\n                }\n                that.value(that.options.value || element.val());\n                that._validationIcon = $('<span class=\\'k-icon k-i-warning\\'></span>').insertAfter(element);\n                kendo.notify(that);\n            },\n            options: {\n                name: 'MaskedTextBox',\n                clearPromptChar: false,\n                unmaskOnPost: false,\n                promptChar: '_',\n                culture: '',\n                rules: {},\n                value: '',\n                mask: ''\n            },\n            events: [CHANGE],\n            rules: {\n                '0': /\\d/,\n                '9': /\\d|\\s/,\n                '#': /\\d|\\s|\\+|\\-/,\n                'L': /[a-zA-Z]/,\n                '?': /[a-zA-Z]|\\s/,\n                '&': /\\S/,\n                'C': /./,\n                'A': /[a-zA-Z0-9]/,\n                'a': /[a-zA-Z0-9]|\\s/\n            },\n            setOptions: function (options) {\n                var that = this;\n                Widget.fn.setOptions.call(that, options);\n                that._rules = $.extend({}, that.rules, that.options.rules);\n                that._tokenize();\n                this._unbindInput();\n                this._bindInput();\n                that.value(that.element.val());\n            },\n            destroy: function () {\n                var that = this;\n                that.element.off(NS);\n                if (that._formElement) {\n                    that._formElement.off('reset', that._resetHandler);\n                    that._formElement.off('submit', that._submitHandler);\n                }\n                Widget.fn.destroy.call(that);\n            },\n            raw: function () {\n                var unmasked = this._unmask(this.element.val(), 0);\n                return unmasked.replace(new RegExp(this.options.promptChar, 'g'), '');\n            },\n            value: function (value) {\n                var element = this.element;\n                var emptyMask = this._emptyMask;\n                if (value === undefined) {\n                    return this.element.val();\n                }\n                if (value === null) {\n                    value = '';\n                }\n                if (!emptyMask) {\n                    this._oldValue = value;\n                    element.val(value);\n                    return;\n                }\n                value = this._unmask(value + '');\n                element.val(value ? emptyMask : '');\n                this._mask(0, this._maskLength, value);\n                this._unmaskedValue = null;\n                value = element.val();\n                this._oldValue = value;\n                if (kendo._activeElement() !== element) {\n                    if (value === emptyMask) {\n                        element.val('');\n                    } else {\n                        this._togglePrompt();\n                    }\n                }\n            },\n            _togglePrompt: function (show) {\n                var DOMElement = this.element[0];\n                var value = DOMElement.value;\n                if (this.options.clearPromptChar) {\n                    if (!show) {\n                        value = value.replace(new RegExp(this.options.promptChar, 'g'), ' ');\n                    } else {\n                        value = this._oldValue;\n                    }\n                    DOMElement.value = this._old = value;\n                }\n            },\n            readonly: function (readonly) {\n                this._editable({\n                    readonly: readonly === undefined ? true : readonly,\n                    disable: false\n                });\n            },\n            enable: function (enable) {\n                this._editable({\n                    readonly: false,\n                    disable: !(enable = enable === undefined ? true : enable)\n                });\n            },\n            _bindInput: function () {\n                var that = this;\n                if (that._maskLength) {\n                    if (that.options.$angular) {\n                        that.element.off(INPUT);\n                    }\n                    that.element.on(ns(KEYDOWN), proxy(that._keydown, that)).on(ns(DROP), proxy(that._drop, that)).on(ns(CHANGE), proxy(that._trackChange, that)).on(INPUT_EVENT_NAME, proxy(that._inputHandler, that));\n                    if (kendo.support.browser.msie) {\n                        var version = kendo.support.browser.version;\n                        if (version > 8 && version < 11) {\n                            var events = [\n                                ns(MOUSEUP),\n                                ns(DROP),\n                                ns(KEYDOWN),\n                                ns(PASTE)\n                            ].join(' ');\n                            that.element.on(events, proxy(that._legacyIEInputHandler, that));\n                        }\n                    }\n                }\n            },\n            _unbindInput: function () {\n                var events = [\n                    INPUT_EVENT_NAME,\n                    ns(KEYDOWN),\n                    ns(MOUSEUP),\n                    ns(DROP),\n                    ns(PASTE)\n                ].join(' ');\n                this.element.off(events);\n            },\n            _editable: function (options) {\n                var that = this;\n                var element = that.element;\n                var wrapper = that.wrapper;\n                var disable = options.disable;\n                var readonly = options.readonly;\n                that._unbindInput();\n                if (!readonly && !disable) {\n                    element.removeAttr(DISABLED).removeAttr(READONLY);\n                    wrapper.removeClass(STATEDISABLED);\n                    that._bindInput();\n                } else {\n                    element.attr(DISABLED, disable).attr(READONLY, readonly);\n                    wrapper.toggleClass(STATEDISABLED, disable);\n                }\n            },\n            _change: function () {\n                var that = this;\n                var value = that.value();\n                if (value !== that._oldValue) {\n                    that._oldValue = value;\n                    that.trigger(CHANGE);\n                    that.element.trigger(CHANGE);\n                } else if (value === '' && that.__changing) {\n                    that.element.trigger(CHANGE);\n                }\n            },\n            inputChange: function (backward) {\n                var that = this;\n                var old = that._old;\n                var element = that.element[0];\n                var value = element.value;\n                var selection = caret(element);\n                var cursor = selection[1];\n                var lengthDiff = value.length - old.length;\n                var mobile = kendo.support.mobileOS;\n                if (that.__dropping && lengthDiff < 0) {\n                    return;\n                }\n                if (lengthDiff === -1 && mobile.android && mobile.browser === 'chrome') {\n                    backward = true;\n                }\n                var contentStart = min(cursor, stringDiffStart(value, old));\n                var content = value.substring(contentStart, cursor);\n                element.value = value.substring(0, contentStart) + that._emptyMask.substring(contentStart);\n                var caretPos = that._mask(contentStart, cursor, content);\n                var endContent = that._trimStartPromptChars(value.substring(cursor), min(lengthDiff, caretPos - contentStart));\n                var unmasked = that._unmask(endContent, old.length - endContent.length);\n                that._mask(caretPos, caretPos, unmasked);\n                if (backward) {\n                    caretPos = that._findCaretPosBackwards(contentStart);\n                }\n                caret(element, caretPos);\n                that.__dropping = false;\n            },\n            _trimStartPromptChars: function (content, count) {\n                var promptChar = this.options.promptChar;\n                while (count-- > 0 && content.indexOf(promptChar) === 0) {\n                    content = content.substring(1);\n                }\n                return content;\n            },\n            _findCaretPosBackwards: function (pos) {\n                var caretStart = this._find(pos, true);\n                if (caretStart < pos) {\n                    caretStart += 1;\n                }\n                return caretStart;\n            },\n            _inputHandler: function () {\n                if (kendo._activeElement() !== this.element[0]) {\n                    return;\n                }\n                this.inputChange(this.__backward);\n            },\n            _legacyIEInputHandler: function (e) {\n                var that = this;\n                var input = that.element[0];\n                var value = input.value;\n                var type = e.type;\n                that.__pasting = type === 'paste';\n                setTimeout(function () {\n                    if (type === 'mouseup' && that.__pasting) {\n                        return;\n                    }\n                    if (input.value !== value) {\n                        that.inputChange(that.__backward);\n                    }\n                });\n            },\n            _trackChange: function () {\n                var that = this;\n                that.__changing = true;\n                setTimeout(function () {\n                    that.__changing = false;\n                });\n            },\n            _form: function () {\n                var that = this;\n                var element = that.element;\n                var formId = element.attr('form');\n                var form = formId ? $('#' + formId) : element.closest('form');\n                if (form[0]) {\n                    that._resetHandler = function () {\n                        setTimeout(function () {\n                            that.value(element[0].value);\n                        });\n                    };\n                    that._submitHandler = function () {\n                        that.element[0].value = that._old = that.raw();\n                    };\n                    if (that.options.unmaskOnPost) {\n                        form.on('submit', that._submitHandler);\n                    }\n                    that._formElement = form.on('reset', that._resetHandler);\n                }\n            },\n            _keydown: function (e) {\n                var key = e.keyCode;\n                this.__backward = key === keys.BACKSPACE;\n                if (key === keys.ENTER) {\n                    this._change();\n                }\n            },\n            _drop: function () {\n                this.__dropping = true;\n            },\n            _find: function (idx, backward) {\n                var value = this.element.val() || this._emptyMask;\n                var step = 1;\n                if (backward === true) {\n                    step = -1;\n                }\n                while (idx > -1 || idx <= this._maskLength) {\n                    if (value.charAt(idx) !== this.tokens[idx]) {\n                        return idx;\n                    }\n                    idx += step;\n                }\n                return -1;\n            },\n            _mask: function (start, end, value, backward) {\n                var element = this.element[0];\n                var current = element.value || this._emptyMask;\n                var empty = this.options.promptChar;\n                var valueLength;\n                var chrIdx = 0;\n                var unmasked;\n                var chr;\n                var idx;\n                start = this._find(start, backward);\n                if (start > end) {\n                    end = start;\n                }\n                unmasked = this._unmask(current.substring(end), end);\n                value = this._unmask(value, start);\n                valueLength = value.length;\n                if (value) {\n                    unmasked = unmasked.replace(new RegExp('^_{0,' + valueLength + '}'), '');\n                }\n                value += unmasked;\n                current = current.split('');\n                chr = value.charAt(chrIdx);\n                while (start < this._maskLength) {\n                    current[start] = chr || empty;\n                    chr = value.charAt(++chrIdx);\n                    if (idx === undefined && chrIdx > valueLength) {\n                        idx = start;\n                    }\n                    start = this._find(start + 1);\n                }\n                element.value = this._old = current.join('');\n                if (kendo._activeElement() === element) {\n                    if (idx === undefined) {\n                        idx = this._maskLength;\n                    }\n                    caret(element, idx);\n                }\n                return idx;\n            },\n            _unmask: function (value, idx) {\n                if (!value) {\n                    return '';\n                }\n                if (this._unmaskedValue === value) {\n                    return this._unmaskedValue;\n                }\n                value = (value + '').split('');\n                var chr;\n                var token;\n                var chrIdx = 0;\n                var tokenIdx = idx || 0;\n                var empty = this.options.promptChar;\n                var valueLength = value.length;\n                var tokensLength = this.tokens.length;\n                var result = '';\n                while (tokenIdx < tokensLength) {\n                    chr = value[chrIdx];\n                    token = this.tokens[tokenIdx];\n                    if (chr === token || chr === empty) {\n                        result += chr === empty ? empty : '';\n                        chrIdx += 1;\n                        tokenIdx += 1;\n                    } else if (typeof token !== 'string') {\n                        if (token && token.test && token.test(chr) || $.isFunction(token) && token(chr)) {\n                            result += chr;\n                            tokenIdx += 1;\n                        } else {\n                            if (valueLength === 1) {\n                                this._blinkInvalidState();\n                            }\n                        }\n                        chrIdx += 1;\n                    } else {\n                        tokenIdx += 1;\n                    }\n                    if (chrIdx >= valueLength) {\n                        break;\n                    }\n                }\n                this._unmaskedValue = result;\n                return result;\n            },\n            _wrapper: function () {\n                var that = this;\n                var element = that.element;\n                var DOMElement = element[0];\n                var wrapper = element.wrap('<span class=\\'k-widget k-maskedtextbox\\'></span>').parent();\n                wrapper[0].style.cssText = DOMElement.style.cssText;\n                DOMElement.style.width = '100%';\n                that.wrapper = wrapper.addClass(DOMElement.className);\n            },\n            _blinkInvalidState: function () {\n                var that = this;\n                that.wrapper.addClass(STATEINVALID);\n                clearTimeout(that._invalidStateTimeout);\n                that._invalidStateTimeout = setTimeout(proxy(that._removeInvalidState, that), 100);\n            },\n            _removeInvalidState: function () {\n                var that = this;\n                that.wrapper.removeClass(STATEINVALID);\n                that._invalidStateTimeout = null;\n            },\n            _tokenize: function () {\n                var tokens = [];\n                var tokenIdx = 0;\n                var mask = this.options.mask || '';\n                var maskChars = mask.split('');\n                var length = maskChars.length;\n                var idx = 0;\n                var chr;\n                var rule;\n                var emptyMask = '';\n                var promptChar = this.options.promptChar;\n                var numberFormat = kendo.getCulture(this.options.culture).numberFormat;\n                var rules = this._rules;\n                for (; idx < length; idx++) {\n                    chr = maskChars[idx];\n                    rule = rules[chr];\n                    if (rule) {\n                        tokens[tokenIdx] = rule;\n                        emptyMask += promptChar;\n                        tokenIdx += 1;\n                    } else {\n                        if (chr === '.' || chr === ',') {\n                            chr = numberFormat[chr];\n                        } else if (chr === '$') {\n                            chr = numberFormat.currency.symbol;\n                        } else if (chr === '\\\\') {\n                            idx += 1;\n                            chr = maskChars[idx];\n                        }\n                        chr = chr.split('');\n                        for (var i = 0, l = chr.length; i < l; i++) {\n                            tokens[tokenIdx] = chr[i];\n                            emptyMask += chr[i];\n                            tokenIdx += 1;\n                        }\n                    }\n                }\n                this.tokens = tokens;\n                this._emptyMask = emptyMask;\n                this._maskLength = emptyMask.length;\n            }\n        });\n        ui.plugin(MaskedTextBox);\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.toolbar', [\n        'kendo.core',\n        'kendo.userevents',\n        'kendo.popup'\n    ], f);\n}(function () {\n    var __meta__ = {\n        id: 'toolbar',\n        name: 'ToolBar',\n        category: 'web',\n        description: 'The ToolBar widget displays one or more command buttons divided into groups.',\n        depends: ['core']\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, Class = kendo.Class, Widget = kendo.ui.Widget, proxy = $.proxy, isFunction = kendo.isFunction, keys = kendo.keys, outerWidth = kendo._outerWidth, TOOLBAR = 'k-toolbar', BUTTON = 'k-button', OVERFLOW_BUTTON = 'k-overflow-button', TOGGLE_BUTTON = 'k-toggle-button', BUTTON_GROUP = 'k-button-group', SPLIT_BUTTON = 'k-split-button', SEPARATOR = 'k-separator', POPUP = 'k-popup', RESIZABLE_TOOLBAR = 'k-toolbar-resizable', STATE_ACTIVE = 'k-state-active', STATE_DISABLED = 'k-state-disabled', STATE_HIDDEN = 'k-state-hidden', GROUP_START = 'k-group-start', GROUP_END = 'k-group-end', PRIMARY = 'k-primary', ICON = 'k-icon', ICON_PREFIX = 'k-i-', BUTTON_ICON = 'k-button-icon', BUTTON_ICON_TEXT = 'k-button-icontext', LIST_CONTAINER = 'k-list-container k-split-container', SPLIT_BUTTON_ARROW = 'k-split-button-arrow', OVERFLOW_ANCHOR = 'k-overflow-anchor', OVERFLOW_CONTAINER = 'k-overflow-container', FIRST_TOOLBAR_VISIBLE = 'k-toolbar-first-visible', LAST_TOOLBAR_VISIBLE = 'k-toolbar-last-visible', CLICK = 'click', TOGGLE = 'toggle', OPEN = 'open', CLOSE = 'close', OVERFLOW_OPEN = 'overflowOpen', OVERFLOW_CLOSE = 'overflowClose', OVERFLOW_NEVER = 'never', OVERFLOW_AUTO = 'auto', OVERFLOW_ALWAYS = 'always', OVERFLOW_HIDDEN = 'k-overflow-hidden', KENDO_UID_ATTR = kendo.attr('uid');\n        kendo.toolbar = {};\n        var components = {\n            overflowAnchor: '<div tabindex=\"0\" class=\"k-overflow-anchor\"></div>',\n            overflowContainer: '<ul class=\"k-overflow-container k-list-container\"></ul>'\n        };\n        kendo.toolbar.registerComponent = function (name, toolbar, overflow) {\n            components[name] = {\n                toolbar: toolbar,\n                overflow: overflow\n            };\n        };\n        var Item = kendo.Class.extend({\n            addOverflowAttr: function () {\n                this.element.attr(kendo.attr('overflow'), this.options.overflow || OVERFLOW_AUTO);\n            },\n            addUidAttr: function () {\n                this.element.attr(KENDO_UID_ATTR, this.options.uid);\n            },\n            addIdAttr: function () {\n                if (this.options.id) {\n                    this.element.attr('id', this.options.id);\n                }\n            },\n            addOverflowIdAttr: function () {\n                if (this.options.id) {\n                    this.element.attr('id', this.options.id + '_overflow');\n                }\n            },\n            attributes: function () {\n                if (this.options.attributes) {\n                    this.element.attr(this.options.attributes);\n                }\n            },\n            show: function () {\n                this.element.removeClass(STATE_HIDDEN).show();\n                this.options.hidden = false;\n            },\n            hide: function () {\n                this.element.addClass(STATE_HIDDEN).hide();\n                this.options.hidden = true;\n            },\n            remove: function () {\n                this.element.remove();\n            },\n            enable: function (isEnabled) {\n                if (isEnabled === undefined) {\n                    isEnabled = true;\n                }\n                this.element.toggleClass(STATE_DISABLED, !isEnabled);\n                this.options.enable = isEnabled;\n            },\n            twin: function () {\n                var uid = this.element.attr(KENDO_UID_ATTR);\n                if (this.overflow) {\n                    return this.toolbar.element.find('[' + KENDO_UID_ATTR + '=\\'' + uid + '\\']').data(this.options.type);\n                } else if (this.toolbar.options.resizable) {\n                    return this.toolbar.popup.element.find('[' + KENDO_UID_ATTR + '=\\'' + uid + '\\']').data(this.options.type);\n                }\n            }\n        });\n        kendo.toolbar.Item = Item;\n        var Button = Item.extend({\n            init: function (options, toolbar) {\n                var element = options.useButtonTag ? $('<button tabindex=\"0\"></button>') : $('<a href tabindex=\"0\"></a>');\n                this.element = element;\n                this.options = options;\n                this.toolbar = toolbar;\n                this.attributes();\n                if (options.primary) {\n                    element.addClass(PRIMARY);\n                }\n                if (options.togglable) {\n                    element.addClass(TOGGLE_BUTTON);\n                    this.toggle(options.selected);\n                }\n                if (options.url !== undefined && !options.useButtonTag) {\n                    element.attr('href', options.url);\n                    if (options.mobile) {\n                        element.attr(kendo.attr('role'), 'button');\n                    }\n                }\n                if (options.group) {\n                    element.attr(kendo.attr('group'), options.group);\n                    this.group = this.toolbar.addToGroup(this, options.group);\n                }\n                if (!options.togglable && options.click && isFunction(options.click)) {\n                    this.clickHandler = options.click;\n                }\n                if (options.togglable && options.toggle && isFunction(options.toggle)) {\n                    this.toggleHandler = options.toggle;\n                }\n            },\n            toggle: function (state, propagate) {\n                state = !!state;\n                if (this.group && state) {\n                    this.group.select(this);\n                } else if (!this.group) {\n                    this.select(state);\n                }\n                if (propagate && this.twin()) {\n                    this.twin().toggle(state);\n                }\n            },\n            getParentGroup: function () {\n                if (this.options.isChild) {\n                    return this.element.closest('.' + BUTTON_GROUP).data('buttonGroup');\n                }\n            },\n            _addGraphics: function () {\n                var element = this.element, icon = this.options.icon, spriteCssClass = this.options.spriteCssClass, imageUrl = this.options.imageUrl, isEmpty, span, img;\n                if (spriteCssClass || imageUrl || icon) {\n                    isEmpty = true;\n                    element.contents().filter(function () {\n                        return !$(this).hasClass('k-sprite') && !$(this).hasClass(ICON) && !$(this).hasClass('k-image');\n                    }).each(function (idx, el) {\n                        if (el.nodeType == 1 || el.nodeType == 3 && $.trim(el.nodeValue).length > 0) {\n                            isEmpty = false;\n                        }\n                    });\n                    if (isEmpty) {\n                        element.addClass(BUTTON_ICON);\n                    } else {\n                        element.addClass(BUTTON_ICON_TEXT);\n                    }\n                }\n                if (icon) {\n                    span = element.children('span.' + ICON).first();\n                    if (!span[0]) {\n                        span = $('<span class=\"' + ICON + '\"></span>').prependTo(element);\n                    }\n                    span.addClass(ICON_PREFIX + icon);\n                } else if (spriteCssClass) {\n                    span = element.children('span.k-sprite').first();\n                    if (!span[0]) {\n                        span = $('<span class=\"k-sprite ' + ICON + '\"></span>').prependTo(element);\n                    }\n                    span.addClass(spriteCssClass);\n                } else if (imageUrl) {\n                    img = element.children('img.k-image').first();\n                    if (!img[0]) {\n                        img = $('<img alt=\"icon\" class=\"k-image\" />').prependTo(element);\n                    }\n                    img.attr('src', imageUrl);\n                }\n            }\n        });\n        kendo.toolbar.Button = Button;\n        var ToolBarButton = Button.extend({\n            init: function (options, toolbar) {\n                Button.fn.init.call(this, options, toolbar);\n                var element = this.element;\n                element.addClass(BUTTON);\n                this.addIdAttr();\n                if (options.align) {\n                    element.addClass('k-align-' + options.align);\n                }\n                if (options.showText != 'overflow' && options.text) {\n                    if (options.mobile) {\n                        element.html('<span class=\"km-text\">' + options.text + '</span>');\n                    } else {\n                        element.html(options.text);\n                    }\n                }\n                options.hasIcon = options.showIcon != 'overflow' && (options.icon || options.spriteCssClass || options.imageUrl);\n                if (options.hasIcon) {\n                    this._addGraphics();\n                }\n                this.addUidAttr();\n                this.addOverflowAttr();\n                this.enable(options.enable);\n                if (options.hidden) {\n                    this.hide();\n                }\n                this.element.data({\n                    type: 'button',\n                    button: this\n                });\n            },\n            select: function (selected) {\n                if (selected === undefined) {\n                    selected = false;\n                }\n                this.element.toggleClass(STATE_ACTIVE, selected);\n                this.options.selected = selected;\n            }\n        });\n        kendo.toolbar.ToolBarButton = ToolBarButton;\n        var OverflowButton = Button.extend({\n            init: function (options, toolbar) {\n                this.overflow = true;\n                Button.fn.init.call(this, options, toolbar);\n                var element = this.element;\n                if (options.showText != 'toolbar' && options.text) {\n                    if (options.mobile) {\n                        element.html('<span class=\"km-text\">' + options.text + '</span>');\n                    } else {\n                        element.html('<span class=\"k-text\">' + options.text + '</span>');\n                    }\n                }\n                options.hasIcon = options.showIcon != 'toolbar' && (options.icon || options.spriteCssClass || options.imageUrl);\n                if (options.hasIcon) {\n                    this._addGraphics();\n                }\n                if (!options.isChild) {\n                    this._wrap();\n                }\n                this.addOverflowIdAttr();\n                this.attributes();\n                this.addUidAttr();\n                this.addOverflowAttr();\n                this.enable(options.enable);\n                element.addClass(OVERFLOW_BUTTON + ' ' + BUTTON);\n                if (options.hidden) {\n                    this.hide();\n                }\n                if (options.togglable) {\n                    this.toggle(options.selected);\n                }\n                this.element.data({\n                    type: 'button',\n                    button: this\n                });\n            },\n            _wrap: function () {\n                this.element = this.element.wrap('<li></li>').parent();\n            },\n            overflowHidden: function () {\n                this.element.addClass(OVERFLOW_HIDDEN);\n            },\n            select: function (selected) {\n                if (selected === undefined) {\n                    selected = false;\n                }\n                if (this.options.isChild) {\n                    this.element.toggleClass(STATE_ACTIVE, selected);\n                } else {\n                    this.element.find('.k-button').toggleClass(STATE_ACTIVE, selected);\n                }\n                this.options.selected = selected;\n            }\n        });\n        kendo.toolbar.OverflowButton = OverflowButton;\n        kendo.toolbar.registerComponent('button', ToolBarButton, OverflowButton);\n        var ButtonGroup = Item.extend({\n            createButtons: function (buttonConstructor) {\n                var options = this.options;\n                var items = options.buttons || [];\n                var item;\n                for (var i = 0; i < items.length; i++) {\n                    if (!items[i].uid) {\n                        items[i].uid = kendo.guid();\n                    }\n                    item = new buttonConstructor($.extend({\n                        mobile: options.mobile,\n                        isChild: true,\n                        type: 'button'\n                    }, items[i]), this.toolbar);\n                    item.element.appendTo(this.element);\n                }\n            },\n            refresh: function () {\n                this.element.children().filter(':not(\\'.' + STATE_HIDDEN + '\\'):first').addClass(GROUP_START);\n                this.element.children().filter(':not(\\'.' + STATE_HIDDEN + '\\'):last').addClass(GROUP_END);\n            }\n        });\n        kendo.toolbar.ButtonGroup = ButtonGroup;\n        var ToolBarButtonGroup = ButtonGroup.extend({\n            init: function (options, toolbar) {\n                var element = this.element = $('<div></div>');\n                this.options = options;\n                this.toolbar = toolbar;\n                this.addIdAttr();\n                if (options.align) {\n                    element.addClass('k-align-' + options.align);\n                }\n                this.createButtons(ToolBarButton);\n                this.attributes();\n                this.addUidAttr();\n                this.addOverflowAttr();\n                this.refresh();\n                element.addClass(BUTTON_GROUP);\n                this.element.data({\n                    type: 'buttonGroup',\n                    buttonGroup: this\n                });\n            }\n        });\n        kendo.toolbar.ToolBarButtonGroup = ToolBarButtonGroup;\n        var OverflowButtonGroup = ButtonGroup.extend({\n            init: function (options, toolbar) {\n                var element = this.element = $('<li></li>');\n                this.options = options;\n                this.toolbar = toolbar;\n                this.overflow = true;\n                this.addOverflowIdAttr();\n                this.createButtons(OverflowButton);\n                this.attributes();\n                this.addUidAttr();\n                this.addOverflowAttr();\n                this.refresh();\n                element.addClass((options.mobile ? '' : BUTTON_GROUP) + ' k-overflow-group');\n                this.element.data({\n                    type: 'buttonGroup',\n                    buttonGroup: this\n                });\n            },\n            overflowHidden: function () {\n                this.element.addClass(OVERFLOW_HIDDEN);\n            }\n        });\n        kendo.toolbar.OverflowButtonGroup = OverflowButtonGroup;\n        kendo.toolbar.registerComponent('buttonGroup', ToolBarButtonGroup, OverflowButtonGroup);\n        var ToolBarSplitButton = Item.extend({\n            init: function (options, toolbar) {\n                var element = this.element = $('<div class=\"' + SPLIT_BUTTON + '\" tabindex=\"0\"></div>');\n                this.options = options;\n                this.toolbar = toolbar;\n                this.mainButton = new ToolBarButton($.extend({}, options, { hidden: false }), toolbar);\n                this.arrowButton = $('<a class=\"' + BUTTON + ' ' + SPLIT_BUTTON_ARROW + '\"><span class=\"' + (options.mobile ? 'km-icon km-arrowdown' : 'k-icon k-i-arrow-60-down') + '\"></span></a>');\n                this.popupElement = $('<ul class=\"' + LIST_CONTAINER + '\"></ul>');\n                this.mainButton.element.removeAttr('href tabindex').appendTo(element);\n                this.arrowButton.appendTo(element);\n                this.popupElement.appendTo(element);\n                if (options.align) {\n                    element.addClass('k-align-' + options.align);\n                }\n                if (!options.id) {\n                    options.id = options.uid;\n                }\n                element.attr('id', options.id + '_wrapper');\n                this.addOverflowAttr();\n                this.addUidAttr();\n                this.createMenuButtons();\n                this.createPopup();\n                this._navigatable();\n                this.mainButton.main = true;\n                this.enable(options.enable);\n                if (options.hidden) {\n                    this.hide();\n                }\n                element.data({\n                    type: 'splitButton',\n                    splitButton: this,\n                    kendoPopup: this.popup\n                });\n            },\n            _navigatable: function () {\n                var that = this;\n                that.popupElement.on('keydown', '.' + BUTTON, function (e) {\n                    var li = $(e.target).parent();\n                    e.preventDefault();\n                    if (e.keyCode === keys.ESC || e.keyCode === keys.TAB || e.altKey && e.keyCode === keys.UP) {\n                        that.toggle();\n                        that.focus();\n                    } else if (e.keyCode === keys.DOWN) {\n                        findFocusableSibling(li, 'next').focus();\n                    } else if (e.keyCode === keys.UP) {\n                        findFocusableSibling(li, 'prev').focus();\n                    } else if (e.keyCode === keys.SPACEBAR || e.keyCode === keys.ENTER) {\n                        that.toolbar.userEvents.trigger('tap', { target: $(e.target) });\n                    }\n                });\n            },\n            createMenuButtons: function () {\n                var options = this.options;\n                var items = options.menuButtons;\n                var item;\n                for (var i = 0; i < items.length; i++) {\n                    item = new ToolBarButton($.extend({\n                        mobile: options.mobile,\n                        type: 'button',\n                        click: options.click\n                    }, items[i]), this.toolbar);\n                    item.element.wrap('<li></li>').parent().appendTo(this.popupElement);\n                }\n            },\n            createPopup: function () {\n                var options = this.options;\n                var element = this.element;\n                this.popupElement.attr('id', options.id + '_optionlist').attr(KENDO_UID_ATTR, options.rootUid);\n                if (options.mobile) {\n                    this.popupElement = actionSheetWrap(this.popupElement);\n                }\n                this.popup = this.popupElement.kendoPopup({\n                    appendTo: options.mobile ? $(options.mobile).children('.km-pane') : null,\n                    anchor: element,\n                    isRtl: this.toolbar._isRtl,\n                    copyAnchorStyles: false,\n                    animation: options.animation,\n                    open: adjustPopupWidth,\n                    activate: function () {\n                        this.element.find(':kendoFocusable').first().focus();\n                    },\n                    close: function () {\n                        element.focus();\n                    }\n                }).data('kendoPopup');\n                this.popup.element.on(CLICK, 'a.k-button', preventClick);\n            },\n            remove: function () {\n                this.popup.element.off(CLICK, 'a.k-button');\n                this.popup.destroy();\n                this.element.remove();\n            },\n            toggle: function () {\n                this.popup.toggle();\n            },\n            enable: function (isEnabled) {\n                if (isEnabled === undefined) {\n                    isEnabled = true;\n                }\n                this.mainButton.enable(isEnabled);\n                this.options.enable = isEnabled;\n            },\n            focus: function () {\n                this.element.focus();\n            },\n            hide: function () {\n                if (this.popup) {\n                    this.popup.close();\n                }\n                this.element.addClass(STATE_HIDDEN).hide();\n                this.options.hidden = true;\n            },\n            show: function () {\n                this.element.removeClass(STATE_HIDDEN).hide();\n                this.options.hidden = false;\n            }\n        });\n        kendo.toolbar.ToolBarSplitButton = ToolBarSplitButton;\n        var OverflowSplitButton = Item.extend({\n            init: function (options, toolbar) {\n                var element = this.element = $('<li class=\"' + SPLIT_BUTTON + '\"></li>'), items = options.menuButtons, item;\n                this.options = options;\n                this.toolbar = toolbar;\n                this.overflow = true;\n                this.mainButton = new OverflowButton($.extend({ isChild: true }, options));\n                this.mainButton.element.appendTo(element);\n                for (var i = 0; i < items.length; i++) {\n                    item = new OverflowButton($.extend({\n                        mobile: options.mobile,\n                        isChild: true\n                    }, items[i]), this.toolbar);\n                    item.element.appendTo(element);\n                }\n                this.addUidAttr();\n                this.addOverflowAttr();\n                this.mainButton.main = true;\n                element.data({\n                    type: 'splitButton',\n                    splitButton: this\n                });\n            },\n            overflowHidden: function () {\n                this.element.addClass(OVERFLOW_HIDDEN);\n            }\n        });\n        kendo.toolbar.OverflowSplitButton = OverflowSplitButton;\n        kendo.toolbar.registerComponent('splitButton', ToolBarSplitButton, OverflowSplitButton);\n        var ToolBarSeparator = Item.extend({\n            init: function (options, toolbar) {\n                var element = this.element = $('<div>&nbsp;</div>');\n                this.element = element;\n                this.options = options;\n                this.toolbar = toolbar;\n                this.attributes();\n                this.addIdAttr();\n                this.addUidAttr();\n                this.addOverflowAttr();\n                element.addClass(SEPARATOR);\n                element.data({\n                    type: 'separator',\n                    separator: this\n                });\n            }\n        });\n        var OverflowSeparator = Item.extend({\n            init: function (options, toolbar) {\n                var element = this.element = $('<li>&nbsp;</li>');\n                this.element = element;\n                this.options = options;\n                this.toolbar = toolbar;\n                this.overflow = true;\n                this.attributes();\n                this.addUidAttr();\n                this.addOverflowIdAttr();\n                element.addClass(SEPARATOR);\n                element.data({\n                    type: 'separator',\n                    separator: this\n                });\n            },\n            overflowHidden: function () {\n                this.element.addClass(OVERFLOW_HIDDEN);\n            }\n        });\n        kendo.toolbar.registerComponent('separator', ToolBarSeparator, OverflowSeparator);\n        var TemplateItem = Item.extend({\n            init: function (template, options, toolbar) {\n                var element = isFunction(template) ? template(options) : template;\n                if (!(element instanceof jQuery)) {\n                    element = $('<div></div>').html(element);\n                } else {\n                    element = element.wrap('<div></div>').parent();\n                }\n                this.element = element;\n                this.options = options;\n                this.options.type = 'template';\n                this.toolbar = toolbar;\n                this.attributes();\n                this.addUidAttr();\n                this.addIdAttr();\n                this.addOverflowAttr();\n                element.data({\n                    type: 'template',\n                    template: this\n                });\n            }\n        });\n        kendo.toolbar.TemplateItem = TemplateItem;\n        var OverflowTemplateItem = Item.extend({\n            init: function (template, options, toolbar) {\n                var element = isFunction(template) ? $(template(options)) : $(template);\n                if (!(element instanceof jQuery)) {\n                    element = $('<li></li>').html(element);\n                } else {\n                    element = element.wrap('<li></li>').parent();\n                }\n                this.element = element;\n                this.options = options;\n                this.options.type = 'template';\n                this.toolbar = toolbar;\n                this.overflow = true;\n                this.attributes();\n                this.addUidAttr();\n                this.addOverflowIdAttr();\n                this.addOverflowAttr();\n                element.data({\n                    type: 'template',\n                    template: this\n                });\n            },\n            overflowHidden: function () {\n                this.element.addClass(OVERFLOW_HIDDEN);\n            }\n        });\n        kendo.toolbar.OverflowTemplateItem = OverflowTemplateItem;\n        function adjustPopupWidth() {\n            var anchor = this.options.anchor, computedWidth = outerWidth(anchor), width;\n            kendo.wrap(this.element).addClass('k-split-wrapper');\n            if (this.element.css('box-sizing') !== 'border-box') {\n                width = computedWidth - (outerWidth(this.element) - this.element.width());\n            } else {\n                width = computedWidth;\n            }\n            this.element.css({\n                fontFamily: anchor.css('font-family'),\n                'min-width': width\n            });\n        }\n        function toggleActive(e) {\n            if (!e.target.is('.k-toggle-button')) {\n                e.target.toggleClass(STATE_ACTIVE, e.type == 'press');\n            }\n        }\n        function actionSheetWrap(element) {\n            element = $(element);\n            return element.hasClass('km-actionsheet') ? element.closest('.km-popup-wrapper') : element.addClass('km-widget km-actionsheet').wrap('<div class=\"km-actionsheet-wrapper km-actionsheet-tablet km-widget km-popup\"></div>').parent().wrap('<div class=\"km-popup-wrapper k-popup\"></div>').parent();\n        }\n        function preventClick(e) {\n            e.preventDefault();\n        }\n        function findFocusableSibling(element, dir) {\n            var getSibling = dir === 'next' ? $.fn.next : $.fn.prev;\n            var getter = dir === 'next' ? $.fn.first : $.fn.last;\n            var candidate = getSibling.call(element);\n            if (candidate.is(':kendoFocusable') || !candidate.length) {\n                return candidate;\n            }\n            if (candidate.find(':kendoFocusable').length) {\n                return getter.call(candidate.find(':kendoFocusable'));\n            }\n            return findFocusableSibling(candidate, dir);\n        }\n        var Group = Class.extend({\n            init: function (name) {\n                this.name = name;\n                this.buttons = [];\n            },\n            add: function (button) {\n                this.buttons[this.buttons.length] = button;\n            },\n            remove: function (button) {\n                var index = $.inArray(button, this.buttons);\n                this.buttons.splice(index, 1);\n            },\n            select: function (button) {\n                var tmp;\n                for (var i = 0; i < this.buttons.length; i++) {\n                    tmp = this.buttons[i];\n                    tmp.select(false);\n                }\n                button.select(true);\n                if (button.twin()) {\n                    button.twin().select(true);\n                }\n            }\n        });\n        var ToolBar = Widget.extend({\n            init: function (element, options) {\n                var that = this;\n                Widget.fn.init.call(that, element, options);\n                options = that.options;\n                element = that.wrapper = that.element;\n                element.addClass(TOOLBAR + ' k-widget');\n                this.uid = kendo.guid();\n                this._isRtl = kendo.support.isRtl(element);\n                this._groups = {};\n                element.attr(KENDO_UID_ATTR, this.uid);\n                that.isMobile = typeof options.mobile === 'boolean' ? options.mobile : that.element.closest('.km-root')[0];\n                that.animation = that.isMobile ? { open: { effects: 'fade' } } : {};\n                if (that.isMobile) {\n                    element.addClass('km-widget');\n                    ICON = 'km-icon';\n                    ICON_PREFIX = 'km-';\n                    BUTTON = 'km-button';\n                    BUTTON_GROUP = 'km-buttongroup km-widget';\n                    STATE_ACTIVE = 'km-state-active';\n                    STATE_DISABLED = 'km-state-disabled';\n                }\n                if (options.resizable) {\n                    that._renderOverflow();\n                    element.addClass(RESIZABLE_TOOLBAR);\n                    that.overflowUserEvents = new kendo.UserEvents(that.element, {\n                        threshold: 5,\n                        allowSelection: true,\n                        filter: '.' + OVERFLOW_ANCHOR,\n                        tap: proxy(that._toggleOverflow, that)\n                    });\n                    that._resizeHandler = kendo.onResize(function () {\n                        that.resize();\n                    });\n                } else {\n                    that.popup = { element: $([]) };\n                }\n                if (options.items && options.items.length) {\n                    for (var i = 0; i < options.items.length; i++) {\n                        that.add(options.items[i]);\n                    }\n                }\n                that.userEvents = new kendo.UserEvents(document, {\n                    threshold: 5,\n                    allowSelection: true,\n                    filter: '[' + KENDO_UID_ATTR + '=' + this.uid + '] a.' + BUTTON + ', ' + '[' + KENDO_UID_ATTR + '=' + this.uid + '] .' + OVERFLOW_BUTTON,\n                    tap: proxy(that._buttonClick, that),\n                    press: toggleActive,\n                    release: toggleActive\n                });\n                that.element.on(CLICK, 'a.k-button', preventClick);\n                that._navigatable();\n                if (options.resizable) {\n                    that.popup.element.on(CLICK, +'a.k-button', preventClick);\n                }\n                if (options.resizable) {\n                    this._toggleOverflowAnchor();\n                }\n                kendo.notify(that);\n            },\n            events: [\n                CLICK,\n                TOGGLE,\n                OPEN,\n                CLOSE,\n                OVERFLOW_OPEN,\n                OVERFLOW_CLOSE\n            ],\n            options: {\n                name: 'ToolBar',\n                items: [],\n                resizable: true,\n                mobile: null\n            },\n            addToGroup: function (button, groupName) {\n                var group;\n                if (!this._groups[groupName]) {\n                    group = this._groups[groupName] = new Group();\n                } else {\n                    group = this._groups[groupName];\n                }\n                group.add(button);\n                return group;\n            },\n            destroy: function () {\n                var that = this;\n                that.element.find('.' + SPLIT_BUTTON).each(function (idx, element) {\n                    $(element).data('kendoPopup').destroy();\n                });\n                that.element.off(CLICK, 'a.k-button');\n                that.userEvents.destroy();\n                if (that.options.resizable) {\n                    kendo.unbindResize(that._resizeHandler);\n                    that.overflowUserEvents.destroy();\n                    that.popup.element.off(CLICK, 'a.k-button');\n                    that.popup.destroy();\n                }\n                Widget.fn.destroy.call(that);\n            },\n            add: function (options) {\n                var component = components[options.type], template = options.template, tool, that = this, itemClasses = that.isMobile ? '' : 'k-item k-state-default', overflowTemplate = options.overflowTemplate, overflowTool;\n                $.extend(options, {\n                    uid: kendo.guid(),\n                    animation: that.animation,\n                    mobile: that.isMobile,\n                    rootUid: that.uid\n                });\n                if (options.menuButtons) {\n                    for (var i = 0; i < options.menuButtons.length; i++) {\n                        $.extend(options.menuButtons[i], { uid: kendo.guid() });\n                    }\n                }\n                if (template && !overflowTemplate) {\n                    options.overflow = OVERFLOW_NEVER;\n                } else if (!options.overflow) {\n                    options.overflow = OVERFLOW_AUTO;\n                }\n                if (options.overflow !== OVERFLOW_NEVER && that.options.resizable) {\n                    if (overflowTemplate) {\n                        overflowTool = new OverflowTemplateItem(overflowTemplate, options, that);\n                    } else if (component) {\n                        overflowTool = new component.overflow(options, that);\n                        overflowTool.element.addClass(itemClasses);\n                    }\n                    if (overflowTool) {\n                        if (options.overflow === OVERFLOW_AUTO) {\n                            overflowTool.overflowHidden();\n                        }\n                        overflowTool.element.appendTo(that.popup.container);\n                        that.angular('compile', function () {\n                            return { elements: overflowTool.element.get() };\n                        });\n                    }\n                }\n                if (options.overflow !== OVERFLOW_ALWAYS) {\n                    if (template) {\n                        tool = new TemplateItem(template, options, that);\n                    } else if (component) {\n                        tool = new component.toolbar(options, that);\n                    }\n                    if (tool) {\n                        if (that.options.resizable) {\n                            tool.element.appendTo(that.element).css('visibility', 'hidden');\n                            that._shrink(that.element.innerWidth());\n                            tool.element.css('visibility', 'visible');\n                        } else {\n                            tool.element.appendTo(that.element);\n                        }\n                        that.angular('compile', function () {\n                            return { elements: tool.element.get() };\n                        });\n                    }\n                }\n            },\n            _getItem: function (candidate) {\n                var element, toolbarItem, overflowItem, isResizable = this.options.resizable, type;\n                element = this.element.find(candidate);\n                if (!element.length) {\n                    element = $('.k-split-container[data-uid=' + this.uid + ']').find(candidate);\n                }\n                type = element.length ? element.data('type') : '';\n                toolbarItem = element.data(type);\n                if (toolbarItem) {\n                    if (toolbarItem.main) {\n                        element = element.parent('.' + SPLIT_BUTTON);\n                        type = 'splitButton';\n                        toolbarItem = element.data(type);\n                    }\n                    if (isResizable) {\n                        overflowItem = toolbarItem.twin();\n                    }\n                } else if (isResizable) {\n                    element = this.popup.element.find(candidate);\n                    type = element.length ? element.data('type') : '';\n                    overflowItem = element.data(type);\n                    if (overflowItem && overflowItem.main) {\n                        element = element.parent('.' + SPLIT_BUTTON);\n                        type = 'splitButton';\n                        overflowItem = element.data(type);\n                    }\n                }\n                return {\n                    type: type,\n                    toolbar: toolbarItem,\n                    overflow: overflowItem\n                };\n            },\n            remove: function (candidate) {\n                var item = this._getItem(candidate);\n                if (item.toolbar) {\n                    item.toolbar.remove();\n                }\n                if (item.overflow) {\n                    item.overflow.remove();\n                }\n                this.resize(true);\n            },\n            hide: function (candidate) {\n                var item = this._getItem(candidate);\n                if (item.toolbar) {\n                    if (item.toolbar.options.type === 'button' && item.toolbar.options.isChild) {\n                        item.toolbar.hide();\n                        item.toolbar.getParentGroup().refresh();\n                    } else if (!item.toolbar.options.hidden) {\n                        item.toolbar.hide();\n                    }\n                }\n                if (item.overflow) {\n                    if (item.overflow.options.type === 'button' && item.overflow.options.isChild) {\n                        item.overflow.hide();\n                        item.overflow.getParentGroup().refresh();\n                    } else if (!item.overflow.options.hidden) {\n                        item.overflow.hide();\n                    }\n                }\n                this.resize(true);\n            },\n            show: function (candidate) {\n                var item = this._getItem(candidate);\n                if (item.toolbar) {\n                    if (item.toolbar.options.type === 'button' && item.toolbar.options.isChild) {\n                        item.toolbar.show();\n                        item.toolbar.getParentGroup().refresh();\n                    } else if (item.toolbar.options.hidden) {\n                        item.toolbar.show();\n                    }\n                }\n                if (item.overflow) {\n                    if (item.overflow.options.type === 'button' && item.overflow.options.isChild) {\n                        item.toolbar.show();\n                        item.overflow.getParentGroup().refresh();\n                    } else if (item.overflow.options.hidden) {\n                        item.overflow.show();\n                    }\n                }\n                this.resize(true);\n            },\n            enable: function (element, enable) {\n                var item = this._getItem(element);\n                if (typeof enable == 'undefined') {\n                    enable = true;\n                }\n                if (item.toolbar) {\n                    item.toolbar.enable(enable);\n                }\n                if (item.overflow) {\n                    item.overflow.enable(enable);\n                }\n            },\n            getSelectedFromGroup: function (groupName) {\n                return this.element.find('.' + TOGGLE_BUTTON + '[data-group=\\'' + groupName + '\\']').filter('.' + STATE_ACTIVE);\n            },\n            toggle: function (button, checked) {\n                var element = $(button), item = element.data('button');\n                if (item.options.togglable) {\n                    if (checked === undefined) {\n                        checked = true;\n                    }\n                    item.toggle(checked, true);\n                }\n            },\n            _renderOverflow: function () {\n                var that = this, overflowContainer = components.overflowContainer, isRtl = that._isRtl, horizontalDirection = isRtl ? 'left' : 'right';\n                that.overflowAnchor = $(components.overflowAnchor).addClass(BUTTON);\n                that.element.append(that.overflowAnchor);\n                if (that.isMobile) {\n                    that.overflowAnchor.append('<span class=\"km-icon km-more\"></span>');\n                    overflowContainer = actionSheetWrap(overflowContainer);\n                } else {\n                    that.overflowAnchor.append('<span class=\"k-icon k-i-arrow-60-down\"></span>');\n                }\n                that.popup = new kendo.ui.Popup(overflowContainer, {\n                    origin: 'bottom ' + horizontalDirection,\n                    position: 'top ' + horizontalDirection,\n                    anchor: that.overflowAnchor,\n                    isRtl: isRtl,\n                    animation: that.animation,\n                    appendTo: that.isMobile ? $(that.isMobile).children('.km-pane') : null,\n                    copyAnchorStyles: false,\n                    open: function (e) {\n                        var wrapper = kendo.wrap(that.popup.element).addClass('k-overflow-wrapper');\n                        if (!that.isMobile) {\n                            wrapper.css('margin-left', (isRtl ? -1 : 1) * ((outerWidth(wrapper) - wrapper.width()) / 2 + 1));\n                        } else {\n                            that.popup.container.css('max-height', parseFloat($('.km-content:visible').innerHeight()) - 15 + 'px');\n                        }\n                        if (that.trigger(OVERFLOW_OPEN)) {\n                            e.preventDefault();\n                        }\n                    },\n                    activate: function () {\n                        this.element.find(':kendoFocusable').first().focus();\n                    },\n                    close: function (e) {\n                        if (that.trigger(OVERFLOW_CLOSE)) {\n                            e.preventDefault();\n                        }\n                        this.element.focus();\n                    }\n                });\n                that.popup.element.on('keydown', '.' + BUTTON, function (e) {\n                    var target = $(e.target), li = target.parent(), isComplexTool = li.is('.' + BUTTON_GROUP) || li.is('.' + SPLIT_BUTTON), element;\n                    e.preventDefault();\n                    if (e.keyCode === keys.ESC || e.keyCode === keys.TAB || e.altKey && e.keyCode === keys.UP) {\n                        that._toggleOverflow();\n                        that.overflowAnchor.focus();\n                    } else if (e.keyCode === keys.DOWN) {\n                        element = !isComplexTool || isComplexTool && target.is(':last-child') ? li : target;\n                        findFocusableSibling(element, 'next').focus();\n                    } else if (e.keyCode === keys.UP) {\n                        element = !isComplexTool || isComplexTool && target.is(':first-child') ? li : target;\n                        findFocusableSibling(element, 'prev').focus();\n                    } else if (e.keyCode === keys.SPACEBAR || e.keyCode === keys.ENTER) {\n                        that.userEvents.trigger('tap', { target: $(e.target) });\n                    }\n                });\n                if (that.isMobile) {\n                    that.popup.container = that.popup.element.find('.' + OVERFLOW_CONTAINER);\n                } else {\n                    that.popup.container = that.popup.element;\n                }\n                that.popup.container.attr(KENDO_UID_ATTR, this.uid);\n            },\n            _toggleOverflowAnchor: function () {\n                var hasVisibleChildren = false;\n                if (this.options.mobile) {\n                    hasVisibleChildren = this.popup.element.find('.' + OVERFLOW_CONTAINER).children(':not(.' + OVERFLOW_HIDDEN + ', .' + POPUP + ')').length > 0;\n                } else {\n                    hasVisibleChildren = this.popup.element.children(':not(.' + OVERFLOW_HIDDEN + ', .' + POPUP + ')').length > 0;\n                }\n                if (hasVisibleChildren) {\n                    this.overflowAnchor.css({\n                        visibility: 'visible',\n                        width: ''\n                    });\n                } else {\n                    this.overflowAnchor.css({\n                        visibility: 'hidden',\n                        width: '1px'\n                    });\n                }\n            },\n            _buttonClick: function (e) {\n                var that = this, popup, target, item, splitContainer, isSplitButtonArrow = e.target.closest('.' + SPLIT_BUTTON_ARROW).length, handler, eventData, urlTarget;\n                e.preventDefault();\n                if (isSplitButtonArrow) {\n                    that._toggle(e);\n                    return;\n                }\n                target = $(e.target).closest('.' + BUTTON, that.element);\n                if (target.hasClass(OVERFLOW_ANCHOR)) {\n                    return;\n                }\n                item = target.data('button');\n                if (!item && that.popup) {\n                    target = $(e.target).closest('.' + OVERFLOW_BUTTON, that.popup.container);\n                    item = target.parent('li').data('button');\n                }\n                if (!item || !item.options.enable) {\n                    return;\n                }\n                if (item.options.togglable) {\n                    handler = isFunction(item.toggleHandler) ? item.toggleHandler : null;\n                    item.toggle(!item.options.selected, true);\n                    eventData = {\n                        target: target,\n                        group: item.options.group,\n                        checked: item.options.selected,\n                        id: item.options.id\n                    };\n                    if (handler) {\n                        handler.call(that, eventData);\n                    }\n                    that.trigger(TOGGLE, eventData);\n                } else {\n                    handler = isFunction(item.clickHandler) ? item.clickHandler : null;\n                    eventData = {\n                        sender: that,\n                        target: target,\n                        id: item.options.id\n                    };\n                    if (handler) {\n                        handler.call(that, eventData);\n                    }\n                    that.trigger(CLICK, eventData);\n                }\n                if (item.options.url) {\n                    if (item.options.attributes && item.options.attributes.target) {\n                        urlTarget = item.options.attributes.target;\n                    }\n                    window.open(item.options.url, urlTarget || '_self');\n                }\n                if (target.hasClass(OVERFLOW_BUTTON)) {\n                    that.popup.close();\n                }\n                splitContainer = target.closest('.k-split-container');\n                if (splitContainer[0]) {\n                    popup = splitContainer.data('kendoPopup');\n                    (popup ? popup : splitContainer.parents('.km-popup-wrapper').data('kendoPopup')).close();\n                }\n            },\n            _navigatable: function () {\n                var that = this;\n                that.element.attr('tabindex', 0).focus(function () {\n                    var element = $(this).find(':kendoFocusable:first');\n                    if (element.length === 0) {\n                        return;\n                    }\n                    if (element.is('.' + OVERFLOW_ANCHOR)) {\n                        element = findFocusableSibling(element, 'next');\n                    }\n                    element[0].focus();\n                }).on('keydown', proxy(that._keydown, that));\n            },\n            _keydown: function (e) {\n                var target = $(e.target), keyCode = e.keyCode, items = this.element.children(':not(.k-separator):visible');\n                if (keyCode === keys.TAB) {\n                    var element = target.parentsUntil(this.element).last(), lastHasFocus = false, firstHasFocus = false;\n                    if (!element.length) {\n                        element = target;\n                    }\n                    if (element.is('.' + OVERFLOW_ANCHOR)) {\n                        if (e.shiftKey) {\n                            e.preventDefault();\n                        }\n                        if (items.last().is(':kendoFocusable')) {\n                            items.last().focus();\n                        } else {\n                            items.last().find(':kendoFocusable').last().focus();\n                        }\n                    }\n                    if (!e.shiftKey && items.index(element) === items.length - 1) {\n                        if (element.is('.' + BUTTON_GROUP)) {\n                            lastHasFocus = target.is(':last-child');\n                        } else {\n                            lastHasFocus = true;\n                        }\n                    }\n                    var isFirstTool = items.index(element) === items.not('.k-overflow-anchor').first().index();\n                    if (e.shiftKey && isFirstTool) {\n                        if (element.is('.' + BUTTON_GROUP)) {\n                            firstHasFocus = target.is(':first-child');\n                        } else {\n                            firstHasFocus = true;\n                        }\n                    }\n                    if (lastHasFocus && this.overflowAnchor && this.overflowAnchor.css('visibility') !== 'hidden') {\n                        e.preventDefault();\n                        this.overflowAnchor.focus();\n                    }\n                    if (firstHasFocus) {\n                        e.preventDefault();\n                        var prevFocusable = this._getPrevFocusable(this.wrapper);\n                        if (prevFocusable) {\n                            prevFocusable.focus();\n                        }\n                    }\n                }\n                if (e.altKey && keyCode === keys.DOWN) {\n                    var splitButton = $(document.activeElement).data('splitButton');\n                    var isOverflowAnchor = $(document.activeElement).is('.' + OVERFLOW_ANCHOR);\n                    if (splitButton) {\n                        splitButton.toggle();\n                    } else if (isOverflowAnchor) {\n                        this._toggleOverflow();\n                    }\n                    return;\n                }\n                if ((keyCode === keys.SPACEBAR || keyCode === keys.ENTER) && !target.is('input, checkbox')) {\n                    e.preventDefault();\n                    if (target.is('.' + SPLIT_BUTTON)) {\n                        target = target.children().first();\n                    }\n                    this.userEvents.trigger('tap', { target: target });\n                    return;\n                }\n            },\n            _getPrevFocusable: function (element) {\n                if (element.is('html')) {\n                    return element;\n                }\n                var elementToFocus, prevElement, prevElements = element.prevAll();\n                prevElements.each(function () {\n                    prevElement = $(this);\n                    if (prevElement.is(':kendoFocusable')) {\n                        elementToFocus = prevElement;\n                        return false;\n                    } else if (prevElement.find(':kendoFocusable').length > 0) {\n                        elementToFocus = prevElement.find(':kendoFocusable').last();\n                        return false;\n                    }\n                });\n                if (elementToFocus) {\n                    return elementToFocus;\n                } else {\n                    return this._getPrevFocusable(element.parent());\n                }\n            },\n            _toggle: function (e) {\n                var splitButton = $(e.target).closest('.' + SPLIT_BUTTON).data('splitButton'), isDefaultPrevented;\n                e.preventDefault();\n                if (!splitButton.options.enable) {\n                    return;\n                }\n                if (splitButton.popup.element.is(':visible')) {\n                    isDefaultPrevented = this.trigger(CLOSE, { target: splitButton.element });\n                } else {\n                    isDefaultPrevented = this.trigger(OPEN, { target: splitButton.element });\n                }\n                if (!isDefaultPrevented) {\n                    splitButton.toggle();\n                }\n            },\n            _toggleOverflow: function () {\n                this.popup.toggle();\n            },\n            _resize: function (e) {\n                var containerWidth = e.width;\n                if (!this.options.resizable) {\n                    return;\n                }\n                this.popup.close();\n                this._shrink(containerWidth);\n                this._stretch(containerWidth);\n                this._markVisibles();\n                this._toggleOverflowAnchor();\n            },\n            _childrenWidth: function () {\n                var childrenWidth = 0;\n                this.element.children(':visible:not(\\'.' + STATE_HIDDEN + '\\')').each(function () {\n                    childrenWidth += outerWidth($(this), true);\n                });\n                return Math.ceil(childrenWidth);\n            },\n            _shrink: function (containerWidth) {\n                var commandElement, visibleCommands;\n                if (containerWidth < this._childrenWidth()) {\n                    visibleCommands = this.element.children(':visible:not([data-overflow=\\'never\\'], .' + OVERFLOW_ANCHOR + ')');\n                    for (var i = visibleCommands.length - 1; i >= 0; i--) {\n                        commandElement = visibleCommands.eq(i);\n                        if (containerWidth > this._childrenWidth()) {\n                            break;\n                        } else {\n                            this._hideItem(commandElement);\n                        }\n                    }\n                }\n            },\n            _stretch: function (containerWidth) {\n                var commandElement, hiddenCommands;\n                if (containerWidth > this._childrenWidth()) {\n                    hiddenCommands = this.element.children(':hidden:not(\\'.' + STATE_HIDDEN + '\\')');\n                    for (var i = 0; i < hiddenCommands.length; i++) {\n                        commandElement = hiddenCommands.eq(i);\n                        if (containerWidth < this._childrenWidth() || !this._showItem(commandElement, containerWidth)) {\n                            break;\n                        }\n                    }\n                }\n            },\n            _hideItem: function (item) {\n                item.hide();\n                if (this.popup) {\n                    this.popup.container.find('>li[data-uid=\\'' + item.data('uid') + '\\']').removeClass(OVERFLOW_HIDDEN);\n                }\n            },\n            _showItem: function (item, containerWidth) {\n                if (item.length && containerWidth > this._childrenWidth() + outerWidth(item, true)) {\n                    item.show();\n                    if (this.popup) {\n                        this.popup.container.find('>li[data-uid=\\'' + item.data('uid') + '\\']').addClass(OVERFLOW_HIDDEN);\n                    }\n                    return true;\n                }\n                return false;\n            },\n            _markVisibles: function () {\n                var overflowItems = this.popup.container.children(), toolbarItems = this.element.children(':not(.k-overflow-anchor)'), visibleOverflowItems = overflowItems.filter(':not(.k-overflow-hidden)'), visibleToolbarItems = toolbarItems.filter(':visible');\n                overflowItems.add(toolbarItems).removeClass(FIRST_TOOLBAR_VISIBLE + ' ' + LAST_TOOLBAR_VISIBLE);\n                visibleOverflowItems.first().add(visibleToolbarItems.first()).addClass(FIRST_TOOLBAR_VISIBLE);\n                visibleOverflowItems.last().add(visibleToolbarItems.last()).addClass(LAST_TOOLBAR_VISIBLE);\n            }\n        });\n        kendo.ui.plugin(ToolBar);\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.mediaplayer', [\n        'kendo.slider',\n        'kendo.toolbar',\n        'kendo.dropdownlist',\n        'kendo.tooltip'\n    ], f);\n}(function () {\n    var __meta__ = {\n        id: 'mediaplayer',\n        name: 'MediaPlayer',\n        category: 'web',\n        description: '',\n        depends: [\n            'slider',\n            'toolbar',\n            'dropdownlist',\n            'tooltip'\n        ]\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, END = 'end', PAUSE = 'pause', PLAY = 'play', READY = 'ready', TIMECHANGE = 'timeChange', VOLUMECHANGE = 'volumeChange', FULLSCREEN_ENTER = 'k-i-full-screen', FULLSCREEN_EXIT = 'k-i-full-screen-exit', MUTE = 'k-i-volume-off', LOW_VOLUME = 'k-i-volume-down', HIGH_VOLUME = 'k-i-volume-up', VIDEO_QUALITY = 'k-mediaplayer-quality', STATE_PLAY = 'k-i-play', STATE_PAUSE = 'k-i-pause', TITLEBAR = 'k-mediaplayer-titlebar', TITLE = 'k-title', TOOLBARWRAP = 'k-mediaplayer-toolbar-wrap', TOOLBAR = 'k-mediaplayer-toolbar', SLIDER = 'k-mediaplayer-seekbar', VOLUME_SLIDER = 'k-mediaplayer-volume', MEDIA = 'k-mediaplayer-media', OVERLAY = 'k-mediaplayer-overlay', YTPLAYER = 'k-mediaplayer-yt', DOT = '.', ui = kendo.ui, ns = '.kendoMediaPlayer', baseTime = new Date(1970, 0, 1), timeZoneSec = baseTime.getTimezoneOffset() * 60, Widget = kendo.ui.Widget, isArray = $.isArray, timeFormats = {\n                shortTime: 'mm:ss',\n                longTime: 'HH:mm:ss'\n            }, template = kendo.template, proxy = $.proxy, keys = kendo.keys, templates = {\n                htmlPlayer: '<video class=\\'' + MEDIA + '\\'> </video>',\n                titleBar: template('<div class=\\'' + TITLEBAR + '\\' role=\\'heading\\'><span class=\\'' + TITLE + '\\'>Video Title</span></div>'),\n                toolBar: '<div class=\\'' + TOOLBARWRAP + '\\'><div class=\\'' + TOOLBAR + '\\'></div></div>',\n                youtubePlayer: '<div class=\\'' + YTPLAYER + '\\'> </div>',\n                toolBarTime: '<span class=\\'k-mediaplayer-currenttime\\'>00:00:00</span> / <span class=\\'k-mediaplayer-duration\\'>00:00:00</span>',\n                slider: '<input class=\\'' + SLIDER + '\\' value=\\'0\\' title=\\'seekbar\\' />',\n                volumeSlider: '<input class=\\'' + VOLUME_SLIDER + '\\' title=\\'volume\\'/>',\n                qualityDropDown: '<input class=\\'' + VIDEO_QUALITY + '\\' title=\\'video quality\\' />',\n                toolTip: '#= kendo.toString(new Date(value), \\'HH:mm:ss\\') #'\n            };\n        var MediaPlayer = Widget.extend({\n            init: function (element, options) {\n                this.wrapper = $(element);\n                Widget.fn.init.call(this, element, options);\n                this.wrapper.addClass('k-mediaplayer k-widget');\n                options = this.options;\n                this._currentIndex = 0;\n                this._createTitlebar();\n                this._createToolbar();\n                this._createDropDown();\n                this._createSlider();\n                this._createVolumeSlider();\n                this._timers = {};\n                this._aria();\n                this._navigatable();\n                if (options.media) {\n                    this.media(this.options.media);\n                }\n                kendo.notify(this);\n            },\n            events: [\n                END,\n                PAUSE,\n                PLAY,\n                READY,\n                TIMECHANGE,\n                VOLUMECHANGE\n            ],\n            options: {\n                name: 'MediaPlayer',\n                autoPlay: false,\n                autoRepeat: false,\n                volume: 100,\n                fullScreen: false,\n                mute: false,\n                navigatable: false,\n                forwardSeek: true,\n                media: null,\n                messages: {\n                    'pause': 'Pause',\n                    'play': 'Play',\n                    'mute': 'Mute',\n                    'unmute': 'Unmute',\n                    'quality': 'Quality',\n                    'fullscreen': 'Full Screen'\n                }\n            },\n            _msToTime: function (ms) {\n                var time = new Date(baseTime.getTime());\n                time.setSeconds(ms);\n                return time;\n            },\n            _timeToSec: function (time) {\n                var curTime = new Date(time).getTime();\n                return curTime / 1000;\n            },\n            _createTitlebar: function () {\n                this._titleBar = this.wrapper.find(DOT + TITLEBAR);\n                if (this._titleBar.length === 0) {\n                    this.wrapper.append(templates.titleBar);\n                    this._titleBar = this.wrapper.find(DOT + TITLEBAR);\n                }\n            },\n            _createSlider: function () {\n                var sliderElement = this.wrapper.find(DOT + SLIDER);\n                if (!this._slider) {\n                    this._sliderDragChangeHandler = proxy(this._sliderDragChange, this);\n                    this._sliderDraggingHandler = proxy(this._sliderDragging, this);\n                    sliderElement = this.wrapper.find(DOT + SLIDER);\n                    this._slider = new ui.Slider(sliderElement[0], {\n                        smallStep: 1000,\n                        tickPlacement: 'none',\n                        showButtons: false,\n                        change: this._sliderDragChangeHandler,\n                        slide: this._sliderDraggingHandler,\n                        tooltip: { template: templates.toolTip },\n                        dragHandleTitle: ''\n                    });\n                }\n            },\n            _createVolumeSlider: function () {\n                var volumeSliderElement = this.wrapper.find(DOT + VOLUME_SLIDER);\n                if (!this._volumeSlider) {\n                    this._volumeDraggingHandler = proxy(this._volumeDragging, this);\n                    this._volumeChangeHandler = proxy(this._volumeChange, this);\n                    volumeSliderElement.width(87);\n                    this._volumeSlider = new ui.Slider(volumeSliderElement[0], {\n                        smallStep: 1,\n                        min: 0,\n                        max: 100,\n                        value: this.options.volume,\n                        slide: this._volumeDraggingHandler,\n                        change: this._volumeChangeHandler,\n                        tickPlacement: 'none',\n                        showButtons: false,\n                        tooltip: { enabled: false },\n                        dragHandleTitle: ''\n                    });\n                }\n            },\n            _resetTime: function () {\n                if (this._youTubeVideo) {\n                    this._ytmedia.seekTo(0, true);\n                } else {\n                    this._media.currentTime = 0;\n                }\n                this._mediaTimeUpdate();\n                $.grep(this._toolBar.options.items, function (e) {\n                    return !!e.template;\n                }).template = templates.toolBarTime;\n            },\n            _currentUrl: function () {\n                var media = this.media();\n                return isArray(media.source) ? media.source[this._currentIndex].url : media.source;\n            },\n            _isYouTubeUrl: function () {\n                return !!this._currentUrl().match('youtube.com/|youtu.be/');\n            },\n            _setPlayerUrl: function () {\n                var oldPlayer = this._youTubeVideo;\n                this.stop();\n                this._youTubeVideo = this._isYouTubeUrl();\n                if (oldPlayer !== this._youTubeVideo) {\n                    this.wrapper.find(DOT + YTPLAYER).toggle();\n                    this.wrapper.find(DOT + MEDIA).toggle();\n                }\n                var initialized = this._media || this._ytmedia;\n                this._initializePlayer();\n                if (initialized) {\n                    this.mute(this.mute());\n                    this.volume(this.volume());\n                }\n                if (!this._youTubeVideo) {\n                    this._videoOverlay.show();\n                    this.wrapper.find(DOT + MEDIA + ' > source').remove();\n                    this.wrapper.find(DOT + MEDIA).attr('src', this._currentUrl());\n                    if (this.options.autoPlay) {\n                        this.play();\n                    }\n                } else if (this._ytmedia) {\n                    if (this._videoOverlay) {\n                        this._videoOverlay.hide();\n                    }\n                    if (this.options.autoPlay) {\n                        this._ytmedia.loadVideoById(this._getMediaId());\n                        this._playStateToggle(true);\n                    } else {\n                        this._ytmedia.cueVideoById(this._getMediaId());\n                        this._playStateToggle(true);\n                    }\n                }\n            },\n            _createToolbar: function () {\n                var toolBarElement = this.wrapper.find(DOT + TOOLBAR);\n                if (toolBarElement.length === 0) {\n                    this._toolbarClickHandler = proxy(this._toolbarClick, this);\n                    this.wrapper.append(templates.toolBar);\n                    toolBarElement = this.wrapper.find(DOT + TOOLBAR);\n                    toolBarElement.width(this.wrapper.find(DOT + MEDIA).width());\n                    this._toolBar = new ui.ToolBar(toolBarElement, {\n                        click: this._toolbarClickHandler,\n                        resizable: false,\n                        items: [\n                            {\n                                type: 'button',\n                                attributes: { 'class': 'k-play-button' },\n                                icon: 'play'\n                            },\n                            {\n                                template: templates.toolBarTime,\n                                attributes: { 'class': 'k-mediaplayer-currenttime-wrap' }\n                            },\n                            {\n                                type: 'separator',\n                                attributes: { 'class': 'k-toolbar-spacer' }\n                            },\n                            {\n                                type: 'button',\n                                attributes: { 'class': 'k-volume-button' },\n                                icon: 'volume-up'\n                            },\n                            {\n                                template: templates.volumeSlider,\n                                attributes: { 'class': 'k-mediaplayer-volume-wrap' }\n                            },\n                            {\n                                template: templates.qualityDropDown,\n                                attributes: { 'class': 'k-mediaplayer-quality-wrap' }\n                            },\n                            {\n                                type: 'button',\n                                attributes: { 'class': 'k-fullscreen-button' },\n                                icon: 'full-screen'\n                            }\n                        ]\n                    });\n                    this._toolBar.wrapper.off('keydown');\n                    toolBarElement.before(templates.slider);\n                    this._volumeButton = toolBarElement.find('.k-volume-button');\n                    this._fullscreenButton = toolBarElement.find('.k-fullscreen-button');\n                    this._volumeButton.attr('title', this.options.mute ? this.options.messages.unmute : this.options.messages.mute);\n                    this._volumeButton.attr('aria-label', this.options.mute ? this.options.messages.unmute : this.options.messages.mute);\n                    this._fullscreenButton.attr('title', this.options.messages.fullscreen);\n                    this._fullscreenButton.attr('aria-label', this.options.messages.fullscreen);\n                    toolBarElement.width('auto');\n                    this._currentTimeElement = toolBarElement.find('.k-mediaplayer-currenttime');\n                    this._durationElement = toolBarElement.find('.k-mediaplayer-duration');\n                    this._playButton = toolBarElement.find('.k-play-button');\n                    this._playButtonSpan = this._playButton.find('.k-i-play');\n                    if (this.options.autoPlay) {\n                        this._playStateToggle(true);\n                    }\n                    $([\n                        this._volumeButton[0],\n                        toolBarElement.find('.k-mediaplayer-volume-wrap')[0],\n                        toolBarElement.find('.k-mediaplayer-quality-wrap')[0],\n                        this._fullscreenButton[0]\n                    ]).wrapAll('<div class=\\'k-align-right\\' />');\n                    toolBarElement.find('.k-button').addClass('k-bare');\n                }\n            },\n            _createDropDown: function () {\n                var dropDownElement = this.wrapper.find(DOT + VIDEO_QUALITY);\n                var media = this.media();\n                if (typeof dropDownElement.data('kendoDropDownList') === 'undefined') {\n                    this._dropDownSelectHandler = proxy(this._dropDownSelect, this);\n                    this._dropDown = new ui.DropDownList(dropDownElement, {\n                        dataTextField: 'quality',\n                        dataValueField: 'url',\n                        popup: {\n                            position: 'bottom',\n                            origin: 'top',\n                            appendTo: this.wrapper\n                        },\n                        animation: {\n                            open: {\n                                effects: 'slideIn:up',\n                                duration: 1\n                            }\n                        },\n                        select: this._dropDownSelectHandler\n                    });\n                    if (media && isArray(media.source)) {\n                        this._dropDown.setDataSource(media.source);\n                        this._dropDown.select(0);\n                    }\n                    this._dropDown.wrapper.addClass('k-button k-bare');\n                    this._dropDown.wrapper.attr('title', this.options.messages.quality).hide();\n                    this._dropDown.wrapper.find('span.k-i-arrow-60-down').removeClass('k-i-arrow-60-down').addClass('k-icon k-i-hd');\n                    this._dropDown.list.addClass('k-quality-list');\n                }\n            },\n            _dropDownSelect: function (e) {\n                if (this._currentIndex !== e.item.index()) {\n                    this._currentIndex = e.item.index();\n                    this._setPlayerUrl();\n                }\n            },\n            _toolbarClick: function (e) {\n                var target = $(e.target).children().first();\n                var isPaused = target.hasClass(STATE_PLAY);\n                if (!this.media()) {\n                    return;\n                }\n                if (target.hasClass(STATE_PLAY) || target.hasClass(STATE_PAUSE)) {\n                    if (isPaused) {\n                        this.play();\n                    } else {\n                        this.pause();\n                    }\n                }\n                if (target.hasClass(FULLSCREEN_ENTER) || target.hasClass(FULLSCREEN_EXIT)) {\n                    if (this._isInFullScreen) {\n                        target.removeClass(FULLSCREEN_EXIT).addClass(FULLSCREEN_ENTER);\n                        this.fullScreen(false);\n                    } else {\n                        target.removeClass(FULLSCREEN_ENTER).addClass(FULLSCREEN_EXIT);\n                        this.fullScreen(true);\n                    }\n                }\n                if (target.hasClass(MUTE) || target.hasClass(LOW_VOLUME) || target.hasClass(HIGH_VOLUME)) {\n                    var muted = this.mute();\n                    this.mute(!muted);\n                }\n            },\n            _sliderDragging: function () {\n                if (!this.media()) {\n                    return;\n                }\n                this._isDragging = true;\n            },\n            _sliderDragChange: function (e) {\n                var that = this;\n                var slider = e.sender;\n                var tzOffset = timeZoneSec * 1000;\n                if (!this.media()) {\n                    return;\n                }\n                that._sliderChangeFired = true;\n                that._isDragging = false;\n                if (!this.options.forwardSeek && slider.value() > this._seekBarLastPosition) {\n                    setTimeout(function () {\n                        slider.value(that._seekBarLastPosition);\n                    }, 1);\n                } else if (this._youTubeVideo) {\n                    that._ytmedia.seekTo(that._timeToSec(e.value - tzOffset));\n                } else {\n                    that._media.currentTime = that._timeToSec(e.value - tzOffset);\n                }\n                that.trigger(TIMECHANGE);\n                that._preventPlay = true;\n            },\n            _changeVolumeButtonImage: function (volume) {\n                var volumeButton = this._volumeButton;\n                var volumeElement = volumeButton.find('span');\n                var cssClass = volumeElement.attr('class');\n                cssClass = cssClass.substring(0, cssClass.lastIndexOf(' '));\n                if (volume === 0) {\n                    volumeElement.attr('class', cssClass + ' ' + MUTE);\n                    volumeButton.attr('title', this.options.messages.unmute);\n                    volumeButton.attr('aria-label', this.options.messages.unmute);\n                } else if (volume > 0 && volume < 51) {\n                    volumeElement.attr('class', cssClass + ' ' + LOW_VOLUME);\n                    volumeButton.attr('title', this.options.messages.mute);\n                    volumeButton.attr('aria-label', this.options.messages.mute);\n                } else {\n                    volumeElement.attr('class', cssClass + ' ' + HIGH_VOLUME);\n                    volumeButton.attr('title', this.options.messages.mute);\n                    volumeButton.attr('aria-label', this.options.messages.mute);\n                }\n            },\n            _volumeDragging: function (e) {\n                if (!this.media()) {\n                    return;\n                }\n                this.volume(e.value);\n                this._changeVolumeButtonImage(e.value);\n                this.trigger(VOLUMECHANGE);\n            },\n            _volumeChange: function (e) {\n                if (!this.media()) {\n                    return;\n                }\n                this.volume(e.value);\n                this._changeVolumeButtonImage(e.value);\n                this.trigger(VOLUMECHANGE);\n            },\n            _mediaTimeUpdate: function () {\n                var currentTime = this._youTubeVideo ? this._ytmedia.getCurrentTime() : this._media.currentTime;\n                var timeInMs = this._msToTime(currentTime);\n                this._currentTimeElement.text(kendo.toString(timeInMs, this._timeFormat));\n                if (!this._isDragging) {\n                    this._seekBarLastPosition = (currentTime + timeZoneSec) * 1000;\n                    this._slider.value(this._seekBarLastPosition);\n                }\n                return this.isPlaying();\n            },\n            _playStateToggle: function (play) {\n                if (typeof play === 'undefined') {\n                    play = this._playButtonSpan.is(DOT + STATE_PLAY);\n                }\n                if (play) {\n                    this._playButtonSpan.removeClass(STATE_PLAY).addClass(STATE_PAUSE);\n                    this._playButton.attr('title', this.options.messages.pause);\n                    this._playButton.attr('aria-label', this.options.messages.pause);\n                } else {\n                    this._playButtonSpan.removeClass(STATE_PAUSE).addClass(STATE_PLAY);\n                    this._playButton.attr('title', this.options.messages.play);\n                    this._playButton.attr('aria-label', this.options.messages.play);\n                }\n            },\n            _mediaEnded: function () {\n                this._playStateToggle(false);\n                this._currentTimeElement.text(kendo.toString(this._msToTime(0), this._timeFormat));\n                this._slider.value((0 + timeZoneSec) * 1000);\n                this.trigger(END);\n            },\n            _mediaPlay: function () {\n                this.trigger(PLAY);\n            },\n            _mediaReady: function () {\n                this.trigger(READY);\n            },\n            _mediaDurationChange: function () {\n                var durationTime = this._msToTime(this._youTubeVideo ? this._ytmedia.getDuration() : this._media.duration);\n                this._timeFormat = durationTime.getHours() === 0 ? timeFormats.shortTime : timeFormats.longTime;\n                this._durationElement.text(kendo.toString(durationTime, this._timeFormat));\n                this._slider.setOptions({\n                    min: baseTime.getTime(),\n                    max: durationTime.getTime()\n                });\n                if (!this._isFirstRun) {\n                    this._resetTime();\n                    this._isFirstRun = true;\n                }\n            },\n            _createYoutubePlayer: function () {\n                this._mediaTimeUpdateHandler = proxy(this._mediaTimeUpdate, this);\n                this._mediaDurationChangeHandler = proxy(this._mediaDurationChange, this);\n                this.wrapper.prepend(templates.youtubePlayer);\n                this._ytPlayer = this.wrapper.find(DOT + YTPLAYER)[0];\n                $(this._ytPlayer).css({\n                    width: this.wrapper.width(),\n                    height: this.wrapper.height()\n                });\n                if (!window.YT || !window.YT.Player) {\n                    if (!window.onYouTubeIframeAPIReadyRegister) {\n                        window.onYouTubeIframeAPIReadyRegister = [];\n                        $.getScript('https://www.youtube.com/iframe_api');\n                        window.onYouTubeIframeAPIReady = function () {\n                            if (window.onYouTubeIframeAPIReadyRegister) {\n                                for (var i = 0; i < window.onYouTubeIframeAPIReadyRegister.length; i++) {\n                                    window.onYouTubeIframeAPIReadyRegister[i]._youtubeApiReady();\n                                }\n                            }\n                            window.onYouTubeIframeAPIReadyRegister.length = 0;\n                            window.onYouTubeIframeAPIReadyRegister = undefined;\n                        };\n                    }\n                    window.onYouTubeIframeAPIReadyRegister[window.onYouTubeIframeAPIReadyRegister.length] = this;\n                } else {\n                    this._configurePlayer();\n                }\n            },\n            _poll: function (name, callback, interval, context) {\n                var that = this;\n                if (that._timers[name] !== null) {\n                    clearTimeout(that._timers[name]);\n                }\n                that._timers[name] = setTimeout(function (context) {\n                    return function callLater() {\n                        if (callback.call(context)) {\n                            that._timers[name] = setTimeout(callLater, interval);\n                        }\n                    };\n                }(context), interval);\n                return that._timers[name];\n            },\n            _youtubeApiReady: function () {\n                this._configurePlayer();\n            },\n            _configurePlayer: function () {\n                var vars = {\n                    'autoplay': +this.options.autoPlay,\n                    'wmode': 'transparent',\n                    'controls': 0,\n                    'rel': 0,\n                    'showinfo': 0\n                };\n                this._onYouTubePlayerReady = proxy(this._onYouTubePlayerReady, this);\n                window.onYouTubePlayerReady = this._onYouTubePlayerReady;\n                this._onPlayerStateChangeHandler = proxy(this._onPlayerStateChange, this);\n                window.onPlayerStateChange = this._onPlayerStateChange;\n                var player = new window.YT.Player(this.wrapper.find(DOT + YTPLAYER)[0], {\n                    height: this.wrapper.height(),\n                    width: this.wrapper.width(),\n                    videoId: this._getMediaId(),\n                    playerVars: vars,\n                    events: {\n                        'onReady': this._onYouTubePlayerReady,\n                        'onStateChange': this._onPlayerStateChangeHandler\n                    }\n                });\n            },\n            _onYouTubePlayerReady: function (event) {\n                this._ytmedia = event.target;\n                this._ytmedia.getIframe().style.width = '100%';\n                this._ytmedia.getIframe().style.height = '100%';\n                this._youTubeVideo = true;\n                this._mediaDurationChangeHandler();\n                if (this.options.autoPlay) {\n                    this._playStateToggle(true);\n                    this._ytmedia.loadVideoById(this._getMediaId());\n                } else {\n                    this._ytmedia.cueVideoById(this._getMediaId());\n                }\n                if (this.options.mute) {\n                    this.mute(true);\n                }\n                this.trigger(READY);\n            },\n            _updateTitle: function () {\n                this.titlebar().text(this.media().title || this.media().source);\n            },\n            _onPlayerStateChange: function (event) {\n                if (event.data === 0) {\n                    this._slider.value(0);\n                    this._paused = false;\n                    this._playStateToggle(true);\n                    this.trigger(END);\n                    if (this.options.autoRepeat) {\n                        this.play();\n                    }\n                } else if (event.data === 1) {\n                    this._mediaDurationChange();\n                    this._ytmedia.setVolume(this.volume());\n                    if (this._sliderChangeFired) {\n                        this._sliderChangeFired = false;\n                    } else {\n                        this._uiDisplay(false);\n                    }\n                    this.trigger(PLAY);\n                    this._playStateToggle(true);\n                    this._poll('progress', this._mediaTimeUpdate, 500, this);\n                    this._paused = false;\n                } else if (event.data === 2) {\n                    if (!this._paused) {\n                        this._uiDisplay(true);\n                        this._playStateToggle(false);\n                        this.trigger(PAUSE);\n                        this._paused = true;\n                    }\n                }\n            },\n            _getMediaId: function () {\n                var result = this._currentUrl();\n                var regExp = /^.*((youtu.be\\/)|(v\\/)|(\\/u\\/\\w\\/)|(embed\\/)|(watch\\?))\\??v?=?([^#\\&\\?]*).*/;\n                var match = result.match(regExp);\n                if (match && match[7].length === 11) {\n                    result = match[7];\n                }\n                return result;\n            },\n            _mouseClick: function () {\n                if (this.isPaused()) {\n                    this.play();\n                } else {\n                    this.pause();\n                }\n            },\n            _initializePlayer: function () {\n                if (!this._mouseMoveHandler) {\n                    this._mouseMoveHandler = proxy(this._mouseMove, this);\n                    this._mouseInHandler = proxy(this._mouseIn, this);\n                    this._mouseOutHandler = proxy(this._mouseOut, this);\n                    $(this.wrapper).on('mouseenter' + ns, this._mouseInHandler).on('mouseleave' + ns, this._mouseOutHandler).on('mousemove' + ns, this._mouseMoveHandler);\n                }\n                if (!this._ytmedia && this._youTubeVideo) {\n                    this._createYoutubePlayer();\n                } else if (!this._media && !this._youTubeVideo) {\n                    this._createHtmlPlayer();\n                }\n            },\n            _createHtmlPlayer: function () {\n                if (!this._videoOverlay) {\n                    this._mouseClickHanlder = proxy(this._mouseClick, this);\n                    this.wrapper.append('<div class=\\'' + OVERLAY + '\\'></div>');\n                    this._videoOverlay = this.wrapper.find('.k-mediaplayer-overlay').on('click' + ns, this._mouseClickHanlder);\n                }\n                this._mediaTimeUpdateHandler = proxy(this._mediaTimeUpdate, this);\n                this._mediaDurationChangeHandler = proxy(this._mediaDurationChange, this);\n                this._mediaEndedHandler = proxy(this._mediaEnded, this);\n                this._mediaCanPlayHandler = proxy(this._mediaReady, this);\n                this._mediaPlayHandler = proxy(this._mediaPlay, this);\n                this._videoOverlay.after(templates.htmlPlayer);\n                this._media = this.wrapper.find(DOT + MEDIA)[0];\n                $(this._media).css({\n                    width: '100%',\n                    height: '100%'\n                });\n                if (this.options.mute) {\n                    this.mute(true);\n                }\n                this._media.ontimeupdate = this._mediaTimeUpdateHandler;\n                this._media.ondurationchange = this._mediaDurationChangeHandler;\n                this._media.oncanplay = this._mediaCanPlayHandler;\n                this._media.onplay = this._mediaPlayHandler;\n                this._media.onended = this._mediaEndedHandler;\n            },\n            _mouseIn: function () {\n                this._uiDisplay(true);\n            },\n            _mouseOut: function () {\n                this._poll('mouseIdle', this._mouseIdle, 3000, this);\n            },\n            _mouseIdle: function () {\n                this._uiDisplay(false);\n                return false;\n            },\n            _mouseMove: function () {\n                if (!(this._titleBar.is(':animated') || this._toolBar.element.is(':animated') || this._slider.wrapper.is(':animated'))) {\n                    this._uiDisplay(true);\n                }\n                this._poll('mouseIdle', this._mouseIdle, 3000, this);\n            },\n            _uiDisplay: function (state) {\n                var animationSpeed = 'slow';\n                var uiElements = this._titleBar.add(this._toolBar.element.parent());\n                if (state) {\n                    uiElements.fadeIn(animationSpeed);\n                } else {\n                    uiElements.fadeOut(animationSpeed);\n                }\n            },\n            setOptions: function (options) {\n                Widget.fn.setOptions.call(this, options);\n            },\n            destroy: function () {\n                Widget.fn.destroy.call(this);\n                if (!this.isPaused()) {\n                    this.pause();\n                }\n                this.element.off(ns);\n                this.element.find(DOT + OVERLAY).off(ns);\n                this._timers = null;\n                this._mouseMoveHandler = null;\n                this._mouseOutHandler = null;\n                this._mouseInHandler = null;\n                this._mouseClickHanlder = null;\n                this._keyDownHandler = null;\n                this._fullscreenHandler = null;\n                this._toolbarClickHandler = null;\n                this._sliderDragChangeHandler = null;\n                this._sliderDraggingHandler = null;\n                this._volumeDraggingHandler = null;\n                this._volumeChangeHandler = null;\n                this._youtubeApiReadyHandler = null;\n                this._onYouTubePlayerReady = null;\n                this._onPlayerStateChangeHandler = null;\n                this._dropDownSelectHandler = null;\n                if (this._youTubeVideo) {\n                    this._ytmedia.destroy();\n                } else {\n                    this._media.ontimeupdate = this._mediaTimeUpdateHandler = null;\n                    this._media.ondurationchange = this._mediaDurationChangeHandler = null;\n                    this._media.oncanplay = this._mediaCanPlayHandler = null;\n                    this._media.onplay = this._mediaPlayHandler = null;\n                    this._media.onended = this._mediaEndedHandler = null;\n                    this._media.src = '';\n                    this._media.remove();\n                }\n                this._mouseMoveTimer = null;\n                clearTimeout(this._mouseMoveTimer);\n                kendo.destroy(this.element);\n            },\n            seek: function (ms) {\n                if (typeof ms === 'undefined') {\n                    return 1000 * this._youTubeVideo ? this._ytmedia.getCurrentTime() : this._media ? this._media.currentTime : 0;\n                }\n                var seconds = ms / 1000;\n                if (this._youTubeVideo) {\n                    if (seconds + 3 >= this._ytmedia.getDuration() | 0) {\n                        this._ytmedia.seekTo(this._ytmedia.getDuration() - 3 | 0, true);\n                    } else {\n                        this._ytmedia.seekTo(seconds, true);\n                    }\n                } else {\n                    this._media.currentTime = seconds;\n                }\n                return this;\n            },\n            play: function () {\n                if (this._youTubeVideo) {\n                    this._ytmedia.playVideo();\n                } else {\n                    if (kendo.support.mobileOS) {\n                        this._uiDisplay(false);\n                    }\n                    this._media.play();\n                }\n                this._paused = false;\n                this._playStateToggle(true);\n                return this;\n            },\n            stop: function () {\n                if (this._youTubeVideo && this._ytmedia) {\n                    this._ytmedia.stopVideo();\n                } else if (this._media && !this._youTubeVideo) {\n                    if (kendo.support.mobileOS) {\n                        this._uiDisplay(true);\n                    }\n                    this._media.pause();\n                    this._media.currentTime = 0;\n                }\n                this._paused = true;\n                this._playStateToggle(false);\n                return this;\n            },\n            pause: function () {\n                if (this._youTubeVideo) {\n                    this._ytmedia.pauseVideo();\n                } else {\n                    if (kendo.support.mobileOS) {\n                        this._uiDisplay(true);\n                    }\n                    this._media.pause();\n                }\n                this._paused = true;\n                this._playStateToggle(false);\n                this.trigger(PAUSE);\n                return this;\n            },\n            toolbar: function () {\n                return this._toolBar;\n            },\n            dropdown: function () {\n                return this._dropDown;\n            },\n            titlebar: function () {\n                return this._titleBar;\n            },\n            fullScreen: function (enterFullScreen) {\n                if (typeof enterFullScreen === 'undefined') {\n                    return this._isInFullScreen || false;\n                }\n                var element = this.element.get(0);\n                if (enterFullScreen) {\n                    this.element.addClass('k-mediaplayer-fullscreen');\n                    if (element.requestFullscreen) {\n                        element.requestFullscreen();\n                    } else if (element.webkitRequestFullscreen) {\n                        element.webkitRequestFullscreen();\n                    } else if (element.mozRequestFullScreen) {\n                        element.mozRequestFullScreen();\n                    } else if (element.msRequestFullscreen) {\n                        element.msRequestFullscreen();\n                    }\n                    this._isInFullScreen = true;\n                } else {\n                    if (document.cancelFullscreen) {\n                        document.cancelFullscreen();\n                    } else if (document.webkitCancelFullScreen) {\n                        document.webkitCancelFullScreen();\n                    } else if (document.mozCancelFullScreen) {\n                        document.mozCancelFullScreen();\n                    } else if (document.msCancelFullscreen) {\n                        document.msCancelFullscreen();\n                    } else if (document.exitFullscreen) {\n                        document.exitFullscreen();\n                    } else if (document.msExitFullscreen) {\n                        document.msExitFullscreen();\n                    }\n                    this.element.removeClass('k-mediaplayer-fullscreen');\n                    this._isInFullScreen = false;\n                }\n                this._slider.resize();\n            },\n            volume: function (value) {\n                if (typeof value === 'undefined') {\n                    return typeof this._volume !== 'undefined' ? this._volume : this._volume = this.options.volume;\n                }\n                this._volume = value;\n                this.mute(value <= 0);\n                if (this._youTubeVideo) {\n                    this._ytmedia.setVolume(this._volume);\n                } else {\n                    this._media.volume = this._volume / 100;\n                }\n                this._volumeSlider.value(value);\n            },\n            mute: function (muted) {\n                var currentState = this._youTubeVideo ? this._ytmedia && this._ytmedia.isMuted() : this._media && this._media.muted;\n                if (typeof muted === 'undefined' || muted === currentState) {\n                    return currentState;\n                }\n                if (this._youTubeVideo) {\n                    if (muted) {\n                        this._ytmedia.mute();\n                    } else {\n                        this._ytmedia.unMute();\n                    }\n                } else {\n                    this._media.muted = muted;\n                }\n                if (muted) {\n                    this._volumeSlider.value(0);\n                } else {\n                    this._volumeSlider.value(this._media && this._media.volume * 100 || this._ytmedia && this._ytmedia.getVolume());\n                }\n                this.trigger(VOLUMECHANGE);\n                this._changeVolumeButtonImage(this._volumeSlider.value());\n            },\n            isEnded: function () {\n                if (this._youTubeVideo) {\n                    return this._ytmedia.getPlayerState() === 0;\n                } else {\n                    return this._media.ended;\n                }\n            },\n            media: function (value) {\n                var dropdown = this.dropdown();\n                if (typeof value === 'undefined') {\n                    return typeof this._mediaData !== 'undefined' ? this._mediaData : this._mediaData = this.options.media;\n                }\n                if (isArray(value.source)) {\n                    dropdown.setDataSource(value.source);\n                    dropdown.wrapper.show();\n                } else {\n                    dropdown.wrapper.hide();\n                }\n                this._mediaData = value;\n                this._updateTitle();\n                this._setPlayerUrl();\n            },\n            isPaused: function () {\n                return this._paused;\n            },\n            isPlaying: function () {\n                return !this.isEnded() && !this._paused;\n            },\n            _aria: function () {\n                this.wrapper.attr('role', 'region');\n            },\n            _navigatable: function () {\n                this._fullscreenHandler = proxy(this._fullscreen, this);\n                $(document).on('webkitfullscreenchange mozfullscreenchange fullscreenchange' + ns, this._fullscreenHandler);\n                if (this.options.navigatable) {\n                    this.wrapper.attr('tabIndex', 0);\n                    this._keyDownHandler = proxy(this._keyDown, this);\n                    this.wrapper.on('keydown' + ns, this._keyDownHandler);\n                }\n            },\n            _fullscreen: function () {\n                var isFullScreen = document.fullScreen || document.mozFullScreen || document.webkitIsFullScreen;\n                this._uiDisplay(true);\n                this._slider.resize();\n                if (!isFullScreen) {\n                    this.wrapper.find('span[class*=\"k-i-fullscreen\"]').removeClass(FULLSCREEN_EXIT).addClass(FULLSCREEN_ENTER);\n                    this.fullScreen(false);\n                }\n            },\n            _keyDown: function (e) {\n                e.preventDefault();\n                var fsButton = this.wrapper.find('span[class*=\"k-i-fullscreen\"]');\n                if (e.keyCode === keys.SPACEBAR) {\n                    if (this.isPlaying()) {\n                        this.pause();\n                    } else {\n                        this.play();\n                    }\n                } else if (e.keyCode === keys.ENTER && !this._isInFullScreen) {\n                    fsButton.removeClass(FULLSCREEN_ENTER).addClass(FULLSCREEN_EXIT);\n                    this.fullScreen(true);\n                } else if (e.keyCode === 77) {\n                    var muted = this.mute();\n                    this.mute(!muted);\n                } else if (e.keyCode === keys.ESC && this._isInFullScreen) {\n                    fsButton.removeClass(FULLSCREEN_EXIT).addClass(FULLSCREEN_ENTER);\n                    this.fullScreen(false);\n                }\n            },\n            _error: function () {\n            },\n            _progress: function () {\n            }\n        });\n        ui.plugin(MediaPlayer);\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define === 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.pivotgrid', [\n        'kendo.dom',\n        'kendo.data'\n    ], f);\n}(function () {\n    var __meta__ = {\n        id: 'pivotgrid',\n        name: 'PivotGrid',\n        category: 'web',\n        description: 'The PivotGrid widget is a data summarization tool.',\n        depends: [\n            'dom',\n            'data',\n            'data.xml',\n            'sortable'\n        ],\n        features: [\n            {\n                id: 'pivotgrid-configurator',\n                name: 'Configurator',\n                description: 'The PivotConfigurator widget allows the user to select data slices displayed in PivotGrid',\n                depends: ['pivot.configurator']\n            },\n            {\n                id: 'pivotgrid-filtering',\n                name: 'Filtering',\n                description: 'Support for filtering',\n                depends: ['pivot.fieldmenu']\n            },\n            {\n                id: 'pivotgrid-excel-export',\n                name: 'Excel export',\n                description: 'Export pivot grid data as Excel spreadsheet',\n                depends: ['ooxml']\n            },\n            {\n                id: 'pivotgrid-pdf-export',\n                name: 'PDF export',\n                description: 'Export pivot grid data as PDF',\n                depends: [\n                    'pdf',\n                    'drawing'\n                ]\n            },\n            {\n                id: 'mobile-scroller',\n                name: 'Mobile scroller',\n                description: 'Support for kinetic scrolling in mobile device',\n                depends: ['mobile.scroller']\n            }\n        ]\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, ui = kendo.ui, Class = kendo.Class, Widget = ui.Widget, DataSource = kendo.data.DataSource, outerWidth = kendo._outerWidth, outerHeight = kendo._outerHeight, toString = {}.toString, identity = function (o) {\n                return o;\n            }, map = $.map, extend = $.extend, isFunction = kendo.isFunction, CHANGE = 'change', ERROR = 'error', MEASURES = 'Measures', PROGRESS = 'progress', STATERESET = 'stateReset', AUTO = 'auto', DIV = '<div/>', NS = '.kendoPivotGrid', ROW_TOTAL_KEY = '__row_total__', DATABINDING = 'dataBinding', DATABOUND = 'dataBound', EXPANDMEMBER = 'expandMember', COLLAPSEMEMBER = 'collapseMember', STATE_EXPANDED = 'k-i-collapse', STATE_COLLAPSED = 'k-i-expand', HEADER_TEMPLATE = '<span>#: data.member.caption || data.member.name #</span>', KPISTATUS_TEMPLATE = '<span class=\"k-icon k-i-#=data.dataItem.value > 0 ? \"circle\" : data.dataItem.value < 0 ? \"stop\" : \"arrow-60-up k-i-hold\"#\" title=\"#:data.dataItem.value#\"></span>', KPITREND_TEMPLATE = '<span class=\"k-icon k-i-#=data.dataItem.value > 0 ? \"arrow-60-up\" : data.dataItem.value < 0 ? \"arrow-60-down\" : \"minus\"#\" title=\"#:data.dataItem.value#\"></span>', DATACELL_TEMPLATE = '#= data.dataItem ? kendo.htmlEncode(data.dataItem.fmtValue || data.dataItem.value) || \"&nbsp;\" : \"&nbsp;\" #', LAYOUT_TABLE = '<table class=\"k-pivot-layout\">' + '<tr>' + '<td>' + '<div class=\"k-pivot-rowheaders\"></div>' + '</td>' + '<td>' + '<div class=\"k-pivot-table k-state-default\"></div>' + '</td>' + '</tr>' + '</table>';\n        var AXIS_ROWS = 'rows';\n        var AXIS_COLUMNS = 'columns';\n        function normalizeMeasures(measure) {\n            var descriptor = typeof measure === 'string' ? [{ name: measure }] : measure;\n            var descriptors = toString.call(descriptor) === '[object Array]' ? descriptor : descriptor !== undefined ? [descriptor] : [];\n            return map(descriptors, function (d) {\n                if (typeof d === 'string') {\n                    return { name: d };\n                }\n                return {\n                    name: d.name,\n                    type: d.type\n                };\n            });\n        }\n        function normalizeMembers(member) {\n            var descriptor = typeof member === 'string' ? [{\n                    name: [member],\n                    expand: false\n                }] : member;\n            var descriptors = toString.call(descriptor) === '[object Array]' ? descriptor : descriptor !== undefined ? [descriptor] : [];\n            return map(descriptors, function (d) {\n                if (typeof d === 'string') {\n                    return {\n                        name: [d],\n                        expand: false\n                    };\n                }\n                return {\n                    name: toString.call(d.name) === '[object Array]' ? d.name.slice() : [d.name],\n                    expand: d.expand\n                };\n            });\n        }\n        function normalizeName(name) {\n            if (name.indexOf(' ') !== -1) {\n                name = '[\"' + name + '\"]';\n            }\n            return name;\n        }\n        function accumulateMembers(accumulator, rootTuple, tuple, level) {\n            var idx, length;\n            var children;\n            var member;\n            if (!tuple) {\n                tuple = rootTuple;\n            }\n            if (!level) {\n                level = 0;\n            }\n            member = tuple.members[level];\n            if (!member || member.measure) {\n                return;\n            }\n            children = member.children;\n            length = children.length;\n            if (tuple === rootTuple) {\n                accumulator[kendo.stringify([member.name])] = !!length;\n            } else if (length) {\n                accumulator[kendo.stringify(buildPath(tuple, level))] = true;\n            }\n            if (length) {\n                for (idx = 0; idx < length; idx++) {\n                    accumulateMembers(accumulator, rootTuple, children[idx], level);\n                }\n            }\n            accumulateMembers(accumulator, rootTuple, tuple, level + 1);\n        }\n        function descriptorsForAxes(tuples) {\n            var result = {};\n            if (tuples.length) {\n                accumulateMembers(result, tuples[0]);\n            }\n            var descriptors = [];\n            for (var k in result) {\n                descriptors.push({\n                    name: $.parseJSON(k),\n                    expand: result[k]\n                });\n            }\n            return descriptors;\n        }\n        function addMissingPathMembers(members, axis) {\n            var tuples = axis.tuples || [];\n            var firstTuple = tuples[0];\n            if (firstTuple && members.length < firstTuple.members.length) {\n                var tupleMembers = firstTuple.members;\n                for (var idx = 0; idx < tupleMembers.length; idx++) {\n                    if (tupleMembers[idx].measure) {\n                        continue;\n                    }\n                    var found = false;\n                    for (var j = 0; j < members.length; j++) {\n                        if (getName(members[j]).indexOf(tupleMembers[idx].hierarchy) === 0) {\n                            found = true;\n                            break;\n                        }\n                    }\n                    if (!found) {\n                        members.push({\n                            name: [tupleMembers[idx].name],\n                            expand: false\n                        });\n                    }\n                }\n            }\n        }\n        function tupleToDescriptors(tuple) {\n            var result = [];\n            var members = tuple.members;\n            for (var idx = 0; idx < members.length; idx++) {\n                if (members[idx].measure) {\n                    continue;\n                }\n                result.push({\n                    name: [members[idx].name],\n                    expand: members[idx].children.length > 0\n                });\n            }\n            return result;\n        }\n        function descriptorsForMembers(axis, members, measures) {\n            axis = axis || {};\n            addMissingPathMembers(members, axis);\n            if (measures.length > 1) {\n                members.push({\n                    name: MEASURES,\n                    measure: true,\n                    children: normalizeMembers(measures)\n                });\n            }\n            var tupletoSearch = { members: members };\n            if (axis.tuples) {\n                var result = findExistingTuple(axis.tuples, tupletoSearch);\n                if (result.tuple) {\n                    members = tupleToDescriptors(result.tuple);\n                }\n            }\n            return members;\n        }\n        function createAggregateGetter(m) {\n            var measureGetter = kendo.getter(m.field, true);\n            return function (aggregatorContext, state) {\n                return m.aggregate(measureGetter(aggregatorContext.dataItem), state, aggregatorContext);\n            };\n        }\n        function isNumber(val) {\n            return typeof val === 'number' && !isNaN(val);\n        }\n        function isDate(val) {\n            return val && val.getTime;\n        }\n        var functions = {\n            sum: function (value, state) {\n                var accumulator = state.accumulator;\n                if (!isNumber(accumulator)) {\n                    accumulator = value;\n                } else if (isNumber(value)) {\n                    accumulator += value;\n                }\n                return accumulator;\n            },\n            count: function (value, state) {\n                return (state.accumulator || 0) + 1;\n            },\n            average: {\n                aggregate: function (value, state) {\n                    var accumulator = state.accumulator;\n                    if (state.count === undefined) {\n                        state.count = 0;\n                    }\n                    if (!isNumber(accumulator)) {\n                        accumulator = value;\n                    } else if (isNumber(value)) {\n                        accumulator += value;\n                    }\n                    if (isNumber(value)) {\n                        state.count++;\n                    }\n                    return accumulator;\n                },\n                result: function (state) {\n                    var accumulator = state.accumulator;\n                    if (isNumber(accumulator)) {\n                        accumulator = accumulator / state.count;\n                    }\n                    return accumulator;\n                }\n            },\n            max: function (value, state) {\n                var accumulator = state.accumulator;\n                if (!isNumber(accumulator) && !isDate(accumulator)) {\n                    accumulator = value;\n                }\n                if (accumulator < value && (isNumber(value) || isDate(value))) {\n                    accumulator = value;\n                }\n                return accumulator;\n            },\n            min: function (value, state) {\n                var accumulator = state.accumulator;\n                if (!isNumber(accumulator) && !isDate(accumulator)) {\n                    accumulator = value;\n                }\n                if (accumulator > value && (isNumber(value) || isDate(value))) {\n                    accumulator = value;\n                }\n                return accumulator;\n            }\n        };\n        var PivotCubeBuilder = Class.extend({\n            init: function (options) {\n                this.options = extend({}, this.options, options);\n                this.dimensions = this._normalizeDescriptors('field', this.options.dimensions);\n                this.measures = this._normalizeDescriptors('name', this.options.measures);\n            },\n            _normalizeDescriptors: function (keyField, descriptors) {\n                descriptors = descriptors || {};\n                var fields = {};\n                var field;\n                if (toString.call(descriptors) === '[object Array]') {\n                    for (var idx = 0, length = descriptors.length; idx < length; idx++) {\n                        field = descriptors[idx];\n                        if (typeof field === 'string') {\n                            fields[field] = {};\n                        } else if (field[keyField]) {\n                            fields[field[keyField]] = field;\n                        }\n                    }\n                    descriptors = fields;\n                }\n                return descriptors;\n            },\n            _rootTuples: function (rootNames, measureAggregators) {\n                var aggregatorsLength = measureAggregators.length || 1;\n                var dimensionsSchema = this.dimensions || [];\n                var root, name, parts;\n                var measureIdx = 0;\n                var idx;\n                var rootNamesLength = rootNames.length;\n                var result = [];\n                var keys = [];\n                if (rootNamesLength || measureAggregators.length) {\n                    for (measureIdx = 0; measureIdx < aggregatorsLength; measureIdx++) {\n                        root = { members: [] };\n                        for (idx = 0; idx < rootNamesLength; idx++) {\n                            name = rootNames[idx];\n                            parts = name.split('&');\n                            root.members[root.members.length] = {\n                                children: [],\n                                caption: (dimensionsSchema[name] || {}).caption || 'All',\n                                name: name,\n                                levelName: name,\n                                levelNum: '0',\n                                hasChildren: true,\n                                parentName: parts.length > 1 ? parts[0] : undefined,\n                                hierarchy: name\n                            };\n                        }\n                        if (aggregatorsLength > 1) {\n                            root.members[root.members.length] = {\n                                children: [],\n                                caption: measureAggregators[measureIdx].caption,\n                                name: measureAggregators[measureIdx].descriptor.name,\n                                levelName: 'MEASURES',\n                                levelNum: '0',\n                                hasChildren: false,\n                                parentName: undefined,\n                                hierarchy: 'MEASURES'\n                            };\n                        }\n                        result[result.length] = root;\n                    }\n                    keys.push(ROW_TOTAL_KEY);\n                }\n                return {\n                    keys: keys,\n                    tuples: result\n                };\n            },\n            _expandedTuples: function (map, expanded, measureAggregators) {\n                var aggregatorsLength = measureAggregators.length || 1;\n                var dimensionsSchema = this.dimensions || [];\n                var measureIdx;\n                var tuple;\n                var key;\n                var mapItem;\n                var current;\n                var currentKeys;\n                var accumulator = [];\n                var accumulatorKeys = [];\n                var memberInfo;\n                var expandedNames;\n                var parts;\n                var name;\n                var idx;\n                for (key in map) {\n                    mapItem = map[key];\n                    memberInfo = this._findExpandedMember(expanded, mapItem.uniquePath);\n                    current = accumulator[memberInfo.index] || [];\n                    currentKeys = accumulatorKeys[memberInfo.index] || [];\n                    expandedNames = memberInfo.member.names;\n                    for (measureIdx = 0; measureIdx < aggregatorsLength; measureIdx++) {\n                        tuple = { members: [] };\n                        for (idx = 0; idx < expandedNames.length; idx++) {\n                            if (idx === memberInfo.member.expandedIdx) {\n                                tuple.members[tuple.members.length] = {\n                                    children: [],\n                                    caption: mapItem.value,\n                                    name: mapItem.name,\n                                    hasChildren: false,\n                                    levelNum: 1,\n                                    levelName: mapItem.parentName + mapItem.name,\n                                    parentName: mapItem.parentName,\n                                    hierarchy: mapItem.parentName + mapItem.name\n                                };\n                                if (measureIdx === 0) {\n                                    currentKeys.push(buildPath(tuple, idx).join(''));\n                                }\n                            } else {\n                                name = expandedNames[idx];\n                                parts = name.split('&');\n                                tuple.members[tuple.members.length] = {\n                                    children: [],\n                                    caption: (dimensionsSchema[name] || {}).caption || 'All',\n                                    name: name,\n                                    levelName: name,\n                                    levelNum: '0',\n                                    hasChildren: true,\n                                    parentName: parts.length > 1 ? parts[0] : undefined,\n                                    hierarchy: name\n                                };\n                            }\n                        }\n                        if (aggregatorsLength > 1) {\n                            tuple.members[tuple.members.length] = {\n                                children: [],\n                                caption: measureAggregators[measureIdx].caption,\n                                name: measureAggregators[measureIdx].descriptor.name,\n                                levelName: 'MEASURES',\n                                levelNum: '0',\n                                hasChildren: true,\n                                parentName: undefined,\n                                hierarchy: 'MEASURES'\n                            };\n                        }\n                        current[current.length] = tuple;\n                    }\n                    accumulator[memberInfo.index] = current;\n                    accumulatorKeys[memberInfo.index] = currentKeys;\n                }\n                return {\n                    keys: accumulatorKeys,\n                    tuples: accumulator\n                };\n            },\n            _findExpandedMember: function (members, parentName) {\n                for (var idx = 0; idx < members.length; idx++) {\n                    if (members[idx].uniquePath === parentName) {\n                        return {\n                            member: members[idx],\n                            index: idx\n                        };\n                    }\n                }\n            },\n            _asTuples: function (map, descriptor, measureAggregators) {\n                measureAggregators = measureAggregators || [];\n                var rootInfo = this._rootTuples(descriptor.root, measureAggregators);\n                var expandedInfo = this._expandedTuples(map, descriptor.expanded, measureAggregators);\n                return {\n                    keys: [].concat.apply(rootInfo.keys, expandedInfo.keys),\n                    tuples: [].concat.apply(rootInfo.tuples, expandedInfo.tuples)\n                };\n            },\n            _measuresInfo: function (measures, rowAxis) {\n                var idx = 0;\n                var length = measures && measures.length;\n                var aggregateNames = [];\n                var resultFuncs = {};\n                var formats = {};\n                var descriptors = this.measures || {};\n                var measure;\n                var name;\n                for (; idx < length; idx++) {\n                    name = measures[idx].descriptor.name;\n                    measure = descriptors[name] || {};\n                    aggregateNames.push(name);\n                    if (measure.result) {\n                        resultFuncs[name] = measure.result;\n                    }\n                    if (measure.format) {\n                        formats[name] = measure.format;\n                    }\n                }\n                return {\n                    names: aggregateNames,\n                    formats: formats,\n                    resultFuncs: resultFuncs,\n                    rowAxis: rowAxis\n                };\n            },\n            _toDataArray: function (map, measuresInfo, rowKeys, columnKeys) {\n                var result = [];\n                var aggregates;\n                var name, i, j, k, n;\n                var row, column, columnKey;\n                var rowMeasureNamesLength = 1;\n                var rowMeasureNames = [];\n                var columnMeasureNames;\n                var rowLength = rowKeys.length || 1;\n                var columnLength = columnKeys.length || 1;\n                if (measuresInfo.rowAxis) {\n                    rowMeasureNames = measuresInfo.names;\n                    rowMeasureNamesLength = rowMeasureNames.length;\n                } else {\n                    columnMeasureNames = measuresInfo.names;\n                }\n                for (i = 0; i < rowLength; i++) {\n                    row = map[rowKeys[i] || ROW_TOTAL_KEY];\n                    for (n = 0; n < rowMeasureNamesLength; n++) {\n                        if (measuresInfo.rowAxis) {\n                            columnMeasureNames = [rowMeasureNames[n]];\n                        }\n                        for (j = 0; j < columnLength; j++) {\n                            columnKey = columnKeys[j] || ROW_TOTAL_KEY;\n                            column = row.items[columnKey];\n                            if (columnKey === ROW_TOTAL_KEY) {\n                                aggregates = row.aggregates;\n                            } else {\n                                aggregates = column ? column.aggregates : {};\n                            }\n                            for (k = 0; k < columnMeasureNames.length; k++) {\n                                name = columnMeasureNames[k];\n                                this._addData(result, aggregates[name], measuresInfo.formats[name], measuresInfo.resultFuncs[name]);\n                            }\n                        }\n                    }\n                }\n                return result;\n            },\n            _addData: function (result, value, format, resultFunc) {\n                var fmtValue = '';\n                var ordinal;\n                if (value) {\n                    value = resultFunc ? resultFunc(value) : value.accumulator;\n                    fmtValue = format ? kendo.format(format, value) : value;\n                }\n                ordinal = result.length;\n                result[ordinal] = {\n                    ordinal: ordinal,\n                    value: value || '',\n                    fmtValue: fmtValue\n                };\n            },\n            _matchDescriptors: function (dataItem, descriptor, getters) {\n                var parts;\n                var parentField;\n                var expectedValue;\n                var names = descriptor.names;\n                var idx = descriptor.expandedIdx;\n                var value;\n                while (idx > 0) {\n                    parts = names[--idx].split('&');\n                    if (parts.length > 1) {\n                        parentField = parts[0];\n                        expectedValue = parts[1];\n                        value = getters[parentField](dataItem);\n                        value = value !== undefined && value !== null ? value.toString() : value;\n                        if (value != expectedValue) {\n                            return false;\n                        }\n                    }\n                }\n                return true;\n            },\n            _calculateAggregate: function (measureAggregators, aggregatorContext, totalItem) {\n                var result = {};\n                var state;\n                var name;\n                for (var measureIdx = 0; measureIdx < measureAggregators.length; measureIdx++) {\n                    name = measureAggregators[measureIdx].descriptor.name;\n                    state = totalItem.aggregates[name] || {};\n                    state.accumulator = measureAggregators[measureIdx].aggregator(aggregatorContext, state);\n                    result[name] = state;\n                }\n                return result;\n            },\n            _processColumns: function (measureAggregators, descriptors, getters, columns, aggregatorContext, rowTotal, state, updateColumn) {\n                var value;\n                var descriptor;\n                var column;\n                var totalItem;\n                var key, name, parentName, path;\n                var dataItem = aggregatorContext.dataItem;\n                var idx = 0;\n                for (; idx < descriptors.length; idx++) {\n                    descriptor = descriptors[idx];\n                    if (!this._matchDescriptors(dataItem, descriptor, getters)) {\n                        continue;\n                    }\n                    path = descriptor.names.slice(0, descriptor.expandedIdx).join('');\n                    name = descriptor.names[descriptor.expandedIdx];\n                    value = getters[name](dataItem);\n                    value = value !== undefined && value !== null ? value.toString() : value;\n                    parentName = name;\n                    name = name + '&' + value;\n                    key = path + name;\n                    column = columns[key] || {\n                        index: state.columnIndex,\n                        parentName: parentName,\n                        name: name,\n                        uniquePath: path + parentName,\n                        value: value\n                    };\n                    totalItem = rowTotal.items[key] || { aggregates: {} };\n                    rowTotal.items[key] = {\n                        index: column.index,\n                        aggregates: this._calculateAggregate(measureAggregators, aggregatorContext, totalItem)\n                    };\n                    if (updateColumn) {\n                        if (!columns[key]) {\n                            state.columnIndex++;\n                        }\n                        columns[key] = column;\n                    }\n                }\n            },\n            _measureAggregators: function (options) {\n                var measureDescriptors = options.measures || [];\n                var measures = this.measures || {};\n                var aggregators = [];\n                var descriptor, measure, idx, length;\n                var defaultAggregate, aggregate;\n                if (measureDescriptors.length) {\n                    for (idx = 0, length = measureDescriptors.length; idx < length; idx++) {\n                        descriptor = measureDescriptors[idx];\n                        measure = measures[descriptor.name];\n                        defaultAggregate = null;\n                        if (measure) {\n                            aggregate = measure.aggregate;\n                            if (typeof aggregate === 'string') {\n                                defaultAggregate = functions[aggregate.toLowerCase()];\n                                if (!defaultAggregate) {\n                                    throw new Error('There is no such aggregate function');\n                                }\n                                measure.aggregate = defaultAggregate.aggregate || defaultAggregate;\n                                measure.result = defaultAggregate.result;\n                            }\n                            aggregators.push({\n                                descriptor: descriptor,\n                                caption: measure.caption,\n                                result: measure.result,\n                                aggregator: createAggregateGetter(measure)\n                            });\n                        }\n                    }\n                } else {\n                    aggregators.push({\n                        descriptor: { name: 'default' },\n                        caption: 'default',\n                        aggregator: function () {\n                            return 1;\n                        }\n                    });\n                }\n                return aggregators;\n            },\n            _buildGetters: function (names) {\n                var result = {};\n                var parts;\n                var name;\n                for (var idx = 0; idx < names.length; idx++) {\n                    name = names[idx];\n                    parts = name.split('&');\n                    if (parts.length > 1) {\n                        result[parts[0]] = kendo.getter(parts[0], true);\n                    } else {\n                        result[name] = kendo.getter(normalizeName(name), true);\n                    }\n                }\n                return result;\n            },\n            _parseDescriptors: function (descriptors) {\n                var parsedDescriptors = parseDescriptors(descriptors);\n                var rootNames = getRootNames(parsedDescriptors.root);\n                var expanded = parsedDescriptors.expanded;\n                var result = [];\n                for (var idx = 0; idx < expanded.length; idx++) {\n                    result.push(mapNames(expanded[idx].name, rootNames));\n                }\n                return {\n                    root: rootNames,\n                    expanded: result\n                };\n            },\n            _filter: function (data, filter) {\n                if (!filter) {\n                    return data;\n                }\n                var expr;\n                var idx = 0;\n                var filters = filter.filters;\n                for (; idx < filters.length; idx++) {\n                    expr = filters[idx];\n                    if (expr.operator === 'in') {\n                        filters[idx] = this._normalizeFilter(expr);\n                    }\n                }\n                return new kendo.data.Query(data).filter(filter).data;\n            },\n            _normalizeFilter: function (filter) {\n                var value = filter.value.split(',');\n                var result = [];\n                if (!value.length) {\n                    return value;\n                }\n                for (var idx = 0; idx < value.length; idx++) {\n                    result.push({\n                        field: filter.field,\n                        operator: 'eq',\n                        value: value[idx]\n                    });\n                }\n                return {\n                    logic: 'or',\n                    filters: result\n                };\n            },\n            process: function (data, options) {\n                data = data || [];\n                options = options || {};\n                data = this._filter(data, options.filter);\n                var measures = options.measures || [];\n                var measuresRowAxis = options.measuresAxis === 'rows';\n                var columnDescriptors = options.columns || [];\n                var rowDescriptors = options.rows || [];\n                if (!columnDescriptors.length && rowDescriptors.length && (!measures.length || measures.length && measuresRowAxis)) {\n                    columnDescriptors = rowDescriptors;\n                    rowDescriptors = [];\n                    measuresRowAxis = false;\n                }\n                if (!columnDescriptors.length && !rowDescriptors.length) {\n                    measuresRowAxis = false;\n                }\n                if (!columnDescriptors.length && measures.length) {\n                    columnDescriptors = normalizeMembers(options.measures);\n                }\n                columnDescriptors = this._parseDescriptors(columnDescriptors);\n                rowDescriptors = this._parseDescriptors(rowDescriptors);\n                var aggregatedData = {};\n                var columns = {};\n                var rows = {};\n                var rowValue;\n                var state = { columnIndex: 0 };\n                var measureAggregators = this._measureAggregators(options);\n                var columnGetters = this._buildGetters(columnDescriptors.root);\n                var rowGetters = this._buildGetters(rowDescriptors.root);\n                var processed = false;\n                var expandedColumns = columnDescriptors.expanded;\n                var expandedRows = rowDescriptors.expanded;\n                var dataItem;\n                var aggregatorContext;\n                var hasExpandedRows = expandedRows.length !== 0;\n                var rowIdx, rowDescriptor, rowName, rowTotal;\n                var key, path, parentName, value;\n                var columnsInfo, rowsInfo;\n                var length = data.length;\n                var idx = 0;\n                if (columnDescriptors.root.length || rowDescriptors.root.length) {\n                    processed = true;\n                    for (idx = 0; idx < length; idx++) {\n                        dataItem = data[idx];\n                        aggregatorContext = {\n                            dataItem: dataItem,\n                            index: idx\n                        };\n                        rowTotal = aggregatedData[ROW_TOTAL_KEY] || {\n                            items: {},\n                            aggregates: {}\n                        };\n                        this._processColumns(measureAggregators, expandedColumns, columnGetters, columns, aggregatorContext, rowTotal, state, !hasExpandedRows);\n                        rowTotal.aggregates = this._calculateAggregate(measureAggregators, aggregatorContext, rowTotal);\n                        aggregatedData[ROW_TOTAL_KEY] = rowTotal;\n                        for (rowIdx = 0; rowIdx < expandedRows.length; rowIdx++) {\n                            rowDescriptor = expandedRows[rowIdx];\n                            if (!this._matchDescriptors(dataItem, rowDescriptor, rowGetters)) {\n                                this._processColumns(measureAggregators, expandedColumns, columnGetters, columns, aggregatorContext, {\n                                    items: {},\n                                    aggregates: {}\n                                }, state, true);\n                                continue;\n                            }\n                            path = rowDescriptor.names.slice(0, rowDescriptor.expandedIdx).join('');\n                            rowName = rowDescriptor.names[rowDescriptor.expandedIdx];\n                            parentName = rowName;\n                            rowValue = rowGetters[rowName](dataItem);\n                            rowValue = rowValue !== undefined ? rowValue.toString() : rowValue;\n                            rowName = rowName + '&' + rowValue;\n                            key = path + rowName;\n                            rows[key] = {\n                                uniquePath: path + parentName,\n                                parentName: parentName,\n                                name: rowName,\n                                value: rowValue\n                            };\n                            value = aggregatedData[key] || {\n                                items: {},\n                                aggregates: {}\n                            };\n                            this._processColumns(measureAggregators, expandedColumns, columnGetters, columns, aggregatorContext, value, state, true);\n                            value.aggregates = this._calculateAggregate(measureAggregators, aggregatorContext, value);\n                            aggregatedData[key] = value;\n                        }\n                    }\n                }\n                if (processed && length) {\n                    if (measureAggregators.length > 1 && (!options.columns || !options.columns.length)) {\n                        columnDescriptors = {\n                            root: [],\n                            expanded: []\n                        };\n                    }\n                    columnsInfo = this._asTuples(columns, columnDescriptors, measuresRowAxis ? [] : measureAggregators);\n                    rowsInfo = this._asTuples(rows, rowDescriptors, measuresRowAxis ? measureAggregators : []);\n                    columns = columnsInfo.tuples;\n                    rows = rowsInfo.tuples;\n                    aggregatedData = this._toDataArray(aggregatedData, this._measuresInfo(measureAggregators, measuresRowAxis), rowsInfo.keys, columnsInfo.keys);\n                } else {\n                    aggregatedData = columns = rows = [];\n                }\n                return {\n                    axes: {\n                        columns: { tuples: columns },\n                        rows: { tuples: rows }\n                    },\n                    data: aggregatedData\n                };\n            }\n        });\n        var PivotTransport = Class.extend({\n            init: function (options, transport) {\n                this.transport = transport;\n                this.options = transport.options || {};\n                if (!this.transport.discover) {\n                    if (isFunction(options.discover)) {\n                        this.discover = options.discover;\n                    }\n                }\n            },\n            read: function (options) {\n                return this.transport.read(options);\n            },\n            update: function (options) {\n                return this.transport.update(options);\n            },\n            create: function (options) {\n                return this.transport.create(options);\n            },\n            destroy: function (options) {\n                return this.transport.destroy(options);\n            },\n            discover: function (options) {\n                if (this.transport.discover) {\n                    return this.transport.discover(options);\n                }\n                options.success({});\n            },\n            catalog: function (val) {\n                var options = this.options || {};\n                if (val === undefined) {\n                    return (options.connection || {}).catalog;\n                }\n                var connection = options.connection || {};\n                connection.catalog = val;\n                this.options.connection = connection;\n                $.extend(this.transport.options, { connection: connection });\n            },\n            cube: function (val) {\n                var options = this.options || {};\n                if (val === undefined) {\n                    return (options.connection || {}).cube;\n                }\n                var connection = options.connection || {};\n                connection.cube = val;\n                this.options.connection = connection;\n                extend(true, this.transport.options, { connection: connection });\n            }\n        });\n        var PivotDataSource = DataSource.extend({\n            init: function (options) {\n                var cube = ((options || {}).schema || {}).cube;\n                var measuresAxis = 'columns';\n                var measures;\n                var schema = {\n                    axes: identity,\n                    cubes: identity,\n                    catalogs: identity,\n                    measures: identity,\n                    dimensions: identity,\n                    hierarchies: identity,\n                    levels: identity,\n                    members: identity\n                };\n                if (cube) {\n                    schema = $.extend(schema, this._cubeSchema(cube));\n                    this.cubeBuilder = new PivotCubeBuilder(cube);\n                }\n                DataSource.fn.init.call(this, extend(true, {}, { schema: schema }, options));\n                this.transport = new PivotTransport(this.options.transport || {}, this.transport);\n                this._columns = normalizeMembers(this.options.columns);\n                this._rows = normalizeMembers(this.options.rows);\n                measures = this.options.measures || [];\n                if (toString.call(measures) === '[object Object]') {\n                    measuresAxis = measures.axis || 'columns';\n                    measures = measures.values || [];\n                }\n                this._measures = normalizeMeasures(measures);\n                this._measuresAxis = measuresAxis;\n                this._skipNormalize = 0;\n                this._axes = {};\n            },\n            _cubeSchema: function (cube) {\n                return {\n                    dimensions: function () {\n                        var result = [];\n                        var dimensions = cube.dimensions;\n                        for (var key in dimensions) {\n                            result.push({\n                                name: key,\n                                caption: dimensions[key].caption || key,\n                                uniqueName: key,\n                                defaultHierarchy: key,\n                                type: 1\n                            });\n                        }\n                        if (cube.measures) {\n                            result.push({\n                                name: MEASURES,\n                                caption: MEASURES,\n                                uniqueName: MEASURES,\n                                type: 2\n                            });\n                        }\n                        return result;\n                    },\n                    hierarchies: function () {\n                        return [];\n                    },\n                    measures: function () {\n                        var result = [];\n                        var measures = cube.measures;\n                        for (var key in measures) {\n                            result.push({\n                                name: key,\n                                caption: key,\n                                uniqueName: key,\n                                aggregator: key\n                            });\n                        }\n                        return result;\n                    },\n                    members: $.proxy(function (response, restrictions) {\n                        var name = restrictions.levelUniqueName || restrictions.memberUniqueName;\n                        var schemaData = this.options.schema.data;\n                        var dataGetter = isFunction(schemaData) ? schemaData : kendo.getter(schemaData, true);\n                        var data = this.options.data && dataGetter(this.options.data) || this._rawData || [];\n                        var result = [];\n                        var getter;\n                        var value;\n                        var idx = 0;\n                        var distinct = {};\n                        if (name) {\n                            name = name.split('.')[0];\n                        }\n                        if (!restrictions.treeOp) {\n                            result.push({\n                                caption: cube.dimensions[name].caption || name,\n                                childrenCardinality: '1',\n                                dimensionUniqueName: name,\n                                hierarchyUniqueName: name,\n                                levelUniqueName: name,\n                                name: name,\n                                uniqueName: name\n                            });\n                            return result;\n                        }\n                        getter = kendo.getter(normalizeName(name), true);\n                        for (; idx < data.length; idx++) {\n                            value = getter(data[idx]);\n                            if ((value || value === 0) && !distinct[value]) {\n                                distinct[value] = true;\n                                result.push({\n                                    caption: value,\n                                    childrenCardinality: '0',\n                                    dimensionUniqueName: name,\n                                    hierarchyUniqueName: name,\n                                    levelUniqueName: name,\n                                    name: value,\n                                    uniqueName: value\n                                });\n                            }\n                        }\n                        return result;\n                    }, this)\n                };\n            },\n            options: {\n                serverSorting: true,\n                serverPaging: true,\n                serverFiltering: true,\n                serverGrouping: true,\n                serverAggregates: true\n            },\n            catalog: function (val) {\n                if (val === undefined) {\n                    return this.transport.catalog();\n                }\n                this.transport.catalog(val);\n                this._mergeState({});\n                this._axes = {};\n                this.data([]);\n            },\n            cube: function (val) {\n                if (val === undefined) {\n                    return this.transport.cube();\n                }\n                this.transport.cube(val);\n                this._axes = {};\n                this._mergeState({});\n                this.data([]);\n            },\n            axes: function () {\n                return this._axes;\n            },\n            columns: function (val) {\n                if (val === undefined) {\n                    return this._columns;\n                }\n                this._skipNormalize += 1;\n                this._clearAxesData = true;\n                this._columns = normalizeMembers(val);\n                this.query({\n                    columns: val,\n                    rows: this.rowsAxisDescriptors(),\n                    measures: this.measures(),\n                    sort: this.sort(),\n                    filter: this.filter()\n                });\n            },\n            rows: function (val) {\n                if (val === undefined) {\n                    return this._rows;\n                }\n                this._skipNormalize += 1;\n                this._clearAxesData = true;\n                this._rows = normalizeMembers(val);\n                this.query({\n                    columns: this.columnsAxisDescriptors(),\n                    rows: val,\n                    measures: this.measures(),\n                    sort: this.sort(),\n                    filter: this.filter()\n                });\n            },\n            measures: function (val) {\n                if (val === undefined) {\n                    return this._measures;\n                }\n                this._skipNormalize += 1;\n                this._clearAxesData = true;\n                this.query({\n                    columns: this.columnsAxisDescriptors(),\n                    rows: this.rowsAxisDescriptors(),\n                    measures: normalizeMeasures(val),\n                    sort: this.sort(),\n                    filter: this.filter()\n                });\n            },\n            measuresAxis: function () {\n                return this._measuresAxis || 'columns';\n            },\n            _expandPath: function (path, axis) {\n                var origin = axis === 'columns' ? 'columns' : 'rows';\n                var other = axis === 'columns' ? 'rows' : 'columns';\n                var members = normalizeMembers(path);\n                var memberToExpand = getName(members[members.length - 1]);\n                this._lastExpanded = origin;\n                members = descriptorsForMembers(this.axes()[origin], members, this.measures());\n                for (var idx = 0; idx < members.length; idx++) {\n                    var memberName = getName(members[idx]);\n                    if (memberName === memberToExpand) {\n                        if (members[idx].expand) {\n                            return;\n                        }\n                        members[idx].expand = true;\n                    } else {\n                        members[idx].expand = false;\n                    }\n                }\n                var descriptors = {};\n                descriptors[origin] = members;\n                descriptors[other] = this._descriptorsForAxis(other);\n                this._query(descriptors);\n            },\n            _descriptorsForAxis: function (axis) {\n                var axes = this.axes();\n                var descriptors = this[axis]() || [];\n                if (axes && axes[axis] && axes[axis].tuples && axes[axis].tuples[0]) {\n                    descriptors = descriptorsForAxes(axes[axis].tuples || []);\n                }\n                return descriptors;\n            },\n            columnsAxisDescriptors: function () {\n                return this._descriptorsForAxis('columns');\n            },\n            rowsAxisDescriptors: function () {\n                return this._descriptorsForAxis('rows');\n            },\n            _process: function (data, e) {\n                this._view = data;\n                e = e || {};\n                e.items = e.items || this._view;\n                this.trigger(CHANGE, e);\n            },\n            _query: function (options) {\n                var that = this;\n                if (!options) {\n                    this._skipNormalize += 1;\n                    this._clearAxesData = true;\n                }\n                return that.query(extend({}, {\n                    page: that.page(),\n                    pageSize: that.pageSize(),\n                    sort: that.sort(),\n                    filter: that.filter(),\n                    group: that.group(),\n                    aggregate: that.aggregate(),\n                    columns: this.columnsAxisDescriptors(),\n                    rows: this.rowsAxisDescriptors(),\n                    measures: this.measures()\n                }, options));\n            },\n            query: function (options) {\n                var state = this._mergeState(options);\n                if (this._data.length && this.cubeBuilder) {\n                    this._params(state);\n                    this._updateLocalData(this._pristineData);\n                    return $.Deferred().resolve().promise();\n                }\n                return this.read(state);\n            },\n            _mergeState: function (options) {\n                options = DataSource.fn._mergeState.call(this, options);\n                if (options !== undefined) {\n                    this._measures = normalizeMeasures(options.measures);\n                    if (options.columns) {\n                        options.columns = normalizeMembers(options.columns);\n                    } else if (!options.columns) {\n                        this._columns = [];\n                    }\n                    if (options.rows) {\n                        options.rows = normalizeMembers(options.rows);\n                    } else if (!options.rows) {\n                        this._rows = [];\n                    }\n                }\n                return options;\n            },\n            filter: function (val) {\n                if (val === undefined) {\n                    return this._filter;\n                }\n                this._skipNormalize += 1;\n                this._clearAxesData = true;\n                this._query({\n                    filter: val,\n                    page: 1\n                });\n            },\n            expandColumn: function (path) {\n                this._expandPath(path, 'columns');\n            },\n            expandRow: function (path) {\n                this._expandPath(path, 'rows');\n            },\n            success: function (data) {\n                var originalData;\n                if (this.cubeBuilder) {\n                    originalData = (this.reader.data(data) || []).slice(0);\n                }\n                DataSource.fn.success.call(this, data);\n                if (originalData) {\n                    this._pristineData = originalData;\n                }\n            },\n            _processResult: function (data, axes) {\n                if (this.cubeBuilder) {\n                    var processedData = this.cubeBuilder.process(data, this._requestData);\n                    data = processedData.data;\n                    axes = processedData.axes;\n                }\n                var columnIndexes, rowIndexes;\n                var tuples, resultAxis, measures, axisToSkip;\n                var columnDescriptors = this.columns();\n                var rowDescriptors = this.rows();\n                var hasColumnTuples = axes.columns && axes.columns.tuples;\n                if (!columnDescriptors.length && rowDescriptors.length && hasColumnTuples && (this._rowMeasures().length || !this.measures().length)) {\n                    axes = {\n                        columns: {},\n                        rows: axes.columns\n                    };\n                }\n                if (!columnDescriptors.length && !rowDescriptors.length && this.measuresAxis() === 'rows' && hasColumnTuples) {\n                    axes = {\n                        columns: {},\n                        rows: axes.columns\n                    };\n                }\n                this._axes = {\n                    columns: normalizeAxis(this._axes.columns),\n                    rows: normalizeAxis(this._axes.rows)\n                };\n                axes = {\n                    columns: normalizeAxis(axes.columns),\n                    rows: normalizeAxis(axes.rows)\n                };\n                columnIndexes = this._normalizeTuples(axes.columns.tuples, this._axes.columns.tuples, columnDescriptors, this._columnMeasures());\n                rowIndexes = this._normalizeTuples(axes.rows.tuples, this._axes.rows.tuples, rowDescriptors, this._rowMeasures());\n                this._skipNormalize -= 1;\n                if (!this.cubeBuilder) {\n                    data = this._normalizeData({\n                        columnsLength: axes.columns.tuples.length,\n                        rowsLength: axes.rows.tuples.length,\n                        columnIndexes: columnIndexes,\n                        rowIndexes: rowIndexes,\n                        data: data\n                    });\n                }\n                if (this._lastExpanded == 'rows') {\n                    tuples = axes.columns.tuples;\n                    measures = this._columnMeasures();\n                    resultAxis = validateAxis(axes.columns, this._axes.columns, measures);\n                    if (resultAxis) {\n                        axisToSkip = 'columns';\n                        axes.columns = resultAxis;\n                        adjustDataByColumn(tuples, resultAxis.tuples, axes.rows.tuples.length, measures, data);\n                        if (!this.cubeBuilder) {\n                            data = this._normalizeData({\n                                columnsLength: membersCount(axes.columns.tuples, measures),\n                                rowsLength: axes.rows.tuples.length,\n                                data: data\n                            });\n                        }\n                    }\n                } else if (this._lastExpanded == 'columns') {\n                    tuples = axes.rows.tuples;\n                    measures = this._rowMeasures();\n                    resultAxis = validateAxis(axes.rows, this._axes.rows, measures);\n                    if (resultAxis) {\n                        axisToSkip = 'rows';\n                        axes.rows = resultAxis;\n                        adjustDataByRow(tuples, resultAxis.tuples, axes.columns.tuples.length, measures, data);\n                        if (!this.cubeBuilder) {\n                            data = this._normalizeData({\n                                columnsLength: membersCount(axes.rows.tuples, measures),\n                                rowsLength: axes.columns.tuples.length,\n                                data: data\n                            });\n                        }\n                    }\n                }\n                this._lastExpanded = null;\n                var result = this._mergeAxes(axes, data, axisToSkip);\n                this._axes = result.axes;\n                return result.data;\n            },\n            _readData: function (data) {\n                var axes = this.reader.axes(data);\n                var newData = this.reader.data(data);\n                if (this.cubeBuilder) {\n                    this._rawData = newData;\n                }\n                return this._processResult(newData, axes);\n            },\n            _createTuple: function (tuple, measure, buildRoot) {\n                var members = tuple.members;\n                var length = members.length;\n                var root = { members: [] };\n                var levelName, levelNum;\n                var name, parentName;\n                var hasChildren;\n                var hierarchy;\n                var caption;\n                var member;\n                var idx = 0;\n                if (measure) {\n                    length -= 1;\n                }\n                for (; idx < length; idx++) {\n                    member = members[idx];\n                    levelNum = Number(member.levelNum);\n                    name = member.name;\n                    parentName = member.parentName;\n                    caption = member.caption || name;\n                    hasChildren = member.hasChildren;\n                    hierarchy = member.hierarchy;\n                    levelName = member.levelName;\n                    if (buildRoot) {\n                        caption = 'All';\n                        if (levelNum === 0) {\n                            parentName = member.name;\n                        } else {\n                            levelNum -= 1;\n                        }\n                        hasChildren = true;\n                        name = hierarchy = levelName = parentName;\n                    }\n                    root.members.push({\n                        name: name,\n                        children: [],\n                        caption: caption,\n                        levelName: levelName,\n                        levelNum: levelNum.toString(),\n                        hasChildren: hasChildren,\n                        hierarchy: hierarchy,\n                        parentName: !buildRoot ? parentName : ''\n                    });\n                }\n                if (measure) {\n                    root.members.push({\n                        name: measure.name,\n                        children: []\n                    });\n                }\n                return root;\n            },\n            _hasRoot: function (target, source, descriptors) {\n                if (source.length) {\n                    return findExistingTuple(source, target).tuple;\n                }\n                var members = target.members;\n                var member;\n                var descriptor;\n                var isRoot = true;\n                var levelNum;\n                for (var idx = 0, length = members.length; idx < length; idx++) {\n                    member = members[idx];\n                    levelNum = Number(member.levelNum) || 0;\n                    descriptor = descriptors[idx];\n                    if (!(levelNum === 0 || descriptor && member.name === getName(descriptor))) {\n                        isRoot = false;\n                        break;\n                    }\n                }\n                return isRoot;\n            },\n            _mergeAxes: function (sourceAxes, data, axisToSkip) {\n                var columnMeasures = this._columnMeasures();\n                var rowMeasures = this._rowMeasures();\n                var axes = this.axes();\n                var startIndex, tuples;\n                var oldRowsLength = membersCount(axes.rows.tuples, rowMeasures);\n                var newRowsLength = sourceAxes.rows.tuples.length;\n                var oldColumnsLength = membersCount(axes.columns.tuples, columnMeasures);\n                var newColumnsLength = sourceAxes.columns.tuples.length;\n                if (axisToSkip == 'columns') {\n                    newColumnsLength = oldColumnsLength;\n                    tuples = sourceAxes.columns.tuples;\n                } else {\n                    tuples = parseSource(sourceAxes.columns.tuples, columnMeasures);\n                    data = prepareDataOnColumns(tuples, data);\n                }\n                var mergedColumns = mergeTuples(axes.columns.tuples, tuples, columnMeasures);\n                if (axisToSkip == 'rows') {\n                    newRowsLength = membersCount(sourceAxes.rows.tuples, rowMeasures);\n                    tuples = sourceAxes.rows.tuples;\n                } else {\n                    tuples = parseSource(sourceAxes.rows.tuples, rowMeasures);\n                    data = prepareDataOnRows(tuples, data);\n                }\n                var mergedRows = mergeTuples(axes.rows.tuples, tuples, rowMeasures);\n                axes.columns.tuples = mergedColumns.tuples;\n                axes.rows.tuples = mergedRows.tuples;\n                if (oldColumnsLength !== membersCount(axes.columns.tuples, columnMeasures)) {\n                    startIndex = mergedColumns.index + findDataIndex(mergedColumns.parsedRoot, mergedColumns.memberIndex, columnMeasures);\n                    var offset = oldColumnsLength + newColumnsLength;\n                    data = this._mergeColumnData(data, startIndex, newRowsLength, newColumnsLength, offset);\n                } else if (oldRowsLength !== membersCount(axes.rows.tuples, rowMeasures)) {\n                    startIndex = mergedRows.index + findDataIndex(mergedRows.parsedRoot, mergedRows.memberIndex, rowMeasures);\n                    data = this._mergeRowData(data, startIndex, newRowsLength, newColumnsLength);\n                }\n                if (axes.columns.tuples.length === 0 && axes.rows.tuples.length === 0) {\n                    data = [];\n                }\n                return {\n                    axes: axes,\n                    data: data\n                };\n            },\n            _mergeColumnData: function (newData, columnIndex, rowsLength, columnsLength, offset) {\n                var data = this.data().toJSON();\n                var rowIndex, index, drop = 0, toAdd;\n                var columnMeasures = Math.max(this._columnMeasures().length, 1);\n                rowsLength = Math.max(rowsLength, 1);\n                if (data.length > 0) {\n                    drop = columnMeasures;\n                    offset -= columnMeasures;\n                }\n                for (rowIndex = 0; rowIndex < rowsLength; rowIndex++) {\n                    index = columnIndex + rowIndex * offset;\n                    toAdd = newData.splice(0, columnsLength);\n                    toAdd.splice(0, drop);\n                    [].splice.apply(data, [\n                        index,\n                        0\n                    ].concat(toAdd));\n                }\n                return data;\n            },\n            _mergeRowData: function (newData, rowIndex, rowsLength, columnsLength) {\n                var data = this.data().toJSON();\n                var idx, dataIndex, toAdd;\n                var rowMeasures = Math.max(this._rowMeasures().length, 1);\n                columnsLength = Math.max(columnsLength, 1);\n                if (data.length > 0) {\n                    rowsLength -= rowMeasures;\n                    newData.splice(0, columnsLength * rowMeasures);\n                }\n                for (idx = 0; idx < rowsLength; idx++) {\n                    toAdd = newData.splice(0, columnsLength);\n                    dataIndex = rowIndex * columnsLength + idx * columnsLength;\n                    [].splice.apply(data, [\n                        dataIndex,\n                        0\n                    ].concat(toAdd));\n                }\n                return data;\n            },\n            _columnMeasures: function () {\n                var measures = this.measures();\n                var columnMeasures = [];\n                if (this.measuresAxis() === 'columns') {\n                    if (this.columns().length === 0) {\n                        columnMeasures = measures;\n                    } else if (measures.length > 1) {\n                        columnMeasures = measures;\n                    }\n                }\n                return columnMeasures;\n            },\n            _rowMeasures: function () {\n                var measures = this.measures();\n                var rowMeasures = [];\n                if (this.measuresAxis() === 'rows') {\n                    if (this.rows().length === 0) {\n                        rowMeasures = measures;\n                    } else if (measures.length > 1) {\n                        rowMeasures = measures;\n                    }\n                }\n                return rowMeasures;\n            },\n            _updateLocalData: function (data, state) {\n                if (this.cubeBuilder) {\n                    if (state) {\n                        this._requestData = state;\n                    }\n                    data = this._processResult(data);\n                }\n                this._data = this._observe(data);\n                this._ranges = [];\n                this._addRange(this._data);\n                this._total = this._data.length;\n                this._pristineTotal = this._total;\n                this._process(this._data);\n            },\n            data: function (value) {\n                var that = this;\n                if (value !== undefined) {\n                    this._pristineData = value.slice(0);\n                    this._updateLocalData(value, {\n                        columns: this.columns(),\n                        rows: this.rows(),\n                        measures: this.measures()\n                    });\n                } else {\n                    return that._data;\n                }\n            },\n            _normalizeTuples: function (tuples, source, descriptors, measures) {\n                var length = measures.length || 1;\n                var idx = 0;\n                var roots = [];\n                var indexes = {};\n                var measureIdx = 0;\n                var tuple, memberIdx, last;\n                if (!tuples.length) {\n                    return;\n                }\n                if (this._skipNormalize <= 0 && !this._hasRoot(tuples[0], source, descriptors)) {\n                    this._skipNormalize = 0;\n                    for (; idx < length; idx++) {\n                        roots.push(this._createTuple(tuples[0], measures[idx], true));\n                        indexes[idx] = idx;\n                    }\n                    tuples.splice.apply(tuples, [\n                        0,\n                        tuples.length\n                    ].concat(roots).concat(tuples));\n                    idx = length;\n                }\n                if (measures.length) {\n                    last = tuple = tuples[idx];\n                    memberIdx = tuple.members.length - 1;\n                    while (tuple) {\n                        if (measureIdx >= length) {\n                            measureIdx = 0;\n                        }\n                        if (tuple.members[memberIdx].name !== measures[measureIdx].name) {\n                            tuples.splice(idx, 0, this._createTuple(tuple, measures[measureIdx]));\n                            indexes[idx] = idx;\n                        }\n                        idx += 1;\n                        measureIdx += 1;\n                        tuple = tuples[idx];\n                        if (length > measureIdx && (!tuple || tupleName(last, memberIdx - 1) !== tupleName(tuple, memberIdx - 1))) {\n                            for (; measureIdx < length; measureIdx++) {\n                                tuples.splice(idx, 0, this._createTuple(last, measures[measureIdx]));\n                                indexes[idx] = idx;\n                                idx += 1;\n                            }\n                            tuple = tuples[idx];\n                        }\n                        last = tuple;\n                    }\n                }\n                return indexes;\n            },\n            _addMissingDataItems: function (result, metadata) {\n                while (metadata.rowIndexes[parseInt(result.length / metadata.columnsLength, 10)] !== undefined) {\n                    for (var idx = 0; idx < metadata.columnsLength; idx++) {\n                        result = addEmptyDataItem(result);\n                    }\n                }\n                while (metadata.columnIndexes[result.length % metadata.columnsLength] !== undefined) {\n                    result = addEmptyDataItem(result);\n                }\n                return result;\n            },\n            _normalizeOrdinals: function (result, dataItem, metadata) {\n                var lastOrdinal = metadata.lastOrdinal;\n                if (!dataItem) {\n                    return addEmptyDataItem(result);\n                }\n                if (dataItem.ordinal - lastOrdinal > 1) {\n                    lastOrdinal += 1;\n                    while (lastOrdinal < dataItem.ordinal && result.length < metadata.length) {\n                        result = this._addMissingDataItems(addEmptyDataItem(result), metadata);\n                        lastOrdinal += 1;\n                    }\n                }\n                dataItem.ordinal = result.length;\n                result[result.length] = dataItem;\n                return result;\n            },\n            _normalizeData: function (options) {\n                var data = options.data;\n                var dataIdx = 0;\n                var dataItem;\n                var result = [];\n                var lastOrdinal;\n                var length;\n                options.lastOrdinal = 0;\n                options.columnIndexes = options.columnIndexes || {};\n                options.rowIndexes = options.rowIndexes || {};\n                options.columnsLength = options.columnsLength || 1;\n                options.rowsLength = options.rowsLength || 1;\n                options.length = options.columnsLength * options.rowsLength;\n                length = options.length;\n                if (data.length === length) {\n                    return data;\n                }\n                while (result.length < length) {\n                    dataItem = data[dataIdx++];\n                    if (dataItem) {\n                        lastOrdinal = dataItem.ordinal;\n                    }\n                    result = this._normalizeOrdinals(this._addMissingDataItems(result, options), dataItem, options);\n                    options.lastOrdinal = lastOrdinal;\n                }\n                return result;\n            },\n            discover: function (options, converter) {\n                var that = this, transport = that.transport;\n                return $.Deferred(function (deferred) {\n                    transport.discover(extend({\n                        success: function (response) {\n                            response = that.reader.parse(response);\n                            if (that._handleCustomErrors(response)) {\n                                return;\n                            }\n                            if (converter) {\n                                response = converter(response);\n                            }\n                            deferred.resolve(response);\n                        },\n                        error: function (response, status, error) {\n                            deferred.reject(response);\n                            that.error(response, status, error);\n                        }\n                    }, options));\n                }).promise().done(function () {\n                    that.trigger('schemaChange');\n                });\n            },\n            schemaMeasures: function () {\n                var that = this;\n                return that.discover({\n                    data: {\n                        command: 'schemaMeasures',\n                        restrictions: {\n                            catalogName: that.transport.catalog(),\n                            cubeName: that.transport.cube()\n                        }\n                    }\n                }, function (response) {\n                    return that.reader.measures(response);\n                });\n            },\n            schemaKPIs: function () {\n                var that = this;\n                return that.discover({\n                    data: {\n                        command: 'schemaKPIs',\n                        restrictions: {\n                            catalogName: that.transport.catalog(),\n                            cubeName: that.transport.cube()\n                        }\n                    }\n                }, function (response) {\n                    return that.reader.kpis(response);\n                });\n            },\n            schemaDimensions: function () {\n                var that = this;\n                return that.discover({\n                    data: {\n                        command: 'schemaDimensions',\n                        restrictions: {\n                            catalogName: that.transport.catalog(),\n                            cubeName: that.transport.cube()\n                        }\n                    }\n                }, function (response) {\n                    return that.reader.dimensions(response);\n                });\n            },\n            schemaHierarchies: function (dimensionName) {\n                var that = this;\n                return that.discover({\n                    data: {\n                        command: 'schemaHierarchies',\n                        restrictions: {\n                            catalogName: that.transport.catalog(),\n                            cubeName: that.transport.cube(),\n                            dimensionUniqueName: dimensionName\n                        }\n                    }\n                }, function (response) {\n                    return that.reader.hierarchies(response);\n                });\n            },\n            schemaLevels: function (hierarchyName) {\n                var that = this;\n                return that.discover({\n                    data: {\n                        command: 'schemaLevels',\n                        restrictions: {\n                            catalogName: that.transport.catalog(),\n                            cubeName: that.transport.cube(),\n                            hierarchyUniqueName: hierarchyName\n                        }\n                    }\n                }, function (response) {\n                    return that.reader.levels(response);\n                });\n            },\n            schemaCubes: function () {\n                var that = this;\n                return that.discover({\n                    data: {\n                        command: 'schemaCubes',\n                        restrictions: { catalogName: that.transport.catalog() }\n                    }\n                }, function (response) {\n                    return that.reader.cubes(response);\n                });\n            },\n            schemaCatalogs: function () {\n                var that = this;\n                return that.discover({ data: { command: 'schemaCatalogs' } }, function (response) {\n                    return that.reader.catalogs(response);\n                });\n            },\n            schemaMembers: function (restrictions) {\n                var that = this;\n                var success = function (restrictions) {\n                    return function (response) {\n                        return that.reader.members(response, restrictions);\n                    };\n                }(restrictions);\n                return that.discover({\n                    data: {\n                        command: 'schemaMembers',\n                        restrictions: extend({\n                            catalogName: that.transport.catalog(),\n                            cubeName: that.transport.cube()\n                        }, restrictions)\n                    }\n                }, success);\n            },\n            _params: function (data) {\n                if (this._clearAxesData) {\n                    this._axes = {};\n                    this._data = this._observe([]);\n                    this._clearAxesData = false;\n                    this.trigger(STATERESET);\n                }\n                var options = DataSource.fn._params.call(this, data);\n                options = extend({\n                    measures: this.measures(),\n                    measuresAxis: this.measuresAxis(),\n                    columns: this.columns(),\n                    rows: this.rows()\n                }, options);\n                if (this.cubeBuilder) {\n                    this._requestData = options;\n                }\n                return options;\n            }\n        });\n        function addEmptyDataItem(result) {\n            result[result.length] = {\n                value: '',\n                fmtValue: '',\n                ordinal: result.length\n            };\n            return result;\n        }\n        function validateAxis(newAxis, axis, measures) {\n            if (newAxis.tuples.length < membersCount(axis.tuples, measures)) {\n                return axis;\n            }\n            return;\n        }\n        function adjustDataByColumn(sourceTuples, targetTuples, rowsLength, measures, data) {\n            var columnIdx, rowIdx, dataIdx;\n            var columnsLength = sourceTuples.length;\n            var targetColumnsLength = membersCount(targetTuples, measures);\n            var measuresLength = measures.length || 1;\n            for (rowIdx = 0; rowIdx < rowsLength; rowIdx++) {\n                for (columnIdx = 0; columnIdx < columnsLength; columnIdx++) {\n                    dataIdx = tupleIndex(sourceTuples[columnIdx], targetTuples) * measuresLength;\n                    dataIdx += columnIdx % measuresLength;\n                    data[rowIdx * columnsLength + columnIdx].ordinal = rowIdx * targetColumnsLength + dataIdx;\n                }\n            }\n        }\n        function adjustDataByRow(sourceTuples, targetTuples, columnsLength, measures, data) {\n            var columnIdx, rowIdx, dataIdx;\n            var rowsLength = sourceTuples.length;\n            var measuresLength = measures.length || 1;\n            for (rowIdx = 0; rowIdx < rowsLength; rowIdx++) {\n                dataIdx = tupleIndex(sourceTuples[rowIdx], targetTuples);\n                dataIdx *= measuresLength;\n                dataIdx += rowIdx % measuresLength;\n                for (columnIdx = 0; columnIdx < columnsLength; columnIdx++) {\n                    data[rowIdx * columnsLength + columnIdx].ordinal = dataIdx * columnsLength + columnIdx;\n                }\n            }\n        }\n        function tupleIndex(tuple, collection) {\n            return findExistingTuple(collection, tuple).index;\n        }\n        function membersCount(tuples, measures) {\n            if (!tuples.length) {\n                return 0;\n            }\n            var queue = tuples.slice();\n            var current = queue.shift();\n            var result = 1;\n            while (current) {\n                if (current.members) {\n                    [].push.apply(queue, current.members);\n                } else if (current.children) {\n                    if (!current.measure) {\n                        result += current.children.length;\n                    }\n                    [].push.apply(queue, current.children);\n                }\n                current = queue.shift();\n            }\n            if (measures.length) {\n                result = result * measures.length;\n            }\n            return result;\n        }\n        function normalizeAxis(axis) {\n            if (!axis) {\n                axis = { tuples: [] };\n            }\n            if (!axis.tuples) {\n                axis.tuples = [];\n            }\n            return axis;\n        }\n        function findDataIndex(tuple, memberIndex, measures) {\n            if (!tuple) {\n                return 0;\n            }\n            var measuresLength = Math.max(measures.length, 1);\n            var tuples = tuple.members.slice(0, memberIndex);\n            var current = tuples.shift();\n            var counter = measuresLength;\n            while (current) {\n                if (current.name === MEASURES) {\n                    counter += measuresLength - 1;\n                } else if (current.children) {\n                    [].push.apply(tuples, current.children);\n                } else {\n                    counter++;\n                    [].push.apply(tuples, current.members);\n                }\n                current = tuples.shift();\n            }\n            return counter;\n        }\n        function mergeTuples(target, source, measures) {\n            if (!source[0]) {\n                return {\n                    parsedRoot: null,\n                    tuples: target,\n                    memberIndex: 0,\n                    index: 0\n                };\n            }\n            var result = findExistingTuple(target, source[0]);\n            if (!result.tuple) {\n                return {\n                    parsedRoot: null,\n                    tuples: source,\n                    memberIndex: 0,\n                    index: 0\n                };\n            }\n            var targetMembers = result.tuple.members;\n            var sourceMembers = source[0].members;\n            var memberIndex = -1;\n            if (targetMembers.length !== sourceMembers.length) {\n                return {\n                    parsedRoot: null,\n                    tuples: source,\n                    memberIndex: 0,\n                    index: 0\n                };\n            }\n            for (var idx = 0, length = targetMembers.length; idx < length; idx++) {\n                if (!targetMembers[idx].measure && sourceMembers[idx].children[0]) {\n                    if (memberIndex == -1 && sourceMembers[idx].children.length) {\n                        memberIndex = idx;\n                    }\n                    targetMembers[idx].children = sourceMembers[idx].children;\n                }\n            }\n            measures = Math.max(measures.length, 1);\n            return {\n                parsedRoot: result.tuple,\n                index: result.index * measures,\n                memberIndex: memberIndex,\n                tuples: target\n            };\n        }\n        function equalTuples(first, second) {\n            var equal = true;\n            var idx, length;\n            first = first.members;\n            second = second.members;\n            for (idx = 0, length = first.length; idx < length; idx++) {\n                if (first[idx].measure || second[idx].measure) {\n                    continue;\n                }\n                equal = equal && getName(first[idx]) === getName(second[idx]);\n            }\n            return equal;\n        }\n        function findExistingTuple(tuples, toFind) {\n            var idx, length, tuple, found, counter = 0;\n            var memberIndex, membersLength, member;\n            for (idx = 0, length = tuples.length; idx < length; idx++) {\n                tuple = tuples[idx];\n                if (equalTuples(tuple, toFind)) {\n                    return {\n                        tuple: tuple,\n                        index: counter\n                    };\n                }\n                counter++;\n                for (memberIndex = 0, membersLength = tuple.members.length; memberIndex < membersLength; memberIndex++) {\n                    member = tuple.members[memberIndex];\n                    if (member.measure) {\n                        continue;\n                    }\n                    found = findExistingTuple(member.children, toFind);\n                    counter += found.index;\n                    if (found.tuple) {\n                        return {\n                            tuple: found.tuple,\n                            index: counter\n                        };\n                    }\n                }\n            }\n            return { index: counter };\n        }\n        function addMembers(members, map) {\n            var member, i, len, path = '';\n            for (i = 0, len = members.length; i < len; i++) {\n                member = members[i];\n                path += member.name;\n                if (!map[path]) {\n                    map[path] = member;\n                }\n            }\n        }\n        function findParentMember(tuple, map) {\n            var members = tuple.members;\n            var i, len, member, path = '';\n            var parentPath = '';\n            var parentMember;\n            for (i = 0, len = members.length; i < len; i++) {\n                member = members[i];\n                if (parentMember) {\n                    if (map[path + member.name]) {\n                        path += member.name;\n                        parentMember = map[path];\n                        continue;\n                    } else if (map[path + member.parentName]) {\n                        return map[path + member.parentName];\n                    } else if (map[parentPath + member.parentName]) {\n                        return map[parentPath + member.parentName];\n                    } else {\n                        return map[parentPath];\n                    }\n                }\n                path += member.name;\n                parentMember = map[member.parentName];\n                if (!parentMember) {\n                    parentMember = map[path];\n                    if (!parentMember) {\n                        return null;\n                    }\n                }\n                if (parentMember) {\n                    parentPath += parentMember.name;\n                }\n            }\n            return parentMember;\n        }\n        function measurePosition(tuple, measures) {\n            if (measures.length === 0) {\n                return -1;\n            }\n            var measure = measures[0];\n            var members = tuple.members;\n            for (var idx = 0, len = members.length; idx < len; idx++) {\n                if (members[idx].name == measure.name) {\n                    return idx;\n                }\n            }\n        }\n        function normalizeTupleMeasures(tuple, index) {\n            if (index < 0) {\n                return;\n            }\n            var member = {\n                name: MEASURES,\n                measure: true,\n                children: [$.extend({\n                        members: [],\n                        dataIndex: tuple.dataIndex\n                    }, tuple.members[index])]\n            };\n            tuple.members.splice(index, 1, member);\n            tuple.dataIndex = undefined;\n        }\n        function parseSource(tuples, measures) {\n            if (tuples.length < 1) {\n                return [];\n            }\n            var result = [];\n            var map = {};\n            var measureIndex = measurePosition(tuples[0], measures);\n            for (var i = 0; i < tuples.length; i++) {\n                var tuple = tuples[i];\n                tuple.dataIndex = i;\n                normalizeTupleMeasures(tuple, measureIndex);\n                var parentMember = findParentMember(tuple, map);\n                if (parentMember) {\n                    if (measureIndex < 0 || !parentMember.measure) {\n                        parentMember.children.push(tuple);\n                    } else {\n                        parentMember.children.push(tuple.members[measureIndex].children[0]);\n                    }\n                } else {\n                    result.push(tuple);\n                }\n                addMembers(tuple.members, map);\n            }\n            return result;\n        }\n        function prepareDataOnRows(tuples, data) {\n            if (!tuples || !tuples.length) {\n                return data;\n            }\n            var result = [];\n            var indices = buildDataIndices(tuples);\n            var rowsLength = indices.length;\n            var columnsLength = Math.max(data.length / rowsLength, 1);\n            var rowIndex, columnIndex, targetIndex, sourceIndex;\n            var calcIndex;\n            for (rowIndex = 0; rowIndex < rowsLength; rowIndex++) {\n                targetIndex = columnsLength * rowIndex;\n                sourceIndex = columnsLength * indices[rowIndex];\n                for (columnIndex = 0; columnIndex < columnsLength; columnIndex++) {\n                    calcIndex = parseInt(sourceIndex + columnIndex, 10);\n                    result[parseInt(targetIndex + columnIndex, 10)] = data[calcIndex] || {\n                        value: '',\n                        fmtValue: '',\n                        ordinal: calcIndex\n                    };\n                }\n            }\n            return result;\n        }\n        function prepareDataOnColumns(tuples, data) {\n            if (!tuples || !tuples.length) {\n                return data;\n            }\n            var result = [];\n            var indices = buildDataIndices(tuples);\n            var columnsLength = indices.length;\n            var rowsLength = Math.max(data.length / columnsLength, 1);\n            var columnIndex, rowIndex, dataIndex, calcIndex;\n            for (rowIndex = 0; rowIndex < rowsLength; rowIndex++) {\n                dataIndex = columnsLength * rowIndex;\n                for (columnIndex = 0; columnIndex < columnsLength; columnIndex++) {\n                    calcIndex = indices[columnIndex] + dataIndex;\n                    result[dataIndex + columnIndex] = data[calcIndex] || {\n                        value: '',\n                        fmtValue: '',\n                        ordinal: calcIndex\n                    };\n                }\n            }\n            return result;\n        }\n        function buildDataIndices(tuples) {\n            tuples = tuples.slice();\n            var result = [];\n            var tuple = tuples.shift();\n            var idx, length, spliceIndex, children, member;\n            while (tuple) {\n                if (tuple.dataIndex !== undefined) {\n                    result.push(tuple.dataIndex);\n                }\n                spliceIndex = 0;\n                for (idx = 0, length = tuple.members.length; idx < length; idx++) {\n                    member = tuple.members[idx];\n                    children = member.children;\n                    if (member.measure) {\n                        [].splice.apply(tuples, [\n                            0,\n                            0\n                        ].concat(children));\n                    } else {\n                        [].splice.apply(tuples, [\n                            spliceIndex,\n                            0\n                        ].concat(children));\n                    }\n                    spliceIndex += children.length;\n                }\n                tuple = tuples.shift();\n            }\n            return result;\n        }\n        PivotDataSource.create = function (options) {\n            options = options && options.push ? { data: options } : options;\n            var dataSource = options || {}, data = dataSource.data;\n            dataSource.data = data;\n            if (!(dataSource instanceof PivotDataSource) && dataSource instanceof kendo.data.DataSource) {\n                throw new Error('Incorrect DataSource type. Only PivotDataSource instances are supported');\n            }\n            return dataSource instanceof PivotDataSource ? dataSource : new PivotDataSource(dataSource);\n        };\n        function baseHierarchyPath(memberName) {\n            var parts = memberName.split('.');\n            if (parts.length > 2) {\n                return parts[0] + '.' + parts[1];\n            }\n            return memberName;\n        }\n        function expandMemberDescriptor(names, sort) {\n            var idx = names.length - 1;\n            var name = names[idx];\n            var sortDescriptor;\n            sortDescriptor = sortDescriptorForMember(sort, name);\n            if (sortDescriptor && sortDescriptor.dir) {\n                name = 'ORDER(' + name + '.Children,' + sortDescriptor.field + '.CurrentMember.MEMBER_CAPTION,' + sortDescriptor.dir + ')';\n            } else {\n                name += '.Children';\n            }\n            names[idx] = name;\n            return names;\n        }\n        function sortDescriptorForMember(sort, member) {\n            for (var idx = 0, length = sort.length; idx < length; idx++) {\n                if (member.indexOf(sort[idx].field) === 0) {\n                    return sort[idx];\n                }\n            }\n            return null;\n        }\n        function crossJoin(names) {\n            var result = 'CROSSJOIN({';\n            var r;\n            if (names.length > 2) {\n                r = names.pop();\n                result += crossJoin(names);\n            } else {\n                result += names.shift();\n                r = names.pop();\n            }\n            result += '},{';\n            result += r;\n            result += '})';\n            return result;\n        }\n        function crossJoinCommand(members, measures) {\n            var tmp = members.slice(0);\n            if (measures.length > 1) {\n                tmp.push('{' + measureNames(measures).join(',') + '}');\n            }\n            return crossJoin(tmp);\n        }\n        function measureNames(measures) {\n            var idx = 0;\n            var length = measures.length;\n            var result = [];\n            var measure;\n            for (; idx < length; idx++) {\n                measure = measures[idx];\n                result.push(measure.name !== undefined ? measure.name : measure);\n            }\n            return result;\n        }\n        function getName(name) {\n            name = name.name || name;\n            if (toString.call(name) === '[object Array]') {\n                name = name[name.length - 1];\n            }\n            return name;\n        }\n        function getRootNames(members) {\n            var length = members.length;\n            var names = [];\n            var idx = 0;\n            for (; idx < length; idx++) {\n                names.push(members[idx].name[0]);\n            }\n            return names;\n        }\n        function mapNames(names, rootNames) {\n            var name;\n            var rootName;\n            var j;\n            var idx = 0;\n            var length = names.length;\n            var rootLength = rootNames.length;\n            rootNames = rootNames.slice(0);\n            for (; idx < length; idx++) {\n                name = names[idx];\n                for (j = 0; j < rootLength; j++) {\n                    rootName = baseHierarchyPath(rootNames[j]);\n                    if (name.indexOf(rootName) !== -1) {\n                        rootNames[j] = name;\n                        break;\n                    }\n                }\n            }\n            return {\n                names: rootNames,\n                expandedIdx: j,\n                uniquePath: rootNames.slice(0, j + 1).join('')\n            };\n        }\n        function parseDescriptors(members) {\n            var expanded = [];\n            var child = [];\n            var root = [];\n            var member;\n            var j, l;\n            var idx = 0;\n            var length = members.length;\n            var name;\n            var hierarchyName;\n            var found;\n            for (; idx < length; idx++) {\n                member = members[idx];\n                name = member.name;\n                found = false;\n                if (toString.call(name) !== '[object Array]') {\n                    member.name = name = [name];\n                }\n                if (name.length > 1) {\n                    child.push(member);\n                } else {\n                    hierarchyName = baseHierarchyPath(name[0]);\n                    for (j = 0, l = root.length; j < l; j++) {\n                        if (root[j].name[0].indexOf(hierarchyName) === 0) {\n                            found = true;\n                            break;\n                        }\n                    }\n                    if (!found) {\n                        root.push(member);\n                    }\n                    if (member.expand) {\n                        expanded.push(member);\n                    }\n                }\n            }\n            expanded = expanded.concat(child);\n            return {\n                root: root,\n                expanded: expanded\n            };\n        }\n        function serializeMembers(members, measures, sort) {\n            var command = '';\n            members = members || [];\n            var expanded = parseDescriptors(members);\n            var root = expanded.root;\n            var rootNames = getRootNames(root);\n            var crossJoinCommands = [];\n            expanded = expanded.expanded;\n            var length = expanded.length;\n            var idx = 0;\n            var memberName;\n            var names = [];\n            if (rootNames.length > 1 || measures.length > 1) {\n                crossJoinCommands.push(crossJoinCommand(rootNames, measures));\n                for (; idx < length; idx++) {\n                    memberName = expandMemberDescriptor(expanded[idx].name, sort);\n                    names = mapNames(memberName, rootNames).names;\n                    crossJoinCommands.push(crossJoinCommand(names, measures));\n                }\n                command += crossJoinCommands.join(',');\n            } else {\n                for (; idx < length; idx++) {\n                    memberName = expandMemberDescriptor(expanded[idx].name, sort);\n                    names.push(memberName[0]);\n                }\n                command += rootNames.concat(names).join(',');\n            }\n            return command;\n        }\n        var filterFunctionFormats = {\n            contains: ', InStr({0}.CurrentMember.MEMBER_CAPTION,\"{1}\") > 0',\n            doesnotcontain: ', InStr({0}.CurrentMember.MEMBER_CAPTION,\"{1}\")',\n            startswith: ', Left({0}.CurrentMember.MEMBER_CAPTION,Len(\"{1}\"))=\"{1}\"',\n            endswith: ', Right({0}.CurrentMember.MEMBER_CAPTION,Len(\"{1}\"))=\"{1}\"',\n            eq: ', {0}.CurrentMember.MEMBER_CAPTION = \"{1}\"',\n            neq: ', {0}.CurrentMember.MEMBER_CAPTION = \"{1}\"'\n        };\n        function serializeExpression(expression) {\n            var command = '';\n            var value = expression.value;\n            var field = expression.field;\n            var operator = expression.operator;\n            if (operator == 'in') {\n                command += '{';\n                command += value;\n                command += '}';\n            } else {\n                command += operator == 'neq' || operator == 'doesnotcontain' ? '-' : '';\n                command += 'Filter(';\n                command += field + '.MEMBERS';\n                command += kendo.format(filterFunctionFormats[operator], field, value);\n                command += ')';\n            }\n            return command;\n        }\n        function serializeFilters(filter, cube) {\n            var command = '', current;\n            var filters = filter.filters;\n            var length = filters.length;\n            var idx;\n            for (idx = length - 1; idx >= 0; idx--) {\n                current = 'SELECT (';\n                current += serializeExpression(filters[idx]);\n                current += ') ON 0';\n                if (idx == length - 1) {\n                    current += ' FROM [' + cube + ']';\n                    command = current;\n                } else {\n                    command = current + ' FROM ( ' + command + ' )';\n                }\n            }\n            return command;\n        }\n        function serializeOptions(parentTagName, options, capitalize) {\n            var result = '';\n            if (options) {\n                result += '<' + parentTagName + '>';\n                var value;\n                for (var key in options) {\n                    value = options[key];\n                    if (capitalize) {\n                        key = key.replace(/([A-Z]+(?=$|[A-Z][a-z])|[A-Z]?[a-z]+)/g, '$1_').toUpperCase().replace(/_$/, '');\n                    }\n                    result += '<' + key + '>' + value + '</' + key + '>';\n                }\n                result += '</' + parentTagName + '>';\n            } else {\n                result += '<' + parentTagName + '/>';\n            }\n            return result;\n        }\n        var xmlaDiscoverCommands = {\n            schemaCubes: 'MDSCHEMA_CUBES',\n            schemaCatalogs: 'DBSCHEMA_CATALOGS',\n            schemaMeasures: 'MDSCHEMA_MEASURES',\n            schemaDimensions: 'MDSCHEMA_DIMENSIONS',\n            schemaHierarchies: 'MDSCHEMA_HIERARCHIES',\n            schemaLevels: 'MDSCHEMA_LEVELS',\n            schemaMembers: 'MDSCHEMA_MEMBERS',\n            schemaKPIs: 'MDSCHEMA_KPIS'\n        };\n        var convertersMap = {\n            read: function (options) {\n                var command = '<Envelope xmlns=\"http://schemas.xmlsoap.org/soap/envelope/\"><Header/><Body><Execute xmlns=\"urn:schemas-microsoft-com:xml-analysis\"><Command><Statement>';\n                command += 'SELECT NON EMPTY {';\n                var columns = options.columns || [];\n                var rows = options.rows || [];\n                var measures = options.measures || [];\n                var measuresRowAxis = options.measuresAxis === 'rows';\n                var sort = options.sort || [];\n                if (!columns.length && rows.length && (!measures.length || measures.length && measuresRowAxis)) {\n                    columns = rows;\n                    rows = [];\n                    measuresRowAxis = false;\n                }\n                if (!columns.length && !rows.length) {\n                    measuresRowAxis = false;\n                }\n                if (columns.length) {\n                    command += serializeMembers(columns, !measuresRowAxis ? measures : [], sort);\n                } else if (measures.length && !measuresRowAxis) {\n                    command += measureNames(measures).join(',');\n                }\n                command += '} DIMENSION PROPERTIES CHILDREN_CARDINALITY, PARENT_UNIQUE_NAME ON COLUMNS';\n                if (rows.length || measuresRowAxis && measures.length > 1) {\n                    command += ', NON EMPTY {';\n                    if (rows.length) {\n                        command += serializeMembers(rows, measuresRowAxis ? measures : [], sort);\n                    } else {\n                        command += measureNames(measures).join(',');\n                    }\n                    command += '} DIMENSION PROPERTIES CHILDREN_CARDINALITY, PARENT_UNIQUE_NAME ON ROWS';\n                }\n                if (options.filter) {\n                    command += ' FROM ';\n                    command += '(';\n                    command += serializeFilters(options.filter, options.connection.cube);\n                    command += ')';\n                } else {\n                    command += ' FROM [' + options.connection.cube + ']';\n                }\n                if (measures.length == 1 && columns.length) {\n                    command += ' WHERE (' + measureNames(measures).join(',') + ')';\n                }\n                command += '</Statement></Command><Properties><PropertyList><Catalog>' + options.connection.catalog + '</Catalog><Format>Multidimensional</Format></PropertyList></Properties></Execute></Body></Envelope>';\n                return command.replace(/\\&/g, '&amp;');\n            },\n            discover: function (options) {\n                options = options || {};\n                var command = '<Envelope xmlns=\"http://schemas.xmlsoap.org/soap/envelope/\"><Header/><Body><Discover xmlns=\"urn:schemas-microsoft-com:xml-analysis\">';\n                command += '<RequestType>' + (xmlaDiscoverCommands[options.command] || options.command) + '</RequestType>';\n                command += '<Restrictions>' + serializeOptions('RestrictionList', options.restrictions, true) + '</Restrictions>';\n                if (options.connection && options.connection.catalog) {\n                    options.properties = $.extend({}, { Catalog: options.connection.catalog }, options.properties);\n                }\n                command += '<Properties>' + serializeOptions('PropertyList', options.properties) + '</Properties>';\n                command += '</Discover></Body></Envelope>';\n                return command;\n            }\n        };\n        var XmlaTransport = kendo.data.RemoteTransport.extend({\n            init: function (options) {\n                var originalOptions = options;\n                options = this.options = extend(true, {}, this.options, options);\n                kendo.data.RemoteTransport.call(this, options);\n                if (isFunction(originalOptions.discover)) {\n                    this.discover = originalOptions.discover;\n                } else if (typeof originalOptions.discover === 'string') {\n                    this.options.discover = { url: originalOptions.discover };\n                } else if (!originalOptions.discover) {\n                    this.options.discover = this.options.read;\n                }\n            },\n            setup: function (options, type) {\n                options.data = options.data || {};\n                $.extend(true, options.data, { connection: this.options.connection });\n                return kendo.data.RemoteTransport.fn.setup.call(this, options, type);\n            },\n            options: {\n                read: {\n                    dataType: 'text',\n                    contentType: 'text/xml',\n                    type: 'POST'\n                },\n                discover: {\n                    dataType: 'text',\n                    contentType: 'text/xml',\n                    type: 'POST'\n                },\n                parameterMap: function (options, type) {\n                    return convertersMap[type](options, type);\n                }\n            },\n            discover: function (options) {\n                return $.ajax(this.setup(options, 'discover'));\n            }\n        });\n        function asArray(object) {\n            if (object == null) {\n                return [];\n            }\n            var type = toString.call(object);\n            if (type !== '[object Array]') {\n                return [object];\n            }\n            return object;\n        }\n        function translateAxis(axis) {\n            var result = { tuples: [] };\n            var tuples = asArray(kendo.getter('Tuples.Tuple', true)(axis));\n            var captionGetter = kendo.getter('Caption[\\'#text\\']');\n            var unameGetter = kendo.getter('UName[\\'#text\\']');\n            var levelNameGetter = kendo.getter('LName[\\'#text\\']');\n            var levelNumGetter = kendo.getter('LNum[\\'#text\\']');\n            var childrenGetter = kendo.getter('CHILDREN_CARDINALITY[\\'#text\\']', true);\n            var hierarchyGetter = kendo.getter('[\\'@Hierarchy\\']');\n            var parentNameGetter = kendo.getter('PARENT_UNIQUE_NAME[\\'#text\\']', true);\n            for (var idx = 0; idx < tuples.length; idx++) {\n                var members = [];\n                var member = asArray(tuples[idx].Member);\n                for (var memberIdx = 0; memberIdx < member.length; memberIdx++) {\n                    members.push({\n                        children: [],\n                        caption: captionGetter(member[memberIdx]),\n                        name: unameGetter(member[memberIdx]),\n                        levelName: levelNameGetter(member[memberIdx]),\n                        levelNum: levelNumGetter(member[memberIdx]),\n                        hasChildren: parseInt(childrenGetter(member[memberIdx]), 10) > 0,\n                        parentName: parentNameGetter(member[memberIdx]),\n                        hierarchy: hierarchyGetter(member[memberIdx])\n                    });\n                }\n                result.tuples.push({ members: members });\n            }\n            return result;\n        }\n        var schemaDataReaderMap = {\n            cubes: {\n                name: kendo.getter('CUBE_NAME[\\'#text\\']', true),\n                caption: kendo.getter('CUBE_CAPTION[\\'#text\\']', true),\n                description: kendo.getter('DESCRIPTION[\\'#text\\']', true),\n                type: kendo.getter('CUBE_TYPE[\\'#text\\']', true)\n            },\n            catalogs: {\n                name: kendo.getter('CATALOG_NAME[\\'#text\\']', true),\n                description: kendo.getter('DESCRIPTION[\\'#text\\']', true)\n            },\n            measures: {\n                name: kendo.getter('MEASURE_NAME[\\'#text\\']', true),\n                caption: kendo.getter('MEASURE_CAPTION[\\'#text\\']', true),\n                uniqueName: kendo.getter('MEASURE_UNIQUE_NAME[\\'#text\\']', true),\n                description: kendo.getter('DESCRIPTION[\\'#text\\']', true),\n                aggregator: kendo.getter('MEASURE_AGGREGATOR[\\'#text\\']', true),\n                groupName: kendo.getter('MEASUREGROUP_NAME[\\'#text\\']', true),\n                displayFolder: kendo.getter('MEASURE_DISPLAY_FOLDER[\\'#text\\']', true),\n                defaultFormat: kendo.getter('DEFAULT_FORMAT_STRING[\\'#text\\']', true)\n            },\n            kpis: {\n                name: kendo.getter('KPI_NAME[\\'#text\\']', true),\n                caption: kendo.getter('KPI_CAPTION[\\'#text\\']', true),\n                value: kendo.getter('KPI_VALUE[\\'#text\\']', true),\n                goal: kendo.getter('KPI_GOAL[\\'#text\\']', true),\n                status: kendo.getter('KPI_STATUS[\\'#text\\']', true),\n                trend: kendo.getter('KPI_TREND[\\'#text\\']', true),\n                statusGraphic: kendo.getter('KPI_STATUS_GRAPHIC[\\'#text\\']', true),\n                trendGraphic: kendo.getter('KPI_TREND_GRAPHIC[\\'#text\\']', true),\n                description: kendo.getter('KPI_DESCRIPTION[\\'#text\\']', true),\n                groupName: kendo.getter('MEASUREGROUP_NAME[\\'#text\\']', true)\n            },\n            dimensions: {\n                name: kendo.getter('DIMENSION_NAME[\\'#text\\']', true),\n                caption: kendo.getter('DIMENSION_CAPTION[\\'#text\\']', true),\n                description: kendo.getter('DESCRIPTION[\\'#text\\']', true),\n                uniqueName: kendo.getter('DIMENSION_UNIQUE_NAME[\\'#text\\']', true),\n                defaultHierarchy: kendo.getter('DEFAULT_HIERARCHY[\\'#text\\']', true),\n                type: kendo.getter('DIMENSION_TYPE[\\'#text\\']', true)\n            },\n            hierarchies: {\n                name: kendo.getter('HIERARCHY_NAME[\\'#text\\']', true),\n                caption: kendo.getter('HIERARCHY_CAPTION[\\'#text\\']', true),\n                description: kendo.getter('DESCRIPTION[\\'#text\\']', true),\n                uniqueName: kendo.getter('HIERARCHY_UNIQUE_NAME[\\'#text\\']', true),\n                dimensionUniqueName: kendo.getter('DIMENSION_UNIQUE_NAME[\\'#text\\']', true),\n                displayFolder: kendo.getter('HIERARCHY_DISPLAY_FOLDER[\\'#text\\']', true),\n                origin: kendo.getter('HIERARCHY_ORIGIN[\\'#text\\']', true),\n                defaultMember: kendo.getter('DEFAULT_MEMBER[\\'#text\\']', true)\n            },\n            levels: {\n                name: kendo.getter('LEVEL_NAME[\\'#text\\']', true),\n                caption: kendo.getter('LEVEL_CAPTION[\\'#text\\']', true),\n                description: kendo.getter('DESCRIPTION[\\'#text\\']', true),\n                uniqueName: kendo.getter('LEVEL_UNIQUE_NAME[\\'#text\\']', true),\n                dimensionUniqueName: kendo.getter('DIMENSION_UNIQUE_NAME[\\'#text\\']', true),\n                displayFolder: kendo.getter('LEVEL_DISPLAY_FOLDER[\\'#text\\']', true),\n                orderingProperty: kendo.getter('LEVEL_ORDERING_PROPERTY[\\'#text\\']', true),\n                origin: kendo.getter('LEVEL_ORIGIN[\\'#text\\']', true),\n                hierarchyUniqueName: kendo.getter('HIERARCHY_UNIQUE_NAME[\\'#text\\']', true)\n            },\n            members: {\n                name: kendo.getter('MEMBER_NAME[\\'#text\\']', true),\n                caption: kendo.getter('MEMBER_CAPTION[\\'#text\\']', true),\n                uniqueName: kendo.getter('MEMBER_UNIQUE_NAME[\\'#text\\']', true),\n                dimensionUniqueName: kendo.getter('DIMENSION_UNIQUE_NAME[\\'#text\\']', true),\n                hierarchyUniqueName: kendo.getter('HIERARCHY_UNIQUE_NAME[\\'#text\\']', true),\n                levelUniqueName: kendo.getter('LEVEL_UNIQUE_NAME[\\'#text\\']', true),\n                childrenCardinality: kendo.getter('CHILDREN_CARDINALITY[\\'#text\\']', true)\n            }\n        };\n        var xmlaReaderMethods = [\n            'axes',\n            'catalogs',\n            'cubes',\n            'dimensions',\n            'hierarchies',\n            'levels',\n            'measures'\n        ];\n        var XmlaDataReader = kendo.data.XmlDataReader.extend({\n            init: function (options) {\n                kendo.data.XmlDataReader.call(this, options);\n                this._extend(options);\n            },\n            _extend: function (options) {\n                var idx = 0;\n                var length = xmlaReaderMethods.length;\n                var methodName;\n                var option;\n                for (; idx < length; idx++) {\n                    methodName = xmlaReaderMethods[idx];\n                    option = options[methodName];\n                    if (option && option !== identity) {\n                        this[methodName] = option;\n                    }\n                }\n            },\n            parse: function (xml) {\n                var result = kendo.data.XmlDataReader.fn.parse(xml.replace(/<(\\/?)(\\w|-)+:/g, '<$1'));\n                return kendo.getter('[\\'Envelope\\'][\\'Body\\']', true)(result);\n            },\n            errors: function (root) {\n                var fault = kendo.getter('[\\'Fault\\']', true)(root);\n                if (fault) {\n                    return [{\n                            faultstring: kendo.getter('faultstring[\\'#text\\']', true)(fault),\n                            faultcode: kendo.getter('faultcode[\\'#text\\']', true)(fault)\n                        }];\n                }\n                return null;\n            },\n            axes: function (root) {\n                root = kendo.getter('ExecuteResponse[\"return\"].root', true)(root);\n                var axes = asArray(kendo.getter('Axes.Axis', true)(root));\n                var axis;\n                var result = {\n                    columns: {},\n                    rows: {}\n                };\n                for (var idx = 0; idx < axes.length; idx++) {\n                    axis = axes[idx];\n                    if (axis['@name'].toLowerCase() !== 'sliceraxis') {\n                        if (!result.columns.tuples) {\n                            result.columns = translateAxis(axis);\n                        } else {\n                            result.rows = translateAxis(axis);\n                        }\n                    }\n                }\n                return result;\n            },\n            data: function (root) {\n                root = kendo.getter('ExecuteResponse[\"return\"].root', true)(root);\n                var cells = asArray(kendo.getter('CellData.Cell', true)(root));\n                var result = [];\n                var ordinalGetter = kendo.getter('[\\'@CellOrdinal\\']');\n                var valueGetter = kendo.getter('Value[\\'#text\\']');\n                var fmtValueGetter = kendo.getter('FmtValue[\\'#text\\']');\n                for (var idx = 0; idx < cells.length; idx++) {\n                    result.push({\n                        value: valueGetter(cells[idx]),\n                        fmtValue: fmtValueGetter(cells[idx]),\n                        ordinal: parseInt(ordinalGetter(cells[idx]), 10)\n                    });\n                }\n                return result;\n            },\n            _mapSchema: function (root, getters) {\n                root = kendo.getter('DiscoverResponse[\"return\"].root', true)(root);\n                var rows = asArray(kendo.getter('row', true)(root));\n                var result = [];\n                for (var idx = 0; idx < rows.length; idx++) {\n                    var obj = {};\n                    for (var key in getters) {\n                        obj[key] = getters[key](rows[idx]);\n                    }\n                    result.push(obj);\n                }\n                return result;\n            },\n            measures: function (root) {\n                return this._mapSchema(root, schemaDataReaderMap.measures);\n            },\n            kpis: function (root) {\n                return this._mapSchema(root, schemaDataReaderMap.kpis);\n            },\n            hierarchies: function (root) {\n                return this._mapSchema(root, schemaDataReaderMap.hierarchies);\n            },\n            levels: function (root) {\n                return this._mapSchema(root, schemaDataReaderMap.levels);\n            },\n            dimensions: function (root) {\n                return this._mapSchema(root, schemaDataReaderMap.dimensions);\n            },\n            cubes: function (root) {\n                return this._mapSchema(root, schemaDataReaderMap.cubes);\n            },\n            catalogs: function (root) {\n                return this._mapSchema(root, schemaDataReaderMap.catalogs);\n            },\n            members: function (root) {\n                return this._mapSchema(root, schemaDataReaderMap.members);\n            }\n        });\n        extend(true, kendo.data, {\n            PivotDataSource: PivotDataSource,\n            XmlaTransport: XmlaTransport,\n            XmlaDataReader: XmlaDataReader,\n            PivotCubeBuilder: PivotCubeBuilder,\n            transports: { xmla: XmlaTransport },\n            readers: { xmla: XmlaDataReader }\n        });\n        var sortExpr = function (expressions, name) {\n            if (!expressions) {\n                return null;\n            }\n            for (var idx = 0, length = expressions.length; idx < length; idx++) {\n                if (expressions[idx].field === name) {\n                    return expressions[idx];\n                }\n            }\n            return null;\n        };\n        var removeExpr = function (expressions, name) {\n            var result = [];\n            for (var idx = 0, length = expressions.length; idx < length; idx++) {\n                if (expressions[idx].field !== name) {\n                    result.push(expressions[idx]);\n                }\n            }\n            return result;\n        };\n        kendo.ui.PivotSettingTarget = Widget.extend({\n            init: function (element, options) {\n                var that = this;\n                Widget.fn.init.call(that, element, options);\n                that.element.addClass('k-pivot-setting');\n                that.dataSource = kendo.data.PivotDataSource.create(options.dataSource);\n                that._refreshHandler = $.proxy(that.refresh, that);\n                that.dataSource.first(CHANGE, that._refreshHandler);\n                if (!options.template) {\n                    that.options.template = '<div data-' + kendo.ns + 'name=\"${data.name || data}\">${data.name || data}' + (that.options.enabled ? '<a class=\"k-button k-button-icon k-bare\"><span class=\"k-icon k-i-close k-setting-delete\"></span></a>' : '') + '</div>';\n                }\n                that.template = kendo.template(that.options.template);\n                that.emptyTemplate = kendo.template(that.options.emptyTemplate);\n                that._sortable();\n                that.element.on('click' + NS, '.k-button,.k-item', function (e) {\n                    var target = $(e.target);\n                    var name = target.closest('[' + kendo.attr('name') + ']').attr(kendo.attr('name'));\n                    if (!name) {\n                        return;\n                    }\n                    if (target.hasClass('k-i-close')) {\n                        that.remove(name);\n                    } else if (that.options.sortable && target[0] === e.currentTarget) {\n                        that.sort({\n                            field: name,\n                            dir: target.find('.k-i-sort-asc-sm')[0] ? 'desc' : 'asc'\n                        });\n                    }\n                });\n                if (options.filterable || options.sortable) {\n                    that.fieldMenu = new ui.PivotFieldMenu(that.element, {\n                        messages: that.options.messages.fieldMenu,\n                        filter: '.k-setting-fieldmenu',\n                        filterable: options.filterable,\n                        sortable: options.sortable,\n                        dataSource: that.dataSource\n                    });\n                }\n                that.refresh();\n            },\n            options: {\n                name: 'PivotSettingTarget',\n                template: null,\n                filterable: false,\n                sortable: false,\n                emptyTemplate: '<div class=\\'k-empty\\'>${data}</div>',\n                setting: 'columns',\n                enabled: true,\n                messages: { empty: 'Drop Fields Here' }\n            },\n            setDataSource: function (dataSource) {\n                this.dataSource.unbind(CHANGE, this._refreshHandler);\n                this.dataSource = this.options.dataSource = dataSource;\n                if (this.fieldMenu) {\n                    this.fieldMenu.setDataSource(dataSource);\n                }\n                dataSource.first(CHANGE, this._refreshHandler);\n                this.refresh();\n            },\n            _sortable: function () {\n                var that = this;\n                if (that.options.enabled) {\n                    this.sortable = this.element.kendoSortable({\n                        connectWith: this.options.connectWith,\n                        hint: that.options.hint,\n                        cursor: 'move',\n                        start: function (e) {\n                            e.item.focus().blur();\n                        },\n                        change: function (e) {\n                            var name = e.item.attr(kendo.attr('name'));\n                            if (e.action == 'receive') {\n                                that.add(name);\n                            } else if (e.action == 'remove') {\n                                that.remove(name);\n                            } else if (e.action == 'sort') {\n                                that.move(name, e.newIndex);\n                            }\n                        }\n                    }).data('kendoSortable');\n                }\n            },\n            _indexOf: function (name, items) {\n                var idx, length, index = -1;\n                for (idx = 0, length = items.length; idx < length; idx++) {\n                    if (getName(items[idx]) === name) {\n                        index = idx;\n                        break;\n                    }\n                }\n                return index;\n            },\n            _isKPI: function (data) {\n                return data.type === 'kpi' || data.measure;\n            },\n            validate: function (data) {\n                var isMeasure = data.type == 2 || 'aggregator' in data || this._isKPI(data);\n                if (isMeasure) {\n                    return this.options.setting === 'measures';\n                }\n                if (this.options.setting === 'measures') {\n                    return isMeasure;\n                }\n                var items = this.dataSource[this.options.setting]();\n                var name = data.defaultHierarchy || data.uniqueName;\n                if (this._indexOf(name, items) > -1) {\n                    return false;\n                }\n                items = this.dataSource[this.options.setting === 'columns' ? 'rows' : 'columns']();\n                if (this._indexOf(name, items) > -1) {\n                    return false;\n                }\n                return true;\n            },\n            add: function (name) {\n                var items = this.dataSource[this.options.setting]();\n                var i, l;\n                name = $.isArray(name) ? name.slice(0) : [name];\n                for (i = 0, l = name.length; i < l; i++) {\n                    if (this._indexOf(name[i], items) !== -1) {\n                        name.splice(i, 1);\n                        i -= 1;\n                        l -= 1;\n                    }\n                }\n                if (name.length) {\n                    items = items.concat(name);\n                    this.dataSource[this.options.setting](items);\n                }\n            },\n            move: function (name, index) {\n                var items = this.dataSource[this.options.setting]();\n                var idx = this._indexOf(name, items);\n                if (idx > -1) {\n                    name = items.splice(idx, 1)[0];\n                    items.splice(index, 0, name);\n                    this.dataSource[this.options.setting](items);\n                }\n            },\n            remove: function (name) {\n                var items = this.dataSource[this.options.setting]();\n                var idx = this._indexOf(name, items);\n                var sortExpressions = this.dataSource.sort();\n                var filter = this.dataSource.filter();\n                if (idx > -1) {\n                    if (filter) {\n                        filter.filters = removeExpr(filter.filters, name);\n                        this.dataSource._filter.filters = filter.filters;\n                        if (!filter.filters.length) {\n                            this.dataSource._filter = null;\n                        }\n                    }\n                    if (sortExpressions) {\n                        sortExpressions = removeExpr(sortExpressions, name);\n                        this.dataSource._sort = sortExpressions;\n                    }\n                    items.splice(idx, 1);\n                    this.dataSource[this.options.setting](items);\n                }\n            },\n            sort: function (expr) {\n                var sortable = this.options.sortable;\n                var allowUnsort = sortable === true || sortable.allowUnsort;\n                var skipExpr = allowUnsort && expr.dir === 'asc';\n                var expressions = this.dataSource.sort() || [];\n                var result = removeExpr(expressions, expr.field);\n                if (skipExpr && expressions.length !== result.length) {\n                    expr = null;\n                }\n                if (expr) {\n                    result.push(expr);\n                }\n                this.dataSource.sort(result);\n            },\n            refresh: function () {\n                var html = '';\n                var items = this.dataSource[this.options.setting]();\n                var length = items.length;\n                var idx = 0;\n                var item;\n                if (length) {\n                    for (; idx < length; idx++) {\n                        item = items[idx];\n                        item = item.name === undefined ? { name: item } : item;\n                        html += this.template(extend({ sortIcon: this._sortIcon(item.name) }, item));\n                    }\n                } else {\n                    html = this.emptyTemplate(this.options.messages.empty);\n                }\n                this.element.html(html);\n            },\n            destroy: function () {\n                Widget.fn.destroy.call(this);\n                this.dataSource.unbind(CHANGE, this._refreshHandler);\n                this.element.off(NS);\n                if (this.sortable) {\n                    this.sortable.destroy();\n                }\n                if (this.fieldMenu) {\n                    this.fieldMenu.destroy();\n                }\n                this.element = null;\n                this._refreshHandler = null;\n            },\n            _sortIcon: function (name) {\n                var expressions = this.dataSource.sort();\n                var expr = sortExpr(expressions, getName(name));\n                var icon = '';\n                if (expr) {\n                    icon = 'k-i-sort-' + expr.dir;\n                }\n                return icon;\n            }\n        });\n        var PivotGrid = Widget.extend({\n            init: function (element, options) {\n                var that = this;\n                var columnBuilder;\n                var rowBuilder;\n                Widget.fn.init.call(that, element, options);\n                that._dataSource();\n                that._bindConfigurator();\n                that._wrapper();\n                that._createLayout();\n                that._columnBuilder = columnBuilder = new ColumnBuilder();\n                that._rowBuilder = rowBuilder = new RowBuilder();\n                that._contentBuilder = new ContentBuilder();\n                that._templates();\n                that.columnsHeader.add(that.rowsHeader).on('click', 'span.k-icon', function () {\n                    var button = $(this);\n                    var builder = columnBuilder;\n                    var action = 'expandColumn';\n                    var eventName;\n                    var path = button.attr(kendo.attr('path'));\n                    var eventArgs = {\n                        axis: 'columns',\n                        path: $.parseJSON(path)\n                    };\n                    if (button.parent().is('td')) {\n                        builder = rowBuilder;\n                        action = 'expandRow';\n                        eventArgs.axis = 'rows';\n                    }\n                    var expanded = button.hasClass(STATE_EXPANDED);\n                    var metadata = builder.metadata[path];\n                    var request = metadata.expanded === undefined;\n                    eventName = expanded ? COLLAPSEMEMBER : EXPANDMEMBER;\n                    eventArgs.childrenLoaded = metadata.maxChildren > metadata.children;\n                    if (that.trigger(eventName, eventArgs)) {\n                        return;\n                    }\n                    builder.metadata[path].expanded = !expanded;\n                    button.toggleClass(STATE_EXPANDED, !expanded).toggleClass(STATE_COLLAPSED, expanded);\n                    if (!expanded && request) {\n                        that.dataSource[action](eventArgs.path);\n                    } else {\n                        that.refresh();\n                    }\n                });\n                that._scrollable();\n                if (that.options.autoBind) {\n                    that.dataSource.fetch();\n                }\n                kendo.notify(that);\n            },\n            events: [\n                DATABINDING,\n                DATABOUND,\n                EXPANDMEMBER,\n                COLLAPSEMEMBER\n            ],\n            options: {\n                name: 'PivotGrid',\n                autoBind: true,\n                reorderable: true,\n                filterable: false,\n                sortable: false,\n                height: null,\n                columnWidth: 100,\n                configurator: '',\n                columnHeaderTemplate: null,\n                rowHeaderTemplate: null,\n                dataCellTemplate: null,\n                kpiStatusTemplate: null,\n                kpiTrendTemplate: null,\n                messages: {\n                    measureFields: 'Drop Data Fields Here',\n                    columnFields: 'Drop Column Fields Here',\n                    rowFields: 'Drop Rows Fields Here'\n                }\n            },\n            _templates: function () {\n                var columnTemplate = this.options.columnHeaderTemplate;\n                var rowTemplate = this.options.rowHeaderTemplate;\n                var dataTemplate = this.options.dataCellTemplate;\n                var kpiStatusTemplate = this.options.kpiStatusTemplate;\n                var kpiTrendTemplate = this.options.kpiTrendTemplate;\n                this._columnBuilder.template = kendo.template(columnTemplate || HEADER_TEMPLATE, { useWithBlock: !!columnTemplate });\n                this._contentBuilder.dataTemplate = kendo.template(dataTemplate || DATACELL_TEMPLATE, { useWithBlock: !!dataTemplate });\n                this._contentBuilder.kpiStatusTemplate = kendo.template(kpiStatusTemplate || KPISTATUS_TEMPLATE, { useWithBlock: !!kpiStatusTemplate });\n                this._contentBuilder.kpiTrendTemplate = kendo.template(kpiTrendTemplate || KPITREND_TEMPLATE, { useWithBlock: !!kpiTrendTemplate });\n                this._rowBuilder.template = kendo.template(rowTemplate || HEADER_TEMPLATE, { useWithBlock: !!rowTemplate });\n            },\n            _bindConfigurator: function () {\n                var configurator = this.options.configurator;\n                if (configurator) {\n                    $(configurator).kendoPivotConfigurator('setDataSource', this.dataSource);\n                }\n            },\n            cellInfoByElement: function (element) {\n                element = $(element);\n                return this.cellInfo(element.index(), element.parent('tr').index());\n            },\n            cellInfo: function (columnIndex, rowIndex) {\n                var contentBuilder = this._contentBuilder;\n                var columnInfo = contentBuilder.columnIndexes[columnIndex || 0];\n                var rowInfo = contentBuilder.rowIndexes[rowIndex || 0];\n                var dataIndex;\n                if (!columnInfo || !rowInfo) {\n                    return null;\n                }\n                dataIndex = rowInfo.index * contentBuilder.rowLength + columnInfo.index;\n                return {\n                    columnTuple: columnInfo.tuple,\n                    rowTuple: rowInfo.tuple,\n                    measure: columnInfo.measure || rowInfo.measure,\n                    dataItem: this.dataSource.view()[dataIndex]\n                };\n            },\n            setDataSource: function (dataSource) {\n                this.options.dataSource = dataSource;\n                this._dataSource();\n                if (this.measuresTarget) {\n                    this.measuresTarget.setDataSource(dataSource);\n                }\n                if (this.rowsTarget) {\n                    this.rowsTarget.setDataSource(dataSource);\n                }\n                if (this.columnsTarget) {\n                    this.columnsTarget.setDataSource(dataSource);\n                }\n                this._bindConfigurator();\n                if (this.options.autoBind) {\n                    dataSource.fetch();\n                }\n            },\n            setOptions: function (options) {\n                Widget.fn.setOptions.call(this, options);\n                this._templates();\n            },\n            destroy: function () {\n                Widget.fn.destroy.call(this);\n                clearTimeout(this._headerReflowTimeout);\n            },\n            _dataSource: function () {\n                var that = this;\n                var dataSource = that.options.dataSource;\n                dataSource = $.isArray(dataSource) ? { data: dataSource } : dataSource;\n                if (that.dataSource && this._refreshHandler) {\n                    that.dataSource.unbind(CHANGE, that._refreshHandler).unbind(STATERESET, that._stateResetHandler).unbind(PROGRESS, that._progressHandler).unbind(ERROR, that._errorHandler);\n                } else {\n                    that._refreshHandler = $.proxy(that.refresh, that);\n                    that._progressHandler = $.proxy(that._requestStart, that);\n                    that._stateResetHandler = $.proxy(that._stateReset, that);\n                    that._errorHandler = $.proxy(that._error, that);\n                }\n                that.dataSource = kendo.data.PivotDataSource.create(dataSource).bind(CHANGE, that._refreshHandler).bind(PROGRESS, that._progressHandler).bind(STATERESET, that._stateResetHandler).bind(ERROR, that._errorHandler);\n            },\n            _error: function () {\n                this._progress(false);\n            },\n            _requestStart: function () {\n                this._progress(true);\n            },\n            _stateReset: function () {\n                this._columnBuilder.reset();\n                this._rowBuilder.reset();\n            },\n            _wrapper: function () {\n                var height = this.options.height;\n                this.wrapper = this.element.addClass('k-widget k-pivot');\n                if (height) {\n                    this.wrapper.css('height', height);\n                }\n            },\n            _measureFields: function () {\n                this.measureFields = $(DIV).addClass('k-pivot-toolbar k-header k-settings-measures');\n                this.measuresTarget = this._createSettingTarget(this.measureFields, {\n                    setting: 'measures',\n                    messages: { empty: this.options.messages.measureFields }\n                });\n            },\n            _createSettingTarget: function (element, options) {\n                var template = '<span tabindex=\"0\" class=\"k-button\" data-' + kendo.ns + 'name=\"${data.name}\">${data.name}';\n                var sortable = options.sortable;\n                var icons = '';\n                if (sortable) {\n                    icons += '#if (data.sortIcon) {#';\n                    icons += '<span class=\"k-icon ${data.sortIcon}-sm\"></span>';\n                    icons += '#}#';\n                }\n                if (options.filterable || sortable) {\n                    icons += '<span class=\"k-icon k-i-more-vertical k-setting-fieldmenu\"></span>';\n                }\n                if (this.options.reorderable) {\n                    icons += '<span class=\"k-icon k-i-close k-setting-delete\"></span>';\n                }\n                if (icons) {\n                    template += '<span class=\"k-field-actions\">' + icons + '</span>';\n                }\n                template += '</span>';\n                return new kendo.ui.PivotSettingTarget(element, $.extend({\n                    template: template,\n                    emptyTemplate: '<span class=\"k-empty\">${data}</span>',\n                    enabled: this.options.reorderable,\n                    dataSource: this.dataSource\n                }, options));\n            },\n            _initSettingTargets: function () {\n                this.columnsTarget = this._createSettingTarget(this.columnFields, {\n                    connectWith: this.rowFields,\n                    setting: 'columns',\n                    filterable: this.options.filterable,\n                    sortable: this.options.sortable,\n                    messages: {\n                        empty: this.options.messages.columnFields,\n                        fieldMenu: this.options.messages.fieldMenu\n                    }\n                });\n                this.rowsTarget = this._createSettingTarget(this.rowFields, {\n                    connectWith: this.columnFields,\n                    setting: 'rows',\n                    filterable: this.options.filterable,\n                    sortable: this.options.sortable,\n                    messages: {\n                        empty: this.options.messages.rowFields,\n                        fieldMenu: this.options.messages.fieldMenu\n                    }\n                });\n            },\n            _createLayout: function () {\n                var that = this;\n                var layoutTable = $(LAYOUT_TABLE);\n                var leftContainer = layoutTable.find('.k-pivot-rowheaders');\n                var rightContainer = layoutTable.find('.k-pivot-table');\n                var gridWrapper = $(DIV).addClass('k-grid k-widget');\n                that._measureFields();\n                that.columnFields = $(DIV).addClass('k-pivot-toolbar k-header k-settings-columns');\n                that.rowFields = $(DIV).addClass('k-pivot-toolbar k-header k-settings-rows');\n                that.columnsHeader = $('<div class=\"k-grid-header-wrap\" />').wrap('<div class=\"k-grid-header\" />');\n                that.columnsHeader.parent().css('padding-right', kendo.support.scrollbar());\n                that.rowsHeader = $('<div class=\"k-grid k-widget k-alt\"/>');\n                that.content = $('<div class=\"k-grid-content\" />');\n                leftContainer.append(that.measureFields);\n                leftContainer.append(that.rowFields);\n                leftContainer.append(that.rowsHeader);\n                gridWrapper.append(that.columnsHeader.parent());\n                gridWrapper.append(that.content);\n                rightContainer.append(that.columnFields);\n                rightContainer.append(gridWrapper);\n                that.wrapper.append(layoutTable);\n                that.columnsHeaderTree = new kendo.dom.Tree(that.columnsHeader[0]);\n                that.rowsHeaderTree = new kendo.dom.Tree(that.rowsHeader[0]);\n                that.contentTree = new kendo.dom.Tree(that.content[0]);\n                that._initSettingTargets();\n            },\n            _progress: function (toggle) {\n                kendo.ui.progress(this.wrapper, toggle);\n            },\n            _resize: function () {\n                if (this.content[0].firstChild) {\n                    this._setSectionsWidth();\n                    this._setSectionsHeight();\n                    this._setContentWidth();\n                    this._setContentHeight();\n                    this._columnHeaderReflow();\n                }\n            },\n            _columnHeaderReflow: function () {\n                var columnTable = this.columnsHeader.children('table');\n                if (!kendo.support.browser.mozilla) {\n                    return;\n                }\n                clearTimeout(this._headerReflowTimeout);\n                columnTable.css('table-layout', 'auto');\n                this._headerReflowTimeout = setTimeout(function () {\n                    columnTable.css('table-layout', '');\n                });\n            },\n            _setSectionsWidth: function () {\n                var rowsHeader = this.rowsHeader;\n                var leftColumn = rowsHeader.parent('.k-pivot-rowheaders').width(AUTO);\n                var width;\n                width = Math.max(outerWidth(this.measureFields), outerWidth(this.rowFields));\n                width = Math.max(rowsHeader.children('table').width(), width);\n                leftColumn.width(width);\n            },\n            _setSectionsHeight: function () {\n                var measureFieldsHeight = this.measureFields.height(AUTO).height();\n                var columnFieldsHeight = this.columnFields.height(AUTO).height();\n                var rowFieldsHeight = this.rowFields.height(AUTO).innerHeight();\n                var columnsHeight = this.columnsHeader.height(AUTO).innerHeight();\n                var padding = rowFieldsHeight - this.rowFields.height();\n                var firstRowHeight = columnFieldsHeight > measureFieldsHeight ? columnFieldsHeight : measureFieldsHeight;\n                var secondRowHeight = columnsHeight > rowFieldsHeight ? columnsHeight : rowFieldsHeight;\n                this.measureFields.height(firstRowHeight);\n                this.columnFields.height(firstRowHeight);\n                this.rowFields.height(secondRowHeight - padding);\n                this.columnsHeader.height(secondRowHeight);\n            },\n            _setContentWidth: function () {\n                var contentTable = this.content.find('table');\n                var columnTable = this.columnsHeader.children('table');\n                var rowLength = contentTable.children('colgroup').children().length;\n                var calculatedWidth = rowLength * this.options.columnWidth;\n                var minWidth = Math.ceil(calculatedWidth / this.content.width() * 100);\n                if (minWidth < 100) {\n                    minWidth = 100;\n                }\n                contentTable.add(columnTable).css('width', minWidth + '%');\n                this._resetColspan(columnTable);\n            },\n            _setContentHeight: function () {\n                var that = this;\n                var content = that.content;\n                var rowsHeader = that.rowsHeader;\n                var innerHeight = that.wrapper.innerHeight();\n                var scrollbar = kendo.support.scrollbar();\n                var skipScrollbar = content[0].offsetHeight === content[0].clientHeight;\n                var height = that.options.height;\n                if (that.wrapper.is(':visible')) {\n                    if (!innerHeight || !height) {\n                        if (skipScrollbar) {\n                            scrollbar = 0;\n                        }\n                        content.height('auto');\n                        rowsHeader.height(content.height() - scrollbar);\n                        return;\n                    }\n                    innerHeight -= outerHeight(that.columnFields);\n                    innerHeight -= outerHeight(that.columnsHeader);\n                    if (innerHeight <= scrollbar * 2) {\n                        innerHeight = scrollbar * 2 + 1;\n                        if (!skipScrollbar) {\n                            innerHeight += scrollbar;\n                        }\n                    }\n                    content.height(innerHeight);\n                    if (skipScrollbar) {\n                        scrollbar = 0;\n                    }\n                    rowsHeader.height(innerHeight - scrollbar);\n                }\n            },\n            _resetColspan: function (columnTable) {\n                var that = this;\n                var cell = columnTable.children('tbody').children(':first').children(':first');\n                if (that._colspan === undefined) {\n                    that._colspan = cell.attr('colspan');\n                }\n                cell.attr('colspan', 1);\n                clearTimeout(that._layoutTimeout);\n                that._layoutTimeout = setTimeout(function () {\n                    cell.attr('colspan', that._colspan);\n                    that._colspan = undefined;\n                });\n            },\n            _axisMeasures: function (axis) {\n                var result = [];\n                var dataSource = this.dataSource;\n                var measures = dataSource.measures();\n                var hasMeasure = measures.length > 1 || measures[0] && measures[0].type;\n                if (dataSource.measuresAxis() === axis) {\n                    if (dataSource[axis]().length === 0 || hasMeasure) {\n                        result = measures;\n                    }\n                }\n                return result;\n            },\n            items: function () {\n                return [];\n            },\n            refresh: function () {\n                var that = this;\n                var dataSource = that.dataSource;\n                var axes = dataSource.axes();\n                var columns = (axes.columns || {}).tuples || [];\n                var rows = (axes.rows || {}).tuples || [];\n                var columnBuilder = that._columnBuilder;\n                var rowBuilder = that._rowBuilder;\n                var columnAxis = {};\n                var rowAxis = {};\n                if (that.trigger(DATABINDING, { action: 'rebind' })) {\n                    return;\n                }\n                columnBuilder.measures = that._axisMeasures(AXIS_COLUMNS);\n                rowBuilder.measures = that._axisMeasures(AXIS_ROWS);\n                that.columnsHeaderTree.render(columnBuilder.build(columns));\n                that.rowsHeaderTree.render(rowBuilder.build(rows));\n                columnAxis = {\n                    indexes: columnBuilder._indexes,\n                    measures: columnBuilder.measures,\n                    metadata: columnBuilder.metadata\n                };\n                rowAxis = {\n                    indexes: rowBuilder._indexes,\n                    measures: rowBuilder.measures,\n                    metadata: rowBuilder.metadata\n                };\n                that.contentTree.render(that._contentBuilder.build(dataSource.view(), columnAxis, rowAxis));\n                that._resize();\n                if (that.touchScroller) {\n                    that.touchScroller.contentResized();\n                } else {\n                    var touchScroller = kendo.touchScroller(that.content);\n                    if (touchScroller && touchScroller.movable) {\n                        that.touchScroller = touchScroller;\n                        touchScroller.movable.bind('change', function (e) {\n                            that.columnsHeader.scrollLeft(-e.sender.x);\n                            that.rowsHeader.scrollTop(-e.sender.y);\n                        });\n                    }\n                }\n                that._progress(false);\n                that.trigger(DATABOUND);\n            },\n            _scrollable: function () {\n                var that = this;\n                var columnsHeader = that.columnsHeader;\n                var rowsHeader = that.rowsHeader;\n                that.content.scroll(function () {\n                    columnsHeader.scrollLeft(this.scrollLeft);\n                    rowsHeader.scrollTop(this.scrollTop);\n                });\n                rowsHeader.bind('DOMMouseScroll' + NS + ' mousewheel' + NS, $.proxy(that._wheelScroll, that));\n            },\n            _wheelScroll: function (e) {\n                if (e.ctrlKey) {\n                    return;\n                }\n                var delta = kendo.wheelDeltaY(e);\n                var scrollTop = this.content.scrollTop();\n                if (delta) {\n                    e.preventDefault();\n                    $(e.currentTarget).one('wheel' + NS, false);\n                    this.rowsHeader.scrollTop(scrollTop + -delta);\n                    this.content.scrollTop(scrollTop + -delta);\n                }\n            }\n        });\n        var element = kendo.dom.element;\n        var htmlNode = kendo.dom.html;\n        var createMetadata = function (levelNum, memberIdx) {\n            return {\n                maxChildren: 0,\n                children: 0,\n                maxMembers: 0,\n                members: 0,\n                measures: 1,\n                levelNum: levelNum,\n                parentMember: memberIdx !== 0\n            };\n        };\n        var buildPath = function (tuple, index) {\n            var path = [];\n            var idx = 0;\n            for (; idx <= index; idx++) {\n                path.push(tuple.members[idx].name);\n            }\n            return path;\n        };\n        var tupleName = function (tuple, index) {\n            var name = '';\n            var idx = 0;\n            for (; idx <= index; idx++) {\n                name += tuple.members[idx].name;\n            }\n            return name;\n        };\n        var ColumnBuilder = Class.extend({\n            init: function () {\n                this.measures = 1;\n                this.metadata = {};\n            },\n            build: function (tuples) {\n                var tbody = this._tbody(tuples);\n                var colgroup = this._colGroup();\n                return [element('table', null, [\n                        colgroup,\n                        tbody\n                    ])];\n            },\n            reset: function () {\n                this.metadata = {};\n            },\n            _colGroup: function () {\n                var length = this._rowLength();\n                var children = [];\n                var idx = 0;\n                for (; idx < length; idx++) {\n                    children.push(element('col', null));\n                }\n                return element('colgroup', null, children);\n            },\n            _tbody: function (tuples) {\n                var root = tuples[0];\n                this.map = {};\n                this.rows = [];\n                this.rootTuple = root;\n                this._indexes = [];\n                if (root) {\n                    this._buildRows(root, 0);\n                    this._normalize();\n                } else {\n                    this.rows.push(element('tr', null, [element('th', null, [htmlNode('&nbsp;')])]));\n                }\n                return element('tbody', null, this.rows);\n            },\n            _normalize: function () {\n                var rows = this.rows;\n                var rowsLength = rows.length;\n                var rowIdx = 0;\n                var row;\n                var cellsLength;\n                var cellIdx;\n                var cells;\n                var cell;\n                for (; rowIdx < rowsLength; rowIdx++) {\n                    row = rows[rowIdx];\n                    if (row.rowSpan === 1) {\n                        continue;\n                    }\n                    cells = row.children;\n                    cellIdx = 0;\n                    cellsLength = cells.length;\n                    for (; cellIdx < cellsLength; cellIdx++) {\n                        cell = cells[cellIdx];\n                        if (cell.tupleAll) {\n                            cell.attr.rowSpan = row.rowSpan;\n                        }\n                    }\n                }\n            },\n            _rowIndex: function (row) {\n                var rows = this.rows;\n                var length = rows.length;\n                var idx = 0;\n                for (; idx < length; idx++) {\n                    if (rows[idx] === row) {\n                        break;\n                    }\n                }\n                return idx;\n            },\n            _rowLength: function () {\n                var cells = this.rows[0] ? this.rows[0].children : [];\n                var length = cells.length;\n                var rowLength = 0;\n                var idx = 0;\n                if (length) {\n                    for (; idx < length; idx++) {\n                        rowLength += cells[idx].attr.colSpan || 1;\n                    }\n                }\n                if (!rowLength) {\n                    rowLength = this.measures;\n                }\n                return rowLength;\n            },\n            _row: function (tuple, memberIdx, parentMember) {\n                var rootName = this.rootTuple.members[memberIdx].name;\n                var levelNum = tuple.members[memberIdx].levelNum;\n                var rowKey = rootName + levelNum;\n                var map = this.map;\n                var parentRow;\n                var children;\n                var row = map[rowKey];\n                if (!row) {\n                    row = element('tr', null, []);\n                    row.parentMember = parentMember;\n                    row.collapsed = 0;\n                    row.colSpan = 0;\n                    row.rowSpan = 1;\n                    map[rowKey] = row;\n                    parentRow = map[rootName + (Number(levelNum) - 1)];\n                    if (parentRow) {\n                        children = parentRow.children;\n                        if (children[1] && children[1].attr.className.indexOf('k-alt') === -1) {\n                            row.notFirst = true;\n                        } else {\n                            row.notFirst = parentRow.notFirst;\n                        }\n                    }\n                    this.rows.splice(this._rowIndex(parentRow) + 1, 0, row);\n                } else {\n                    row.notFirst = false;\n                    if (!row.parentMember || row.parentMember !== parentMember) {\n                        row.parentMember = parentMember;\n                        row.collapsed = 0;\n                        row.colSpan = 0;\n                    }\n                }\n                return row;\n            },\n            _measures: function (measures, tuple, className) {\n                var map = this.map;\n                var row = map.measureRow;\n                var measure;\n                if (!row) {\n                    row = element('tr', null, []);\n                    map.measureRow = row;\n                    this.rows.push(row);\n                }\n                for (var idx = 0, length = measures.length; idx < length; idx++) {\n                    measure = measures[idx];\n                    row.children.push(this._cell(className || '', [this._content(measure, tuple)], measure));\n                }\n                return length;\n            },\n            _content: function (member, tuple) {\n                return htmlNode(this.template({\n                    member: member,\n                    tuple: tuple\n                }));\n            },\n            _cell: function (className, children, member) {\n                var cell = element('th', { className: 'k-header' + className }, children);\n                cell.value = member.caption || member.name;\n                return cell;\n            },\n            _buildRows: function (tuple, memberIdx, parentMember) {\n                var members = tuple.members;\n                var member = members[memberIdx];\n                var nextMember = members[memberIdx + 1];\n                var row, childRow, children, childrenLength;\n                var cell, allCell, cellAttr;\n                var cellChildren = [];\n                var path;\n                var idx = 0;\n                var metadata;\n                var colSpan;\n                var collapsed = 0;\n                var memberCollapsed = 0;\n                if (member.measure) {\n                    this._measures(member.children, tuple);\n                    return;\n                }\n                path = kendo.stringify(buildPath(tuple, memberIdx));\n                row = this._row(tuple, memberIdx, parentMember);\n                children = member.children;\n                childrenLength = children.length;\n                metadata = this.metadata[path];\n                if (!metadata) {\n                    this.metadata[path] = metadata = createMetadata(Number(member.levelNum), memberIdx);\n                    metadata.rootLevelNum = Number(this.rootTuple.members[memberIdx].levelNum);\n                }\n                this._indexes.push({\n                    path: path,\n                    tuple: tuple\n                });\n                if (member.hasChildren) {\n                    if (metadata.expanded === false) {\n                        collapsed = metadata.maxChildren;\n                        row.collapsed += collapsed;\n                        metadata.children = 0;\n                        childrenLength = 0;\n                    }\n                    cellAttr = { className: 'k-icon ' + (childrenLength ? STATE_EXPANDED : STATE_COLLAPSED) };\n                    cellAttr[kendo.attr('path')] = path;\n                    cellChildren.push(element('span', cellAttr));\n                }\n                cellChildren.push(this._content(member, tuple));\n                cell = this._cell(row.notFirst ? ' k-first' : '', cellChildren, member);\n                row.children.push(cell);\n                row.colSpan += 1;\n                if (childrenLength) {\n                    allCell = this._cell(' k-alt', [this._content(member, tuple)], member);\n                    row.children.push(allCell);\n                    for (; idx < childrenLength; idx++) {\n                        childRow = this._buildRows(children[idx], memberIdx, member);\n                    }\n                    colSpan = childRow.colSpan;\n                    collapsed = childRow.collapsed;\n                    cell.attr.colSpan = colSpan;\n                    metadata.children = colSpan;\n                    metadata.members = 1;\n                    row.colSpan += colSpan;\n                    row.collapsed += collapsed;\n                    row.rowSpan = childRow.rowSpan + 1;\n                    if (nextMember) {\n                        if (nextMember.measure) {\n                            colSpan = this._measures(nextMember.children, tuple, ' k-alt');\n                        } else {\n                            childRow = this._buildRows(tuple, memberIdx + 1);\n                            colSpan = childRow.colSpan;\n                            row.collapsed += childRow.collapsed;\n                            memberCollapsed = childRow.collapsed;\n                        }\n                        allCell.attr.colSpan = colSpan;\n                        colSpan -= 1;\n                        metadata.members += colSpan;\n                        row.colSpan += colSpan;\n                    }\n                } else if (nextMember) {\n                    if (nextMember.measure) {\n                        colSpan = this._measures(nextMember.children, tuple);\n                    } else {\n                        childRow = this._buildRows(tuple, memberIdx + 1);\n                        colSpan = childRow.colSpan;\n                        row.collapsed += childRow.collapsed;\n                        memberCollapsed = childRow.collapsed;\n                    }\n                    metadata.members = colSpan;\n                    if (colSpan > 1) {\n                        cell.attr.colSpan = colSpan;\n                        row.colSpan += colSpan - 1;\n                    }\n                }\n                if (metadata.maxMembers < metadata.members + memberCollapsed) {\n                    metadata.maxMembers = metadata.members + memberCollapsed;\n                }\n                children = metadata.children + collapsed;\n                if (metadata.maxChildren < children) {\n                    metadata.maxChildren = children;\n                }\n                (allCell || cell).tupleAll = true;\n                return row;\n            }\n        });\n        var RowBuilder = Class.extend({\n            init: function () {\n                this.metadata = {};\n            },\n            build: function (tuples) {\n                var tbody = this._tbody(tuples);\n                var colgroup = this._colGroup();\n                return [element('table', null, [\n                        colgroup,\n                        tbody\n                    ])];\n            },\n            reset: function () {\n                this.metadata = {};\n            },\n            _rowLength: function () {\n                var children = this.rows[0].children;\n                var length = 0;\n                var idx = 0;\n                var cell = children[idx];\n                while (cell) {\n                    length += cell.attr.colSpan || 1;\n                    cell = children[++idx];\n                }\n                return length;\n            },\n            _colGroup: function () {\n                var length = this._rowLength();\n                var children = [];\n                var idx = 0;\n                for (; idx < length; idx++) {\n                    children.push(element('col', null));\n                }\n                return element('colgroup', null, children);\n            },\n            _tbody: function (tuples) {\n                var root = tuples[0];\n                this.rootTuple = root;\n                this.rows = [];\n                this.map = {};\n                this._indexes = [];\n                if (root) {\n                    this._buildRows(root, 0);\n                    this._normalize();\n                } else {\n                    this.rows.push(element('tr', null, [element('td', null, [htmlNode('&nbsp;')])]));\n                }\n                return element('tbody', null, this.rows);\n            },\n            _normalize: function () {\n                var rows = this.rows;\n                var rowsLength = rows.length;\n                var rowIdx = 0;\n                var members = this.rootTuple.members;\n                var firstMemberName = members[0].name;\n                var membersLength = members.length;\n                var memberIdx = 0;\n                var row;\n                var cell;\n                var maxcolSpan;\n                var map = this.map;\n                var allRow;\n                for (; rowIdx < rowsLength; rowIdx++) {\n                    row = rows[rowIdx];\n                    for (memberIdx = 0; memberIdx < membersLength; memberIdx++) {\n                        maxcolSpan = this[members[memberIdx].name];\n                        cell = row.colSpan['dim' + memberIdx];\n                        if (cell && cell.colSpan < maxcolSpan) {\n                            cell.attr.colSpan = maxcolSpan - cell.colSpan + 1;\n                        }\n                    }\n                }\n                row = map[firstMemberName];\n                allRow = map[firstMemberName + 'all'];\n                if (row) {\n                    row.children[0].attr.className = 'k-first';\n                }\n                if (allRow) {\n                    allRow.children[0].attr.className += ' k-first';\n                }\n            },\n            _row: function (children) {\n                var row = element('tr', null, children);\n                row.rowSpan = 1;\n                row.colSpan = {};\n                this.rows.push(row);\n                return row;\n            },\n            _content: function (member, tuple) {\n                return htmlNode(this.template({\n                    member: member,\n                    tuple: tuple\n                }));\n            },\n            _cell: function (className, children, member) {\n                var cell = element('td', { className: className }, children);\n                cell.value = member.caption || member.name;\n                return cell;\n            },\n            _buildRows: function (tuple, memberIdx) {\n                var map = this.map;\n                var path;\n                var members = tuple.members;\n                var member = members[memberIdx];\n                var nextMember = members[memberIdx + 1];\n                var children = member.children;\n                var childrenLength = children.length;\n                var levelNum = Number(member.levelNum);\n                var rootName = this.rootTuple.members[memberIdx].name;\n                var tuplePath = buildPath(tuple, memberIdx - 1).join('');\n                var rootLevelNum = Number(this.rootTuple.members[memberIdx].levelNum);\n                var parentName = tuplePath + (rootLevelNum === levelNum ? '' : member.parentName || '');\n                var row = map[parentName + 'all'] || map[parentName];\n                var colSpan = levelNum + 1;\n                var cell, allCell;\n                var childRow, allRow;\n                var metadata;\n                var className;\n                var cellChildren = [];\n                var expandIconAttr;\n                var idx;\n                if (!row || row.hasChild) {\n                    row = this._row();\n                } else {\n                    row.hasChild = true;\n                }\n                if (member.measure) {\n                    className = row.allCell ? 'k-grid-footer' : '';\n                    row.children.push(this._cell(className, [this._content(children[0], tuple)], children[0]));\n                    row.rowSpan = childrenLength;\n                    for (idx = 1; idx < childrenLength; idx++) {\n                        this._row([this._cell(className, [this._content(children[idx], tuple)], children[idx])]);\n                    }\n                    return row;\n                }\n                map[tuplePath + member.name] = row;\n                path = kendo.stringify(buildPath(tuple, memberIdx));\n                metadata = this.metadata[path];\n                if (!metadata) {\n                    this.metadata[path] = metadata = createMetadata(levelNum, memberIdx);\n                    metadata.rootLevelNum = rootLevelNum;\n                }\n                this._indexes.push({\n                    path: path,\n                    tuple: tuple\n                });\n                if (member.hasChildren) {\n                    if (metadata.expanded === false) {\n                        childrenLength = 0;\n                        metadata.children = 0;\n                    }\n                    expandIconAttr = { className: 'k-icon ' + (childrenLength ? STATE_EXPANDED : STATE_COLLAPSED) };\n                    expandIconAttr[kendo.attr('path')] = path;\n                    cellChildren.push(element('span', expandIconAttr));\n                }\n                cellChildren.push(this._content(member, tuple));\n                className = row.allCell && !childrenLength ? 'k-grid-footer' : '';\n                cell = this._cell(className, cellChildren, member);\n                cell.colSpan = colSpan;\n                row.children.push(cell);\n                row.colSpan['dim' + memberIdx] = cell;\n                if (!this[rootName] || this[rootName] < colSpan) {\n                    this[rootName] = colSpan;\n                }\n                if (childrenLength) {\n                    row.allCell = false;\n                    row.hasChild = false;\n                    for (idx = 0; idx < childrenLength; idx++) {\n                        childRow = this._buildRows(children[idx], memberIdx);\n                        if (row !== childRow) {\n                            row.rowSpan += childRow.rowSpan;\n                        }\n                    }\n                    if (row.rowSpan > 1) {\n                        cell.attr.rowSpan = row.rowSpan;\n                    }\n                    metadata.children = row.rowSpan;\n                    allCell = this._cell('k-grid-footer', [this._content(member, tuple)], member);\n                    allCell.colSpan = colSpan;\n                    allRow = this._row([allCell]);\n                    allRow.colSpan['dim' + memberIdx] = allCell;\n                    allRow.allCell = true;\n                    map[tuplePath + member.name + 'all'] = allRow;\n                    if (nextMember) {\n                        childRow = this._buildRows(tuple, memberIdx + 1);\n                        allCell.attr.rowSpan = childRow.rowSpan;\n                    }\n                    row.rowSpan += allRow.rowSpan;\n                    metadata.members = allRow.rowSpan;\n                } else if (nextMember) {\n                    row.hasChild = false;\n                    this._buildRows(tuple, memberIdx + 1);\n                    (allCell || cell).attr.rowSpan = row.rowSpan;\n                    metadata.members = row.rowSpan;\n                }\n                if (metadata.maxChildren < metadata.children) {\n                    metadata.maxChildren = metadata.children;\n                }\n                if (metadata.maxMembers < metadata.members) {\n                    metadata.maxMembers = metadata.members;\n                }\n                return row;\n            }\n        });\n        var ContentBuilder = Class.extend({\n            init: function () {\n                this.columnAxis = {};\n                this.rowAxis = {};\n            },\n            build: function (data, columnAxis, rowAxis) {\n                var index = columnAxis.indexes[0];\n                var metadata = columnAxis.metadata[index ? index.path : undefined];\n                this.columnAxis = columnAxis;\n                this.rowAxis = rowAxis;\n                this.data = data;\n                this.rowLength = metadata ? metadata.maxChildren + metadata.maxMembers : columnAxis.measures.length || 1;\n                if (!this.rowLength) {\n                    this.rowLength = 1;\n                }\n                var tbody = this._tbody();\n                var colgroup = this._colGroup();\n                return [element('table', null, [\n                        colgroup,\n                        tbody\n                    ])];\n            },\n            _colGroup: function () {\n                var length = this.columnAxis.measures.length || 1;\n                var children = [];\n                var idx = 0;\n                if (this.rows[0]) {\n                    length = this.rows[0].children.length;\n                }\n                for (; idx < length; idx++) {\n                    children.push(element('col', null));\n                }\n                return element('colgroup', null, children);\n            },\n            _tbody: function () {\n                this.rows = [];\n                if (this.data[0]) {\n                    this.columnIndexes = this._indexes(this.columnAxis, this.rowLength);\n                    this.rowIndexes = this._indexes(this.rowAxis, Math.ceil(this.data.length / this.rowLength));\n                    this._buildRows();\n                } else {\n                    this.rows.push(element('tr', null, [element('td', null, [htmlNode('&nbsp;')])]));\n                }\n                return element('tbody', null, this.rows);\n            },\n            _indexes: function (axisInfo, total) {\n                var result = [];\n                var axisInfoMember;\n                var indexes = axisInfo.indexes;\n                var metadata = axisInfo.metadata;\n                var measures = axisInfo.measures;\n                var measuresLength = measures.length || 1;\n                var current;\n                var dataIdx = 0;\n                var firstEmpty = 0;\n                var idx = 0;\n                var length = indexes.length;\n                var measureIdx;\n                var index;\n                var children;\n                var skipChildren;\n                if (!length) {\n                    for (measureIdx = 0; measureIdx < measuresLength; measureIdx++) {\n                        result[measureIdx] = {\n                            index: measureIdx,\n                            measure: measures[measureIdx],\n                            tuple: null\n                        };\n                    }\n                    return result;\n                }\n                for (; idx < length; idx++) {\n                    axisInfoMember = indexes[idx];\n                    current = metadata[axisInfoMember.path];\n                    children = current.children + current.members;\n                    skipChildren = 0;\n                    if (children) {\n                        children -= measuresLength;\n                    }\n                    if (current.expanded === false && current.children !== current.maxChildren) {\n                        skipChildren = current.maxChildren;\n                    }\n                    if (current.parentMember && current.levelNum === current.rootLevelNum) {\n                        children = -1;\n                    }\n                    if (children > -1) {\n                        for (measureIdx = 0; measureIdx < measuresLength; measureIdx++) {\n                            index = children + measureIdx;\n                            if (!current.children) {\n                                index += firstEmpty;\n                            }\n                            result[children + firstEmpty + measureIdx] = {\n                                children: children,\n                                index: dataIdx,\n                                measure: measures[measureIdx],\n                                tuple: axisInfoMember.tuple\n                            };\n                            dataIdx += 1;\n                        }\n                        while (result[firstEmpty] !== undefined) {\n                            firstEmpty += 1;\n                        }\n                    }\n                    if (firstEmpty === total) {\n                        break;\n                    }\n                    dataIdx += skipChildren;\n                }\n                return result;\n            },\n            _buildRows: function () {\n                var rowIndexes = this.rowIndexes;\n                var length = rowIndexes.length;\n                var idx = 0;\n                for (; idx < length; idx++) {\n                    var rowIndex = rowIndexes[idx];\n                    if (rowIndex) {\n                        this.rows.push(this._buildRow(rowIndex));\n                    }\n                }\n            },\n            _buildRow: function (rowInfo) {\n                var startIdx = rowInfo.index * this.rowLength;\n                var columnIndexes = this.columnIndexes;\n                var length = columnIndexes.length;\n                var columnInfo;\n                var cells = [];\n                var idx = 0;\n                var templateInfo;\n                var cell, cellContent;\n                var attr, dataItem, measure;\n                for (; idx < length; idx++) {\n                    columnInfo = columnIndexes[idx];\n                    if (columnInfo === undefined) {\n                        continue;\n                    }\n                    attr = {};\n                    if (columnInfo.children) {\n                        attr.className = 'k-alt';\n                    }\n                    cellContent = '';\n                    dataItem = this.data[startIdx + columnInfo.index];\n                    measure = columnInfo.measure || rowInfo.measure;\n                    templateInfo = {\n                        columnTuple: columnInfo.tuple,\n                        rowTuple: rowInfo.tuple,\n                        measure: measure,\n                        dataItem: dataItem\n                    };\n                    if (dataItem.value !== '' && measure && measure.type) {\n                        if (measure.type === 'status') {\n                            cellContent = this.kpiStatusTemplate(templateInfo);\n                        } else if (measure.type === 'trend') {\n                            cellContent = this.kpiTrendTemplate(templateInfo);\n                        }\n                    }\n                    if (!cellContent) {\n                        cellContent = this.dataTemplate(templateInfo);\n                    }\n                    cell = element('td', attr, [htmlNode(cellContent)]);\n                    cell.value = dataItem.value;\n                    cells.push(cell);\n                }\n                attr = {};\n                if (rowInfo.children) {\n                    attr.className = 'k-grid-footer';\n                }\n                return element('tr', attr, cells);\n            }\n        });\n        ui.plugin(PivotGrid);\n        kendo.PivotExcelExporter = kendo.Class.extend({\n            init: function (options) {\n                this.options = options;\n                this.widget = options.widget;\n                this.dataSource = this.widget.dataSource;\n            },\n            _columns: function () {\n                var columnHeaderTable = this.widget.columnsHeaderTree.children[0];\n                var rowHeaderTable = this.widget.rowsHeaderTree.children[0];\n                var columnHeaderLength = columnHeaderTable.children[0].children.length;\n                var rowHeaderLength = rowHeaderTable.children[0].children.length;\n                var width = this.widget.options.columnWidth;\n                var result = [];\n                var idx;\n                if (rowHeaderLength && this.dataSource.data()[0]) {\n                    for (idx = 0; idx < rowHeaderLength; idx++) {\n                        result.push({ autoWidth: true });\n                    }\n                }\n                for (idx = 0; idx < columnHeaderLength; idx++) {\n                    result.push({\n                        autoWidth: false,\n                        width: width\n                    });\n                }\n                return result;\n            },\n            _cells: function (rows, type, callback) {\n                var result = [];\n                var i = 0;\n                var length = rows.length;\n                var cellsLength;\n                var row, cells;\n                var j, cell;\n                for (; i < length; i++) {\n                    row = [];\n                    cells = rows[i].children;\n                    cellsLength = cells.length;\n                    for (j = 0; j < cellsLength; j++) {\n                        cell = cells[j];\n                        row.push({\n                            background: '#7a7a7a',\n                            color: '#fff',\n                            value: cell.value,\n                            colSpan: cell.attr.colSpan || 1,\n                            rowSpan: cell.attr.rowSpan || 1\n                        });\n                    }\n                    if (callback) {\n                        callback(row, i);\n                    }\n                    result.push({\n                        cells: row,\n                        type: type\n                    });\n                }\n                return result;\n            },\n            _rows: function () {\n                var columnHeaderTable = this.widget.columnsHeaderTree.children[0];\n                var rowHeaderTable = this.widget.rowsHeaderTree.children[0];\n                var columnHeaderLength = columnHeaderTable.children[0].children.length;\n                var rowHeaderLength = rowHeaderTable.children[0].children.length;\n                var columnHeaderRows = columnHeaderTable.children[1].children;\n                var rowHeaderRows = rowHeaderTable.children[1].children;\n                var contentRows = this.widget.contentTree.children[0].children[1].children;\n                var columnRows = this._cells(columnHeaderRows, 'header');\n                if (rowHeaderLength) {\n                    columnRows[0].cells.splice(0, 0, {\n                        background: '#7a7a7a',\n                        color: '#fff',\n                        value: '',\n                        colSpan: rowHeaderLength,\n                        rowSpan: columnHeaderRows.length\n                    });\n                }\n                var dataCallback = function (row, index) {\n                    var j = 0;\n                    var cell, value;\n                    var cells = contentRows[index].children;\n                    for (; j < columnHeaderLength; j++) {\n                        cell = cells[j];\n                        value = Number(cell.value);\n                        if (isNaN(value)) {\n                            value = cell.value;\n                        }\n                        row.push({\n                            background: '#dfdfdf',\n                            color: '#333',\n                            value: value,\n                            colSpan: 1,\n                            rowSpan: 1\n                        });\n                    }\n                };\n                var rowRows = this._cells(rowHeaderRows, 'data', dataCallback);\n                return columnRows.concat(rowRows);\n            },\n            _freezePane: function () {\n                var columnHeaderTable = this.widget.columnsHeaderTree.children[0];\n                var rowHeaderTable = this.widget.rowsHeaderTree.children[0];\n                var rowHeaderLength = rowHeaderTable.children[0].children.length;\n                var columnHeaderRows = columnHeaderTable.children[1].children;\n                return {\n                    colSplit: rowHeaderLength,\n                    rowSplit: columnHeaderRows.length\n                };\n            },\n            workbook: function () {\n                var promise;\n                if (this.dataSource.view()[0]) {\n                    promise = $.Deferred();\n                    promise.resolve();\n                } else {\n                    promise = this.dataSource.fetch();\n                }\n                return promise.then($.proxy(function () {\n                    return {\n                        sheets: [{\n                                columns: this._columns(),\n                                rows: this._rows(),\n                                freezePane: this._freezePane(),\n                                filter: null\n                            }]\n                    };\n                }, this));\n            }\n        });\n        var PivotExcelMixin = {\n            extend: function (proto) {\n                proto.events.push('excelExport');\n                proto.options.excel = $.extend(proto.options.excel, this.options);\n                proto.saveAsExcel = this.saveAsExcel;\n            },\n            options: {\n                proxyURL: '',\n                filterable: false,\n                fileName: 'Export.xlsx'\n            },\n            saveAsExcel: function () {\n                var excel = this.options.excel || {};\n                var exporter = new kendo.PivotExcelExporter({ widget: this });\n                exporter.workbook().then($.proxy(function (book) {\n                    if (!this.trigger('excelExport', { workbook: book })) {\n                        var workbook = new kendo.ooxml.Workbook(book);\n                        kendo.saveAs({\n                            dataURI: workbook.toDataURL(),\n                            fileName: book.fileName || excel.fileName,\n                            proxyURL: excel.proxyURL,\n                            forceProxy: excel.forceProxy\n                        });\n                    }\n                }, this));\n            }\n        };\n        kendo.PivotExcelMixin = PivotExcelMixin;\n        if (kendo.ooxml && kendo.ooxml.Workbook) {\n            PivotExcelMixin.extend(PivotGrid.prototype);\n        }\n        if (kendo.PDFMixin) {\n            kendo.PDFMixin.extend(PivotGrid.prototype);\n            PivotGrid.fn._drawPDF = function () {\n                return this._drawPDFShadow({ width: this.wrapper.width() }, { avoidLinks: this.options.pdf.avoidLinks });\n            };\n        }\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.treeview.draganddrop', [\n        'kendo.data',\n        'kendo.draganddrop'\n    ], f);\n}(function () {\n    var __meta__ = {\n        id: 'treeview.draganddrop',\n        name: 'Hierarchical Drag & Drop',\n        category: 'framework',\n        depends: [\n            'core',\n            'draganddrop'\n        ],\n        advanced: true\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo;\n        var ui = kendo.ui;\n        var proxy = $.proxy;\n        var extend = $.extend;\n        var VISIBILITY = 'visibility';\n        var KSTATEHOVER = 'k-state-hover';\n        var INPUTSELECTOR = 'input,a,textarea,.k-multiselect-wrap,select,button,a.k-button>.k-icon,button.k-button>.k-icon,span.k-icon.k-i-arrow-60-right,span.k-icon.k-i-arrow-45-down-right';\n        ui.HierarchicalDragAndDrop = kendo.Class.extend({\n            init: function (element, options) {\n                this.element = element;\n                this.hovered = element;\n                this.options = extend({\n                    dragstart: $.noop,\n                    drag: $.noop,\n                    drop: $.noop,\n                    dragend: $.noop\n                }, options);\n                this._draggable = new ui.Draggable(element, {\n                    ignore: INPUTSELECTOR,\n                    filter: options.filter,\n                    autoScroll: options.autoScroll,\n                    cursorOffset: {\n                        left: 10,\n                        top: kendo.support.mobileOS ? -40 / kendo.support.zoomLevel() : 10\n                    },\n                    hint: proxy(this._hint, this),\n                    dragstart: proxy(this.dragstart, this),\n                    dragcancel: proxy(this.dragcancel, this),\n                    drag: proxy(this.drag, this),\n                    dragend: proxy(this.dragend, this),\n                    $angular: options.$angular\n                });\n            },\n            _hint: function (element) {\n                return '<div class=\\'k-header k-drag-clue\\'>' + '<span class=\\'k-icon k-drag-status\\' />' + this.options.hintText(element) + '</div>';\n            },\n            _removeTouchHover: function () {\n                if (kendo.support.touch && this.hovered) {\n                    this.hovered.find('.' + KSTATEHOVER).removeClass(KSTATEHOVER);\n                    this.hovered = false;\n                }\n            },\n            _hintStatus: function (newStatus) {\n                var statusElement = this._draggable.hint.find('.k-drag-status')[0];\n                if (newStatus) {\n                    statusElement.className = 'k-icon k-drag-status ' + newStatus;\n                } else {\n                    return $.trim(statusElement.className.replace(/(p|k)-(icon|drag-status)/g, ''));\n                }\n            },\n            dragstart: function (e) {\n                this.source = e.currentTarget.closest(this.options.itemSelector);\n                if (this.options.dragstart(this.source)) {\n                    e.preventDefault();\n                }\n                if (this.options.reorderable) {\n                    this.dropHint = $('<div class=\\'k-i-drag-and-drop\\' />').css(VISIBILITY, 'hidden').appendTo(this.element);\n                } else {\n                    this.dropHint = $();\n                }\n            },\n            drag: function (e) {\n                var options = this.options;\n                var source = this.source;\n                var target = this.dropTarget = $(kendo.eventTarget(e));\n                var container = target.closest(options.allowedContainers);\n                var hoveredItem, itemHeight, itemTop, itemContent, delta;\n                var insertOnTop, insertOnBottom, addChild;\n                var itemData, position, status;\n                if (!container.length) {\n                    status = 'k-i-cancel';\n                    this._removeTouchHover();\n                } else if (source[0] == target[0] || options.contains(source[0], target[0])) {\n                    status = 'k-i-cancel';\n                } else {\n                    status = 'k-i-insert-middle';\n                    itemData = options.itemFromTarget(target);\n                    hoveredItem = itemData.item;\n                    if (hoveredItem.length) {\n                        this._removeTouchHover();\n                        itemHeight = kendo._outerHeight(hoveredItem);\n                        itemContent = itemData.content;\n                        if (options.reorderable) {\n                            delta = itemHeight / (itemContent.length > 0 ? 4 : 2);\n                            itemTop = kendo.getOffset(hoveredItem).top;\n                            insertOnTop = e.y.location < itemTop + delta;\n                            insertOnBottom = itemTop + itemHeight - delta < e.y.location;\n                            addChild = itemContent.length && !insertOnTop && !insertOnBottom;\n                        } else {\n                            addChild = true;\n                            insertOnTop = false;\n                            insertOnBottom = false;\n                        }\n                        this.hovered = addChild ? container : false;\n                        this.dropHint.css(VISIBILITY, addChild ? 'hidden' : 'visible');\n                        if (this._lastHover && this._lastHover[0] != itemContent[0]) {\n                            this._lastHover.removeClass(KSTATEHOVER);\n                        }\n                        this._lastHover = itemContent.toggleClass(KSTATEHOVER, addChild);\n                        if (addChild) {\n                            status = 'k-i-plus';\n                        } else {\n                            position = hoveredItem.position();\n                            position.top += insertOnTop ? 0 : itemHeight;\n                            this.dropHint.css(position)[insertOnTop ? 'prependTo' : 'appendTo'](options.dropHintContainer(hoveredItem));\n                            if (insertOnTop && itemData.first) {\n                                status = 'k-i-insert-up';\n                            }\n                            if (insertOnBottom && itemData.last) {\n                                status = 'k-i-insert-down';\n                            }\n                        }\n                    } else if (target[0] != this.dropHint[0]) {\n                        if (this._lastHover) {\n                            this._lastHover.removeClass(KSTATEHOVER);\n                        }\n                        if (!$.contains(this.element[0], container[0])) {\n                            status = 'k-i-plus';\n                        } else {\n                            status = 'k-i-cancel';\n                        }\n                    }\n                }\n                this.options.drag({\n                    originalEvent: e.originalEvent,\n                    source: source,\n                    target: target,\n                    pageY: e.y.location,\n                    pageX: e.x.location,\n                    status: status.substring(2),\n                    setStatus: function (value) {\n                        status = value;\n                    }\n                });\n                if (status.indexOf('k-i-insert') !== 0) {\n                    this.dropHint.css(VISIBILITY, 'hidden');\n                }\n                this._hintStatus(status);\n            },\n            dragcancel: function () {\n                this.dropHint.remove();\n            },\n            dragend: function (e) {\n                var position = 'over', source = this.source, destination, dropHint = this.dropHint, dropTarget = this.dropTarget, eventArgs, dropPrevented;\n                if (dropHint.css(VISIBILITY) == 'visible') {\n                    position = this.options.dropPositionFrom(dropHint);\n                    destination = dropHint.closest(this.options.itemSelector);\n                } else if (dropTarget) {\n                    destination = dropTarget.closest(this.options.itemSelector);\n                    if (!destination.length) {\n                        destination = dropTarget.closest(this.options.allowedContainers);\n                    }\n                }\n                eventArgs = {\n                    originalEvent: e.originalEvent,\n                    source: source[0],\n                    destination: destination[0],\n                    valid: this._hintStatus() != 'k-i-cancel',\n                    setValid: function (newValid) {\n                        this.valid = newValid;\n                    },\n                    dropTarget: dropTarget[0],\n                    position: position\n                };\n                dropPrevented = this.options.drop(eventArgs);\n                dropHint.remove();\n                this._removeTouchHover();\n                if (this._lastHover) {\n                    this._lastHover.removeClass(KSTATEHOVER);\n                }\n                if (!eventArgs.valid || dropPrevented) {\n                    this._draggable.dropped = eventArgs.valid;\n                    return;\n                }\n                this._draggable.dropped = true;\n                this.options.dragend({\n                    originalEvent: e.originalEvent,\n                    source: source,\n                    destination: destination,\n                    position: position\n                });\n            },\n            destroy: function () {\n                this._lastHover = this.hovered = null;\n                this._draggable.destroy();\n            }\n        });\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.treeview', [\n        'kendo.data',\n        'kendo.treeview.draganddrop'\n    ], f);\n}(function () {\n    var __meta__ = {\n        id: 'treeview',\n        name: 'TreeView',\n        category: 'web',\n        description: 'The TreeView widget displays hierarchical data in a traditional tree structure,with support for interactive drag-and-drop operations.',\n        depends: ['data'],\n        features: [{\n                id: 'treeview-dragging',\n                name: 'Drag & Drop',\n                description: 'Support for drag & drop',\n                depends: ['treeview.draganddrop']\n            }]\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, ui = kendo.ui, data = kendo.data, extend = $.extend, template = kendo.template, isArray = $.isArray, Widget = ui.Widget, HierarchicalDataSource = data.HierarchicalDataSource, proxy = $.proxy, keys = kendo.keys, NS = '.kendoTreeView', SELECT = 'select', CHECK = 'check', NAVIGATE = 'navigate', EXPAND = 'expand', CHANGE = 'change', ERROR = 'error', CHECKED = 'checked', INDETERMINATE = 'indeterminate', COLLAPSE = 'collapse', DRAGSTART = 'dragstart', DRAG = 'drag', DROP = 'drop', DRAGEND = 'dragend', DATABOUND = 'dataBound', CLICK = 'click', UNDEFINED = 'undefined', KSTATEHOVER = 'k-state-hover', KTREEVIEW = 'k-treeview', VISIBLE = ':visible', NODE = '.k-item', STRING = 'string', ARIASELECTED = 'aria-selected', ARIADISABLED = 'aria-disabled', TreeView, subGroup, nodeContents, nodeIcon, spriteRe, bindings = {\n                text: 'dataTextField',\n                url: 'dataUrlField',\n                spriteCssClass: 'dataSpriteCssClassField',\n                imageUrl: 'dataImageUrlField'\n            }, isDomElement = function (o) {\n                return typeof HTMLElement === 'object' ? o instanceof HTMLElement : o && typeof o === 'object' && o.nodeType === 1 && typeof o.nodeName === STRING;\n            };\n        function contentChild(filter) {\n            return function (node) {\n                var result = node.children('.k-animation-container');\n                if (!result.length) {\n                    result = node;\n                }\n                return result.children(filter);\n            };\n        }\n        function templateNoWith(code) {\n            return kendo.template(code, { useWithBlock: false });\n        }\n        subGroup = contentChild('.k-group');\n        nodeContents = contentChild('.k-group,.k-content');\n        nodeIcon = function (node) {\n            return node.children('div').children('.k-icon');\n        };\n        function checkboxes(node) {\n            return node.find('> div .k-checkbox-wrapper [type=checkbox]');\n        }\n        function insertAction(indexOffset) {\n            return function (nodeData, referenceNode) {\n                referenceNode = referenceNode.closest(NODE);\n                var group = referenceNode.parent(), parentNode;\n                if (group.parent().is('li')) {\n                    parentNode = group.parent();\n                }\n                return this._dataSourceMove(nodeData, group, parentNode, function (dataSource, model) {\n                    return this._insert(dataSource.data(), model, referenceNode.index() + indexOffset);\n                });\n            };\n        }\n        spriteRe = /k-sprite/;\n        function moveContents(node, container) {\n            var tmp;\n            while (node && node.nodeName.toLowerCase() != 'ul') {\n                tmp = node;\n                node = node.nextSibling;\n                if (tmp.nodeType == 3) {\n                    tmp.nodeValue = $.trim(tmp.nodeValue);\n                }\n                if (spriteRe.test(tmp.className)) {\n                    container.insertBefore(tmp, container.firstChild);\n                } else {\n                    container.appendChild(tmp);\n                }\n            }\n        }\n        function updateNodeHtml(node) {\n            var wrapper = node.children('div'), group = node.children('ul'), toggleButton = wrapper.children('.k-icon'), checkbox = node.children(':checkbox'), innerWrapper = wrapper.children('.k-in');\n            if (node.hasClass('k-treeview')) {\n                return;\n            }\n            if (!wrapper.length) {\n                wrapper = $('<div />').prependTo(node);\n            }\n            if (!toggleButton.length && group.length) {\n                toggleButton = $('<span class=\\'k-icon\\' />').prependTo(wrapper);\n            } else if (!group.length || !group.children().length) {\n                toggleButton.remove();\n                group.remove();\n            }\n            if (checkbox.length) {\n                $('<span class=\\'k-checkbox-wrapper\\' />').appendTo(wrapper).append(checkbox);\n            }\n            if (!innerWrapper.length) {\n                innerWrapper = node.children('a').eq(0).addClass('k-in k-link');\n                if (!innerWrapper.length) {\n                    innerWrapper = $('<span class=\\'k-in\\' />');\n                }\n                innerWrapper.appendTo(wrapper);\n                if (wrapper.length) {\n                    moveContents(wrapper[0].nextSibling, innerWrapper[0]);\n                }\n            }\n        }\n        TreeView = kendo.ui.DataBoundWidget.extend({\n            init: function (element, options) {\n                var that = this, inferred = false, hasDataSource = options && !!options.dataSource, list;\n                if (isArray(options)) {\n                    options = { dataSource: options };\n                }\n                if (options && typeof options.loadOnDemand == UNDEFINED && isArray(options.dataSource)) {\n                    options.loadOnDemand = false;\n                }\n                Widget.prototype.init.call(that, element, options);\n                element = that.element;\n                options = that.options;\n                list = element.is('ul') && element || element.hasClass(KTREEVIEW) && element.children('ul');\n                inferred = !hasDataSource && list.length;\n                if (inferred) {\n                    options.dataSource.list = list;\n                }\n                that._animation();\n                that._accessors();\n                that._templates();\n                if (!element.hasClass(KTREEVIEW)) {\n                    that._wrapper();\n                    if (list) {\n                        that.root = element;\n                        that._group(that.wrapper);\n                    }\n                } else {\n                    that.wrapper = element;\n                    that.root = element.children('ul').eq(0);\n                }\n                that._tabindex();\n                that.root.attr('role', 'tree');\n                that._dataSource(inferred);\n                that._attachEvents();\n                that._dragging();\n                if (!inferred) {\n                    if (options.autoBind) {\n                        that._progress(true);\n                        that.dataSource.fetch();\n                    }\n                } else {\n                    that._syncHtmlAndDataSource();\n                }\n                if (options.checkboxes && options.checkboxes.checkChildren) {\n                    that.updateIndeterminate();\n                }\n                if (that.element[0].id) {\n                    that._ariaId = kendo.format('{0}_tv_active', that.element[0].id);\n                }\n                kendo.notify(that);\n            },\n            _attachEvents: function () {\n                var that = this, clickableItems = '.k-in:not(.k-state-selected,.k-state-disabled)', MOUSEENTER = 'mouseenter';\n                that.wrapper.on(MOUSEENTER + NS, '.k-in.k-state-selected', function (e) {\n                    e.preventDefault();\n                }).on(MOUSEENTER + NS, clickableItems, function () {\n                    $(this).addClass(KSTATEHOVER);\n                }).on('mouseleave' + NS, clickableItems, function () {\n                    $(this).removeClass(KSTATEHOVER);\n                }).on(CLICK + NS, clickableItems, proxy(that._click, that)).on('dblclick' + NS, '.k-in:not(.k-state-disabled)', proxy(that._toggleButtonClick, that)).on(CLICK + NS, '.k-i-expand,.k-i-collapse', proxy(that._toggleButtonClick, that)).on('keydown' + NS, proxy(that._keydown, that)).on('focus' + NS, proxy(that._focus, that)).on('blur' + NS, proxy(that._blur, that)).on('mousedown' + NS, '.k-in,.k-checkbox-wrapper :checkbox,.k-i-expand,.k-i-collapse', proxy(that._mousedown, that)).on('change' + NS, '.k-checkbox-wrapper :checkbox', proxy(that._checkboxChange, that)).on('click' + NS, '.k-checkbox-wrapper :checkbox', proxy(that._checkboxClick, that)).on('click' + NS, '.k-checkbox-label', proxy(that._checkboxLabelClick, that)).on('click' + NS, '.k-request-retry', proxy(that._retryRequest, that)).on('click' + NS, function (e) {\n                    if (!$(e.target).is(':kendoFocusable')) {\n                        that.focus();\n                    }\n                });\n            },\n            _checkboxClick: function (e) {\n                var checkbox = $(e.target);\n                if (checkbox.data(INDETERMINATE)) {\n                    checkbox.data(INDETERMINATE, false).prop(INDETERMINATE, false).prop(CHECKED, true);\n                    this._checkboxChange(e);\n                }\n            },\n            _checkboxLabelClick: function (e) {\n                e.target.previousSibling.click();\n            },\n            _syncHtmlAndDataSource: function (root, dataSource) {\n                root = root || this.root;\n                dataSource = dataSource || this.dataSource;\n                var data = dataSource.view(), uidAttr = kendo.attr('uid'), expandedAttr = kendo.attr('expanded'), checkboxesEnabled = this.options.checkboxes, items = root.children('li'), i, item, dataItem, uid, itemCheckbox;\n                for (i = 0; i < items.length; i++) {\n                    dataItem = data[i];\n                    uid = dataItem.uid;\n                    item = items.eq(i);\n                    item.attr('role', 'treeitem').attr(uidAttr, uid);\n                    dataItem.expanded = item.attr(expandedAttr) === 'true';\n                    if (checkboxesEnabled) {\n                        itemCheckbox = checkboxes(item);\n                        dataItem.checked = itemCheckbox.prop(CHECKED);\n                        itemCheckbox.attr('id', '_' + uid);\n                        itemCheckbox.next('.k-checkbox-label').attr('for', '_' + uid);\n                    }\n                    this._syncHtmlAndDataSource(item.children('ul'), dataItem.children);\n                }\n            },\n            _animation: function () {\n                var options = this.options, animationOptions = options.animation, hasCollapseAnimation = animationOptions.collapse && 'effects' in animationOptions.collapse, collapse = extend({}, animationOptions.expand, animationOptions.collapse);\n                if (!hasCollapseAnimation) {\n                    collapse = extend(collapse, { reverse: true });\n                }\n                if (animationOptions === false) {\n                    animationOptions = {\n                        expand: { effects: {} },\n                        collapse: {\n                            hide: true,\n                            effects: {}\n                        }\n                    };\n                }\n                animationOptions.collapse = extend(collapse, { hide: true });\n                options.animation = animationOptions;\n            },\n            _dragging: function () {\n                var enabled = this.options.dragAndDrop;\n                var dragging = this.dragging;\n                if (enabled && !dragging) {\n                    var widget = this;\n                    this.dragging = new ui.HierarchicalDragAndDrop(this.element, {\n                        reorderable: true,\n                        $angular: this.options.$angular,\n                        autoScroll: this.options.autoScroll,\n                        filter: 'div:not(.k-state-disabled) .k-in',\n                        allowedContainers: '.k-treeview',\n                        itemSelector: '.k-treeview .k-item',\n                        hintText: proxy(this._hintText, this),\n                        contains: function (source, destination) {\n                            return $.contains(source, destination);\n                        },\n                        dropHintContainer: function (item) {\n                            return item;\n                        },\n                        itemFromTarget: function (target) {\n                            var item = target.closest('.k-top,.k-mid,.k-bot');\n                            return {\n                                item: item,\n                                content: target.closest('.k-in'),\n                                first: item.hasClass('k-top'),\n                                last: item.hasClass('k-bot')\n                            };\n                        },\n                        dropPositionFrom: function (dropHint) {\n                            return dropHint.prevAll('.k-in').length > 0 ? 'after' : 'before';\n                        },\n                        dragstart: function (source) {\n                            return widget.trigger(DRAGSTART, { sourceNode: source[0] });\n                        },\n                        drag: function (options) {\n                            widget.trigger(DRAG, {\n                                originalEvent: options.originalEvent,\n                                sourceNode: options.source[0],\n                                dropTarget: options.target[0],\n                                pageY: options.pageY,\n                                pageX: options.pageX,\n                                statusClass: options.status,\n                                setStatusClass: options.setStatus\n                            });\n                        },\n                        drop: function (options) {\n                            return widget.trigger(DROP, {\n                                originalEvent: options.originalEvent,\n                                sourceNode: options.source,\n                                destinationNode: options.destination,\n                                valid: options.valid,\n                                setValid: function (state) {\n                                    this.valid = state;\n                                    options.setValid(state);\n                                },\n                                dropTarget: options.dropTarget,\n                                dropPosition: options.position\n                            });\n                        },\n                        dragend: function (options) {\n                            var source = options.source;\n                            var destination = options.destination;\n                            var position = options.position;\n                            function triggerDragEnd(source) {\n                                widget.updateIndeterminate();\n                                widget.trigger(DRAGEND, {\n                                    originalEvent: options.originalEvent,\n                                    sourceNode: source && source[0],\n                                    destinationNode: destination[0],\n                                    dropPosition: position\n                                });\n                            }\n                            if (position == 'over') {\n                                widget.append(source, destination, triggerDragEnd);\n                            } else {\n                                if (position == 'before') {\n                                    source = widget.insertBefore(source, destination);\n                                } else if (position == 'after') {\n                                    source = widget.insertAfter(source, destination);\n                                }\n                                triggerDragEnd(source);\n                            }\n                        }\n                    });\n                } else if (!enabled && dragging) {\n                    dragging.destroy();\n                    this.dragging = null;\n                }\n            },\n            _hintText: function (node) {\n                return this.templates.dragClue({\n                    item: this.dataItem(node),\n                    treeview: this.options\n                });\n            },\n            _templates: function () {\n                var that = this, options = that.options, fieldAccessor = proxy(that._fieldAccessor, that);\n                if (options.template && typeof options.template == STRING) {\n                    options.template = template(options.template);\n                } else if (!options.template) {\n                    options.template = templateNoWith('# var text = ' + fieldAccessor('text') + '(data.item); #' + '# if (typeof data.item.encoded != \\'undefined\\' && data.item.encoded === false) {#' + '#= text #' + '# } else { #' + '#: text #' + '# } #');\n                }\n                that._checkboxes();\n                that.templates = {\n                    wrapperCssClass: function (group, item) {\n                        var result = 'k-item', index = item.index;\n                        if (group.firstLevel && index === 0) {\n                            result += ' k-first';\n                        }\n                        if (index == group.length - 1) {\n                            result += ' k-last';\n                        }\n                        return result;\n                    },\n                    cssClass: function (group, item) {\n                        var result = '', index = item.index, groupLength = group.length - 1;\n                        if (group.firstLevel && index === 0) {\n                            result += 'k-top ';\n                        }\n                        if (index === 0 && index != groupLength) {\n                            result += 'k-top';\n                        } else if (index == groupLength) {\n                            result += 'k-bot';\n                        } else {\n                            result += 'k-mid';\n                        }\n                        return result;\n                    },\n                    textClass: function (item, isLink) {\n                        var result = 'k-in';\n                        if (isLink) {\n                            result += ' k-link';\n                        }\n                        if (item.enabled === false) {\n                            result += ' k-state-disabled';\n                        }\n                        if (item.selected === true) {\n                            result += ' k-state-selected';\n                        }\n                        return result;\n                    },\n                    toggleButtonClass: function (item) {\n                        var result = 'k-icon';\n                        if (item.expanded !== true) {\n                            result += ' k-i-expand';\n                        } else {\n                            result += ' k-i-collapse';\n                        }\n                        return result;\n                    },\n                    groupAttributes: function (group) {\n                        var attributes = '';\n                        if (!group.firstLevel) {\n                            attributes = 'role=\\'group\\'';\n                        }\n                        return attributes + (group.expanded !== true ? ' style=\\'display:none\\'' : '');\n                    },\n                    groupCssClass: function (group) {\n                        var cssClass = 'k-group';\n                        if (group.firstLevel) {\n                            cssClass += ' k-treeview-lines';\n                        }\n                        return cssClass;\n                    },\n                    dragClue: templateNoWith('#= data.treeview.template(data) #'),\n                    group: templateNoWith('<ul class=\\'#= data.r.groupCssClass(data.group) #\\'#= data.r.groupAttributes(data.group) #>' + '#= data.renderItems(data) #' + '</ul>'),\n                    itemContent: templateNoWith('# var imageUrl = ' + fieldAccessor('imageUrl') + '(data.item); #' + '# var spriteCssClass = ' + fieldAccessor('spriteCssClass') + '(data.item); #' + '# if (imageUrl) { #' + '<img class=\\'k-image\\' alt=\\'\\' src=\\'#= imageUrl #\\'>' + '# } #' + '# if (spriteCssClass) { #' + '<span class=\\'k-sprite #= spriteCssClass #\\' />' + '# } #' + '#= data.treeview.template(data) #'),\n                    itemElement: templateNoWith('# var item = data.item, r = data.r; #' + '# var url = ' + fieldAccessor('url') + '(item); #' + '<div class=\\'#= r.cssClass(data.group, item) #\\'>' + '# if (item.hasChildren) { #' + '<span class=\\'#= r.toggleButtonClass(item) #\\'/>' + '# } #' + '# if (data.treeview.checkboxes) { #' + '<span class=\\'k-checkbox-wrapper\\' role=\\'presentation\\'>' + '#= data.treeview.checkboxes.template(data) #' + '</span>' + '# } #' + '# var tag = url ? \\'a\\' : \\'span\\'; #' + '# var textAttr = url ? \\' href=\\\\\\'\\' + url + \\'\\\\\\'\\' : \\'\\'; #' + '<#=tag# class=\\'#= r.textClass(item, !!url) #\\'#= textAttr #>' + '#= r.itemContent(data) #' + '</#=tag#>' + '</div>'),\n                    item: templateNoWith('# var item = data.item, r = data.r; #' + '<li role=\\'treeitem\\' class=\\'#= r.wrapperCssClass(data.group, item) #\\' ' + kendo.attr('uid') + '=\\'#= item.uid #\\' ' + 'aria-selected=\\'#= item.selected ? \"true\" : \"false \" #\\' ' + '#=item.enabled === false ? \"aria-disabled=\\'true\\'\" : \\'\\'#' + '# if (item.expanded) { #' + 'data-expanded=\\'true\\' aria-expanded=\\'true\\'' + '# } #' + '>' + '#= r.itemElement(data) #' + '</li>'),\n                    loading: templateNoWith('<div class=\\'k-icon k-i-loading\\' /> #: data.messages.loading #'),\n                    retry: templateNoWith('#: data.messages.requestFailed # ' + '<button class=\\'k-button k-request-retry\\'>#: data.messages.retry #</button>')\n                };\n            },\n            items: function () {\n                return this.element.find('.k-item > div:first-child');\n            },\n            setDataSource: function (dataSource) {\n                var options = this.options;\n                options.dataSource = dataSource;\n                this._dataSource();\n                if (options.checkboxes && options.checkboxes.checkChildren) {\n                    this.dataSource.one('change', $.proxy(this.updateIndeterminate, this, null));\n                }\n                if (this.options.autoBind) {\n                    this.dataSource.fetch();\n                }\n            },\n            _bindDataSource: function () {\n                this._refreshHandler = proxy(this.refresh, this);\n                this._errorHandler = proxy(this._error, this);\n                this.dataSource.bind(CHANGE, this._refreshHandler);\n                this.dataSource.bind(ERROR, this._errorHandler);\n            },\n            _unbindDataSource: function () {\n                var dataSource = this.dataSource;\n                if (dataSource) {\n                    dataSource.unbind(CHANGE, this._refreshHandler);\n                    dataSource.unbind(ERROR, this._errorHandler);\n                }\n            },\n            _dataSource: function (silentRead) {\n                var that = this, options = that.options, dataSource = options.dataSource;\n                function recursiveRead(data) {\n                    for (var i = 0; i < data.length; i++) {\n                        data[i]._initChildren();\n                        data[i].children.fetch();\n                        recursiveRead(data[i].children.view());\n                    }\n                }\n                dataSource = isArray(dataSource) ? { data: dataSource } : dataSource;\n                that._unbindDataSource();\n                if (!dataSource.fields) {\n                    dataSource.fields = [\n                        { field: 'text' },\n                        { field: 'url' },\n                        { field: 'spriteCssClass' },\n                        { field: 'imageUrl' }\n                    ];\n                }\n                that.dataSource = dataSource = HierarchicalDataSource.create(dataSource);\n                if (silentRead) {\n                    dataSource.fetch();\n                    recursiveRead(dataSource.view());\n                }\n                that._bindDataSource();\n            },\n            events: [\n                DRAGSTART,\n                DRAG,\n                DROP,\n                DRAGEND,\n                DATABOUND,\n                EXPAND,\n                COLLAPSE,\n                SELECT,\n                CHANGE,\n                NAVIGATE,\n                CHECK\n            ],\n            options: {\n                name: 'TreeView',\n                dataSource: {},\n                animation: {\n                    expand: {\n                        effects: 'expand:vertical',\n                        duration: 200\n                    },\n                    collapse: { duration: 100 }\n                },\n                messages: {\n                    loading: 'Loading...',\n                    requestFailed: 'Request failed.',\n                    retry: 'Retry'\n                },\n                dragAndDrop: false,\n                checkboxes: false,\n                autoBind: true,\n                autoScroll: false,\n                loadOnDemand: true,\n                template: '',\n                dataTextField: null\n            },\n            _accessors: function () {\n                var that = this, options = that.options, i, field, textField, element = that.element;\n                for (i in bindings) {\n                    field = options[bindings[i]];\n                    textField = element.attr(kendo.attr(i + '-field'));\n                    if (!field && textField) {\n                        field = textField;\n                    }\n                    if (!field) {\n                        field = i;\n                    }\n                    if (!isArray(field)) {\n                        field = [field];\n                    }\n                    options[bindings[i]] = field;\n                }\n            },\n            _fieldAccessor: function (fieldName) {\n                var fieldBindings = this.options[bindings[fieldName]], count = fieldBindings.length, result = '(function(item) {';\n                if (count === 0) {\n                    result += 'return item[\\'' + fieldName + '\\'];';\n                } else {\n                    result += 'var levels = [' + $.map(fieldBindings, function (x) {\n                        return 'function(d){ return ' + kendo.expr(x) + '}';\n                    }).join(',') + '];';\n                    result += 'return levels[Math.min(item.level(), ' + count + '-1)](item)';\n                }\n                result += '})';\n                return result;\n            },\n            setOptions: function (options) {\n                Widget.fn.setOptions.call(this, options);\n                this._animation();\n                this._dragging();\n                this._templates();\n            },\n            _trigger: function (eventName, node) {\n                return this.trigger(eventName, { node: node.closest(NODE)[0] });\n            },\n            _setChecked: function (datasource, value) {\n                if (!datasource || !$.isFunction(datasource.view)) {\n                    return;\n                }\n                for (var i = 0, nodes = datasource.view(); i < nodes.length; i++) {\n                    nodes[i][CHECKED] = value;\n                    if (nodes[i].children) {\n                        this._setChecked(nodes[i].children, value);\n                    }\n                }\n            },\n            _setIndeterminate: function (node) {\n                var group = subGroup(node), siblings, length, all = true, i;\n                if (!group.length) {\n                    return;\n                }\n                siblings = checkboxes(group.children());\n                length = siblings.length;\n                if (!length) {\n                    return;\n                } else if (length > 1) {\n                    for (i = 1; i < length; i++) {\n                        if (siblings[i].checked != siblings[i - 1].checked || siblings[i].indeterminate || siblings[i - 1].indeterminate) {\n                            all = false;\n                            break;\n                        }\n                    }\n                } else {\n                    all = !siblings[0].indeterminate;\n                }\n                return checkboxes(node).data(INDETERMINATE, !all).prop(INDETERMINATE, !all).prop(CHECKED, all && siblings[0].checked);\n            },\n            updateIndeterminate: function (node) {\n                node = node || this.wrapper;\n                var subnodes = subGroup(node).children();\n                var i;\n                var checkbox;\n                if (subnodes.length) {\n                    for (i = 0; i < subnodes.length; i++) {\n                        this.updateIndeterminate(subnodes.eq(i));\n                    }\n                    checkbox = this._setIndeterminate(node);\n                    if (checkbox && checkbox.prop(CHECKED)) {\n                        this.dataItem(node).checked = true;\n                    }\n                }\n            },\n            _bubbleIndeterminate: function (node) {\n                if (!node.length) {\n                    return;\n                }\n                var parentNode = this.parent(node), checkbox;\n                if (parentNode.length) {\n                    this._setIndeterminate(parentNode);\n                    checkbox = parentNode.children('div').find('.k-checkbox-wrapper :checkbox');\n                    if (checkbox.prop(INDETERMINATE) === false) {\n                        this.dataItem(parentNode).set(CHECKED, checkbox.prop(CHECKED));\n                    } else {\n                        delete this.dataItem(parentNode).checked;\n                    }\n                    this._bubbleIndeterminate(parentNode);\n                }\n            },\n            _checkboxChange: function (e) {\n                var checkbox = $(e.target);\n                var isChecked = checkbox.prop(CHECKED);\n                var node = checkbox.closest(NODE);\n                var dataItem = this.dataItem(node);\n                if (dataItem.checked != isChecked) {\n                    dataItem.set(CHECKED, isChecked);\n                    this._trigger(CHECK, node);\n                }\n            },\n            _toggleButtonClick: function (e) {\n                var node = $(e.currentTarget).closest(NODE);\n                if (node.is('[aria-disabled=\\'true\\']')) {\n                    return;\n                }\n                this.toggle($(e.target).closest(NODE));\n            },\n            _mousedown: function (e) {\n                var node = $(e.currentTarget).closest(NODE);\n                if (node.is('[aria-disabled=\\'true\\']')) {\n                    return;\n                }\n                this._clickTarget = node;\n                this.current(node);\n            },\n            _focusable: function (node) {\n                return node && node.length && node.is(':visible') && !node.find('.k-in:first').hasClass('k-state-disabled');\n            },\n            _focus: function () {\n                var current = this.select(), clickTarget = this._clickTarget;\n                if (kendo.support.touch) {\n                    return;\n                }\n                if (clickTarget && clickTarget.length) {\n                    current = clickTarget;\n                }\n                if (!this._focusable(current)) {\n                    current = this.current();\n                }\n                if (!this._focusable(current)) {\n                    current = this._nextVisible($());\n                }\n                this.current(current);\n            },\n            focus: function () {\n                var wrapper = this.wrapper, scrollContainer = wrapper[0], containers = [], offsets = [], documentElement = document.documentElement, i;\n                do {\n                    scrollContainer = scrollContainer.parentNode;\n                    if (scrollContainer.scrollHeight > scrollContainer.clientHeight) {\n                        containers.push(scrollContainer);\n                        offsets.push(scrollContainer.scrollTop);\n                    }\n                } while (scrollContainer != documentElement);\n                wrapper.focus();\n                for (i = 0; i < containers.length; i++) {\n                    containers[i].scrollTop = offsets[i];\n                }\n            },\n            _blur: function () {\n                this.current().find('.k-in:first').removeClass('k-state-focused');\n            },\n            _enabled: function (node) {\n                return !node.children('div').children('.k-in').hasClass('k-state-disabled');\n            },\n            parent: function (node) {\n                var wrapperRe = /\\bk-treeview\\b/, itemRe = /\\bk-item\\b/, result, skipSelf;\n                if (typeof node == STRING) {\n                    node = this.element.find(node);\n                }\n                if (!isDomElement(node)) {\n                    node = node[0];\n                }\n                skipSelf = itemRe.test(node.className);\n                do {\n                    node = node.parentNode;\n                    if (itemRe.test(node.className)) {\n                        if (skipSelf) {\n                            result = node;\n                        } else {\n                            skipSelf = true;\n                        }\n                    }\n                } while (!wrapperRe.test(node.className) && !result);\n                return $(result);\n            },\n            _nextVisible: function (node) {\n                var that = this, expanded = that._expanded(node), result;\n                function nextParent(node) {\n                    while (node.length && !node.next().length) {\n                        node = that.parent(node);\n                    }\n                    if (node.next().length) {\n                        return node.next();\n                    } else {\n                        return node;\n                    }\n                }\n                if (!node.length || !node.is(':visible')) {\n                    result = that.root.children().eq(0);\n                } else if (expanded) {\n                    result = subGroup(node).children().first();\n                    if (!result.length) {\n                        result = nextParent(node);\n                    }\n                } else {\n                    result = nextParent(node);\n                }\n                if (!that._enabled(result)) {\n                    result = that._nextVisible(result);\n                }\n                return result;\n            },\n            _previousVisible: function (node) {\n                var that = this, lastChild, result;\n                if (!node.length || node.prev().length) {\n                    if (node.length) {\n                        result = node.prev();\n                    } else {\n                        result = that.root.children().last();\n                    }\n                    while (that._expanded(result)) {\n                        lastChild = subGroup(result).children().last();\n                        if (!lastChild.length) {\n                            break;\n                        }\n                        result = lastChild;\n                    }\n                } else {\n                    result = that.parent(node) || node;\n                }\n                if (!that._enabled(result)) {\n                    result = that._previousVisible(result);\n                }\n                return result;\n            },\n            _keydown: function (e) {\n                var that = this, key = e.keyCode, target, focused = that.current(), expanded = that._expanded(focused), checkbox = focused.find('.k-checkbox-wrapper:first :checkbox'), rtl = kendo.support.isRtl(that.element);\n                if (e.target != e.currentTarget) {\n                    return;\n                }\n                if (!rtl && key == keys.RIGHT || rtl && key == keys.LEFT) {\n                    if (expanded) {\n                        target = that._nextVisible(focused);\n                    } else {\n                        that.expand(focused);\n                    }\n                } else if (!rtl && key == keys.LEFT || rtl && key == keys.RIGHT) {\n                    if (expanded) {\n                        that.collapse(focused);\n                    } else {\n                        target = that.parent(focused);\n                        if (!that._enabled(target)) {\n                            target = undefined;\n                        }\n                    }\n                } else if (key == keys.DOWN) {\n                    target = that._nextVisible(focused);\n                } else if (key == keys.UP) {\n                    target = that._previousVisible(focused);\n                } else if (key == keys.HOME) {\n                    target = that._nextVisible($());\n                } else if (key == keys.END) {\n                    target = that._previousVisible($());\n                } else if (key == keys.ENTER) {\n                    if (!focused.find('.k-in:first').hasClass('k-state-selected')) {\n                        if (!that._trigger(SELECT, focused)) {\n                            that.select(focused);\n                        }\n                    }\n                } else if (key == keys.SPACEBAR && checkbox.length) {\n                    checkbox.prop(CHECKED, !checkbox.prop(CHECKED)).data(INDETERMINATE, false).prop(INDETERMINATE, false);\n                    that._checkboxChange({ target: checkbox });\n                    target = focused;\n                }\n                if (target) {\n                    e.preventDefault();\n                    if (focused[0] != target[0]) {\n                        that._trigger(NAVIGATE, target);\n                        that.current(target);\n                    }\n                }\n            },\n            _click: function (e) {\n                var that = this, node = $(e.currentTarget), contents = nodeContents(node.closest(NODE)), href = node.attr('href'), shouldNavigate;\n                if (href) {\n                    shouldNavigate = href == '#' || href.indexOf('#' + this.element.id + '-') >= 0;\n                } else {\n                    shouldNavigate = contents.length && !contents.children().length;\n                }\n                if (shouldNavigate) {\n                    e.preventDefault();\n                }\n                if (!node.hasClass('.k-state-selected') && !that._trigger(SELECT, node)) {\n                    that.select(node);\n                }\n            },\n            _wrapper: function () {\n                var that = this, element = that.element, wrapper, root, wrapperClasses = 'k-widget k-treeview';\n                if (element.is('ul')) {\n                    wrapper = element.wrap('<div />').parent();\n                    root = element;\n                } else {\n                    wrapper = element;\n                    root = wrapper.children('ul').eq(0);\n                }\n                that.wrapper = wrapper.addClass(wrapperClasses);\n                that.root = root;\n            },\n            _group: function (item) {\n                var that = this, firstLevel = item.hasClass(KTREEVIEW), group = {\n                        firstLevel: firstLevel,\n                        expanded: firstLevel || that._expanded(item)\n                    }, groupElement = item.children('ul');\n                groupElement.addClass(that.templates.groupCssClass(group)).css('display', group.expanded ? '' : 'none');\n                that._nodes(groupElement, group);\n            },\n            _nodes: function (groupElement, groupData) {\n                var that = this, nodes = groupElement.children('li'), nodeData;\n                groupData = extend({ length: nodes.length }, groupData);\n                nodes.each(function (i, node) {\n                    node = $(node);\n                    nodeData = {\n                        index: i,\n                        expanded: that._expanded(node)\n                    };\n                    updateNodeHtml(node);\n                    that._updateNodeClasses(node, groupData, nodeData);\n                    that._group(node);\n                });\n            },\n            _checkboxes: function () {\n                var options = this.options;\n                var checkboxes = options.checkboxes;\n                var defaultTemplate;\n                if (checkboxes) {\n                    defaultTemplate = '<input aria-label=\\'#=item.text#\\' type=\\'checkbox\\' tabindex=\\'-1\\' #= (item.enabled === false) ? \\'disabled\\' : \\'\\' # #= item.checked ? \\'checked\\' : \\'\\' #';\n                    if (checkboxes.name) {\n                        defaultTemplate += ' name=\\'' + checkboxes.name + '\\'';\n                    }\n                    defaultTemplate += ' id=\\'_#= item.uid #\\' class=\\'k-checkbox\\' /><span class=\\'k-checkbox-label\\'></span>';\n                    checkboxes = extend({ template: defaultTemplate }, options.checkboxes);\n                    if (typeof checkboxes.template == STRING) {\n                        checkboxes.template = template(checkboxes.template);\n                    }\n                    options.checkboxes = checkboxes;\n                }\n            },\n            _updateNodeClasses: function (node, groupData, nodeData) {\n                var wrapper = node.children('div'), group = node.children('ul'), templates = this.templates;\n                if (node.hasClass('k-treeview')) {\n                    return;\n                }\n                nodeData = nodeData || {};\n                nodeData.expanded = typeof nodeData.expanded != UNDEFINED ? nodeData.expanded : this._expanded(node);\n                nodeData.index = typeof nodeData.index != UNDEFINED ? nodeData.index : node.index();\n                nodeData.enabled = typeof nodeData.enabled != UNDEFINED ? nodeData.enabled : !wrapper.children('.k-in').hasClass('k-state-disabled');\n                groupData = groupData || {};\n                groupData.firstLevel = typeof groupData.firstLevel != UNDEFINED ? groupData.firstLevel : node.parent().parent().hasClass(KTREEVIEW);\n                groupData.length = typeof groupData.length != UNDEFINED ? groupData.length : node.parent().children().length;\n                node.removeClass('k-first k-last').addClass(templates.wrapperCssClass(groupData, nodeData));\n                wrapper.removeClass('k-top k-mid k-bot').addClass(templates.cssClass(groupData, nodeData));\n                var textWrap = wrapper.children('.k-in');\n                var isLink = textWrap[0] && textWrap[0].nodeName.toLowerCase() == 'a';\n                textWrap.removeClass('k-in k-link k-state-default k-state-disabled').addClass(templates.textClass(nodeData, isLink));\n                if (group.length || node.attr('data-hasChildren') == 'true') {\n                    wrapper.children('.k-icon').removeClass('k-i-expand k-i-collapse').addClass(templates.toggleButtonClass(nodeData));\n                    group.addClass('k-group');\n                }\n            },\n            _processNodes: function (nodes, callback) {\n                var that = this;\n                that.element.find(nodes).each(function (index, item) {\n                    callback.call(that, index, $(item).closest(NODE));\n                });\n            },\n            dataItem: function (node) {\n                var uid = $(node).closest(NODE).attr(kendo.attr('uid')), dataSource = this.dataSource;\n                return dataSource && dataSource.getByUid(uid);\n            },\n            _insertNode: function (nodeData, index, parentNode, insertCallback, collapsed) {\n                var that = this, group = subGroup(parentNode), updatedGroupLength = group.children().length + 1, childrenData, groupData = {\n                        firstLevel: parentNode.hasClass(KTREEVIEW),\n                        expanded: !collapsed,\n                        length: updatedGroupLength\n                    }, node, i, item, nodeHtml = '', append = function (item, group) {\n                        item.appendTo(group);\n                    };\n                for (i = 0; i < nodeData.length; i++) {\n                    item = nodeData[i];\n                    item.index = index + i;\n                    nodeHtml += that._renderItem({\n                        group: groupData,\n                        item: item\n                    });\n                }\n                node = $(nodeHtml);\n                if (!node.length) {\n                    return;\n                }\n                that.angular('compile', function () {\n                    return {\n                        elements: node.get(),\n                        data: nodeData.map(function (item) {\n                            return { dataItem: item };\n                        })\n                    };\n                });\n                if (!group.length) {\n                    group = $(that._renderGroup({ group: groupData })).appendTo(parentNode);\n                }\n                insertCallback(node, group);\n                if (parentNode.hasClass('k-item')) {\n                    updateNodeHtml(parentNode);\n                    that._updateNodeClasses(parentNode);\n                }\n                that._updateNodeClasses(node.prev().first());\n                that._updateNodeClasses(node.next().last());\n                for (i = 0; i < nodeData.length; i++) {\n                    item = nodeData[i];\n                    if (item.hasChildren) {\n                        childrenData = item.children.data();\n                        if (childrenData.length) {\n                            that._insertNode(childrenData, item.index, node.eq(i), append, !that._expanded(node.eq(i)));\n                        }\n                    }\n                }\n                return node;\n            },\n            _updateNodes: function (items, field) {\n                var that = this;\n                var i, node, nodeWrapper, item, isChecked, isCollapsed;\n                var context = {\n                    treeview: that.options,\n                    item: item\n                };\n                var render = field != 'expanded' && field != 'checked';\n                function setCheckedState(root, state) {\n                    root.find('.k-checkbox-wrapper :checkbox').prop(CHECKED, state).data(INDETERMINATE, false).prop(INDETERMINATE, false);\n                }\n                if (field == 'selected') {\n                    item = items[0];\n                    node = that.findByUid(item.uid).find('.k-in:first').removeClass('k-state-hover').toggleClass('k-state-selected', item[field]).end();\n                    if (item[field]) {\n                        that.current(node);\n                    }\n                    node.attr(ARIASELECTED, !!item[field]);\n                } else {\n                    var elements = $.map(items, function (item) {\n                        return that.findByUid(item.uid).children('div');\n                    });\n                    if (render) {\n                        that.angular('cleanup', function () {\n                            return { elements: elements };\n                        });\n                    }\n                    for (i = 0; i < items.length; i++) {\n                        context.item = item = items[i];\n                        nodeWrapper = elements[i];\n                        node = nodeWrapper.parent();\n                        if (render) {\n                            nodeWrapper.children('.k-in').html(that.templates.itemContent(context));\n                        }\n                        if (field == CHECKED) {\n                            isChecked = item[field];\n                            setCheckedState(nodeWrapper, isChecked);\n                            if (that.options.checkboxes.checkChildren) {\n                                setCheckedState(node.children('.k-group'), isChecked);\n                                that._setChecked(item.children, isChecked);\n                                that._bubbleIndeterminate(node);\n                            }\n                        } else if (field == 'expanded') {\n                            that._toggle(node, item, item[field]);\n                        } else if (field == 'enabled') {\n                            node.find('.k-checkbox-wrapper :checkbox').prop('disabled', !item[field]);\n                            isCollapsed = !nodeContents(node).is(VISIBLE);\n                            node.removeAttr(ARIADISABLED);\n                            if (!item[field]) {\n                                if (item.selected) {\n                                    item.set('selected', false);\n                                }\n                                if (item.expanded) {\n                                    item.set('expanded', false);\n                                }\n                                isCollapsed = true;\n                                node.attr(ARIASELECTED, false).attr(ARIADISABLED, true);\n                            }\n                            that._updateNodeClasses(node, {}, {\n                                enabled: item[field],\n                                expanded: !isCollapsed\n                            });\n                        }\n                        if (nodeWrapper.length) {\n                            this.trigger('itemChange', {\n                                item: nodeWrapper,\n                                data: item,\n                                ns: ui\n                            });\n                        }\n                    }\n                    if (render) {\n                        that.angular('compile', function () {\n                            return {\n                                elements: elements,\n                                data: $.map(items, function (item) {\n                                    return [{ dataItem: item }];\n                                })\n                            };\n                        });\n                    }\n                }\n            },\n            _appendItems: function (index, items, parentNode) {\n                var group = subGroup(parentNode);\n                var children = group.children();\n                var collapsed = !this._expanded(parentNode);\n                if (typeof index == UNDEFINED) {\n                    index = children.length;\n                }\n                this._insertNode(items, index, parentNode, function (item, group) {\n                    if (index >= children.length) {\n                        item.appendTo(group);\n                    } else {\n                        item.insertBefore(children.eq(index));\n                    }\n                }, collapsed);\n                if (this._expanded(parentNode)) {\n                    this._updateNodeClasses(parentNode);\n                    subGroup(parentNode).css('display', 'block');\n                }\n            },\n            _refreshChildren: function (parentNode, items, index) {\n                var i, children, child;\n                var options = this.options;\n                var loadOnDemand = options.loadOnDemand;\n                var checkChildren = options.checkboxes && options.checkboxes.checkChildren;\n                subGroup(parentNode).empty();\n                if (!items.length) {\n                    updateNodeHtml(parentNode);\n                } else {\n                    this._appendItems(index, items, parentNode);\n                    children = subGroup(parentNode).children();\n                    if (loadOnDemand && checkChildren) {\n                        this._bubbleIndeterminate(children.last());\n                    }\n                    for (i = 0; i < children.length; i++) {\n                        child = children.eq(i);\n                        this.trigger('itemChange', {\n                            item: child.children('div'),\n                            data: this.dataItem(child),\n                            ns: ui\n                        });\n                    }\n                }\n            },\n            _refreshRoot: function (items) {\n                var groupHtml = this._renderGroup({\n                    items: items,\n                    group: {\n                        firstLevel: true,\n                        expanded: true\n                    }\n                });\n                if (this.root.length) {\n                    this._angularItems('cleanup');\n                    var group = $(groupHtml);\n                    this.root.attr('class', group.attr('class')).html(group.html());\n                } else {\n                    this.root = this.wrapper.html(groupHtml).children('ul');\n                }\n                this.root.attr('role', 'tree');\n                var elements = this.root.children('.k-item');\n                for (var i = 0; i < items.length; i++) {\n                    this.trigger('itemChange', {\n                        item: elements.eq(i),\n                        data: items[i],\n                        ns: ui\n                    });\n                }\n                this._angularItems('compile');\n            },\n            refresh: function (e) {\n                var node = e.node;\n                var action = e.action;\n                var items = e.items;\n                var parentNode = this.wrapper;\n                var options = this.options;\n                var loadOnDemand = options.loadOnDemand;\n                var checkChildren = options.checkboxes && options.checkboxes.checkChildren;\n                var i;\n                if (e.field) {\n                    if (!items[0] || !items[0].level) {\n                        return;\n                    }\n                    return this._updateNodes(items, e.field);\n                }\n                if (node) {\n                    parentNode = this.findByUid(node.uid);\n                    this._progress(parentNode, false);\n                }\n                if (checkChildren && action != 'remove') {\n                    var bubble = false;\n                    for (i = 0; i < items.length; i++) {\n                        if ('checked' in items[i]) {\n                            bubble = true;\n                            break;\n                        }\n                    }\n                    if (!bubble && node && node.checked) {\n                        for (i = 0; i < items.length; i++) {\n                            items[i].checked = true;\n                        }\n                    }\n                }\n                if (action == 'add') {\n                    this._appendItems(e.index, items, parentNode);\n                } else if (action == 'remove') {\n                    this._remove(this.findByUid(items[0].uid), false);\n                } else if (action == 'itemchange') {\n                    this._updateNodes(items);\n                } else if (action == 'itemloaded') {\n                    this._refreshChildren(parentNode, items, e.index);\n                } else {\n                    this._refreshRoot(items);\n                }\n                if (action != 'remove') {\n                    for (i = 0; i < items.length; i++) {\n                        if (!loadOnDemand || items[i].expanded) {\n                            items[i].load();\n                        }\n                    }\n                }\n                this.trigger(DATABOUND, { node: node ? parentNode : undefined });\n            },\n            _error: function (e) {\n                var node = e.node && this.findByUid(e.node.uid);\n                var retryHtml = this.templates.retry({ messages: this.options.messages });\n                if (node) {\n                    this._progress(node, false);\n                    this._expanded(node, false);\n                    nodeIcon(node).addClass('k-i-reload');\n                    e.node.loaded(false);\n                } else {\n                    this._progress(false);\n                    this.element.html(retryHtml);\n                }\n            },\n            _retryRequest: function (e) {\n                e.preventDefault();\n                this.dataSource.fetch();\n            },\n            expand: function (nodes) {\n                this._processNodes(nodes, function (index, item) {\n                    this.toggle(item, true);\n                });\n            },\n            collapse: function (nodes) {\n                this._processNodes(nodes, function (index, item) {\n                    this.toggle(item, false);\n                });\n            },\n            enable: function (nodes, enable) {\n                enable = arguments.length == 2 ? !!enable : true;\n                this._processNodes(nodes, function (index, item) {\n                    this.dataItem(item).set('enabled', enable);\n                });\n            },\n            current: function (node) {\n                var that = this, current = that._current, element = that.element, id = that._ariaId;\n                if (arguments.length > 0 && node && node.length) {\n                    if (current) {\n                        if (current[0].id === id) {\n                            current.removeAttr('id');\n                        }\n                        current.find('.k-in:first').removeClass('k-state-focused');\n                    }\n                    current = that._current = $(node, element).closest(NODE);\n                    current.find('.k-in:first').addClass('k-state-focused');\n                    id = current[0].id || id;\n                    if (id) {\n                        that.wrapper.removeAttr('aria-activedescendant');\n                        current.attr('id', id);\n                        that.wrapper.attr('aria-activedescendant', id);\n                    }\n                    return;\n                }\n                if (!current) {\n                    current = that._nextVisible($());\n                }\n                return current;\n            },\n            select: function (node) {\n                var that = this, element = that.element;\n                if (!arguments.length) {\n                    return element.find('.k-state-selected').closest(NODE);\n                }\n                node = $(node, element).closest(NODE);\n                element.find('.k-state-selected').each(function () {\n                    var dataItem = that.dataItem(this);\n                    if (dataItem) {\n                        dataItem.set('selected', false);\n                        delete dataItem.selected;\n                    } else {\n                        $(this).removeClass('k-state-selected');\n                    }\n                });\n                if (node.length) {\n                    that.dataItem(node).set('selected', true);\n                    that._clickTarget = node;\n                }\n                that.trigger(CHANGE);\n            },\n            _toggle: function (node, dataItem, expand) {\n                var options = this.options;\n                var contents = nodeContents(node);\n                var direction = expand ? 'expand' : 'collapse';\n                var loaded;\n                if (contents.data('animating')) {\n                    return;\n                }\n                if (!this._trigger(direction, node)) {\n                    this._expanded(node, expand);\n                    loaded = dataItem && dataItem.loaded();\n                    if (expand && !loaded) {\n                        if (options.loadOnDemand) {\n                            this._progress(node, true);\n                        }\n                        contents.remove();\n                        dataItem.load();\n                    } else {\n                        this._updateNodeClasses(node, {}, { expanded: expand });\n                        if (!expand) {\n                            contents.css('height', contents.height()).css('height');\n                        }\n                        contents.kendoStop(true, true).kendoAnimate(extend({ reset: true }, options.animation[direction], {\n                            complete: function () {\n                                if (expand) {\n                                    contents.css('height', '');\n                                }\n                            }\n                        }));\n                    }\n                }\n            },\n            toggle: function (node, expand) {\n                node = $(node);\n                if (!nodeIcon(node).is('.k-i-expand, .k-i-collapse')) {\n                    return;\n                }\n                if (arguments.length == 1) {\n                    expand = !this._expanded(node);\n                }\n                this._expanded(node, expand);\n            },\n            destroy: function () {\n                var that = this;\n                Widget.fn.destroy.call(that);\n                that.wrapper.off(NS);\n                that._unbindDataSource();\n                if (that.dragging) {\n                    that.dragging.destroy();\n                }\n                kendo.destroy(that.element);\n                that.root = that.wrapper = that.element = null;\n            },\n            _expanded: function (node, value) {\n                var expandedAttr = kendo.attr('expanded');\n                var dataItem = this.dataItem(node);\n                var expanded = value;\n                if (arguments.length == 1) {\n                    return node.attr(expandedAttr) === 'true' || dataItem && dataItem.expanded;\n                }\n                if (nodeContents(node).data('animating')) {\n                    return;\n                }\n                if (dataItem) {\n                    dataItem.set('expanded', expanded);\n                    expanded = dataItem.expanded;\n                }\n                if (expanded) {\n                    node.attr(expandedAttr, 'true');\n                    node.attr('aria-expanded', 'true');\n                } else {\n                    node.removeAttr(expandedAttr);\n                    node.attr('aria-expanded', 'false');\n                }\n            },\n            _progress: function (node, showProgress) {\n                var element = this.element;\n                var loadingText = this.templates.loading({ messages: this.options.messages });\n                if (arguments.length == 1) {\n                    showProgress = node;\n                    if (showProgress) {\n                        element.html(loadingText);\n                    } else {\n                        element.empty();\n                    }\n                } else {\n                    nodeIcon(node).toggleClass('k-i-loading', showProgress).removeClass('k-i-reload');\n                }\n            },\n            text: function (node, text) {\n                var dataItem = this.dataItem(node), fieldBindings = this.options[bindings.text], level = dataItem.level(), length = fieldBindings.length, field = fieldBindings[Math.min(level, length - 1)];\n                if (text) {\n                    dataItem.set(field, text);\n                } else {\n                    return dataItem[field];\n                }\n            },\n            _objectOrSelf: function (node) {\n                return $(node).closest('[data-role=treeview]').data('kendoTreeView') || this;\n            },\n            _dataSourceMove: function (nodeData, group, parentNode, callback) {\n                var referenceDataItem, destTreeview = this._objectOrSelf(parentNode || group), destDataSource = destTreeview.dataSource;\n                var loadPromise = $.Deferred().resolve().promise();\n                if (parentNode && parentNode[0] != destTreeview.element[0]) {\n                    referenceDataItem = destTreeview.dataItem(parentNode);\n                    if (!referenceDataItem.loaded()) {\n                        destTreeview._progress(parentNode, true);\n                        loadPromise = referenceDataItem.load();\n                    }\n                    if (parentNode != this.root) {\n                        destDataSource = referenceDataItem.children;\n                        if (!destDataSource || !(destDataSource instanceof HierarchicalDataSource)) {\n                            referenceDataItem._initChildren();\n                            referenceDataItem.loaded(true);\n                            destDataSource = referenceDataItem.children;\n                        }\n                    }\n                }\n                nodeData = this._toObservableData(nodeData);\n                return callback.call(destTreeview, destDataSource, nodeData, loadPromise);\n            },\n            _toObservableData: function (node) {\n                var dataItem = node, dataSource, uid;\n                if (node instanceof window.jQuery || isDomElement(node)) {\n                    dataSource = this._objectOrSelf(node).dataSource;\n                    uid = $(node).attr(kendo.attr('uid'));\n                    dataItem = dataSource.getByUid(uid);\n                    if (dataItem) {\n                        dataItem = dataSource.remove(dataItem);\n                    }\n                }\n                return dataItem;\n            },\n            _insert: function (data, model, index) {\n                if (!(model instanceof kendo.data.ObservableArray)) {\n                    if (!isArray(model)) {\n                        model = [model];\n                    }\n                } else {\n                    model = model.toJSON();\n                }\n                var parentNode = data.parent();\n                if (parentNode && parentNode._initChildren) {\n                    parentNode.hasChildren = true;\n                    parentNode._initChildren();\n                }\n                data.splice.apply(data, [\n                    index,\n                    0\n                ].concat(model));\n                return this.findByUid(data[index].uid);\n            },\n            insertAfter: insertAction(1),\n            insertBefore: insertAction(0),\n            append: function (nodeData, parentNode, success) {\n                var group = this.root;\n                if (parentNode) {\n                    group = subGroup(parentNode);\n                }\n                return this._dataSourceMove(nodeData, group, parentNode, function (dataSource, model, loadModel) {\n                    var inserted;\n                    var that = this;\n                    function add() {\n                        if (parentNode) {\n                            that._expanded(parentNode, true);\n                        }\n                        var data = dataSource.data(), index = Math.max(data.length, 0);\n                        return that._insert(data, model, index);\n                    }\n                    loadModel.done(function () {\n                        inserted = add();\n                        success = success || $.noop;\n                        success(inserted);\n                    });\n                    return inserted || null;\n                });\n            },\n            _remove: function (node, keepData) {\n                var that = this, parentNode, prevSibling, nextSibling;\n                node = $(node, that.element);\n                this.angular('cleanup', function () {\n                    return { elements: node.get() };\n                });\n                parentNode = node.parent().parent();\n                prevSibling = node.prev();\n                nextSibling = node.next();\n                node[keepData ? 'detach' : 'remove']();\n                if (parentNode.hasClass('k-item')) {\n                    updateNodeHtml(parentNode);\n                    that._updateNodeClasses(parentNode);\n                }\n                that._updateNodeClasses(prevSibling);\n                that._updateNodeClasses(nextSibling);\n                return node;\n            },\n            remove: function (node) {\n                var dataItem = this.dataItem(node);\n                if (dataItem) {\n                    this.dataSource.remove(dataItem);\n                }\n            },\n            detach: function (node) {\n                return this._remove(node, true);\n            },\n            findByText: function (text) {\n                return $(this.element).find('.k-in').filter(function (i, element) {\n                    return $(element).text() == text;\n                }).closest(NODE);\n            },\n            findByUid: function (uid) {\n                var items = this.element.find('.k-item');\n                var uidAttr = kendo.attr('uid');\n                var result;\n                for (var i = 0; i < items.length; i++) {\n                    if (items[i].getAttribute(uidAttr) == uid) {\n                        result = items[i];\n                        break;\n                    }\n                }\n                return $(result);\n            },\n            expandPath: function (path, complete) {\n                var treeview = this;\n                var nodeIds = path.slice(0);\n                var callback = complete || $.noop;\n                function proceed() {\n                    nodeIds.shift();\n                    if (nodeIds.length) {\n                        expand(nodeIds[0]).then(proceed);\n                    } else {\n                        callback.call(treeview);\n                    }\n                }\n                function expand(id) {\n                    var result = $.Deferred();\n                    var node = treeview.dataSource.get(id);\n                    if (node) {\n                        if (node.loaded()) {\n                            node.set('expanded', true);\n                            result.resolve();\n                        } else {\n                            treeview._progress(treeview.findByUid(node.uid), true);\n                            node.load().then(function () {\n                                node.set('expanded', true);\n                                result.resolve();\n                            });\n                        }\n                    } else {\n                        result.resolve();\n                    }\n                    return result.promise();\n                }\n                expand(nodeIds[0]).then(proceed);\n            },\n            _parentIds: function (node) {\n                var parent = node && node.parentNode();\n                var parents = [];\n                while (parent && parent.parentNode) {\n                    parents.unshift(parent.id);\n                    parent = parent.parentNode();\n                }\n                return parents;\n            },\n            expandTo: function (node) {\n                if (!(node instanceof kendo.data.Node)) {\n                    node = this.dataSource.get(node);\n                }\n                var parents = this._parentIds(node);\n                this.expandPath(parents);\n            },\n            _renderItem: function (options) {\n                if (!options.group) {\n                    options.group = {};\n                }\n                options.treeview = this.options;\n                options.r = this.templates;\n                return this.templates.item(options);\n            },\n            _renderGroup: function (options) {\n                var that = this;\n                options.renderItems = function (options) {\n                    var html = '', i = 0, items = options.items, len = items ? items.length : 0, group = options.group;\n                    group.length = len;\n                    for (; i < len; i++) {\n                        options.group = group;\n                        options.item = items[i];\n                        options.item.index = i;\n                        html += that._renderItem(options);\n                    }\n                    return html;\n                };\n                options.r = that.templates;\n                return that.templates.group(options);\n            }\n        });\n        ui.plugin(TreeView);\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.pivot.fieldmenu', [\n        'kendo.pivotgrid',\n        'kendo.menu',\n        'kendo.window',\n        'kendo.treeview',\n        'kendo.dropdownlist'\n    ], f);\n}(function () {\n    var __meta__ = {\n        id: 'pivot.fieldmenu',\n        name: 'PivotFieldMenu',\n        category: 'web',\n        description: 'The PivotFieldMenu widget allows the user to filter on fields displayed in PivotGrid',\n        depends: [\n            'menu',\n            'window',\n            'treeview',\n            'dropdownlist'\n        ],\n        advanced: true\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo;\n        var ui = kendo.ui;\n        var MENU = 'kendoContextMenu';\n        var proxy = $.proxy;\n        var NS = '.kendoPivotFieldMenu';\n        var Widget = ui.Widget;\n        var FILTER_ITEM = 'k-filter-item';\n        var ARIA_LABEL = 'aria-label';\n        var PivotFieldMenu = Widget.extend({\n            init: function (element, options) {\n                Widget.fn.init.call(this, element, options);\n                this._dataSource();\n                this._layout();\n                kendo.notify(this);\n            },\n            events: [],\n            options: {\n                name: 'PivotFieldMenu',\n                filter: null,\n                filterable: true,\n                sortable: true,\n                messages: {\n                    info: 'Show items with value that:',\n                    sortAscending: 'Sort Ascending',\n                    sortDescending: 'Sort Descending',\n                    filterFields: 'Fields Filter',\n                    filter: 'Filter',\n                    include: 'Include Fields...',\n                    title: 'Fields to include',\n                    clear: 'Clear',\n                    ok: 'OK',\n                    cancel: 'Cancel',\n                    operators: {\n                        contains: 'Contains',\n                        doesnotcontain: 'Does not contain',\n                        startswith: 'Starts with',\n                        endswith: 'Ends with',\n                        eq: 'Is equal to',\n                        neq: 'Is not equal to'\n                    }\n                }\n            },\n            _layout: function () {\n                var options = this.options;\n                this.wrapper = $(kendo.template(MENUTEMPLATE)({\n                    ns: kendo.ns,\n                    filterable: options.filterable,\n                    sortable: options.sortable,\n                    messages: options.messages\n                }));\n                this.menu = this.wrapper[MENU]({\n                    filter: options.filter,\n                    target: this.element,\n                    orientation: 'vertical',\n                    showOn: 'click',\n                    closeOnClick: false,\n                    open: proxy(this._menuOpen, this),\n                    select: proxy(this._select, this),\n                    copyAnchorStyles: false\n                }).data(MENU);\n                this._createWindow();\n                if (options.filterable) {\n                    this._initFilterForm();\n                }\n            },\n            _initFilterForm: function () {\n                var filterForm = this.menu.element.find('.' + FILTER_ITEM);\n                var filterProxy = proxy(this._filter, this);\n                this._filterOperator = new kendo.ui.DropDownList(filterForm.find('select'));\n                this._filterValue = filterForm.find('.k-textbox');\n                this._updateFilterAriaLabel();\n                filterForm.on('submit' + NS, filterProxy).on('click' + NS, '.k-button-filter', filterProxy).on('click' + NS, '.k-button-clear', proxy(this._reset, this));\n            },\n            _setFilterForm: function (expression) {\n                var filterOperator = this._filterOperator;\n                var operator = '';\n                var value = '';\n                if (expression) {\n                    operator = expression.operator;\n                    value = expression.value;\n                }\n                filterOperator.value(operator);\n                if (!filterOperator.value()) {\n                    filterOperator.select(0);\n                }\n                this._filterValue.val(value);\n            },\n            _clearFilters: function (member) {\n                var filter = this.dataSource.filter() || {};\n                var expressions;\n                var idx = 0;\n                var length;\n                filter.filters = filter.filters || [];\n                expressions = findFilters(filter, member);\n                for (length = expressions.length; idx < length; idx++) {\n                    filter.filters.splice(filter.filters.indexOf(expressions[idx]), 1);\n                }\n                return filter;\n            },\n            _convert: function (value) {\n                var schema = this.dataSource.options.schema;\n                var field = ((schema.model || {}).fields || {})[this.currentMember];\n                if (field) {\n                    if (field.type === 'number') {\n                        value = parseFloat(value);\n                    } else if (field.type === 'boolean') {\n                        value = Boolean($.parseJSON(value));\n                    }\n                }\n                return value;\n            },\n            _filter: function (e) {\n                var that = this;\n                var value = that._convert(that._filterValue.val());\n                e.preventDefault();\n                if (value === '') {\n                    that.menu.close();\n                    return;\n                }\n                var expression = {\n                    field: that.currentMember,\n                    operator: that._filterOperator.value(),\n                    value: value\n                };\n                var filter = that._clearFilters(that.currentMember);\n                filter.filters.push(expression);\n                that.dataSource.filter(filter);\n                that.menu.close();\n            },\n            _updateFilterAriaLabel: function () {\n                var filterForm = this.menu.element.find('.' + FILTER_ITEM);\n                var selectedOperator = this._filterOperator.value();\n                var selectedOperatorName = this.options.messages.operators[selectedOperator];\n                filterForm.find('select').attr(ARIA_LABEL, selectedOperatorName);\n            },\n            _reset: function (e) {\n                var that = this;\n                var filter = that._clearFilters(that.currentMember);\n                e.preventDefault();\n                if (!filter.filters[0]) {\n                    filter = {};\n                }\n                that.dataSource.filter(filter);\n                that._setFilterForm(null);\n                that.menu.close();\n            },\n            _sort: function (dir) {\n                var field = this.currentMember;\n                var expressions = this.dataSource.sort() || [];\n                expressions = removeExpr(expressions, field);\n                expressions.push({\n                    field: field,\n                    dir: dir\n                });\n                this.dataSource.sort(expressions);\n                this.menu.close();\n            },\n            setDataSource: function (dataSource) {\n                this.options.dataSource = dataSource;\n                this._dataSource();\n            },\n            _dataSource: function () {\n                this.dataSource = kendo.data.PivotDataSource.create(this.options.dataSource);\n            },\n            _createWindow: function () {\n                var messages = this.options.messages;\n                this.includeWindow = $(kendo.template(WINDOWTEMPLATE)({ messages: messages })).on('click' + NS, '.k-button-ok', proxy(this._applyIncludes, this)).on('click' + NS, '.k-button-cancel', proxy(this._closeWindow, this));\n                this.includeWindow = new ui.Window(this.includeWindow, {\n                    title: messages.title,\n                    visible: false,\n                    resizable: false,\n                    open: proxy(this._windowOpen, this)\n                });\n            },\n            _applyIncludes: function (e) {\n                var checkedNodes = [];\n                var resultExpression;\n                var view = this.treeView.dataSource.view();\n                var rootChecked = view[0].checked;\n                var filter = this.dataSource.filter();\n                var existingExpression = findFilters(filter, this.currentMember, 'in')[0];\n                checkedNodeIds(view, checkedNodes);\n                if (existingExpression) {\n                    if (rootChecked) {\n                        filter.filters.splice(filter.filters.indexOf(existingExpression), 1);\n                        if (!filter.filters.length) {\n                            filter = {};\n                        }\n                    } else {\n                        existingExpression.value = checkedNodes.join(',');\n                    }\n                    resultExpression = filter;\n                }\n                if (checkedNodes.length) {\n                    if (!resultExpression && !rootChecked) {\n                        resultExpression = {\n                            field: this.currentMember,\n                            operator: 'in',\n                            value: checkedNodes.join(',')\n                        };\n                        if (filter) {\n                            filter.filters.push(resultExpression);\n                            resultExpression = filter;\n                        }\n                    }\n                }\n                if (resultExpression) {\n                    this.dataSource.filter(resultExpression);\n                }\n                this._closeWindow(e);\n            },\n            _closeWindow: function (e) {\n                e.preventDefault();\n                this.includeWindow.close();\n            },\n            _treeViewDataSource: function () {\n                var that = this;\n                return kendo.data.HierarchicalDataSource.create({\n                    schema: {\n                        model: {\n                            id: 'uniqueName',\n                            hasChildren: function (item) {\n                                return parseInt(item.childrenCardinality, 10) > 0;\n                            }\n                        }\n                    },\n                    transport: {\n                        read: function (options) {\n                            var restrictions = {};\n                            var node = that.treeView.dataSource.get(options.data.uniqueName);\n                            var name = options.data.uniqueName;\n                            if (!name) {\n                                restrictions.levelUniqueName = that.currentMember + '.[(ALL)]';\n                            } else {\n                                restrictions.memberUniqueName = node.uniqueName.replace(/\\&/g, '&amp;');\n                                restrictions.treeOp = 1;\n                            }\n                            that.dataSource.schemaMembers(restrictions).done(function (data) {\n                                checkNodes(that.dataSource.filter(), that.currentMember, data);\n                                options.success(data);\n                            }).fail(options.error);\n                        }\n                    }\n                });\n            },\n            _createTreeView: function (element) {\n                var that = this;\n                that.treeView = new ui.TreeView(element, {\n                    autoBind: false,\n                    dataSource: that._treeViewDataSource(),\n                    dataTextField: 'caption',\n                    template: '#: data.item.caption || data.item.name #',\n                    checkboxes: { checkChildren: true },\n                    dataBound: function () {\n                        ui.progress(that.includeWindow.element, false);\n                    }\n                });\n            },\n            _menuOpen: function (e) {\n                if (!e.event) {\n                    return;\n                }\n                var attr = kendo.attr('name');\n                this.currentMember = $(e.event.target).closest('[' + attr + ']').attr(attr);\n                if (this.options.filterable) {\n                    this._setFilterForm(findFilters(this.dataSource.filter(), this.currentMember)[0]);\n                }\n            },\n            _select: function (e) {\n                var item = $(e.item);\n                $('.k-pivot-filter-window').not(this.includeWindow.element).kendoWindow('close');\n                if (item.hasClass('k-include-item')) {\n                    this.includeWindow.center().open();\n                } else if (item.hasClass('k-sort-asc')) {\n                    this._sort('asc');\n                } else if (item.hasClass('k-sort-desc')) {\n                    this._sort('desc');\n                } else if (item.hasClass(FILTER_ITEM)) {\n                    this._updateFilterAriaLabel();\n                }\n            },\n            _windowOpen: function () {\n                if (!this.treeView) {\n                    this._createTreeView(this.includeWindow.element.find('.k-treeview'));\n                }\n                ui.progress(this.includeWindow.element, true);\n                this.treeView.dataSource.read();\n            },\n            destroy: function () {\n                Widget.fn.destroy.call(this);\n                if (this.menu) {\n                    this.menu.destroy();\n                    this.menu = null;\n                }\n                if (this.treeView) {\n                    this.treeView.destroy();\n                    this.treeView = null;\n                }\n                if (this.includeWindow) {\n                    this.includeWindow.destroy();\n                    this.includeWindow = null;\n                }\n                this.wrapper = null;\n                this.element = null;\n            }\n        });\n        function removeExpr(expressions, name) {\n            var result = [];\n            for (var idx = 0, length = expressions.length; idx < length; idx++) {\n                if (expressions[idx].field !== name) {\n                    result.push(expressions[idx]);\n                }\n            }\n            return result;\n        }\n        function findFilters(filter, member, operator) {\n            if (!filter) {\n                return [];\n            }\n            filter = filter.filters;\n            var idx = 0;\n            var result = [];\n            var length = filter.length;\n            var filterOperator;\n            for (; idx < length; idx++) {\n                filterOperator = filter[idx].operator;\n                if ((!operator && filterOperator !== 'in' || filterOperator === operator) && filter[idx].field === member) {\n                    result.push(filter[idx]);\n                }\n            }\n            return result;\n        }\n        function checkNodes(filter, member, nodes) {\n            var values, idx = 0, length = nodes.length;\n            filter = findFilters(filter, member, 'in')[0];\n            if (!filter) {\n                for (; idx < length; idx++) {\n                    nodes[idx].checked = true;\n                }\n            } else {\n                values = filter.value.split(',');\n                for (; idx < length; idx++) {\n                    nodes[idx].checked = $.inArray(nodes[idx].uniqueName, values) >= 0;\n                }\n            }\n        }\n        function checkedNodeIds(nodes, checkedNodes) {\n            var idx, length = nodes.length;\n            for (idx = 0; idx < length; idx++) {\n                if (nodes[idx].checked && nodes[idx].level() !== 0) {\n                    checkedNodes.push(nodes[idx].uniqueName);\n                }\n                if (nodes[idx].hasChildren) {\n                    checkedNodeIds(nodes[idx].children.view(), checkedNodes);\n                }\n            }\n        }\n        var LABELMENUTEMPLATE = '<div class=\"k-filterable k-content\" tabindex=\"-1\" data-role=\"fieldmenu\">' + '<form class=\"k-filter-menu\">' + '<div>' + '<div class=\"k-filter-help-text\">#=messages.info#</div>' + '<select>' + '#for(var op in messages.operators){#' + '<option value=\"#=op#\">#=messages.operators[op]#</option>' + '#}#' + '</select>' + '<input class=\"k-textbox\" type=\"text\" ' + ARIA_LABEL + '=\"#=messages.filter#\" />' + '<div>' + '<a class=\"k-button k-primary k-button-filter\" href=\"\\\\#\">#=messages.filter#</a>' + '<a class=\"k-button k-button-clear\" href=\"\\\\#\">#=messages.clear#</a>' + '</div>' + '</div>' + '</form>' + '</div>';\n        var MENUTEMPLATE = '<ul class=\"k-pivot-fieldmenu\">' + '# if (sortable) {#' + '<li class=\"k-item k-sort-asc\">' + '<span class=\"k-link\">' + '<span class=\"k-icon k-i-sort-asc-sm\"></span>' + '${messages.sortAscending}' + '</span>' + '</li>' + '<li class=\"k-item k-sort-desc\">' + '<span class=\"k-link\">' + '<span class=\"k-icon k-i-sort-desc-sm\"></span>' + '${messages.sortDescending}' + '</span>' + '</li>' + '# if (filterable) {#' + '<li class=\"k-separator\"></li>' + '# } #' + '# } #' + '# if (filterable) {#' + '<li class=\"k-item k-include-item\">' + '<span class=\"k-link\">' + '<span class=\"k-icon k-i-filter\"></span>' + '${messages.include}' + '</span>' + '</li>' + '<li class=\"k-separator\"></li>' + '<li class=\"k-item ' + FILTER_ITEM + '\">' + '<span class=\"k-link\">' + '<span class=\"k-icon k-i-filter\"></span>' + '${messages.filterFields}' + '</span>' + '<ul>' + '<li>' + LABELMENUTEMPLATE + '</li>' + '</ul>' + '</li>' + '# } #' + '</ul>';\n        var WINDOWTEMPLATE = '<div class=\"k-popup-edit-form k-pivot-filter-window\"><div class=\"k-edit-form-container\">' + '<div class=\"k-treeview\"></div>' + '<div class=\"k-edit-buttons k-state-default\">' + '<a class=\"k-button k-primary k-button-ok\" href=\"\\\\#\">' + '${messages.ok}' + '</a>' + '<a class=\"k-button k-button-cancel\" href=\"\\\\#\">' + '${messages.cancel}' + '</a>' + '</div></div>';\n        ui.plugin(PivotFieldMenu);\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.filtercell', [\n        'kendo.autocomplete',\n        'kendo.datepicker',\n        'kendo.numerictextbox',\n        'kendo.combobox',\n        'kendo.dropdownlist'\n    ], f);\n}(function () {\n    var __meta__ = {\n        id: 'filtercell',\n        name: 'Row filter',\n        category: 'framework',\n        depends: ['autocomplete'],\n        advanced: true\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, ui = kendo.ui, DataSource = kendo.data.DataSource, Widget = ui.Widget, CHANGE = 'change', BOOL = 'boolean', ENUM = 'enums', STRING = 'string', EQ = 'Is equal to', NEQ = 'Is not equal to', proxy = $.proxy, nonValueOperators = [\n                'isnull',\n                'isnotnull',\n                'isempty',\n                'isnotempty'\n            ];\n        function isNonValueFilter(filter) {\n            var operator = typeof filter === 'string' ? filter : filter.operator;\n            return $.inArray(operator, nonValueOperators) > -1;\n        }\n        function findFilterForField(filter, field) {\n            var filters = [];\n            if ($.isPlainObject(filter)) {\n                if (filter.hasOwnProperty('filters')) {\n                    filters = filter.filters;\n                } else if (filter.field == field) {\n                    return filter;\n                }\n            }\n            if ($.isArray(filter)) {\n                filters = filter;\n            }\n            for (var i = 0; i < filters.length; i++) {\n                var result = findFilterForField(filters[i], field);\n                if (result) {\n                    return result;\n                }\n            }\n        }\n        function removeFiltersForField(expression, field) {\n            if (expression.filters) {\n                expression.filters = $.grep(expression.filters, function (filter) {\n                    removeFiltersForField(filter, field);\n                    if (filter.filters) {\n                        return filter.filters.length;\n                    } else {\n                        return filter.field != field;\n                    }\n                });\n            }\n        }\n        function removeDuplicates(dataSelector, dataTextField) {\n            var getter = kendo.getter(dataTextField, true);\n            return function (e) {\n                var items = dataSelector(e), result = [], index = 0, seen = {};\n                while (index < items.length) {\n                    var item = items[index++], text = getter(item);\n                    if (!seen.hasOwnProperty(text)) {\n                        result.push(item);\n                        seen[text] = true;\n                    }\n                }\n                return result;\n            };\n        }\n        var FilterCell = Widget.extend({\n            init: function (element, options) {\n                element = $(element).addClass('k-filtercell');\n                var wrapper = this.wrapper = $('<span/>').appendTo(element);\n                var that = this, dataSource, viewModel, passedOptions = options, first, type, operators = that.operators = options.operators || {}, input = that.input = $('<input/>').attr(kendo.attr('bind'), 'value: value').appendTo(wrapper);\n                var suggestDataSource = options ? options.suggestDataSource : null;\n                if (suggestDataSource) {\n                    options = $.extend({}, options, { suggestDataSource: {} });\n                }\n                Widget.fn.init.call(that, element[0], options);\n                if (suggestDataSource) {\n                    that.options.suggestDataSource = suggestDataSource;\n                }\n                options = that.options;\n                dataSource = that.dataSource = options.dataSource;\n                that.model = dataSource.reader.model;\n                type = options.type = STRING;\n                var fields = kendo.getter('reader.model.fields', true)(dataSource) || {};\n                var target = fields[options.field];\n                if (target && target.type) {\n                    type = options.type = target.type;\n                }\n                if (options.values) {\n                    options.type = type = ENUM;\n                }\n                operators = operators[type] || options.operators[type];\n                if (!passedOptions.operator) {\n                    for (first in operators) {\n                        options.operator = first;\n                        break;\n                    }\n                }\n                that._parse = function (value) {\n                    return value != null ? value + '' : value;\n                };\n                if (that.model && that.model.fields) {\n                    var field = that.model.fields[options.field];\n                    if (field) {\n                        if (field.parse) {\n                            that._parse = proxy(field.parse, field);\n                        }\n                    }\n                }\n                that.defaultOperator = options.operator;\n                that.viewModel = viewModel = kendo.observable({\n                    operator: options.operator,\n                    value: null,\n                    operatorVisible: function () {\n                        var val = this.get('value');\n                        return val !== null && val !== undefined && val != 'undefined' || isNonValueFilter(this.get('operator')) && !that._clearInProgress;\n                    }\n                });\n                viewModel.bind(CHANGE, proxy(that.updateDsFilter, that));\n                if (type == STRING) {\n                    that.initSuggestDataSource(options);\n                }\n                if (options.inputWidth !== null) {\n                    input.width(options.inputWidth);\n                }\n                input.attr('aria-label', that._getColumnTitle());\n                that._setInputType(options, type);\n                if (type != BOOL && options.showOperators !== false) {\n                    that._createOperatorDropDown(operators);\n                } else {\n                    $('<div unselectable=\"on\" />').css('display', 'none').text('eq').appendTo(wrapper);\n                    wrapper.addClass('k-operator-hidden');\n                }\n                that._createClearIcon();\n                kendo.bind(this.wrapper, viewModel);\n                if (type == STRING) {\n                    if (!options.template) {\n                        that.setAutoCompleteSource();\n                    }\n                }\n                if (type == ENUM) {\n                    that.setComboBoxSource(that.options.values);\n                }\n                that._refreshUI();\n                that._refreshHandler = proxy(that._refreshUI, that);\n                that.dataSource.bind(CHANGE, that._refreshHandler);\n            },\n            _setInputType: function (options, type) {\n                var that = this, input = that.input;\n                if (typeof options.template == 'function') {\n                    options.template.call(that.viewModel, {\n                        element: that.input,\n                        dataSource: that.suggestDataSource\n                    });\n                    that._angularItems('compile');\n                } else if (type == STRING) {\n                    input.attr(kendo.attr('role'), 'autocomplete').attr(kendo.attr('text-field'), options.dataTextField || options.field).attr(kendo.attr('filter'), options.suggestionOperator).attr(kendo.attr('delay'), options.delay).attr(kendo.attr('min-length'), options.minLength).attr(kendo.attr('value-primitive'), true);\n                } else if (type == 'date') {\n                    input.attr(kendo.attr('role'), 'datepicker');\n                } else if (type == BOOL) {\n                    input.remove();\n                    var radioInput = $('<input type=\\'radio\\'/>');\n                    var wrapper = that.wrapper;\n                    var inputName = kendo.guid();\n                    var labelTrue = $('<label/>').text(options.messages.isTrue).append(radioInput);\n                    radioInput.attr(kendo.attr('bind'), 'checked:value').attr('name', inputName).val('true');\n                    var labelFalse = labelTrue.clone().text(options.messages.isFalse);\n                    radioInput.clone().val('false').appendTo(labelFalse);\n                    wrapper.append([\n                        labelTrue,\n                        labelFalse\n                    ]);\n                } else if (type == 'number') {\n                    input.attr(kendo.attr('role'), 'numerictextbox').attr('title', that._getColumnTitle());\n                } else if (type == ENUM) {\n                    input.attr(kendo.attr('role'), 'combobox').attr(kendo.attr('text-field'), 'text').attr(kendo.attr('suggest'), true).attr(kendo.attr('filter'), 'contains').attr(kendo.attr('value-field'), 'value').attr(kendo.attr('value-primitive'), true);\n                }\n            },\n            _getColumnTitle: function () {\n                var column = this.options.column;\n                return column ? column.title || column.field : '';\n            },\n            _createOperatorDropDown: function (operators) {\n                var items = [], viewModel = this.viewModel;\n                for (var prop in operators) {\n                    items.push({\n                        text: operators[prop],\n                        value: prop\n                    });\n                }\n                var dropdown = $('<input class=\"k-dropdown-operator\" ' + kendo.attr('bind') + '=\"value: operator\"/>').appendTo(this.wrapper);\n                this.operatorDropDown = dropdown.kendoDropDownList({\n                    dataSource: items,\n                    dataTextField: 'text',\n                    dataValueField: 'value',\n                    open: function () {\n                        this.popup.element.width(150);\n                    },\n                    valuePrimitive: true\n                }).data('kendoDropDownList');\n                viewModel.bind('change', function () {\n                    var ariaLabel = operators[viewModel.operator];\n                    dropdown.attr('aria-label', ariaLabel);\n                });\n                this.operatorDropDown.wrapper.find('.k-i-arrow-60-down').removeClass('k-i-arrow-60-down').addClass('k-i-filter');\n            },\n            initSuggestDataSource: function (options) {\n                var suggestDataSource = options.suggestDataSource;\n                if (!(suggestDataSource instanceof DataSource)) {\n                    if (!options.customDataSource && suggestDataSource) {\n                        suggestDataSource.group = undefined;\n                    }\n                    suggestDataSource = this.suggestDataSource = DataSource.create(suggestDataSource);\n                }\n                if (!options.customDataSource) {\n                    suggestDataSource._pageSize = undefined;\n                    suggestDataSource.reader.data = removeDuplicates(suggestDataSource.reader.data, this.options.field);\n                }\n                this.suggestDataSource = suggestDataSource;\n            },\n            setAutoCompleteSource: function () {\n                var autoComplete = this.input.data('kendoAutoComplete');\n                if (autoComplete) {\n                    autoComplete.setDataSource(this.suggestDataSource);\n                }\n            },\n            setComboBoxSource: function (values) {\n                var dataSource = DataSource.create({ data: values });\n                var comboBox = this.input.data('kendoComboBox');\n                if (comboBox) {\n                    comboBox.setDataSource(dataSource);\n                }\n            },\n            _refreshUI: function () {\n                var that = this, filter = findFilterForField(that.dataSource.filter(), this.options.field) || {}, viewModel = that.viewModel;\n                that.manuallyUpdatingVM = true;\n                filter = $.extend(true, {}, filter);\n                if (that.options.type == BOOL) {\n                    if (viewModel.value !== filter.value) {\n                        that.wrapper.find(':radio').prop('checked', false);\n                    }\n                }\n                if (filter.operator) {\n                    viewModel.set('operator', filter.operator);\n                }\n                viewModel.set('value', filter.value);\n                that.manuallyUpdatingVM = false;\n            },\n            updateDsFilter: function (e) {\n                var that = this, model = that.viewModel;\n                if (that.manuallyUpdatingVM || e.field == 'operator' && model.value === undefined && !isNonValueFilter(model)) {\n                    return;\n                }\n                var currentFilter = $.extend({}, that.viewModel.toJSON(), { field: that.options.field });\n                var expression = {\n                    logic: 'and',\n                    filters: []\n                };\n                var prevented = false;\n                if (currentFilter.value !== undefined && currentFilter.value !== null || isNonValueFilter(currentFilter) && !this._clearInProgress) {\n                    expression.filters.push(currentFilter);\n                    prevented = that.trigger(CHANGE, {\n                        filter: expression,\n                        field: that.options.field\n                    });\n                }\n                if (that._clearInProgress || currentFilter.value === null) {\n                    prevented = that.trigger(CHANGE, {\n                        filter: null,\n                        field: that.options.field\n                    });\n                }\n                if (prevented) {\n                    return;\n                }\n                var mergeResult = that._merge(expression);\n                if (mergeResult.filters.length) {\n                    that.dataSource.filter(mergeResult);\n                } else {\n                    that.dataSource.filter({});\n                }\n            },\n            _merge: function (expression) {\n                var that = this, logic = expression.logic || 'and', filters = expression.filters, filter, result = that.dataSource.filter() || {\n                        filters: [],\n                        logic: 'and'\n                    }, idx, length;\n                removeFiltersForField(result, that.options.field);\n                for (idx = 0, length = filters.length; idx < length; idx++) {\n                    filter = filters[idx];\n                    filter.value = that._parse(filter.value);\n                }\n                filters = $.grep(filters, function (filter) {\n                    return filter.value !== '' && filter.value !== null || isNonValueFilter(filter);\n                });\n                if (filters.length) {\n                    if (result.filters.length) {\n                        expression.filters = filters;\n                        if (result.logic !== 'and') {\n                            result.filters = [{\n                                    logic: result.logic,\n                                    filters: result.filters\n                                }];\n                            result.logic = 'and';\n                        }\n                        if (filters.length > 1) {\n                            result.filters.push(expression);\n                        } else {\n                            result.filters.push(filters[0]);\n                        }\n                    } else {\n                        result.filters = filters;\n                        result.logic = logic;\n                    }\n                }\n                return result;\n            },\n            _createClearIcon: function () {\n                var that = this;\n                $('<button type=\\'button\\' class=\\'k-button k-button-icon\\' title = ' + that.options.messages.clear + '/>').attr('aria-label', that.options.messages.clear).attr(kendo.attr('bind'), 'visible:operatorVisible').html('<span class=\\'k-icon k-i-close\\'/>').click(proxy(that.clearFilter, that)).appendTo(that.wrapper);\n            },\n            clearFilter: function () {\n                this._clearInProgress = true;\n                if (isNonValueFilter(this.viewModel.operator)) {\n                    this.viewModel.set('operator', this.defaultOperator);\n                }\n                this.viewModel.set('value', null);\n                this._clearInProgress = false;\n            },\n            _angularItems: function (action) {\n                var elements = this.wrapper.closest('th').get();\n                var column = this.options.column;\n                this.angular(action, function () {\n                    return {\n                        elements: elements,\n                        data: [{ column: column }]\n                    };\n                });\n            },\n            destroy: function () {\n                var that = this;\n                that.filterModel = null;\n                that.operatorDropDown = null;\n                that._angularItems('cleanup');\n                if (that._refreshHandler) {\n                    that.dataSource.bind(CHANGE, that._refreshHandler);\n                    that._refreshHandler = null;\n                }\n                kendo.unbind(that.element);\n                Widget.fn.destroy.call(that);\n                kendo.destroy(that.element);\n            },\n            events: [CHANGE],\n            options: {\n                name: 'FilterCell',\n                delay: 200,\n                minLength: 1,\n                inputWidth: null,\n                values: undefined,\n                customDataSource: false,\n                field: '',\n                dataTextField: '',\n                type: 'string',\n                suggestDataSource: null,\n                suggestionOperator: 'startswith',\n                operator: 'eq',\n                showOperators: true,\n                template: null,\n                messages: {\n                    isTrue: 'is true',\n                    isFalse: 'is false',\n                    filter: 'Filter',\n                    clear: 'Clear',\n                    operator: 'Operator'\n                },\n                operators: {\n                    string: {\n                        eq: EQ,\n                        neq: NEQ,\n                        startswith: 'Starts with',\n                        contains: 'Contains',\n                        doesnotcontain: 'Does not contain',\n                        endswith: 'Ends with',\n                        isnull: 'Is null',\n                        isnotnull: 'Is not null',\n                        isempty: 'Is empty',\n                        isnotempty: 'Is not empty'\n                    },\n                    number: {\n                        eq: EQ,\n                        neq: NEQ,\n                        gte: 'Is greater than or equal to',\n                        gt: 'Is greater than',\n                        lte: 'Is less than or equal to',\n                        lt: 'Is less than',\n                        isnull: 'Is null',\n                        isnotnull: 'Is not null'\n                    },\n                    date: {\n                        eq: EQ,\n                        neq: NEQ,\n                        gte: 'Is after or equal to',\n                        gt: 'Is after',\n                        lte: 'Is before or equal to',\n                        lt: 'Is before',\n                        isnull: 'Is null',\n                        isnotnull: 'Is not null'\n                    },\n                    enums: {\n                        eq: EQ,\n                        neq: NEQ,\n                        isnull: 'Is null',\n                        isnotnull: 'Is not null'\n                    }\n                }\n            }\n        });\n        ui.plugin(FilterCell);\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.panelbar', ['kendo.data'], f);\n}(function () {\n    var __meta__ = {\n        id: 'panelbar',\n        name: 'PanelBar',\n        category: 'web',\n        description: 'The PanelBar widget displays hierarchical data as a multi-level expandable panel bar.',\n        depends: [\n            'core',\n            'data',\n            'data.odata'\n        ]\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, ui = kendo.ui, keys = kendo.keys, extend = $.extend, proxy = $.proxy, each = $.each, isArray = $.isArray, template = kendo.template, Widget = ui.Widget, HierarchicalDataSource = kendo.data.HierarchicalDataSource, excludedNodesRegExp = /^(ul|a|div)$/i, NS = '.kendoPanelBar', IMG = 'img', HREF = 'href', LAST = 'k-last', LINK = 'k-link', LINKSELECTOR = '.' + LINK, ERROR = 'error', ITEM = '.k-item', GROUP = '.k-group', VISIBLEGROUP = GROUP + ':visible', IMAGE = 'k-image', FIRST = 'k-first', CHANGE = 'change', EXPAND = 'expand', SELECT = 'select', CONTENT = 'k-content', ACTIVATE = 'activate', COLLAPSE = 'collapse', DATABOUND = 'dataBound', MOUSEENTER = 'mouseenter', MOUSELEAVE = 'mouseleave', CONTENTLOAD = 'contentLoad', UNDEFINED = 'undefined', ACTIVECLASS = 'k-state-active', GROUPS = '> .k-panel', CONTENTS = '> .k-content', STRING = 'string', FOCUSEDCLASS = 'k-state-focused', DISABLEDCLASS = 'k-state-disabled', SELECTEDCLASS = 'k-state-selected', SELECTEDSELECTOR = '.' + SELECTEDCLASS, HIGHLIGHTCLASS = 'k-state-highlight', ACTIVEITEMSELECTOR = ITEM + ':not(.k-state-disabled)', clickableItems = '> ' + ACTIVEITEMSELECTOR + ' > ' + LINKSELECTOR + ', .k-panel > ' + ACTIVEITEMSELECTOR + ' > ' + LINKSELECTOR, disabledItems = ITEM + '.k-state-disabled > .k-link', selectableItems = '> li > ' + SELECTEDSELECTOR + ', .k-panel > li > ' + SELECTEDSELECTOR, defaultState = 'k-state-default', ARIA_DISABLED = 'aria-disabled', ARIA_EXPANDED = 'aria-expanded', ARIA_HIDDEN = 'aria-hidden', ARIA_SELECTED = 'aria-selected', VISIBLE = ':visible', EMPTY = ':empty', SINGLE = 'single', bindings = {\n                text: 'dataTextField',\n                url: 'dataUrlField',\n                spriteCssClass: 'dataSpriteCssClassField',\n                imageUrl: 'dataImageUrlField'\n            }, itemIcon, rendering = {\n                aria: function (item) {\n                    var attr = '';\n                    if (item.items || item.content || item.contentUrl || item.expanded) {\n                        attr += ARIA_EXPANDED + '=\\'' + (item.expanded ? 'true' : 'false') + '\\' ';\n                    }\n                    if (item.enabled === false) {\n                        attr += ARIA_DISABLED + '=\\'true\\'';\n                    }\n                    return attr;\n                },\n                wrapperCssClass: function (group, item) {\n                    var result = 'k-item', index = item.index;\n                    if (item.enabled === false) {\n                        result += ' ' + DISABLEDCLASS;\n                    } else if (item.expanded === true) {\n                        result += ' ' + ACTIVECLASS;\n                    } else {\n                        result += ' k-state-default';\n                    }\n                    if (index === 0) {\n                        result += ' k-first';\n                    }\n                    if (index == group.length - 1) {\n                        result += ' k-last';\n                    }\n                    if (item.cssClass) {\n                        result += ' ' + item.cssClass;\n                    }\n                    return result;\n                },\n                textClass: function (item, group) {\n                    var result = LINK;\n                    if (group.firstLevel) {\n                        result += ' k-header';\n                    }\n                    return result;\n                },\n                textAttributes: function (url) {\n                    return url ? ' href=\\'' + url + '\\'' : '';\n                },\n                arrowClass: function (item) {\n                    var result = 'k-icon';\n                    result += item.expanded ? ' k-panelbar-collapse k-i-arrow-n' : ' k-panelbar-expand k-i-arrow-s';\n                    return result;\n                },\n                text: function (item) {\n                    return item.encoded === false ? item.text : kendo.htmlEncode(item.text);\n                },\n                groupAttributes: function (group) {\n                    return group.expanded !== true ? ' style=\\'display:none\\'' : '';\n                },\n                groupCssClass: function () {\n                    return 'k-group k-panel';\n                },\n                contentAttributes: function (content) {\n                    return content.item.expanded !== true ? ' style=\\'display:none\\'' : '';\n                },\n                content: function (item) {\n                    return item.content ? item.content : item.contentUrl ? '' : '&nbsp;';\n                },\n                contentUrl: function (item) {\n                    return item.contentUrl ? 'href=\"' + item.contentUrl + '\"' : '';\n                }\n            };\n        function updateFirstLast(items) {\n            items = $(items);\n            items.filter('.k-first:not(:first-child)').removeClass(FIRST);\n            items.filter('.k-last:not(:last-child)').removeClass(LAST);\n            items.filter(':first-child').addClass(FIRST);\n            items.filter(':last-child').addClass(LAST);\n        }\n        function updateItemHtml(item) {\n            var wrapper = item, group = item.children('ul'), toggleButton = wrapper.children('.k-link').children('.k-icon');\n            if (item.hasClass('k-panelbar')) {\n                return;\n            }\n            if (!toggleButton.length && group.length) {\n                toggleButton = $('<span class=\\'k-icon\\' />').appendTo(wrapper);\n            } else if (!group.length || !group.children().length) {\n                toggleButton.remove();\n                group.remove();\n            }\n        }\n        itemIcon = function (item) {\n            return item.children('span').children('.k-icon');\n        };\n        var PanelBar = kendo.ui.DataBoundWidget.extend({\n            init: function (element, options) {\n                var that = this, content, hasDataSource;\n                if (isArray(options)) {\n                    options = { dataSource: options };\n                }\n                hasDataSource = options && !!options.dataSource;\n                Widget.fn.init.call(that, element, options);\n                element = that.wrapper = that.element.addClass('k-widget k-reset k-header k-panelbar');\n                options = that.options;\n                if (element[0].id) {\n                    that._itemId = element[0].id + '_pb_active';\n                }\n                that._tabindex();\n                that._accessors();\n                that._dataSource();\n                that._templates();\n                that._initData(hasDataSource);\n                that._updateClasses();\n                that._animations(options);\n                element.on('click' + NS, clickableItems, function (e) {\n                    if (that._click($(e.currentTarget))) {\n                        e.preventDefault();\n                    }\n                }).on(MOUSEENTER + NS + ' ' + MOUSELEAVE + NS, clickableItems, that._toggleHover).on('click' + NS, disabledItems, false).on('click' + NS, '.k-request-retry', proxy(that._retryRequest, that)).on('keydown' + NS, $.proxy(that._keydown, that)).on('focus' + NS, function () {\n                    var item = that.select();\n                    that._current(item[0] ? item : that._first());\n                }).on('blur' + NS, function () {\n                    that._current(null);\n                }).attr('role', 'menu');\n                content = element.find('li.' + ACTIVECLASS + ' > .' + CONTENT);\n                if (content[0]) {\n                    that.expand(content.parent(), false);\n                }\n                if (!options.dataSource) {\n                    that._angularCompile();\n                }\n                kendo.notify(that);\n            },\n            events: [\n                EXPAND,\n                COLLAPSE,\n                SELECT,\n                ACTIVATE,\n                CHANGE,\n                ERROR,\n                DATABOUND,\n                CONTENTLOAD\n            ],\n            options: {\n                name: 'PanelBar',\n                dataSource: {},\n                animation: {\n                    expand: {\n                        effects: 'expand:vertical',\n                        duration: 200\n                    },\n                    collapse: { duration: 200 }\n                },\n                messages: {\n                    loading: 'Loading...',\n                    requestFailed: 'Request failed.',\n                    retry: 'Retry'\n                },\n                autoBind: true,\n                loadOnDemand: true,\n                expandMode: 'multiple',\n                dataTextField: null\n            },\n            _angularCompile: function () {\n                var that = this;\n                that.angular('compile', function () {\n                    return {\n                        elements: that.element.children('li'),\n                        data: [{ dataItem: that.options.$angular }]\n                    };\n                });\n            },\n            _angularCompileElements: function (html, items) {\n                var that = this;\n                that.angular('compile', function () {\n                    return {\n                        elements: html,\n                        data: $.map(items, function (item) {\n                            return [{ dataItem: item }];\n                        })\n                    };\n                });\n            },\n            _angularCleanup: function () {\n                var that = this;\n                that.angular('cleanup', function () {\n                    return { elements: that.element.children('li') };\n                });\n            },\n            destroy: function () {\n                Widget.fn.destroy.call(this);\n                this.element.off(NS);\n                this._angularCleanup();\n                kendo.destroy(this.element);\n            },\n            _initData: function (hasDataSource) {\n                var that = this;\n                if (hasDataSource) {\n                    that.element.empty();\n                    if (that.options.autoBind) {\n                        that._progress(true);\n                        that.dataSource.fetch();\n                    }\n                }\n            },\n            _templates: function () {\n                var that = this, options = that.options, fieldAccessor = proxy(that._fieldAccessor, that);\n                if (options.template && typeof options.template == STRING) {\n                    options.template = template(options.template);\n                } else if (!options.template) {\n                    options.template = template('# var text = ' + fieldAccessor('text') + '(data.item); #' + '# if (typeof data.item.encoded != \\'undefined\\' && data.item.encoded === false) {#' + '#= text #' + '# } else { #' + '#: text #' + '# } #');\n                }\n                that.templates = {\n                    content: template('<div role=\\'region\\' class=\\'k-content\\'#= contentAttributes(data) #>#= content(item) #</div>'),\n                    group: template('<ul role=\\'group\\' aria-hidden=\\'true\\' class=\\'#= groupCssClass(group) #\\'#= groupAttributes(group) #>' + '#= renderItems(data) #' + '</ul>'),\n                    itemWrapper: template('# var url = ' + fieldAccessor('url') + '(item); #' + '# var imageUrl = ' + fieldAccessor('imageUrl') + '(item); #' + '# var spriteCssClass = ' + fieldAccessor('spriteCssClass') + '(item); #' + '# var contentUrl = contentUrl(item); #' + '# var tag = url||contentUrl ? \\'a\\' : \\'span\\'; #' + '<#= tag # class=\\'#= textClass(item, group) #\\' #= contentUrl ##= textAttributes(url) #>' + '# if (imageUrl) { #' + '<img class=\\'k-image\\' alt=\\'\\' src=\\'#= imageUrl #\\' />' + '# } #' + '# if (spriteCssClass) { #' + '<span class=\\'k-sprite #= spriteCssClass #\\'></span>' + '# } #' + '#= data.panelBar.options.template(data) #' + '#= arrow(data) #' + '</#= tag #>'),\n                    item: template('<li role=\\'menuitem\\' #=aria(item)#class=\\'#= wrapperCssClass(group, item) #\\'' + kendo.attr('uid') + '=\\'#= item.uid #\\'>' + '#= itemWrapper(data) #' + '# if (item.items && item.items.length > 0) { #' + '#= subGroup({ items: item.items, panelBar: panelBar, group: { expanded: item.expanded } }) #' + '# } else if (item.content || item.contentUrl) { #' + '#= renderContent(data) #' + '# } #' + '</li>'),\n                    loading: template('<div class=\\'k-item\\'><span class=\\'k-icon k-i-loading\\'></span> #: data.messages.loading #</div>'),\n                    retry: template('#: data.messages.requestFailed # ' + '<button class=\\'k-button k-request-retry\\'>#: data.messages.retry #</button>'),\n                    arrow: template('<span class=\\'#= arrowClass(item) #\\'></span>'),\n                    empty: template('')\n                };\n            },\n            setOptions: function (options) {\n                var animation = this.options.animation;\n                this._animations(options);\n                options.animation = extend(true, animation, options.animation);\n                if ('dataSource' in options) {\n                    this.setDataSource(options.dataSource);\n                }\n                Widget.fn.setOptions.call(this, options);\n            },\n            expand: function (element, useAnimation) {\n                var that = this, animBackup = {};\n                element = this.element.find(element);\n                if (that._animating && element.find('ul').is(':visible')) {\n                    that.one('complete', function () {\n                        setTimeout(function () {\n                            that.expand(element);\n                        });\n                    });\n                    return;\n                }\n                that._animating = true;\n                useAnimation = useAnimation !== false;\n                element.each(function (index, item) {\n                    item = $(item);\n                    var wrapper = element.children('.k-group,.k-content');\n                    if (!wrapper.length) {\n                        wrapper = that._addGroupElement(element);\n                    }\n                    var groups = wrapper.add(item.find(CONTENTS));\n                    if (!item.hasClass(DISABLEDCLASS) && groups.length > 0) {\n                        if (that.options.expandMode == SINGLE && that._collapseAllExpanded(item)) {\n                            return that;\n                        }\n                        element.find('.' + HIGHLIGHTCLASS).removeClass(HIGHLIGHTCLASS);\n                        item.addClass(HIGHLIGHTCLASS);\n                        if (!useAnimation) {\n                            animBackup = that.options.animation;\n                            that.options.animation = {\n                                expand: { effects: {} },\n                                collapse: {\n                                    hide: true,\n                                    effects: {}\n                                }\n                            };\n                        }\n                        if (!that._triggerEvent(EXPAND, item)) {\n                            that._toggleItem(item, false, false);\n                        }\n                        if (!useAnimation) {\n                            that.options.animation = animBackup;\n                        }\n                    }\n                });\n                return that;\n            },\n            collapse: function (element, useAnimation) {\n                var that = this, animBackup = {};\n                that._animating = true;\n                useAnimation = useAnimation !== false;\n                element = that.element.find(element);\n                element.each(function (index, item) {\n                    item = $(item);\n                    var groups = item.find(GROUPS).add(item.find(CONTENTS));\n                    if (!item.hasClass(DISABLEDCLASS) && groups.is(VISIBLE)) {\n                        item.removeClass(HIGHLIGHTCLASS);\n                        if (!useAnimation) {\n                            animBackup = that.options.animation;\n                            that.options.animation = {\n                                expand: { effects: {} },\n                                collapse: {\n                                    hide: true,\n                                    effects: {}\n                                }\n                            };\n                        }\n                        if (!that._triggerEvent(COLLAPSE, item)) {\n                            that._toggleItem(item, true);\n                        }\n                        if (!useAnimation) {\n                            that.options.animation = animBackup;\n                        }\n                    }\n                });\n                return that;\n            },\n            updateArrow: function (items) {\n                var that = this;\n                items = $(items);\n                items.children(LINKSELECTOR).children('.k-panelbar-collapse, .k-panelbar-expand').remove();\n                items.filter(function () {\n                    var dataItem = that.dataItem(this);\n                    if (!dataItem) {\n                        return $(this).find('.k-panel').length > 0 || $(this).find('.k-content').length > 0;\n                    }\n                    return dataItem.hasChildren || dataItem.content || dataItem.contentUrl;\n                }).children('.k-link:not(:has([class*=k-i-arrow]))').each(function () {\n                    var item = $(this), parent = item.parent();\n                    item.append('<span class=\\'k-icon ' + (parent.hasClass(ACTIVECLASS) ? ' k-panelbar-collapse k-i-arrow-n' : ' k-panelbar-expand k-i-arrow-s') + '\\'/>');\n                });\n            },\n            _accessors: function () {\n                var that = this, options = that.options, i, field, textField, element = that.element;\n                for (i in bindings) {\n                    field = options[bindings[i]];\n                    textField = element.attr(kendo.attr(i + '-field'));\n                    if (!field && textField) {\n                        field = textField;\n                    }\n                    if (!field) {\n                        field = i;\n                    }\n                    if (!isArray(field)) {\n                        field = [field];\n                    }\n                    options[bindings[i]] = field;\n                }\n            },\n            _progress: function (item, showProgress) {\n                var element = this.element;\n                var loadingText = this.templates.loading({ messages: this.options.messages });\n                if (arguments.length == 1) {\n                    showProgress = item;\n                    if (showProgress) {\n                        element.html(loadingText);\n                    } else {\n                        element.empty();\n                    }\n                } else {\n                    itemIcon(item).toggleClass('k-i-loading', showProgress).removeClass('k-i-refresh');\n                }\n            },\n            _refreshRoot: function (items) {\n                var that = this;\n                var parent = that.element;\n                var groupData = {\n                    firstLevel: true,\n                    expanded: true,\n                    length: parent.children().length\n                };\n                this.element.empty();\n                var rootItemsHtml = $.map(items, function (value, idx) {\n                    if (typeof value === 'string') {\n                        return $(value);\n                    } else {\n                        value.items = [];\n                        return $(that.renderItem({\n                            group: groupData,\n                            item: extend(value, { index: idx })\n                        }));\n                    }\n                });\n                this.element.append(rootItemsHtml);\n                this._angularCompileElements(rootItemsHtml, items);\n            },\n            _refreshChildren: function (item, parentNode) {\n                var i, children, child;\n                parentNode.children('.k-group').empty();\n                var items = item.children.data();\n                if (!items.length) {\n                    updateItemHtml(parentNode);\n                    children = parentNode.children('.k-group').children('li');\n                    this._angularCompileElements(children, items);\n                } else {\n                    this.append(item.children, parentNode);\n                    if (this.options.loadOnDemand) {\n                        this._toggleGroup(parentNode.children('.k-group'), false);\n                    }\n                    children = parentNode.children('.k-group').children('li');\n                    for (i = 0; i < children.length; i++) {\n                        child = children.eq(i);\n                        this.trigger('itemChange', {\n                            item: child,\n                            data: this.dataItem(child),\n                            ns: ui\n                        });\n                    }\n                }\n            },\n            findByUid: function (uid) {\n                var items = this.element.find('.k-item');\n                var uidAttr = kendo.attr('uid');\n                var result;\n                for (var i = 0; i < items.length; i++) {\n                    if (items[i].getAttribute(uidAttr) == uid) {\n                        result = items[i];\n                        break;\n                    }\n                }\n                return $(result);\n            },\n            refresh: function (e) {\n                var options = this.options;\n                var node = e.node;\n                var action = e.action;\n                var items = e.items;\n                var parentNode = this.wrapper;\n                var loadOnDemand = options.loadOnDemand;\n                if (e.field) {\n                    if (!items[0] || !items[0].level) {\n                        return;\n                    }\n                    return this._updateItems(items, e.field);\n                }\n                if (node) {\n                    parentNode = this.findByUid(node.uid);\n                    this._progress(parentNode, false);\n                }\n                if (action == 'add') {\n                    this._appendItems(e.index, items, parentNode);\n                } else if (action == 'remove') {\n                    this.remove(this.findByUid(items[0].uid));\n                } else if (action == 'itemchange') {\n                    this._updateItems(items);\n                } else if (action == 'itemloaded') {\n                    this._refreshChildren(node, parentNode);\n                } else {\n                    this._refreshRoot(items);\n                }\n                if (action != 'remove') {\n                    for (var k = 0; k < items.length; k++) {\n                        if (!loadOnDemand || items[k].expanded) {\n                            var tempItem = items[k];\n                            if (this._hasChildItems(tempItem)) {\n                                tempItem.load();\n                            }\n                        }\n                    }\n                }\n                this.trigger(DATABOUND, { node: node ? parentNode : undefined });\n            },\n            _error: function (e) {\n                var node = e.node && this.findByUid(e.node.uid);\n                var retryHtml = this.templates.retry({ messages: this.options.messages });\n                if (node) {\n                    this._progress(node, false);\n                    this._expanded(node, false);\n                    itemIcon(node).addClass('k-i-refresh');\n                    e.node.loaded(false);\n                } else {\n                    this._progress(false);\n                    this.element.html(retryHtml);\n                }\n            },\n            _retryRequest: function (e) {\n                e.preventDefault();\n                this.dataSource.fetch();\n            },\n            items: function () {\n                return this.element.find('.k-item > span:first-child');\n            },\n            setDataSource: function (dataSource) {\n                var options = this.options;\n                options.dataSource = dataSource;\n                this._dataSource();\n                if (this.options.autoBind) {\n                    this._progress(true);\n                    this.dataSource.fetch();\n                }\n            },\n            _bindDataSource: function () {\n                this._refreshHandler = proxy(this.refresh, this);\n                this._errorHandler = proxy(this._error, this);\n                this.dataSource.bind(CHANGE, this._refreshHandler);\n                this.dataSource.bind(ERROR, this._errorHandler);\n            },\n            _unbindDataSource: function () {\n                var dataSource = this.dataSource;\n                if (dataSource) {\n                    dataSource.unbind(CHANGE, this._refreshHandler);\n                    dataSource.unbind(ERROR, this._errorHandler);\n                }\n            },\n            _fieldAccessor: function (fieldName) {\n                var fieldBindings = this.options[bindings[fieldName]] || [], count = fieldBindings.length, result = '(function(item) {';\n                if (count === 0) {\n                    result += 'return item[\\'' + fieldName + '\\'];';\n                } else {\n                    result += 'var levels = [' + $.map(fieldBindings, function (x) {\n                        return 'function(d){ return ' + kendo.expr(x) + '}';\n                    }).join(',') + '];';\n                    result += 'if(item.level){return levels[Math.min(item.level(), ' + count + '-1)](item);}else';\n                    result += '{return levels[' + count + '-1](item)}';\n                }\n                result += '})';\n                return result;\n            },\n            _dataSource: function () {\n                var that = this, options = that.options, dataSource = options.dataSource;\n                if (!dataSource) {\n                    return;\n                }\n                dataSource = isArray(dataSource) ? { data: dataSource } : dataSource;\n                that._unbindDataSource();\n                if (!dataSource.fields) {\n                    dataSource.fields = [\n                        { field: 'text' },\n                        { field: 'url' },\n                        { field: 'spriteCssClass' },\n                        { field: 'imageUrl' }\n                    ];\n                }\n                that.dataSource = HierarchicalDataSource.create(dataSource);\n                that._bindDataSource();\n            },\n            _appendItems: function (index, items, parentNode) {\n                var that = this, children, wrapper;\n                if (parentNode.hasClass('k-panelbar')) {\n                    children = parentNode.children('li');\n                    wrapper = parentNode;\n                } else {\n                    wrapper = parentNode.children('.k-group');\n                    if (!wrapper.length) {\n                        wrapper = that._addGroupElement(parentNode);\n                    }\n                    children = wrapper.children('li');\n                }\n                var groupData = {\n                    firstLevel: parentNode.hasClass('k-panelbar'),\n                    expanded: true,\n                    length: children.length\n                };\n                var itemsHtml = $.map(items, function (value, idx) {\n                    if (typeof value === 'string') {\n                        return $(value);\n                    } else {\n                        return $(that.renderItem({\n                            group: groupData,\n                            item: extend(value, { index: idx })\n                        }));\n                    }\n                });\n                if (typeof index == UNDEFINED) {\n                    index = children.length;\n                }\n                for (var i = 0; i < itemsHtml.length; i++) {\n                    if (children.length === 0 || index === 0) {\n                        wrapper.append(itemsHtml[i]);\n                    } else {\n                        itemsHtml[i].insertAfter(children[index - 1]);\n                    }\n                }\n                that._angularCompileElements(itemsHtml, items);\n                if (that.dataItem(parentNode)) {\n                    that.dataItem(parentNode).hasChildren = true;\n                    that.updateArrow(parentNode);\n                }\n            },\n            _updateItems: function (items, field) {\n                var that = this;\n                var i, node, nodeWrapper, item;\n                var context = {\n                    panelBar: that.options,\n                    item: item,\n                    group: {}\n                };\n                var render = field != 'expanded';\n                if (field == 'selected') {\n                    if (items[0][field]) {\n                        var currentNode = that.findByUid(items[0].uid);\n                        if (!currentNode.hasClass(DISABLEDCLASS)) {\n                            that.select(currentNode, true);\n                        }\n                    } else {\n                        that.clearSelection();\n                    }\n                } else {\n                    var elements = $.map(items, function (item) {\n                        return that.findByUid(item.uid);\n                    });\n                    if (render) {\n                        that.angular('cleanup', function () {\n                            return { elements: elements };\n                        });\n                    }\n                    for (i = 0; i < items.length; i++) {\n                        context.item = item = items[i];\n                        context.panelBar = that;\n                        nodeWrapper = elements[i];\n                        node = nodeWrapper.parent();\n                        if (render) {\n                            context.group = {\n                                firstLevel: node.hasClass('k-panelbar'),\n                                expanded: nodeWrapper.parent().hasClass(ACTIVECLASS),\n                                length: nodeWrapper.children().length\n                            };\n                            nodeWrapper.children('.k-link').remove();\n                            nodeWrapper.prepend(that.templates.itemWrapper(extend(context, { arrow: item.hasChildren || item.content || item.contentUrl ? that.templates.arrow : that.templates.empty }, rendering)));\n                        }\n                        if (field == 'expanded') {\n                            that._toggleItem(nodeWrapper, !item[field], item[field] ? 'true' : true);\n                        } else if (field == 'enabled') {\n                            that.enable(nodeWrapper, item[field]);\n                            if (!item[field]) {\n                                if (item.selected) {\n                                    item.set('selected', false);\n                                }\n                            }\n                        }\n                        if (nodeWrapper.length) {\n                            this.trigger('itemChange', {\n                                item: nodeWrapper,\n                                data: item,\n                                ns: ui\n                            });\n                        }\n                    }\n                    if (render) {\n                        that.angular('compile', function () {\n                            return {\n                                elements: elements,\n                                data: $.map(items, function (item) {\n                                    return [{ dataItem: item }];\n                                })\n                            };\n                        });\n                    }\n                }\n            },\n            _toggleDisabled: function (element, enable) {\n                element = this.element.find(element);\n                element.toggleClass(defaultState, enable).toggleClass(DISABLEDCLASS, !enable).attr(ARIA_DISABLED, !enable);\n            },\n            dataItem: function (item) {\n                var uid = $(item).closest(ITEM).attr(kendo.attr('uid')), dataSource = this.dataSource;\n                return dataSource && dataSource.getByUid(uid);\n            },\n            select: function (element, skipChange) {\n                var that = this;\n                if (element === undefined) {\n                    return that.element.find(selectableItems).parent();\n                }\n                element = that.element.find(element);\n                if (!element.length) {\n                    this._updateSelected(element);\n                } else {\n                    element.each(function () {\n                        var item = $(this), link = item.children(LINKSELECTOR);\n                        if (item.hasClass(DISABLEDCLASS)) {\n                            return that;\n                        }\n                        that._updateSelected(link, skipChange);\n                    });\n                }\n                return that;\n            },\n            clearSelection: function () {\n                this.select($());\n            },\n            enable: function (element, state) {\n                this._toggleDisabled(element, state !== false);\n                return this;\n            },\n            disable: function (element) {\n                this._toggleDisabled(element, false);\n                return this;\n            },\n            append: function (item, referenceItem) {\n                referenceItem = this.element.find(referenceItem);\n                var inserted = this._insert(item, referenceItem, referenceItem.length ? referenceItem.find(GROUPS) : null);\n                each(inserted.items, function () {\n                    inserted.group.append(this);\n                    updateFirstLast(this);\n                });\n                this.updateArrow(referenceItem);\n                updateFirstLast(inserted.group.find('.k-first, .k-last'));\n                inserted.group.height('auto');\n                return this;\n            },\n            insertBefore: function (item, referenceItem) {\n                referenceItem = this.element.find(referenceItem);\n                var inserted = this._insert(item, referenceItem, referenceItem.parent());\n                each(inserted.items, function () {\n                    referenceItem.before(this);\n                    updateFirstLast(this);\n                });\n                updateFirstLast(referenceItem);\n                inserted.group.height('auto');\n                return this;\n            },\n            insertAfter: function (item, referenceItem) {\n                referenceItem = this.element.find(referenceItem);\n                var inserted = this._insert(item, referenceItem, referenceItem.parent());\n                each(inserted.items, function () {\n                    referenceItem.after(this);\n                    updateFirstLast(this);\n                });\n                updateFirstLast(referenceItem);\n                inserted.group.height('auto');\n                return this;\n            },\n            remove: function (element) {\n                element = this.element.find(element);\n                var that = this, parent = element.parentsUntil(that.element, ITEM), group = element.parent('ul');\n                element.remove();\n                if (group && !group.hasClass('k-panelbar') && !group.children(ITEM).length) {\n                    group.remove();\n                }\n                if (parent.length) {\n                    parent = parent.eq(0);\n                    that.updateArrow(parent);\n                    updateFirstLast(parent);\n                }\n                return that;\n            },\n            reload: function (element) {\n                var that = this;\n                element = that.element.find(element);\n                element.each(function () {\n                    var item = $(this);\n                    that._ajaxRequest(item, item.children('.' + CONTENT), !item.is(VISIBLE));\n                });\n            },\n            _first: function () {\n                return this.element.children(ACTIVEITEMSELECTOR).first();\n            },\n            _last: function () {\n                var item = this.element.children(ACTIVEITEMSELECTOR).last(), group = item.children(VISIBLEGROUP);\n                if (group[0]) {\n                    return group.children(ACTIVEITEMSELECTOR).last();\n                }\n                return item;\n            },\n            _current: function (candidate) {\n                var that = this, focused = that._focused, id = that._itemId;\n                if (candidate === undefined) {\n                    return focused;\n                }\n                that.element.removeAttr('aria-activedescendant');\n                if (focused && focused.length) {\n                    if (focused[0].id === id) {\n                        focused.removeAttr('id');\n                    }\n                    focused.children(LINKSELECTOR).removeClass(FOCUSEDCLASS);\n                }\n                if ($(candidate).length) {\n                    id = candidate[0].id || id;\n                    candidate.attr('id', id).children(LINKSELECTOR).addClass(FOCUSEDCLASS);\n                    that.element.attr('aria-activedescendant', id);\n                }\n                that._focused = candidate;\n            },\n            _keydown: function (e) {\n                var that = this, key = e.keyCode, current = that._current();\n                if (e.target != e.currentTarget) {\n                    return;\n                }\n                if (key == keys.DOWN || key == keys.RIGHT) {\n                    that._current(that._nextItem(current));\n                    e.preventDefault();\n                } else if (key == keys.UP || key == keys.LEFT) {\n                    that._current(that._prevItem(current));\n                    e.preventDefault();\n                } else if (key == keys.ENTER || key == keys.SPACEBAR) {\n                    that._click(current.children(LINKSELECTOR));\n                    e.preventDefault();\n                } else if (key == keys.HOME) {\n                    that._current(that._first());\n                    e.preventDefault();\n                } else if (key == keys.END) {\n                    that._current(that._last());\n                    e.preventDefault();\n                }\n            },\n            _nextItem: function (item) {\n                if (!item) {\n                    return this._first();\n                }\n                var group = item.children(VISIBLEGROUP), next = item.nextAll(':visible').first();\n                if (group[0]) {\n                    next = group.children('.' + FIRST);\n                }\n                if (!next[0]) {\n                    next = item.parent(VISIBLEGROUP).parent(ITEM).next();\n                }\n                if (!next[0]) {\n                    next = this._first();\n                }\n                if (next.hasClass(DISABLEDCLASS)) {\n                    next = this._nextItem(next);\n                }\n                return next;\n            },\n            _prevItem: function (item) {\n                if (!item) {\n                    return this._last();\n                }\n                var prev = item.prevAll(':visible').first(), result;\n                if (!prev[0]) {\n                    prev = item.parent(VISIBLEGROUP).parent(ITEM);\n                    if (!prev[0]) {\n                        prev = this._last();\n                    }\n                } else {\n                    result = prev;\n                    while (result[0]) {\n                        result = result.children(VISIBLEGROUP).children('.' + LAST);\n                        if (result[0]) {\n                            prev = result;\n                        }\n                    }\n                }\n                if (prev.hasClass(DISABLEDCLASS)) {\n                    prev = this._prevItem(prev);\n                }\n                return prev;\n            },\n            _insert: function (item, referenceItem, parent) {\n                var that = this, items, plain = $.isPlainObject(item), isReferenceItem = referenceItem && referenceItem[0], groupData;\n                if (!isReferenceItem) {\n                    parent = that.element;\n                }\n                groupData = {\n                    firstLevel: parent.hasClass('k-panelbar'),\n                    expanded: $(referenceItem).hasClass(ACTIVECLASS),\n                    length: parent.children().length\n                };\n                if (isReferenceItem && !parent.length) {\n                    parent = $(that.renderGroup({\n                        group: groupData,\n                        options: that.options\n                    })).appendTo(referenceItem);\n                }\n                if (plain || $.isArray(item) || item instanceof HierarchicalDataSource) {\n                    if (item instanceof HierarchicalDataSource) {\n                        item = item.data();\n                    }\n                    items = $.map(plain ? [item] : item, function (value, idx) {\n                        if (typeof value === 'string') {\n                            return $(value);\n                        } else {\n                            return $(that.renderItem({\n                                group: groupData,\n                                item: extend(value, { index: idx })\n                            }));\n                        }\n                    });\n                    if (isReferenceItem) {\n                        var dataItem = that.dataItem(referenceItem);\n                        if (dataItem) {\n                            dataItem.hasChildren = true;\n                        }\n                        referenceItem.attr(ARIA_EXPANDED, false);\n                    }\n                } else {\n                    if (typeof item == 'string' && item.charAt(0) != '<') {\n                        items = that.element.find(item);\n                    } else {\n                        items = $(item);\n                    }\n                    that._updateItemsClasses(items);\n                }\n                if (!item.length) {\n                    item = [item];\n                }\n                that._angularCompileElements(items, item);\n                return {\n                    items: items,\n                    group: parent\n                };\n            },\n            _toggleHover: function (e) {\n                var target = $(e.currentTarget);\n                if (!target.parents('li.' + DISABLEDCLASS).length) {\n                    target.toggleClass('k-state-hover', e.type == MOUSEENTER);\n                }\n            },\n            _updateClasses: function () {\n                var that = this, panels, items;\n                panels = that.element.find('li > ul').not(function () {\n                    return $(this).parentsUntil('.k-panelbar', 'div').length;\n                }).addClass('k-group k-panel').attr('role', 'group');\n                panels.parent().attr(ARIA_EXPANDED, false).not('.' + ACTIVECLASS).children('ul').attr(ARIA_HIDDEN, true).hide();\n                items = that.element.add(panels).children();\n                that._updateItemsClasses(items);\n                that.updateArrow(items);\n                updateFirstLast(items);\n            },\n            _updateItemsClasses: function (items) {\n                var length = items.length, idx = 0;\n                for (; idx < length; idx++) {\n                    this._updateItemClasses(items[idx], idx);\n                }\n            },\n            _updateItemClasses: function (item, index) {\n                var selected = this._selected, contentUrls = this.options.contentUrls, url = contentUrls && contentUrls[index], root = this.element[0], wrapElement, link;\n                item = $(item).addClass('k-item').attr('role', 'menuitem');\n                if (kendo.support.browser.msie) {\n                    item.css('list-style-position', 'inside').css('list-style-position', '');\n                }\n                item.children(IMG).addClass(IMAGE);\n                link = item.children('a').addClass(LINK);\n                if (link[0]) {\n                    link.attr('href', url);\n                    link.children(IMG).addClass(IMAGE);\n                }\n                item.filter(':not([disabled]):not([class*=k-state])').addClass('k-state-default');\n                item.filter('li[disabled]').addClass('k-state-disabled').attr(ARIA_DISABLED, true).removeAttr('disabled');\n                item.children('div').addClass(CONTENT).attr('role', 'region').attr(ARIA_HIDDEN, true).hide().parent().attr(ARIA_EXPANDED, false);\n                link = item.children(SELECTEDSELECTOR);\n                if (link[0]) {\n                    if (selected) {\n                        selected.removeAttr(ARIA_SELECTED).children(SELECTEDSELECTOR).removeClass(SELECTEDCLASS);\n                    }\n                    link.addClass(SELECTEDCLASS);\n                    this._selected = item.attr(ARIA_SELECTED, true);\n                }\n                if (!item.children(LINKSELECTOR)[0]) {\n                    wrapElement = '<span class=\\'' + LINK + '\\'/>';\n                    if (contentUrls && contentUrls[index] && item[0].parentNode == root) {\n                        wrapElement = '<a class=\"k-link k-header\" href=\"' + contentUrls[index] + '\"/>';\n                    }\n                    item.contents().filter(function () {\n                        return !this.nodeName.match(excludedNodesRegExp) && !(this.nodeType == 3 && !$.trim(this.nodeValue));\n                    }).wrapAll(wrapElement);\n                }\n                if (item.parent('.k-panelbar')[0]) {\n                    item.children(LINKSELECTOR).addClass('k-header');\n                }\n            },\n            _click: function (target) {\n                var that = this, element = that.element, prevent, contents, href, isAnchor;\n                if (target.parents('li.' + DISABLEDCLASS).length) {\n                    return;\n                }\n                if (target.closest('.k-widget')[0] != element[0]) {\n                    return;\n                }\n                var link = target.closest(LINKSELECTOR), item = link.closest(ITEM);\n                that._updateSelected(link);\n                var wrapper = item.children('.k-group,.k-content');\n                var dataItem = this.dataItem(item);\n                if (!wrapper.length && (that.options.loadOnDemand && dataItem && dataItem.hasChildren || this._hasChildItems(item) || item.content || item.contentUrl)) {\n                    wrapper = that._addGroupElement(item);\n                }\n                contents = item.find(GROUPS).add(item.find(CONTENTS));\n                href = link.attr(HREF);\n                isAnchor = href && (href.charAt(href.length - 1) == '#' || href.indexOf('#' + that.element[0].id + '-') != -1);\n                prevent = !!(isAnchor || contents.length);\n                if (contents.data('animating')) {\n                    return prevent;\n                }\n                if (that._triggerEvent(SELECT, item)) {\n                    prevent = true;\n                }\n                if (prevent === false) {\n                    return;\n                }\n                if (that.options.expandMode == SINGLE) {\n                    if (that._collapseAllExpanded(item)) {\n                        return prevent;\n                    }\n                }\n                if (contents.length) {\n                    var visibility = contents.is(VISIBLE);\n                    if (!that._triggerEvent(!visibility ? EXPAND : COLLAPSE, item)) {\n                        prevent = that._toggleItem(item, visibility);\n                    }\n                }\n                return prevent;\n            },\n            _hasChildItems: function (item) {\n                return item.items && item.items.length > 0 || item.hasChildren;\n            },\n            _toggleItem: function (element, isVisible, expanded) {\n                var that = this, childGroup = element.find(GROUPS), link = element.find(LINKSELECTOR), url = link.attr(HREF), prevent, content, dataItem = that.dataItem(element);\n                var loaded = dataItem && dataItem.loaded();\n                if (dataItem && !expanded) {\n                    dataItem.set('expanded', !isVisible);\n                    prevent = dataItem.hasChildren || !!dataItem.content || !!dataItem.contentUrl;\n                    return prevent;\n                }\n                if (dataItem && (!expanded || expanded === 'true') && !loaded && !dataItem.content && !dataItem.contentUrl) {\n                    if (that.options.loadOnDemand) {\n                        this._progress(element, true);\n                    }\n                    element.children('.k-group,.k-content').remove();\n                    prevent = dataItem.hasChildren;\n                    dataItem.load();\n                } else {\n                    if (childGroup.length) {\n                        this._toggleGroup(childGroup, isVisible);\n                        prevent = true;\n                    } else {\n                        content = element.children('.' + CONTENT);\n                        if (content.length) {\n                            prevent = true;\n                            if (!content.is(EMPTY) || url === undefined) {\n                                that._toggleGroup(content, isVisible);\n                            } else {\n                                that._ajaxRequest(element, content, isVisible);\n                            }\n                        }\n                    }\n                }\n                return prevent;\n            },\n            _toggleGroup: function (element, visibility) {\n                var that = this, animationSettings = that.options.animation, animation = animationSettings.expand, hasCollapseAnimation = animationSettings.collapse && 'effects' in animationSettings.collapse, collapse = extend({}, animationSettings.expand, animationSettings.collapse);\n                if (!hasCollapseAnimation) {\n                    collapse = extend(collapse, { reverse: true });\n                }\n                if (element.is(VISIBLE) != visibility) {\n                    that._animating = false;\n                    return;\n                }\n                element.parent().attr(ARIA_EXPANDED, !visibility).attr(ARIA_HIDDEN, visibility).toggleClass(ACTIVECLASS, !visibility).find('> .k-link > .k-panelbar-collapse,> .k-link > .k-panelbar-expand').toggleClass('k-i-arrow-n', !visibility).toggleClass('k-panelbar-collapse', !visibility).toggleClass('k-i-arrow-s', visibility).toggleClass('k-panelbar-expand', visibility);\n                if (visibility) {\n                    animation = extend(collapse, { hide: true });\n                    animation.complete = function () {\n                        that._animationCallback();\n                    };\n                } else {\n                    animation = extend({\n                        complete: function (element) {\n                            that._triggerEvent(ACTIVATE, element.closest(ITEM));\n                            that._animationCallback();\n                        }\n                    }, animation);\n                }\n                element.kendoStop(true, true).kendoAnimate(animation);\n            },\n            _animationCallback: function () {\n                var that = this;\n                that.trigger('complete');\n                that._animating = false;\n            },\n            _addGroupElement: function (element) {\n                var group = $('<ul role=\"group\" aria-hidden=\"true\" class=\"k-group k-panel\" style=\"display:none\"></ul>');\n                element.append(group);\n                return group;\n            },\n            _collapseAllExpanded: function (item) {\n                var that = this, children, stopExpand = false;\n                var groups = item.find(GROUPS).add(item.find(CONTENTS));\n                if (groups.is(VISIBLE)) {\n                    stopExpand = true;\n                }\n                if (!(groups.is(VISIBLE) || groups.length === 0)) {\n                    children = item.siblings();\n                    children.find(GROUPS).add(children.find(CONTENTS)).filter(function () {\n                        return $(this).is(VISIBLE);\n                    }).each(function (index, content) {\n                        content = $(content);\n                        stopExpand = that._triggerEvent(COLLAPSE, content.closest(ITEM));\n                        if (!stopExpand) {\n                            that._toggleGroup(content, true);\n                        }\n                    });\n                    that.one('complete', function () {\n                        setTimeout(function () {\n                            children.each(function (index, child) {\n                                var dataItem = that.dataItem(child);\n                                if (dataItem) {\n                                    dataItem.set('expanded', false);\n                                }\n                            });\n                        });\n                    });\n                }\n                return stopExpand;\n            },\n            _ajaxRequest: function (element, contentElement, isVisible) {\n                var that = this, statusIcon = element.find('.k-panelbar-collapse, .k-panelbar-expand'), link = element.find(LINKSELECTOR), loadingIconTimeout = setTimeout(function () {\n                        statusIcon.addClass('k-i-loading');\n                    }, 100), data = {}, url = link.attr(HREF);\n                $.ajax({\n                    type: 'GET',\n                    cache: false,\n                    url: url,\n                    dataType: 'html',\n                    data: data,\n                    error: function (xhr, status) {\n                        statusIcon.removeClass('k-i-loading');\n                        if (that.trigger(ERROR, {\n                                xhr: xhr,\n                                status: status\n                            })) {\n                            this.complete();\n                        }\n                    },\n                    complete: function () {\n                        clearTimeout(loadingIconTimeout);\n                        statusIcon.removeClass('k-i-loading');\n                    },\n                    success: function (data) {\n                        function getElements() {\n                            return { elements: contentElement.get() };\n                        }\n                        try {\n                            that.angular('cleanup', getElements);\n                            contentElement.html(data);\n                            that.angular('compile', getElements);\n                        } catch (e) {\n                            var console = window.console;\n                            if (console && console.error) {\n                                console.error(e.name + ': ' + e.message + ' in ' + url);\n                            }\n                            this.error(this.xhr, 'error');\n                        }\n                        that._toggleGroup(contentElement, isVisible);\n                        that.trigger(CONTENTLOAD, {\n                            item: element[0],\n                            contentElement: contentElement[0]\n                        });\n                    }\n                });\n            },\n            _triggerEvent: function (eventName, element) {\n                var that = this;\n                return that.trigger(eventName, { item: element[0] });\n            },\n            _updateSelected: function (link, skipChange) {\n                var that = this, element = that.element, item = link.parent(ITEM), selected = that._selected, dataItem = that.dataItem(item);\n                if (selected) {\n                    selected.removeAttr(ARIA_SELECTED);\n                }\n                that._selected = item.attr(ARIA_SELECTED, true);\n                element.find(selectableItems).removeClass(SELECTEDCLASS);\n                element.find('> .' + HIGHLIGHTCLASS + ', .k-panel > .' + HIGHLIGHTCLASS).removeClass(HIGHLIGHTCLASS);\n                link.addClass(SELECTEDCLASS);\n                link.parentsUntil(element, ITEM).filter(':has(.k-header)').addClass(HIGHLIGHTCLASS);\n                that._current(item[0] ? item : null);\n                if (dataItem) {\n                    dataItem.set('selected', true);\n                }\n                if (!skipChange) {\n                    that.trigger(CHANGE);\n                }\n            },\n            _animations: function (options) {\n                if (options && 'animation' in options && !options.animation) {\n                    options.animation = {\n                        expand: { effects: {} },\n                        collapse: {\n                            hide: true,\n                            effects: {}\n                        }\n                    };\n                }\n            },\n            renderItem: function (options) {\n                var that = this;\n                options = extend({\n                    panelBar: that,\n                    group: {}\n                }, options);\n                var empty = that.templates.empty, item = options.item;\n                return that.templates.item(extend(options, {\n                    itemWrapper: that.templates.itemWrapper,\n                    renderContent: that.renderContent,\n                    arrow: that._hasChildItems(item) || item.content || item.contentUrl ? that.templates.arrow : empty,\n                    subGroup: !options.loadOnDemand || item.expanded ? that.renderGroup : empty\n                }, rendering));\n            },\n            renderGroup: function (options) {\n                var that = this;\n                var templates = that.templates || options.panelBar.templates;\n                return templates.group(extend({\n                    renderItems: function (options) {\n                        var html = '', i = 0, items = options.items, len = items ? items.length : 0, group = extend({ length: len }, options.group);\n                        for (; i < len; i++) {\n                            html += options.panelBar.renderItem(extend(options, {\n                                group: group,\n                                item: extend({ index: i }, items[i])\n                            }));\n                        }\n                        return html;\n                    }\n                }, options, rendering));\n            },\n            renderContent: function (options) {\n                return options.panelBar.templates.content(extend(options, rendering));\n            }\n        });\n        kendo.ui.plugin(PanelBar);\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.responsivepanel', ['kendo.core'], f);\n}(function () {\n    var __meta__ = {\n        id: 'responsive-panel',\n        name: 'Responsive Panel',\n        category: 'web',\n        description: 'The Responsive Panel widget allows a panel of content to be hidden on mobile devices, available through a toggle button.',\n        depends: ['core']\n    };\n    (function ($, undefined) {\n        var proxy = $.proxy;\n        var NS = '.kendoResponsivePanel';\n        var OPEN = 'open';\n        var CLOSE = 'close';\n        var ACTIVATE_EVENTS = 'click' + NS + ' touchstart' + NS;\n        var Widget = kendo.ui.Widget;\n        var ResponsivePanel = Widget.extend({\n            init: function (element, options) {\n                Widget.fn.init.call(this, element, options);\n                this._guid = '_' + kendo.guid();\n                this._toggleHandler = proxy(this._toggleButtonClick, this);\n                this._closeHandler = proxy(this._close, this);\n                $(document.documentElement).on(ACTIVATE_EVENTS, this.options.toggleButton, this._toggleHandler);\n                this._registerBreakpoint();\n                this.element.addClass('k-rpanel k-rpanel-' + this.options.orientation + ' ' + this._guid);\n                this._resizeHandler = proxy(this.resize, this, true);\n                $(window).on('resize' + NS, this._resizeHandler);\n            },\n            _mediaQuery: '@media (max-width: #= breakpoint-1 #px) {' + '.#= guid #.k-rpanel-animate.k-rpanel-left,' + '.#= guid #.k-rpanel-animate.k-rpanel-right {' + '-webkit-transition: -webkit-transform .2s ease-out;' + '-ms-transition: -ms-transform .2s ease-out;' + 'transition: transform .2s ease-out;' + '} ' + '.#= guid #.k-rpanel-top {' + 'overflow: hidden;' + '}' + '.#= guid #.k-rpanel-animate.k-rpanel-top {' + '-webkit-transition: max-height .2s linear;' + '-ms-transition: max-height .2s linear;' + 'transition: max-height .2s linear;' + '}' + '} ' + '@media (min-width: #= breakpoint #px) {' + '#= toggleButton # { display: none; } ' + '.#= guid #.k-rpanel-left { float: left; } ' + '.#= guid #.k-rpanel-right { float: right; } ' + '.#= guid #.k-rpanel-left, .#= guid #.k-rpanel-right {' + 'position: relative;' + '-webkit-transform: translateX(0);' + '-ms-transform: translateX(0);' + 'transform: translateX(0);' + '-webkit-transform: translateX(0) translateZ(0);' + '-ms-transform: translateX(0) translateZ(0);' + 'transform: translateX(0) translateZ(0);' + '} ' + '.k-ie9 .#= guid #.k-rpanel-left { left: 0; } ' + '.#= guid #.k-rpanel-top { max-height: none; }' + '}',\n            _registerBreakpoint: function () {\n                var options = this.options;\n                this._registerStyle(kendo.template(this._mediaQuery)({\n                    breakpoint: options.breakpoint,\n                    toggleButton: options.toggleButton,\n                    guid: this._guid\n                }));\n            },\n            _registerStyle: function (cssText) {\n                var head = $('head,body')[0];\n                var style = document.createElement('style');\n                head.appendChild(style);\n                if (style.styleSheet) {\n                    style.styleSheet.cssText = cssText;\n                } else {\n                    style.appendChild(document.createTextNode(cssText));\n                }\n            },\n            options: {\n                name: 'ResponsivePanel',\n                orientation: 'left',\n                toggleButton: '.k-rpanel-toggle',\n                breakpoint: 640,\n                autoClose: true\n            },\n            events: [\n                OPEN,\n                CLOSE\n            ],\n            _resize: function () {\n                this.element.removeClass('k-rpanel-animate k-rpanel-expanded');\n                $(document.documentElement).off(ACTIVATE_EVENTS, this._closeHandler);\n            },\n            _toggleButtonClick: function (e) {\n                e.preventDefault();\n                if (this.element.hasClass('k-rpanel-expanded')) {\n                    this.close();\n                } else {\n                    this.open();\n                }\n            },\n            open: function () {\n                if (!this.trigger(OPEN)) {\n                    this.element.addClass('k-rpanel-animate k-rpanel-expanded');\n                    if (this.options.autoClose) {\n                        $(document.documentElement).on(ACTIVATE_EVENTS, this._closeHandler);\n                    }\n                }\n            },\n            close: function () {\n                if (!this.trigger(CLOSE)) {\n                    this.element.addClass('k-rpanel-animate').removeClass('k-rpanel-expanded');\n                    $(document.documentElement).off(ACTIVATE_EVENTS, this._closeHandler);\n                }\n            },\n            _close: function (e) {\n                var prevented = e.isDefaultPrevented();\n                var container = $(e.target).closest(this.options.toggleButton + ',.k-rpanel');\n                if (!container.length && !prevented) {\n                    this.close();\n                }\n            },\n            destroy: function () {\n                Widget.fn.destroy.call(this);\n                $(window).off('resize' + NS, this._resizeHandler);\n                $(document.documentElement).off(ACTIVATE_EVENTS, this._closeHandler);\n            }\n        });\n        kendo.ui.plugin(ResponsivePanel);\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.timepicker', ['kendo.popup'], f);\n}(function () {\n    var __meta__ = {\n        id: 'timepicker',\n        name: 'TimePicker',\n        category: 'web',\n        description: 'The TimePicker widget allows the end user to select a value from a list of predefined values or to type a new value.',\n        depends: ['popup']\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, keys = kendo.keys, parse = kendo.parseDate, activeElement = kendo._activeElement, extractFormat = kendo._extractFormat, support = kendo.support, browser = support.browser, ui = kendo.ui, Widget = ui.Widget, OPEN = 'open', CLOSE = 'close', CHANGE = 'change', ns = '.kendoTimePicker', CLICK = 'click' + ns, DEFAULT = 'k-state-default', DISABLED = 'disabled', READONLY = 'readonly', LI = 'li', SPAN = '<span/>', FOCUSED = 'k-state-focused', HOVER = 'k-state-hover', HOVEREVENTS = 'mouseenter' + ns + ' mouseleave' + ns, MOUSEDOWN = 'mousedown' + ns, MS_PER_MINUTE = 60000, MS_PER_DAY = 86400000, SELECTED = 'k-state-selected', STATEDISABLED = 'k-state-disabled', ARIA_SELECTED = 'aria-selected', ARIA_EXPANDED = 'aria-expanded', ARIA_HIDDEN = 'aria-hidden', ARIA_DISABLED = 'aria-disabled', ARIA_ACTIVEDESCENDANT = 'aria-activedescendant', ID = 'id', isArray = $.isArray, extend = $.extend, proxy = $.proxy, DATE = Date, TODAY = new DATE();\n        TODAY = new DATE(TODAY.getFullYear(), TODAY.getMonth(), TODAY.getDate(), 0, 0, 0);\n        var TimeView = function (options) {\n            var that = this, id = options.id;\n            that.options = options;\n            that._dates = [];\n            that.ul = $('<ul tabindex=\"-1\" role=\"listbox\" aria-hidden=\"true\" unselectable=\"on\" class=\"k-list k-reset\"/>').css({ overflow: support.kineticScrollNeeded ? '' : 'auto' }).on(CLICK, LI, proxy(that._click, that)).on('mouseenter' + ns, LI, function () {\n                $(this).addClass(HOVER);\n            }).on('mouseleave' + ns, LI, function () {\n                $(this).removeClass(HOVER);\n            });\n            that.list = $('<div class=\\'k-list-container k-list-scroller\\' unselectable=\\'on\\'/>').append(that.ul).on(MOUSEDOWN, preventDefault);\n            if (id) {\n                that._timeViewID = id + '_timeview';\n                that._optionID = id + '_option_selected';\n                that.ul.attr(ID, that._timeViewID);\n            }\n            that._popup();\n            that._heightHandler = proxy(that._height, that);\n            that.template = kendo.template('<li tabindex=\"-1\" role=\"option\" class=\"k-item\" unselectable=\"on\">#=data#</li>', { useWithBlock: false });\n        };\n        TimeView.prototype = {\n            current: function (candidate) {\n                var that = this, active = that.options.active;\n                if (candidate !== undefined) {\n                    if (that._current) {\n                        that._current.removeClass(SELECTED).removeAttr(ARIA_SELECTED).removeAttr(ID);\n                    }\n                    if (candidate) {\n                        candidate = $(candidate).addClass(SELECTED).attr(ID, that._optionID).attr(ARIA_SELECTED, true);\n                        that.scroll(candidate[0]);\n                    }\n                    that._current = candidate;\n                    if (active) {\n                        active(candidate);\n                    }\n                } else {\n                    return that._current;\n                }\n            },\n            close: function () {\n                this.popup.close();\n            },\n            destroy: function () {\n                var that = this;\n                that.ul.off(ns);\n                that.list.off(ns);\n                that.popup.destroy();\n            },\n            open: function () {\n                var that = this;\n                if (!that.ul[0].firstChild) {\n                    that.bind();\n                }\n                that.popup.open();\n                if (that._current) {\n                    that.scroll(that._current[0]);\n                }\n            },\n            dataBind: function (dates) {\n                var that = this, options = that.options, format = options.format, toString = kendo.toString, template = that.template, length = dates.length, idx = 0, date, html = '';\n                for (; idx < length; idx++) {\n                    date = dates[idx];\n                    if (isInRange(date, options.min, options.max)) {\n                        html += template(toString(date, format, options.culture));\n                    }\n                }\n                that._html(html);\n            },\n            refresh: function () {\n                var that = this, options = that.options, format = options.format, offset = dst(), ignoreDST = offset < 0, min = options.min, max = options.max, msMin = getMilliseconds(min), msMax = getMilliseconds(max), msInterval = options.interval * MS_PER_MINUTE, toString = kendo.toString, template = that.template, start = new DATE(+min), startDay = start.getDate(), msStart, lastIdx, idx = 0, length, html = '';\n                if (ignoreDST) {\n                    length = (MS_PER_DAY + offset * MS_PER_MINUTE) / msInterval;\n                } else {\n                    length = MS_PER_DAY / msInterval;\n                }\n                if (msMin != msMax) {\n                    if (msMin > msMax) {\n                        msMax += MS_PER_DAY;\n                    }\n                    length = (msMax - msMin) / msInterval + 1;\n                }\n                lastIdx = parseInt(length, 10);\n                for (; idx < length; idx++) {\n                    if (idx) {\n                        setTime(start, msInterval, ignoreDST);\n                    }\n                    if (msMax && lastIdx == idx) {\n                        msStart = getMilliseconds(start);\n                        if (startDay < start.getDate()) {\n                            msStart += MS_PER_DAY;\n                        }\n                        if (msStart > msMax) {\n                            start = new DATE(+max);\n                        }\n                    }\n                    that._dates.push(getMilliseconds(start));\n                    html += template(toString(start, format, options.culture));\n                }\n                that._html(html);\n            },\n            bind: function () {\n                var that = this, dates = that.options.dates;\n                if (dates && dates[0]) {\n                    that.dataBind(dates);\n                } else {\n                    that.refresh();\n                }\n            },\n            _html: function (html) {\n                var that = this;\n                that.ul[0].innerHTML = html;\n                that.popup.unbind(OPEN, that._heightHandler);\n                that.popup.one(OPEN, that._heightHandler);\n                that.current(null);\n                that.select(that._value);\n            },\n            scroll: function (item) {\n                if (!item) {\n                    return;\n                }\n                var content = this.list[0], itemOffsetTop = item.offsetTop, itemOffsetHeight = item.offsetHeight, contentScrollTop = content.scrollTop, contentOffsetHeight = content.clientHeight, bottomDistance = itemOffsetTop + itemOffsetHeight;\n                if (contentScrollTop > itemOffsetTop) {\n                    contentScrollTop = itemOffsetTop;\n                } else if (bottomDistance > contentScrollTop + contentOffsetHeight) {\n                    contentScrollTop = bottomDistance - contentOffsetHeight;\n                }\n                content.scrollTop = contentScrollTop;\n            },\n            select: function (li) {\n                var that = this, options = that.options, current = that._current, selection;\n                if (li instanceof Date) {\n                    li = kendo.toString(li, options.format, options.culture);\n                }\n                if (typeof li === 'string') {\n                    if (!current || current.text() !== li) {\n                        li = $.grep(that.ul[0].childNodes, function (node) {\n                            return (node.textContent || node.innerText) == li;\n                        });\n                        li = li[0] ? li : null;\n                    } else {\n                        li = current;\n                    }\n                }\n                selection = that._distinctSelection(li);\n                that.current(selection);\n            },\n            _distinctSelection: function (selection) {\n                var that = this, currentValue, selectionIndex;\n                if (selection && selection.length > 1) {\n                    currentValue = getMilliseconds(that._value);\n                    selectionIndex = $.inArray(currentValue, that._dates);\n                    selection = that.ul.children()[selectionIndex];\n                }\n                return selection;\n            },\n            setOptions: function (options) {\n                var old = this.options;\n                options.min = parse(options.min);\n                options.max = parse(options.max);\n                this.options = extend(old, options, {\n                    active: old.active,\n                    change: old.change,\n                    close: old.close,\n                    open: old.open\n                });\n                this.bind();\n            },\n            toggle: function () {\n                var that = this;\n                if (that.popup.visible()) {\n                    that.close();\n                } else {\n                    that.open();\n                }\n            },\n            value: function (value) {\n                var that = this;\n                that._value = value;\n                if (that.ul[0].firstChild) {\n                    that.select(value);\n                }\n            },\n            _click: function (e) {\n                var that = this, li = $(e.currentTarget), date = li.text(), dates = that.options.dates;\n                if (dates && dates.length > 0) {\n                    date = dates[li.index()];\n                }\n                if (!e.isDefaultPrevented()) {\n                    that.select(li);\n                    that.options.change(date, true);\n                    that.close();\n                }\n            },\n            _height: function () {\n                var that = this;\n                var list = that.list;\n                var parent = list.parent('.k-animation-container');\n                var height = that.options.height;\n                if (that.ul[0].children.length) {\n                    list.add(parent).show().height(that.ul[0].scrollHeight > height ? height : 'auto').hide();\n                }\n            },\n            _parse: function (value) {\n                var that = this, options = that.options, current = that._value || TODAY;\n                if (value instanceof DATE) {\n                    return value;\n                }\n                value = parse(value, options.parseFormats, options.culture);\n                if (value) {\n                    value = new DATE(current.getFullYear(), current.getMonth(), current.getDate(), value.getHours(), value.getMinutes(), value.getSeconds(), value.getMilliseconds());\n                }\n                return value;\n            },\n            _adjustListWidth: function () {\n                var list = this.list, width = list[0].style.width, wrapper = this.options.anchor, computedStyle, computedWidth, outerWidth = kendo._outerWidth;\n                if (!list.data('width') && width) {\n                    return;\n                }\n                computedStyle = window.getComputedStyle ? window.getComputedStyle(wrapper[0], null) : 0;\n                computedWidth = computedStyle ? parseFloat(computedStyle.width) : outerWidth(wrapper);\n                if (computedStyle && (browser.mozilla || browser.msie)) {\n                    computedWidth += parseFloat(computedStyle.paddingLeft) + parseFloat(computedStyle.paddingRight) + parseFloat(computedStyle.borderLeftWidth) + parseFloat(computedStyle.borderRightWidth);\n                }\n                width = computedWidth - (outerWidth(list) - list.width());\n                list.css({\n                    fontFamily: wrapper.css('font-family'),\n                    width: width\n                }).data('width', width);\n            },\n            _popup: function () {\n                var that = this, list = that.list, options = that.options, anchor = options.anchor;\n                that.popup = new ui.Popup(list, extend(options.popup, {\n                    anchor: anchor,\n                    open: options.open,\n                    close: options.close,\n                    animation: options.animation,\n                    isRtl: support.isRtl(options.anchor)\n                }));\n            },\n            move: function (e) {\n                var that = this, key = e.keyCode, ul = that.ul[0], current = that._current, down = key === keys.DOWN;\n                if (key === keys.UP || down) {\n                    if (e.altKey) {\n                        that.toggle(down);\n                        return;\n                    } else if (down) {\n                        current = current ? current[0].nextSibling : ul.firstChild;\n                    } else {\n                        current = current ? current[0].previousSibling : ul.lastChild;\n                    }\n                    if (current) {\n                        that.select(current);\n                    }\n                    that.options.change(that._current.text());\n                    e.preventDefault();\n                } else if (key === keys.ENTER || key === keys.TAB || key === keys.ESC) {\n                    e.preventDefault();\n                    if (current) {\n                        that.options.change(current.text(), true);\n                    }\n                    that.close();\n                }\n            }\n        };\n        function setTime(date, time, ignoreDST) {\n            var offset = date.getTimezoneOffset(), offsetDiff;\n            date.setTime(date.getTime() + time);\n            if (!ignoreDST) {\n                offsetDiff = date.getTimezoneOffset() - offset;\n                date.setTime(date.getTime() + offsetDiff * MS_PER_MINUTE);\n            }\n        }\n        function dst() {\n            var today = new DATE(), midnight = new DATE(today.getFullYear(), today.getMonth(), today.getDate(), 0, 0, 0), noon = new DATE(today.getFullYear(), today.getMonth(), today.getDate(), 12, 0, 0);\n            return -1 * (midnight.getTimezoneOffset() - noon.getTimezoneOffset());\n        }\n        function getMilliseconds(date) {\n            return date.getHours() * 60 * MS_PER_MINUTE + date.getMinutes() * MS_PER_MINUTE + date.getSeconds() * 1000 + date.getMilliseconds();\n        }\n        function isInRange(value, min, max) {\n            var msMin = getMilliseconds(min), msMax = getMilliseconds(max), msValue;\n            if (!value || msMin == msMax) {\n                return true;\n            }\n            msValue = getMilliseconds(value);\n            if (msMin > msValue) {\n                msValue += MS_PER_DAY;\n            }\n            if (msMax < msMin) {\n                msMax += MS_PER_DAY;\n            }\n            return msValue >= msMin && msValue <= msMax;\n        }\n        TimeView.getMilliseconds = getMilliseconds;\n        kendo.TimeView = TimeView;\n        var TimePicker = Widget.extend({\n            init: function (element, options) {\n                var that = this, ul, timeView, disabled;\n                Widget.fn.init.call(that, element, options);\n                element = that.element;\n                options = that.options;\n                options.min = parse(element.attr('min')) || parse(options.min);\n                options.max = parse(element.attr('max')) || parse(options.max);\n                normalize(options);\n                that._initialOptions = extend({}, options);\n                that._wrapper();\n                that.timeView = timeView = new TimeView(extend({}, options, {\n                    id: element.attr(ID),\n                    anchor: that.wrapper,\n                    format: options.format,\n                    change: function (value, trigger) {\n                        if (trigger) {\n                            that._change(value);\n                        } else {\n                            element.val(value);\n                        }\n                    },\n                    open: function (e) {\n                        that.timeView._adjustListWidth();\n                        if (that.trigger(OPEN)) {\n                            e.preventDefault();\n                        } else {\n                            element.attr(ARIA_EXPANDED, true);\n                            ul.attr(ARIA_HIDDEN, false);\n                        }\n                    },\n                    close: function (e) {\n                        if (that.trigger(CLOSE)) {\n                            e.preventDefault();\n                        } else {\n                            element.attr(ARIA_EXPANDED, false);\n                            ul.attr(ARIA_HIDDEN, true);\n                        }\n                    },\n                    active: function (current) {\n                        element.removeAttr(ARIA_ACTIVEDESCENDANT);\n                        if (current) {\n                            element.attr(ARIA_ACTIVEDESCENDANT, timeView._optionID);\n                        }\n                    }\n                }));\n                ul = timeView.ul;\n                that._icon();\n                that._reset();\n                try {\n                    element[0].setAttribute('type', 'text');\n                } catch (e) {\n                    element[0].type = 'text';\n                }\n                element.addClass('k-input').attr({\n                    'role': 'combobox',\n                    'aria-expanded': false,\n                    'aria-owns': timeView._timeViewID\n                });\n                disabled = element.is('[disabled]') || $(that.element).parents('fieldset').is(':disabled');\n                if (disabled) {\n                    that.enable(false);\n                } else {\n                    that.readonly(element.is('[readonly]'));\n                }\n                if (options.dateInput) {\n                    var min = options.min;\n                    var max = options.max;\n                    var today = new DATE();\n                    if (getMilliseconds(min) == getMilliseconds(max)) {\n                        min = new DATE(today.getFullYear(), today.getMonth(), today.getDate(), 0, 0, 0);\n                        max = new DATE(today.getFullYear(), today.getMonth(), today.getDate(), 24, 0, 0);\n                    } else {\n                        min = new DATE(today.getFullYear(), today.getMonth(), today.getDate(), min.getHours(), min.getMinutes(), min.getSeconds(), min.getMilliseconds());\n                        max = new DATE(today.getFullYear(), today.getMonth(), today.getDate(), max.getHours(), max.getMinutes(), max.getSeconds(), max.getMilliseconds());\n                    }\n                    that._dateInput = new ui.DateInput(element, {\n                        culture: options.culture,\n                        format: options.format,\n                        min: min,\n                        max: max,\n                        value: options.value\n                    });\n                }\n                that._old = that._update(options.value || that.element.val());\n                that._oldText = element.val();\n                kendo.notify(that);\n            },\n            options: {\n                name: 'TimePicker',\n                min: TODAY,\n                max: TODAY,\n                format: '',\n                dates: [],\n                parseFormats: [],\n                value: null,\n                interval: 30,\n                height: 200,\n                animation: {}\n            },\n            events: [\n                OPEN,\n                CLOSE,\n                CHANGE\n            ],\n            setOptions: function (options) {\n                var that = this;\n                var value = that._value;\n                Widget.fn.setOptions.call(that, options);\n                options = that.options;\n                normalize(options);\n                that.timeView.setOptions(options);\n                if (value) {\n                    that.element.val(kendo.toString(value, options.format, options.culture));\n                }\n            },\n            dataBind: function (dates) {\n                if (isArray(dates)) {\n                    this.timeView.dataBind(dates);\n                }\n            },\n            _editable: function (options) {\n                var that = this, disable = options.disable, readonly = options.readonly, arrow = that._arrow.off(ns), element = that.element.off(ns), wrapper = that._inputWrapper.off(ns);\n                if (!readonly && !disable) {\n                    wrapper.addClass(DEFAULT).removeClass(STATEDISABLED).on(HOVEREVENTS, that._toggleHover);\n                    element.removeAttr(DISABLED).removeAttr(READONLY).attr(ARIA_DISABLED, false).on('keydown' + ns, proxy(that._keydown, that)).on('focusout' + ns, proxy(that._blur, that)).on('focus' + ns, function () {\n                        that._inputWrapper.addClass(FOCUSED);\n                    });\n                    arrow.on(CLICK, proxy(that._click, that)).on(MOUSEDOWN, preventDefault);\n                } else {\n                    wrapper.addClass(disable ? STATEDISABLED : DEFAULT).removeClass(disable ? DEFAULT : STATEDISABLED);\n                    element.attr(DISABLED, disable).attr(READONLY, readonly).attr(ARIA_DISABLED, disable);\n                }\n            },\n            readonly: function (readonly) {\n                this._editable({\n                    readonly: readonly === undefined ? true : readonly,\n                    disable: false\n                });\n            },\n            enable: function (enable) {\n                this._editable({\n                    readonly: false,\n                    disable: !(enable = enable === undefined ? true : enable)\n                });\n            },\n            destroy: function () {\n                var that = this;\n                Widget.fn.destroy.call(that);\n                that.timeView.destroy();\n                that.element.off(ns);\n                that._arrow.off(ns);\n                that._inputWrapper.off(ns);\n                if (that._form) {\n                    that._form.off('reset', that._resetHandler);\n                }\n            },\n            close: function () {\n                this.timeView.close();\n            },\n            open: function () {\n                this.timeView.open();\n            },\n            min: function (value) {\n                return this._option('min', value);\n            },\n            max: function (value) {\n                return this._option('max', value);\n            },\n            value: function (value) {\n                var that = this;\n                if (value === undefined) {\n                    return that._value;\n                }\n                that._old = that._update(value);\n                if (that._old === null) {\n                    that.element.val('');\n                }\n                that._oldText = that.element.val();\n            },\n            _blur: function () {\n                var that = this, value = that.element.val();\n                that.close();\n                if (value !== that._oldText) {\n                    that._change(value);\n                }\n                that._inputWrapper.removeClass(FOCUSED);\n            },\n            _click: function () {\n                var that = this, element = that.element;\n                that.timeView.toggle();\n                if (!support.touch && element[0] !== activeElement()) {\n                    element.focus();\n                }\n            },\n            _change: function (value) {\n                var that = this;\n                value = that._update(value);\n                if (+that._old != +value) {\n                    that._old = value;\n                    that._oldText = that.element.val();\n                    if (!that._typing) {\n                        that.element.trigger(CHANGE);\n                    }\n                    that.trigger(CHANGE);\n                }\n                that._typing = false;\n            },\n            _icon: function () {\n                var that = this, element = that.element, arrow;\n                arrow = element.next('span.k-select');\n                if (!arrow[0]) {\n                    arrow = $('<span unselectable=\"on\" class=\"k-select\" aria-label=\"select\"><span class=\"k-icon k-i-clock\"></span></span>').insertAfter(element);\n                }\n                that._arrow = arrow.attr({\n                    'role': 'button',\n                    'aria-controls': that.timeView._timeViewID\n                });\n            },\n            _keydown: function (e) {\n                var that = this, key = e.keyCode, timeView = that.timeView, value = that.element.val();\n                if (timeView.popup.visible() || e.altKey) {\n                    timeView.move(e);\n                    if (that._dateInput && e.stopImmediatePropagation) {\n                        e.stopImmediatePropagation();\n                    }\n                } else if (key === keys.ENTER && value !== that._oldText) {\n                    that._change(value);\n                } else {\n                    that._typing = true;\n                }\n            },\n            _option: function (option, value) {\n                var that = this, options = that.options;\n                if (value === undefined) {\n                    return options[option];\n                }\n                value = that.timeView._parse(value);\n                if (!value) {\n                    return;\n                }\n                value = new DATE(+value);\n                options[option] = value;\n                that.timeView.options[option] = value;\n                that.timeView.bind();\n            },\n            _toggleHover: function (e) {\n                $(e.currentTarget).toggleClass(HOVER, e.type === 'mouseenter');\n            },\n            _update: function (value) {\n                var that = this, options = that.options, timeView = that.timeView, date = timeView._parse(value);\n                if (!isInRange(date, options.min, options.max)) {\n                    date = null;\n                }\n                that._value = date;\n                if (that._dateInput) {\n                    that._dateInput.value(date || value);\n                } else {\n                    that.element.val(kendo.toString(date || value, options.format, options.culture));\n                }\n                timeView.value(date);\n                return date;\n            },\n            _wrapper: function () {\n                var that = this, element = that.element, wrapper;\n                wrapper = element.parents('.k-timepicker');\n                if (!wrapper[0]) {\n                    wrapper = element.wrap(SPAN).parent().addClass('k-picker-wrap k-state-default');\n                    wrapper = wrapper.wrap(SPAN).parent();\n                }\n                wrapper[0].style.cssText = element[0].style.cssText;\n                that.wrapper = wrapper.addClass('k-widget k-timepicker k-header').addClass(element[0].className);\n                element.css({\n                    width: '100%',\n                    height: element[0].style.height\n                });\n                that._inputWrapper = $(wrapper[0].firstChild);\n            },\n            _reset: function () {\n                var that = this, element = that.element, formId = element.attr('form'), form = formId ? $('#' + formId) : element.closest('form');\n                if (form[0]) {\n                    that._resetHandler = function () {\n                        that.value(element[0].defaultValue);\n                        that.max(that._initialOptions.max);\n                        that.min(that._initialOptions.min);\n                    };\n                    that._form = form.on('reset', that._resetHandler);\n                }\n            }\n        });\n        function normalize(options) {\n            var parseFormats = options.parseFormats;\n            options.format = extractFormat(options.format || kendo.getCulture(options.culture).calendars.standard.patterns.t);\n            parseFormats = isArray(parseFormats) ? parseFormats : [parseFormats];\n            parseFormats.splice(0, 0, options.format);\n            options.parseFormats = parseFormats;\n        }\n        function preventDefault(e) {\n            e.preventDefault();\n        }\n        ui.plugin(TimePicker);\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.datetimepicker', [\n        'kendo.datepicker',\n        'kendo.timepicker'\n    ], f);\n}(function () {\n    var __meta__ = {\n        id: 'datetimepicker',\n        name: 'DateTimePicker',\n        category: 'web',\n        description: 'The DateTimePicker allows the end user to select a value from a calendar or a time drop-down list.',\n        depends: [\n            'datepicker',\n            'timepicker'\n        ]\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, TimeView = kendo.TimeView, parse = kendo.parseDate, activeElement = kendo._activeElement, extractFormat = kendo._extractFormat, calendar = kendo.calendar, isInRange = calendar.isInRange, restrictValue = calendar.restrictValue, isEqualDatePart = calendar.isEqualDatePart, getMilliseconds = TimeView.getMilliseconds, ui = kendo.ui, Widget = ui.Widget, OPEN = 'open', CLOSE = 'close', CHANGE = 'change', ns = '.kendoDateTimePicker', CLICK = 'click' + ns, DISABLED = 'disabled', READONLY = 'readonly', DEFAULT = 'k-state-default', FOCUSED = 'k-state-focused', HOVER = 'k-state-hover', STATEDISABLED = 'k-state-disabled', HOVEREVENTS = 'mouseenter' + ns + ' mouseleave' + ns, MOUSEDOWN = 'mousedown' + ns, MONTH = 'month', SPAN = '<span/>', ARIA_ACTIVEDESCENDANT = 'aria-activedescendant', ARIA_EXPANDED = 'aria-expanded', ARIA_HIDDEN = 'aria-hidden', ARIA_OWNS = 'aria-owns', ARIA_DISABLED = 'aria-disabled', DATE = Date, MIN = new DATE(1800, 0, 1), MAX = new DATE(2099, 11, 31), dateViewParams = { view: 'date' }, timeViewParams = { view: 'time' }, extend = $.extend;\n        var DateTimePicker = Widget.extend({\n            init: function (element, options) {\n                var that = this, disabled;\n                Widget.fn.init.call(that, element, options);\n                element = that.element;\n                options = that.options;\n                options.disableDates = kendo.calendar.disabled(options.disableDates);\n                options.min = parse(element.attr('min')) || parse(options.min);\n                options.max = parse(element.attr('max')) || parse(options.max);\n                normalize(options);\n                that._initialOptions = extend({}, options);\n                that._wrapper();\n                that._views();\n                that._icons();\n                that._reset();\n                that._template();\n                try {\n                    element[0].setAttribute('type', 'text');\n                } catch (e) {\n                    element[0].type = 'text';\n                }\n                element.addClass('k-input').attr({\n                    'role': 'combobox',\n                    'aria-expanded': false\n                });\n                that._midnight = that._calculateMidnight(options.min, options.max);\n                disabled = element.is('[disabled]') || $(that.element).parents('fieldset').is(':disabled');\n                if (disabled) {\n                    that.enable(false);\n                } else {\n                    that.readonly(element.is('[readonly]'));\n                }\n                if (options.dateInput) {\n                    that._dateInput = new ui.DateInput(element, {\n                        culture: options.culture,\n                        format: options.format,\n                        min: options.min,\n                        max: options.max,\n                        value: options.value\n                    });\n                }\n                that._old = that._update(options.value || that.element.val());\n                that._oldText = element.val();\n                kendo.notify(that);\n            },\n            options: {\n                name: 'DateTimePicker',\n                value: null,\n                format: '',\n                timeFormat: '',\n                culture: '',\n                parseFormats: [],\n                dates: [],\n                min: new DATE(MIN),\n                max: new DATE(MAX),\n                interval: 30,\n                height: 200,\n                footer: '',\n                start: MONTH,\n                depth: MONTH,\n                animation: {},\n                month: {},\n                ARIATemplate: 'Current focused date is #=kendo.toString(data.current, \"d\")#',\n                dateButtonText: 'Open the date view',\n                timeButtonText: 'Open the time view'\n            },\n            events: [\n                OPEN,\n                CLOSE,\n                CHANGE\n            ],\n            setOptions: function (options) {\n                var that = this, value = that._value, min, max, currentValue;\n                Widget.fn.setOptions.call(that, options);\n                options = that.options;\n                options.min = min = parse(options.min);\n                options.max = max = parse(options.max);\n                normalize(options);\n                that._midnight = that._calculateMidnight(options.min, options.max);\n                currentValue = options.value || that._value || that.dateView._current;\n                if (min && !isEqualDatePart(min, currentValue)) {\n                    min = new DATE(MIN);\n                }\n                if (max && !isEqualDatePart(max, currentValue)) {\n                    max = new DATE(MAX);\n                }\n                that.dateView.setOptions(options);\n                that.timeView.setOptions(extend({}, options, {\n                    format: options.timeFormat,\n                    min: min,\n                    max: max\n                }));\n                if (value) {\n                    that.element.val(kendo.toString(value, options.format, options.culture));\n                    that._updateARIA(value);\n                }\n            },\n            _editable: function (options) {\n                var that = this, element = that.element.off(ns), dateIcon = that._dateIcon.off(ns), timeIcon = that._timeIcon.off(ns), wrapper = that._inputWrapper.off(ns), readonly = options.readonly, disable = options.disable;\n                if (!readonly && !disable) {\n                    wrapper.addClass(DEFAULT).removeClass(STATEDISABLED).on(HOVEREVENTS, that._toggleHover);\n                    element.removeAttr(DISABLED).removeAttr(READONLY).attr(ARIA_DISABLED, false).on('keydown' + ns, $.proxy(that._keydown, that)).on('focus' + ns, function () {\n                        that._inputWrapper.addClass(FOCUSED);\n                    }).on('focusout' + ns, function () {\n                        that._inputWrapper.removeClass(FOCUSED);\n                        if (element.val() !== that._oldText) {\n                            that._change(element.val());\n                        }\n                        that.close('date');\n                        that.close('time');\n                    });\n                    dateIcon.on(MOUSEDOWN, preventDefault).on(CLICK, function () {\n                        that.toggle('date');\n                        if (!kendo.support.touch && element[0] !== activeElement()) {\n                            element.focus();\n                        }\n                    });\n                    timeIcon.on(MOUSEDOWN, preventDefault).on(CLICK, function () {\n                        that.toggle('time');\n                        if (!kendo.support.touch && element[0] !== activeElement()) {\n                            element.focus();\n                        }\n                    });\n                } else {\n                    wrapper.addClass(disable ? STATEDISABLED : DEFAULT).removeClass(disable ? DEFAULT : STATEDISABLED);\n                    element.attr(DISABLED, disable).attr(READONLY, readonly).attr(ARIA_DISABLED, disable);\n                }\n            },\n            readonly: function (readonly) {\n                this._editable({\n                    readonly: readonly === undefined ? true : readonly,\n                    disable: false\n                });\n            },\n            enable: function (enable) {\n                this._editable({\n                    readonly: false,\n                    disable: !(enable = enable === undefined ? true : enable)\n                });\n            },\n            destroy: function () {\n                var that = this;\n                Widget.fn.destroy.call(that);\n                that.dateView.destroy();\n                that.timeView.destroy();\n                that.element.off(ns);\n                that._dateIcon.off(ns);\n                that._timeIcon.off(ns);\n                that._inputWrapper.off(ns);\n                if (that._form) {\n                    that._form.off('reset', that._resetHandler);\n                }\n            },\n            close: function (view) {\n                if (view !== 'time') {\n                    view = 'date';\n                }\n                this[view + 'View'].close();\n            },\n            open: function (view) {\n                if (view !== 'time') {\n                    view = 'date';\n                }\n                this[view + 'View'].open();\n            },\n            min: function (value) {\n                return this._option('min', value);\n            },\n            max: function (value) {\n                return this._option('max', value);\n            },\n            toggle: function (view) {\n                var secondView = 'timeView';\n                if (view !== 'time') {\n                    view = 'date';\n                } else {\n                    secondView = 'dateView';\n                }\n                this[view + 'View'].toggle();\n                this[secondView].close();\n            },\n            value: function (value) {\n                var that = this;\n                if (value === undefined) {\n                    return that._value;\n                }\n                that._old = that._update(value);\n                if (that._old === null) {\n                    that.element.val('');\n                }\n                that._oldText = that.element.val();\n            },\n            _change: function (value) {\n                var that = this, oldValue = that.element.val(), dateChanged;\n                value = that._update(value);\n                dateChanged = +that._old != +value;\n                var valueUpdated = dateChanged && !that._typing;\n                var textFormatted = oldValue !== that.element.val();\n                if (valueUpdated || textFormatted) {\n                    that.element.trigger(CHANGE);\n                }\n                if (dateChanged) {\n                    that._old = value;\n                    that._oldText = that.element.val();\n                    that.trigger(CHANGE);\n                }\n                that._typing = false;\n            },\n            _option: function (option, value) {\n                var that = this;\n                var options = that.options;\n                var timeView = that.timeView;\n                var timeViewOptions = timeView.options;\n                var current = that._value || that._old;\n                var minDateEqual;\n                var maxDateEqual;\n                if (value === undefined) {\n                    return options[option];\n                }\n                value = parse(value, options.parseFormats, options.culture);\n                if (!value) {\n                    return;\n                }\n                if (options.min.getTime() === options.max.getTime()) {\n                    timeViewOptions.dates = [];\n                }\n                options[option] = new DATE(value.getTime());\n                that.dateView[option](value);\n                that._midnight = that._calculateMidnight(options.min, options.max);\n                if (current) {\n                    minDateEqual = isEqualDatePart(options.min, current);\n                    maxDateEqual = isEqualDatePart(options.max, current);\n                }\n                if (minDateEqual || maxDateEqual) {\n                    timeViewOptions[option] = value;\n                    if (minDateEqual && !maxDateEqual) {\n                        timeViewOptions.max = lastTimeOption(options.interval);\n                    }\n                    if (maxDateEqual) {\n                        if (that._midnight) {\n                            timeView.dataBind([MAX]);\n                            return;\n                        } else if (!minDateEqual) {\n                            timeViewOptions.min = MIN;\n                        }\n                    }\n                } else {\n                    timeViewOptions.max = MAX;\n                    timeViewOptions.min = MIN;\n                }\n                timeView.bind();\n            },\n            _toggleHover: function (e) {\n                $(e.currentTarget).toggleClass(HOVER, e.type === 'mouseenter');\n            },\n            _update: function (value) {\n                var that = this, options = that.options, min = options.min, max = options.max, dates = options.dates, timeView = that.timeView, current = that._value, date = parse(value, options.parseFormats, options.culture), isSameType = date === null && current === null || date instanceof Date && current instanceof Date, rebind, timeViewOptions, old, skip, formattedValue;\n                if (options.disableDates && options.disableDates(date)) {\n                    date = null;\n                    if (!that._old && !that.element.val()) {\n                        value = null;\n                    }\n                }\n                if (+date === +current && isSameType) {\n                    formattedValue = kendo.toString(date, options.format, options.culture);\n                    if (formattedValue !== value) {\n                        that.element.val(date === null ? value : formattedValue);\n                        if (value instanceof String) {\n                            that.element.trigger(CHANGE);\n                        }\n                    }\n                    return date;\n                }\n                if (date !== null && isEqualDatePart(date, min)) {\n                    date = restrictValue(date, min, max);\n                } else if (!isInRange(date, min, max)) {\n                    date = null;\n                }\n                that._value = date;\n                timeView.value(date);\n                that.dateView.value(date);\n                if (date) {\n                    old = that._old;\n                    timeViewOptions = timeView.options;\n                    if (dates[0]) {\n                        dates = $.grep(dates, function (d) {\n                            return isEqualDatePart(date, d);\n                        });\n                        if (dates[0]) {\n                            timeView.dataBind(dates);\n                            skip = true;\n                        }\n                    }\n                    if (!skip) {\n                        if (isEqualDatePart(date, min)) {\n                            timeViewOptions.min = min;\n                            timeViewOptions.max = lastTimeOption(options.interval);\n                            rebind = true;\n                        }\n                        if (isEqualDatePart(date, max)) {\n                            if (that._midnight) {\n                                timeView.dataBind([MAX]);\n                                skip = true;\n                            } else {\n                                timeViewOptions.max = max;\n                                if (!rebind) {\n                                    timeViewOptions.min = MIN;\n                                }\n                                rebind = true;\n                            }\n                        }\n                    }\n                    if (!skip && (!old && rebind || old && !isEqualDatePart(old, date))) {\n                        if (!rebind) {\n                            timeViewOptions.max = MAX;\n                            timeViewOptions.min = MIN;\n                        }\n                        timeView.bind();\n                    }\n                }\n                if (that._dateInput) {\n                    that._dateInput.value(date || value);\n                } else {\n                    that.element.val(kendo.toString(date || value, options.format, options.culture));\n                }\n                that._updateARIA(date);\n                return date;\n            },\n            _keydown: function (e) {\n                var that = this, dateView = that.dateView, timeView = that.timeView, value = that.element.val(), isDateViewVisible = dateView.popup.visible();\n                var stopPropagation = that._dateInput && e.stopImmediatePropagation;\n                if (e.altKey && e.keyCode === kendo.keys.DOWN) {\n                    that.toggle(isDateViewVisible ? 'time' : 'date');\n                } else if (isDateViewVisible) {\n                    dateView.move(e);\n                    that._updateARIA(dateView._current);\n                } else if (timeView.popup.visible()) {\n                    timeView.move(e);\n                } else if (e.keyCode === kendo.keys.ENTER && value !== that._oldText) {\n                    that._change(value);\n                } else {\n                    that._typing = true;\n                    stopPropagation = false;\n                }\n                if (stopPropagation) {\n                    e.stopImmediatePropagation();\n                }\n            },\n            _views: function () {\n                var that = this, element = that.element, options = that.options, id = element.attr('id'), dateView, timeView, div, ul, msMin, date;\n                that.dateView = dateView = new kendo.DateView(extend({}, options, {\n                    id: id,\n                    anchor: that.wrapper,\n                    change: function () {\n                        var value = dateView.calendar.value(), msValue = +value, msMin = +options.min, msMax = +options.max, current, adjustedDate;\n                        if (msValue === msMin || msValue === msMax) {\n                            current = msValue === msMin ? msMin : msMax;\n                            current = new DATE(that._value || current);\n                            current.setFullYear(value.getFullYear(), value.getMonth(), value.getDate());\n                            if (isInRange(current, msMin, msMax)) {\n                                value = current;\n                            }\n                        }\n                        if (that._value) {\n                            adjustedDate = kendo.date.setHours(new Date(value), that._value);\n                            if (isInRange(adjustedDate, msMin, msMax)) {\n                                value = adjustedDate;\n                            }\n                        }\n                        that._change(value);\n                        that.close('date');\n                    },\n                    close: function (e) {\n                        if (that.trigger(CLOSE, dateViewParams)) {\n                            e.preventDefault();\n                        } else {\n                            element.attr(ARIA_EXPANDED, false);\n                            div.attr(ARIA_HIDDEN, true);\n                            if (!timeView.popup.visible()) {\n                                element.removeAttr(ARIA_OWNS);\n                            }\n                        }\n                    },\n                    open: function (e) {\n                        if (that.trigger(OPEN, dateViewParams)) {\n                            e.preventDefault();\n                        } else {\n                            if (element.val() !== that._oldText) {\n                                date = parse(element.val(), options.parseFormats, options.culture);\n                                that.dateView[date ? 'current' : 'value'](date);\n                            }\n                            div.attr(ARIA_HIDDEN, false);\n                            element.attr(ARIA_EXPANDED, true).attr(ARIA_OWNS, dateView._dateViewID);\n                            that._updateARIA(date);\n                        }\n                    }\n                }));\n                div = dateView.div;\n                msMin = options.min.getTime();\n                that.timeView = timeView = new TimeView({\n                    id: id,\n                    value: options.value,\n                    anchor: that.wrapper,\n                    animation: options.animation,\n                    format: options.timeFormat,\n                    culture: options.culture,\n                    height: options.height,\n                    interval: options.interval,\n                    min: new DATE(MIN),\n                    max: new DATE(MAX),\n                    dates: msMin === options.max.getTime() ? [new Date(msMin)] : [],\n                    parseFormats: options.parseFormats,\n                    change: function (value, trigger) {\n                        value = timeView._parse(value);\n                        if (value < options.min) {\n                            value = new DATE(+options.min);\n                            timeView.options.min = value;\n                        } else if (value > options.max) {\n                            value = new DATE(+options.max);\n                            timeView.options.max = value;\n                        }\n                        if (trigger) {\n                            that._timeSelected = true;\n                            that._change(value);\n                        } else {\n                            element.val(kendo.toString(value, options.format, options.culture));\n                            dateView.value(value);\n                            that._updateARIA(value);\n                        }\n                    },\n                    close: function (e) {\n                        if (that.trigger(CLOSE, timeViewParams)) {\n                            e.preventDefault();\n                        } else {\n                            ul.attr(ARIA_HIDDEN, true);\n                            element.attr(ARIA_EXPANDED, false);\n                            if (!dateView.popup.visible()) {\n                                element.removeAttr(ARIA_OWNS);\n                            }\n                        }\n                    },\n                    open: function (e) {\n                        timeView._adjustListWidth();\n                        if (that.trigger(OPEN, timeViewParams)) {\n                            e.preventDefault();\n                        } else {\n                            if (element.val() !== that._oldText) {\n                                date = parse(element.val(), options.parseFormats, options.culture);\n                                that.timeView.value(date);\n                            }\n                            ul.attr(ARIA_HIDDEN, false);\n                            element.attr(ARIA_EXPANDED, true).attr(ARIA_OWNS, timeView._timeViewID);\n                            timeView.options.active(timeView.current());\n                        }\n                    },\n                    active: function (current) {\n                        element.removeAttr(ARIA_ACTIVEDESCENDANT);\n                        if (current) {\n                            element.attr(ARIA_ACTIVEDESCENDANT, timeView._optionID);\n                        }\n                    }\n                });\n                ul = timeView.ul;\n            },\n            _icons: function () {\n                var that = this;\n                var element = that.element;\n                var options = that.options;\n                var icons;\n                icons = element.next('span.k-select');\n                if (!icons[0]) {\n                    icons = $('<span unselectable=\"on\" class=\"k-select\">' + '<span class=\"k-link k-link-date\" aria-label=\"' + options.dateButtonText + '\"><span unselectable=\"on\" class=\"k-icon k-i-calendar\"></span></span>' + '<span class=\"k-link k-link-time\" aria-label=\"' + options.timeButtonText + '\"><span unselectable=\"on\" class=\"k-icon k-i-clock\"></span></span>' + '</span>').insertAfter(element);\n                }\n                icons = icons.children();\n                icons = icons.children();\n                that._dateIcon = icons.eq(0).attr('aria-controls', that.dateView._dateViewID);\n                that._timeIcon = icons.eq(1).attr('aria-controls', that.timeView._timeViewID);\n            },\n            _wrapper: function () {\n                var that = this, element = that.element, wrapper;\n                wrapper = element.parents('.k-datetimepicker');\n                if (!wrapper[0]) {\n                    wrapper = element.wrap(SPAN).parent().addClass('k-picker-wrap k-state-default');\n                    wrapper = wrapper.wrap(SPAN).parent();\n                }\n                wrapper[0].style.cssText = element[0].style.cssText;\n                element.css({\n                    width: '100%',\n                    height: element[0].style.height\n                });\n                that.wrapper = wrapper.addClass('k-widget k-datetimepicker k-header').addClass(element[0].className);\n                that._inputWrapper = $(wrapper[0].firstChild);\n            },\n            _reset: function () {\n                var that = this, element = that.element, formId = element.attr('form'), form = formId ? $('#' + formId) : element.closest('form');\n                if (form[0]) {\n                    that._resetHandler = function () {\n                        that.value(element[0].defaultValue);\n                        that.max(that._initialOptions.max);\n                        that.min(that._initialOptions.min);\n                    };\n                    that._form = form.on('reset', that._resetHandler);\n                }\n            },\n            _template: function () {\n                this._ariaTemplate = kendo.template(this.options.ARIATemplate);\n            },\n            _calculateMidnight: function (min, max) {\n                return getMilliseconds(min) + getMilliseconds(max) === 0;\n            },\n            _updateARIA: function (date) {\n                var cell;\n                var that = this;\n                var calendar = that.dateView.calendar;\n                that.element.removeAttr(ARIA_ACTIVEDESCENDANT);\n                if (calendar) {\n                    cell = calendar._cell;\n                    cell.attr('aria-label', that._ariaTemplate({ current: date || calendar.current() }));\n                    that.element.attr(ARIA_ACTIVEDESCENDANT, cell.attr('id'));\n                }\n            }\n        });\n        function lastTimeOption(interval) {\n            var date = new Date(2100, 0, 1);\n            date.setMinutes(-interval);\n            return date;\n        }\n        function preventDefault(e) {\n            e.preventDefault();\n        }\n        function normalize(options) {\n            var patterns = kendo.getCulture(options.culture).calendars.standard.patterns, parseFormats = !options.parseFormats.length, timeFormat;\n            options.format = extractFormat(options.format || patterns.g);\n            options.timeFormat = timeFormat = extractFormat(options.timeFormat || patterns.t);\n            kendo.DateView.normalize(options);\n            if (parseFormats) {\n                options.parseFormats.unshift('yyyy-MM-ddTHH:mm:ss');\n            }\n            if ($.inArray(timeFormat, options.parseFormats) === -1) {\n                options.parseFormats.push(timeFormat);\n            }\n        }\n        ui.plugin(DateTimePicker);\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.splitter', ['kendo.resizable'], f);\n}(function () {\n    var __meta__ = {\n        id: 'splitter',\n        name: 'Splitter',\n        category: 'web',\n        description: 'The Splitter widget provides an easy way to create a dynamic layout of resizable and collapsible panes.',\n        depends: ['resizable']\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, ui = kendo.ui, keys = kendo.keys, extend = $.extend, proxy = $.proxy, Widget = ui.Widget, pxUnitsRegex = /^\\d+(\\.\\d+)?px$/i, percentageUnitsRegex = /^\\d+(\\.\\d+)?%$/i, NS = '.kendoSplitter', EXPAND = 'expand', COLLAPSE = 'collapse', CONTENTLOAD = 'contentLoad', ERROR = 'error', RESIZE = 'resize', LAYOUTCHANGE = 'layoutChange', HORIZONTAL = 'horizontal', VERTICAL = 'vertical', MOUSEENTER = 'mouseenter', CLICK = 'click', PANE = 'pane', MOUSELEAVE = 'mouseleave', FOCUSED = 'k-state-focused', KPANE = 'k-' + PANE, PANECLASS = '.' + KPANE;\n        function isPercentageSize(size) {\n            return percentageUnitsRegex.test(size);\n        }\n        function isPixelSize(size) {\n            return pxUnitsRegex.test(size) || /^\\d+$/.test(size);\n        }\n        function isFluid(size) {\n            return !isPercentageSize(size) && !isPixelSize(size);\n        }\n        function calculateSize(size, total) {\n            var output = parseInt(size, 10);\n            if (isPercentageSize(size)) {\n                output = Math.floor(output * total / 100);\n            }\n            return output;\n        }\n        function panePropertyAccessor(propertyName, triggersResize) {\n            return function (pane, value) {\n                var paneConfig = this.element.find(pane).data(PANE);\n                if (arguments.length == 1) {\n                    return paneConfig[propertyName];\n                }\n                paneConfig[propertyName] = value;\n                if (triggersResize) {\n                    var splitter = this.element.data('kendo' + this.options.name);\n                    splitter.resize(true);\n                }\n            };\n        }\n        var Splitter = Widget.extend({\n            init: function (element, options) {\n                var that = this, isHorizontal;\n                Widget.fn.init.call(that, element, options);\n                that.wrapper = that.element;\n                isHorizontal = that.options.orientation.toLowerCase() != VERTICAL;\n                that.orientation = isHorizontal ? HORIZONTAL : VERTICAL;\n                that._dimension = isHorizontal ? 'width' : 'height';\n                that._keys = {\n                    decrease: isHorizontal ? keys.LEFT : keys.UP,\n                    increase: isHorizontal ? keys.RIGHT : keys.DOWN\n                };\n                that._resizeStep = 10;\n                that._marker = kendo.guid().substring(0, 8);\n                that._initPanes();\n                that.resizing = new PaneResizing(that);\n                that.element.triggerHandler('init' + NS);\n            },\n            events: [\n                EXPAND,\n                COLLAPSE,\n                CONTENTLOAD,\n                ERROR,\n                RESIZE,\n                LAYOUTCHANGE\n            ],\n            _addOverlays: function () {\n                this._panes().append('<div class=\\'k-splitter-overlay k-overlay\\' />');\n            },\n            _removeOverlays: function () {\n                this._panes().children('.k-splitter-overlay').remove();\n            },\n            _attachEvents: function () {\n                var that = this, orientation = that.options.orientation;\n                that.element.children('.k-splitbar-draggable-' + orientation).on('keydown' + NS, proxy(that._keydown, that)).on('mousedown' + NS, function (e) {\n                    e.currentTarget.focus();\n                }).on('focus' + NS, function (e) {\n                    $(e.currentTarget).addClass(FOCUSED);\n                }).on('blur' + NS, function (e) {\n                    $(e.currentTarget).removeClass(FOCUSED);\n                    if (that.resizing) {\n                        that.resizing.end();\n                    }\n                }).on(MOUSEENTER + NS, function () {\n                    $(this).addClass('k-splitbar-' + that.orientation + '-hover');\n                }).on(MOUSELEAVE + NS, function () {\n                    $(this).removeClass('k-splitbar-' + that.orientation + '-hover');\n                }).on('mousedown' + NS, proxy(that._addOverlays, that)).end().children('.k-splitbar').on('dblclick' + NS, proxy(that._togglePane, that)).children('.k-collapse-next, .k-collapse-prev').on(CLICK + NS, that._arrowClick(COLLAPSE)).end().children('.k-expand-next, .k-expand-prev').on(CLICK + NS, that._arrowClick(EXPAND)).end().end();\n                $(window).on('resize' + NS + that._marker, proxy(that.resize, that, false));\n                $(document).on('mouseup' + NS + that._marker, proxy(that._removeOverlays, that));\n            },\n            _detachEvents: function () {\n                var that = this;\n                that.element.children('.k-splitbar-draggable-' + that.orientation).off(NS).end().children('.k-splitbar').off('dblclick' + NS).children('.k-collapse-next, .k-collapse-prev, .k-expand-next, .k-expand-prev').off(NS);\n                $(window).off(NS + that._marker);\n                $(document).off(NS + that._marker);\n            },\n            options: {\n                name: 'Splitter',\n                orientation: HORIZONTAL,\n                panes: []\n            },\n            destroy: function () {\n                Widget.fn.destroy.call(this);\n                this._detachEvents();\n                if (this.resizing) {\n                    this.resizing.destroy();\n                }\n                kendo.destroy(this.element);\n                this.wrapper = this.element = null;\n            },\n            _keydown: function (e) {\n                var that = this, key = e.keyCode, resizing = that.resizing, target = $(e.currentTarget), navigationKeys = that._keys, increase = key === navigationKeys.increase, decrease = key === navigationKeys.decrease, pane;\n                if (increase || decrease) {\n                    if (e.ctrlKey) {\n                        pane = target[decrease ? 'next' : 'prev']();\n                        if (resizing && resizing.isResizing()) {\n                            resizing.end();\n                        }\n                        if (!pane[that._dimension]()) {\n                            that._triggerAction(EXPAND, pane);\n                        } else {\n                            that._triggerAction(COLLAPSE, target[decrease ? 'prev' : 'next']());\n                        }\n                    } else if (resizing) {\n                        resizing.move((decrease ? -1 : 1) * that._resizeStep, target);\n                    }\n                    e.preventDefault();\n                } else if (key === keys.ENTER && resizing) {\n                    resizing.end();\n                    e.preventDefault();\n                }\n            },\n            _initPanes: function () {\n                var panesConfig = this.options.panes || [];\n                var that = this;\n                this.element.addClass('k-widget').addClass('k-splitter').children().each(function (i, pane) {\n                    if (pane.nodeName.toLowerCase() != 'script') {\n                        that._initPane(pane, panesConfig[i]);\n                    }\n                });\n                this.resize();\n            },\n            _initPane: function (pane, config) {\n                pane = $(pane).attr('role', 'group').addClass(KPANE);\n                pane.data(PANE, config ? config : {}).toggleClass('k-scrollable', config ? config.scrollable !== false : true);\n                this.ajaxRequest(pane);\n            },\n            ajaxRequest: function (pane, url, data) {\n                var that = this, paneConfig;\n                pane = that.element.find(pane);\n                paneConfig = pane.data(PANE);\n                url = url || paneConfig.contentUrl;\n                if (url) {\n                    pane.append('<span class=\\'k-icon k-i-loading k-pane-loading\\' />');\n                    if (kendo.isLocalUrl(url)) {\n                        jQuery.ajax({\n                            url: url,\n                            data: data || {},\n                            type: 'GET',\n                            dataType: 'html',\n                            success: function (data) {\n                                that.angular('cleanup', function () {\n                                    return { elements: pane.get() };\n                                });\n                                pane.html(data);\n                                that.angular('compile', function () {\n                                    return { elements: pane.get() };\n                                });\n                                that.trigger(CONTENTLOAD, { pane: pane[0] });\n                            },\n                            error: function (xhr, status) {\n                                that.trigger(ERROR, {\n                                    pane: pane[0],\n                                    status: status,\n                                    xhr: xhr\n                                });\n                            }\n                        });\n                    } else {\n                        pane.removeClass('k-scrollable').html('<iframe src=\\'' + url + '\\' frameborder=\\'0\\' class=\\'k-content-frame\\'>' + 'This page requires frames in order to show content' + '</iframe>');\n                    }\n                }\n            },\n            _triggerAction: function (type, pane) {\n                if (!this.trigger(type, { pane: pane[0] })) {\n                    this[type](pane[0]);\n                }\n            },\n            _togglePane: function (e) {\n                var that = this, target = $(e.target), arrow;\n                if (target.closest('.k-splitter')[0] != that.element[0]) {\n                    return;\n                }\n                arrow = target.children('.k-icon:not(.k-resize-handle)');\n                if (arrow.length !== 1) {\n                    return;\n                }\n                if (arrow.is('.k-collapse-prev')) {\n                    that._triggerAction(COLLAPSE, target.prev());\n                } else if (arrow.is('.k-collapse-next')) {\n                    that._triggerAction(COLLAPSE, target.next());\n                } else if (arrow.is('.k-expand-prev')) {\n                    that._triggerAction(EXPAND, target.prev());\n                } else if (arrow.is('.k-expand-next')) {\n                    that._triggerAction(EXPAND, target.next());\n                }\n            },\n            _arrowClick: function (arrowType) {\n                var that = this;\n                return function (e) {\n                    var target = $(e.target), pane;\n                    if (target.closest('.k-splitter')[0] != that.element[0]) {\n                        return;\n                    }\n                    if (target.is('.k-' + arrowType + '-prev')) {\n                        pane = target.parent().prev();\n                    } else {\n                        pane = target.parent().next();\n                    }\n                    that._triggerAction(arrowType, pane);\n                };\n            },\n            _updateSplitBar: function (splitbar, previousPane, nextPane) {\n                var catIconIf = function (iconType, condition) {\n                        return condition ? '<div class=\\'k-icon ' + iconType + '\\' />' : '';\n                    }, orientation = this.orientation, draggable = previousPane.resizable !== false && nextPane.resizable !== false, prevCollapsible = previousPane.collapsible, prevCollapsed = previousPane.collapsed, nextCollapsible = nextPane.collapsible, nextCollapsed = nextPane.collapsed;\n                splitbar.addClass('k-splitbar k-state-default k-splitbar-' + orientation).attr('role', 'separator').attr('aria-expanded', !(prevCollapsed || nextCollapsed)).removeClass('k-splitbar-' + orientation + '-hover').toggleClass('k-splitbar-draggable-' + orientation, draggable && !prevCollapsed && !nextCollapsed).toggleClass('k-splitbar-static-' + orientation, !draggable && !prevCollapsible && !nextCollapsible).html(catIconIf('k-collapse-prev k-i-arrow-60-up', prevCollapsible && !prevCollapsed && !nextCollapsed && orientation == VERTICAL) + catIconIf('k-collapse-prev k-i-arrow-60-left', prevCollapsible && !prevCollapsed && !nextCollapsed && orientation == HORIZONTAL) + catIconIf('k-expand-prev k-i-arrow-60-down', prevCollapsible && prevCollapsed && !nextCollapsed && orientation == VERTICAL) + catIconIf('k-expand-prev k-i-arrow-60-right', prevCollapsible && prevCollapsed && !nextCollapsed && orientation == HORIZONTAL) + catIconIf('k-resize-handle k-i-hbar', draggable && orientation == VERTICAL) + catIconIf('k-resize-handle k-i-vbar', draggable && orientation == HORIZONTAL) + catIconIf('k-collapse-next k-i-arrow-60-down', nextCollapsible && !nextCollapsed && !prevCollapsed && orientation == VERTICAL) + catIconIf('k-collapse-next k-i-arrow-60-right', nextCollapsible && !nextCollapsed && !prevCollapsed && orientation == HORIZONTAL) + catIconIf('k-expand-next k-i-arrow-60-up', nextCollapsible && nextCollapsed && !prevCollapsed && orientation == VERTICAL) + catIconIf('k-expand-next k-i-arrow-60-left', nextCollapsible && nextCollapsed && !prevCollapsed && orientation == HORIZONTAL));\n                if (!draggable && !prevCollapsible && !nextCollapsible) {\n                    splitbar.removeAttr('tabindex');\n                }\n            },\n            _updateSplitBars: function () {\n                var that = this;\n                this.element.children('.k-splitbar').each(function () {\n                    var splitbar = $(this), previousPane = splitbar.prevAll(PANECLASS).first().data(PANE), nextPane = splitbar.nextAll(PANECLASS).first().data(PANE);\n                    if (!nextPane) {\n                        return;\n                    }\n                    that._updateSplitBar(splitbar, previousPane, nextPane);\n                });\n            },\n            _removeSplitBars: function () {\n                this.element.children('.k-splitbar').remove();\n            },\n            _panes: function () {\n                if (!this.element) {\n                    return $();\n                }\n                return this.element.children(PANECLASS);\n            },\n            _resize: function () {\n                var that = this, element = that.element, panes = element.children(PANECLASS), isHorizontal = that.orientation == HORIZONTAL, splitBars = element.children('.k-splitbar'), splitBarsCount = splitBars.length, sizingProperty = isHorizontal ? 'width' : 'height', totalSize = element[sizingProperty]();\n                that.wrapper.addClass('k-splitter-resizing');\n                if (splitBarsCount === 0) {\n                    splitBarsCount = panes.length - 1;\n                    panes.slice(0, splitBarsCount).after('<div tabindex=\\'0\\' class=\\'k-splitbar\\' data-marker=\\'' + that._marker + '\\' />');\n                    that._updateSplitBars();\n                    splitBars = element.children('.k-splitbar');\n                } else {\n                    that._updateSplitBars();\n                }\n                splitBars.each(function () {\n                    totalSize -= this[isHorizontal ? 'offsetWidth' : 'offsetHeight'];\n                });\n                var sizedPanesWidth = 0, sizedPanesCount = 0, freeSizedPanes = $();\n                panes.css({\n                    position: 'absolute',\n                    top: 0\n                })[sizingProperty](function () {\n                    var element = $(this), config = element.data(PANE) || {}, size;\n                    element.removeClass('k-state-collapsed');\n                    if (config.collapsed) {\n                        size = config.collapsedSize ? calculateSize(config.collapsedSize, totalSize) : 0;\n                        element.css('overflow', 'hidden').addClass('k-state-collapsed');\n                    } else if (isFluid(config.size)) {\n                        freeSizedPanes = freeSizedPanes.add(this);\n                        return;\n                    } else {\n                        size = calculateSize(config.size, totalSize);\n                    }\n                    sizedPanesCount++;\n                    sizedPanesWidth += size;\n                    return size;\n                });\n                totalSize -= sizedPanesWidth;\n                var freeSizePanesCount = freeSizedPanes.length, freeSizePaneWidth = Math.floor(totalSize / freeSizePanesCount);\n                freeSizedPanes.slice(0, freeSizePanesCount - 1).css(sizingProperty, freeSizePaneWidth).end().eq(freeSizePanesCount - 1).css(sizingProperty, totalSize - (freeSizePanesCount - 1) * freeSizePaneWidth);\n                var sum = 0, alternateSizingProperty = isHorizontal ? 'height' : 'width', positioningProperty = isHorizontal ? 'left' : 'top', sizingDomProperty = isHorizontal ? 'offsetWidth' : 'offsetHeight';\n                if (freeSizePanesCount === 0) {\n                    var lastNonCollapsedPane = panes.filter(function () {\n                        return !($(this).data(PANE) || {}).collapsed;\n                    }).last();\n                    lastNonCollapsedPane[sizingProperty](totalSize + lastNonCollapsedPane[0][sizingDomProperty]);\n                }\n                element.children().css(alternateSizingProperty, element[alternateSizingProperty]()).each(function (i, child) {\n                    if (child.tagName.toLowerCase() != 'script') {\n                        child.style[positioningProperty] = Math.floor(sum) + 'px';\n                        sum += child[sizingDomProperty];\n                    }\n                });\n                that._detachEvents();\n                that._attachEvents();\n                that.wrapper.removeClass('k-splitter-resizing');\n                kendo.resize(panes);\n                that.trigger(LAYOUTCHANGE);\n            },\n            toggle: function (pane, expand) {\n                var that = this, paneConfig;\n                pane = that.element.find(pane);\n                paneConfig = pane.data(PANE);\n                if (!expand && !paneConfig.collapsible) {\n                    return;\n                }\n                if (arguments.length == 1) {\n                    expand = paneConfig.collapsed === undefined ? false : paneConfig.collapsed;\n                }\n                paneConfig.collapsed = !expand;\n                if (paneConfig.collapsed) {\n                    pane.css('overflow', 'hidden');\n                } else {\n                    pane.css('overflow', '');\n                }\n                that.resize(true);\n            },\n            collapse: function (pane) {\n                this.toggle(pane, false);\n            },\n            expand: function (pane) {\n                this.toggle(pane, true);\n            },\n            _addPane: function (config, idx, paneElement) {\n                var that = this;\n                if (paneElement.length) {\n                    that.options.panes.splice(idx, 0, config);\n                    that._initPane(paneElement, config);\n                    that._removeSplitBars();\n                    that.resize(true);\n                }\n                return paneElement;\n            },\n            append: function (config) {\n                config = config || {};\n                var that = this, paneElement = $('<div />').appendTo(that.element);\n                return that._addPane(config, that.options.panes.length, paneElement);\n            },\n            insertBefore: function (config, referencePane) {\n                referencePane = $(referencePane);\n                config = config || {};\n                var that = this, idx = that.wrapper.children('.k-pane').index(referencePane), paneElement = $('<div />').insertBefore($(referencePane));\n                return that._addPane(config, idx, paneElement);\n            },\n            insertAfter: function (config, referencePane) {\n                referencePane = $(referencePane);\n                config = config || {};\n                var that = this, idx = that.wrapper.children('.k-pane').index(referencePane), paneElement = $('<div />').insertAfter($(referencePane));\n                return that._addPane(config, idx + 1, paneElement);\n            },\n            remove: function (pane) {\n                pane = $(pane);\n                var that = this;\n                if (pane.length) {\n                    kendo.destroy(pane);\n                    pane.each(function (idx, element) {\n                        that.options.panes.splice(that.wrapper.children('.k-pane').index(element), 1);\n                        $(element).remove();\n                    });\n                    that._removeSplitBars();\n                    if (that.options.panes.length) {\n                        that.resize(true);\n                    }\n                }\n                return that;\n            },\n            size: panePropertyAccessor('size', true),\n            min: panePropertyAccessor('min'),\n            max: panePropertyAccessor('max')\n        });\n        ui.plugin(Splitter);\n        var verticalDefaults = {\n            sizingProperty: 'height',\n            sizingDomProperty: 'offsetHeight',\n            alternateSizingProperty: 'width',\n            positioningProperty: 'top',\n            mousePositioningProperty: 'pageY'\n        };\n        var horizontalDefaults = {\n            sizingProperty: 'width',\n            sizingDomProperty: 'offsetWidth',\n            alternateSizingProperty: 'height',\n            positioningProperty: 'left',\n            mousePositioningProperty: 'pageX'\n        };\n        function PaneResizing(splitter) {\n            var that = this, orientation = splitter.orientation;\n            that.owner = splitter;\n            that._element = splitter.element;\n            that.orientation = orientation;\n            extend(that, orientation === HORIZONTAL ? horizontalDefaults : verticalDefaults);\n            that._resizable = new kendo.ui.Resizable(splitter.element, {\n                orientation: orientation,\n                handle: '.k-splitbar-draggable-' + orientation + '[data-marker=' + splitter._marker + ']',\n                hint: proxy(that._createHint, that),\n                start: proxy(that._start, that),\n                max: proxy(that._max, that),\n                min: proxy(that._min, that),\n                invalidClass: 'k-restricted-size-' + orientation,\n                resizeend: proxy(that._stop, that)\n            });\n        }\n        PaneResizing.prototype = {\n            press: function (target) {\n                this._resizable.press(target);\n            },\n            move: function (delta, target) {\n                if (!this.pressed) {\n                    this.press(target);\n                    this.pressed = true;\n                }\n                if (!this._resizable.target) {\n                    this._resizable.press(target);\n                }\n                this._resizable.move(delta);\n            },\n            end: function () {\n                this._resizable.end();\n                this.pressed = false;\n            },\n            destroy: function () {\n                this._resizable.destroy();\n                this._resizable = this._element = this.owner = null;\n            },\n            isResizing: function () {\n                return this._resizable.resizing;\n            },\n            _createHint: function (handle) {\n                var that = this;\n                return $('<div class=\\'k-ghost-splitbar k-ghost-splitbar-' + that.orientation + ' k-state-default\\' />').css(that.alternateSizingProperty, handle[that.alternateSizingProperty]());\n            },\n            _start: function (e) {\n                var that = this, splitbar = $(e.currentTarget), previousPane = splitbar.prev(), nextPane = splitbar.next(), previousPaneConfig = previousPane.data(PANE), nextPaneConfig = nextPane.data(PANE), prevBoundary = parseInt(previousPane[0].style[that.positioningProperty], 10), nextBoundary = parseInt(nextPane[0].style[that.positioningProperty], 10) + nextPane[0][that.sizingDomProperty] - splitbar[0][that.sizingDomProperty], totalSize = parseInt(that._element.css(that.sizingProperty), 10), toPx = function (value) {\n                        var val = parseInt(value, 10);\n                        return (isPixelSize(value) ? val : totalSize * val / 100) || 0;\n                    }, prevMinSize = toPx(previousPaneConfig.min), prevMaxSize = toPx(previousPaneConfig.max) || nextBoundary - prevBoundary, nextMinSize = toPx(nextPaneConfig.min), nextMaxSize = toPx(nextPaneConfig.max) || nextBoundary - prevBoundary;\n                that.previousPane = previousPane;\n                that.nextPane = nextPane;\n                that._maxPosition = Math.min(nextBoundary - nextMinSize, prevBoundary + prevMaxSize);\n                that._minPosition = Math.max(prevBoundary + prevMinSize, nextBoundary - nextMaxSize);\n            },\n            _max: function () {\n                return this._maxPosition;\n            },\n            _min: function () {\n                return this._minPosition;\n            },\n            _stop: function (e) {\n                var that = this, splitbar = $(e.currentTarget), owner = that.owner;\n                owner._panes().children('.k-splitter-overlay').remove();\n                if (e.keyCode !== kendo.keys.ESC) {\n                    var ghostPosition = e.position, previousPane = splitbar.prev(), nextPane = splitbar.next(), previousPaneConfig = previousPane.data(PANE), nextPaneConfig = nextPane.data(PANE), previousPaneNewSize = ghostPosition - parseInt(previousPane[0].style[that.positioningProperty], 10), nextPaneNewSize = parseInt(nextPane[0].style[that.positioningProperty], 10) + nextPane[0][that.sizingDomProperty] - ghostPosition - splitbar[0][that.sizingDomProperty], fluidPanesCount = that._element.children(PANECLASS).filter(function () {\n                            return isFluid($(this).data(PANE).size);\n                        }).length;\n                    if (!isFluid(previousPaneConfig.size) || fluidPanesCount > 1) {\n                        if (isFluid(previousPaneConfig.size)) {\n                            fluidPanesCount--;\n                        }\n                        previousPaneConfig.size = previousPaneNewSize + 'px';\n                    }\n                    if (!isFluid(nextPaneConfig.size) || fluidPanesCount > 1) {\n                        nextPaneConfig.size = nextPaneNewSize + 'px';\n                    }\n                    owner.resize(true);\n                }\n                return false;\n            }\n        };\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.dialog', [\n        'kendo.core',\n        'kendo.popup'\n    ], f);\n}(function () {\n    var __meta__ = {\n        id: 'dialog',\n        name: 'Dialog',\n        category: 'web',\n        description: 'The dialog widget is a modal popup that brings information to the user.',\n        depends: [\n            'core',\n            'popup'\n        ]\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, Widget = kendo.ui.Widget, TabKeyTrap = kendo.ui.Popup.TabKeyTrap, proxy = $.proxy, template = kendo.template, keys = kendo.keys, isFunction = $.isFunction, NS = 'kendoWindow', KDIALOG = '.k-dialog', KWINDOW = '.k-window', KICONCLOSE = '.k-dialog-close', KCONTENTCLASS = 'k-content k-window-content k-dialog-content', KCONTENT = '.k-content', KTITLELESS = 'k-dialog-titleless', KDIALOGTITLE = '.k-dialog-title', KDIALOGTITLEBAR = KDIALOGTITLE + 'bar', KBUTTONGROUP = '.k-dialog-buttongroup', KBUTTON = '.k-button', KALERT = 'k-alert', KCONFIRM = 'k-confirm', KPROMPT = 'k-prompt', KTEXTBOX = '.k-textbox', KOVERLAY = '.k-overlay', VISIBLE = ':visible', ZINDEX = 'zIndex', BODY = 'body', INITOPEN = 'initOpen', OPEN = 'open', CLOSE = 'close', SHOW = 'show', HIDE = 'hide', WIDTH = 'width', HUNDREDPERCENT = 100, messages = {\n                okText: 'OK',\n                cancel: 'Cancel',\n                promptInput: 'Input'\n            }, ceil = Math.ceil, templates, overlaySelector = ':not(link,meta,script,style)';\n        function defined(x) {\n            return typeof x != 'undefined';\n        }\n        function constrain(value, low, high) {\n            return Math.max(Math.min(parseInt(value, 10), high === Infinity ? high : parseInt(high, 10)), parseInt(low, 10));\n        }\n        function buttonKeyTrigger(e) {\n            return e.keyCode == keys.ENTER || e.keyCode == keys.SPACEBAR;\n        }\n        var DialogBase = Widget.extend({\n            init: function (element, options) {\n                var that = this;\n                Widget.fn.init.call(that, element, options);\n                that._init(that.element, that.options);\n                kendo.notify(that);\n            },\n            _init: function (element, options) {\n                var that = this, wrapper;\n                that._centerCallback = proxy(that._center, that);\n                that.appendTo = $(BODY);\n                if (!defined(options.visible) || options.visible === null) {\n                    options.visible = element.is(VISIBLE);\n                }\n                if (that.wrapperTemplate === undefined) {\n                    that.wrapperTemplate = templates.wrapper;\n                }\n                that._createDialog();\n                wrapper = that.wrapper = element.closest(KDIALOG);\n                if (options._defaultFocus === undefined) {\n                    that._defaultFocus = element[0];\n                }\n                that._tabindex(element);\n                that._dimensions();\n                this._tabKeyTrap = new TabKeyTrap(wrapper);\n                if (!that.options.visible) {\n                    that.wrapper.hide();\n                } else {\n                    that.toFront();\n                    that._triggerInitOpen();\n                    that.trigger(OPEN);\n                    if (options.modal) {\n                        that._overlay(wrapper.is(VISIBLE)).css({ opacity: 0.5 });\n                        that._focusDialog();\n                    }\n                }\n                if (options.closable) {\n                    wrapper.autoApplyNS(NS);\n                    element.autoApplyNS(NS);\n                    wrapper.find(KICONCLOSE).on('click', proxy(that._closeClick, that)).on('keydown', proxy(that._closeKeyHandler, that));\n                    element.on('keydown', proxy(that._keydown, that));\n                }\n            },\n            _dimensions: function () {\n                var that = this, wrapper = that.wrapper, options = that.options, width = options.width, height = options.height, dimensions = [\n                        'minWidth',\n                        'minHeight',\n                        'maxWidth',\n                        'maxHeight'\n                    ];\n                for (var i = 0; i < dimensions.length; i++) {\n                    var value = options[dimensions[i]];\n                    if (value && value != Infinity) {\n                        wrapper.css(dimensions[i], value);\n                    }\n                }\n                this._setElementMaxHeight();\n                if (width) {\n                    if (width.toString().indexOf('%') > 0) {\n                        wrapper.width(width);\n                    } else {\n                        wrapper.width(constrain(width, options.minWidth, options.maxWidth));\n                    }\n                }\n                if (height) {\n                    if (height.toString().indexOf('%') > 0) {\n                        wrapper.height(height);\n                    } else {\n                        wrapper.height(constrain(height, options.minHeight, options.maxHeight));\n                    }\n                    this._setElementHeight();\n                }\n            },\n            _setElementMaxHeight: function () {\n                var that = this, element = that.element, maxHeight = that.options.maxHeight, paddingBox, elementMaxHeight;\n                if (maxHeight != Infinity) {\n                    paddingBox = that._paddingBox(element);\n                    elementMaxHeight = parseFloat(maxHeight, 10) - that._uiHeight() - paddingBox.vertical;\n                    if (elementMaxHeight > 0) {\n                        element.css({\n                            maxHeight: ceil(elementMaxHeight) + 'px',\n                            overflow: 'hidden'\n                        });\n                    }\n                }\n            },\n            _paddingBox: function (element) {\n                var paddingTop = parseFloat(element.css('padding-top'), 10), paddingLeft = parseFloat(element.css('padding-left'), 10), paddingBottom = parseFloat(element.css('padding-bottom'), 10), paddingRight = parseFloat(element.css('padding-right'), 10);\n                return {\n                    vertical: paddingTop + paddingBottom,\n                    horizontal: paddingLeft + paddingRight\n                };\n            },\n            _setElementHeight: function () {\n                var that = this, element = that.element, height = that.options.height, paddingBox = that._paddingBox(element), elementHeight = parseFloat(height, 10) - that._uiHeight() - paddingBox.vertical;\n                if (elementHeight > 0) {\n                    that.element.css({\n                        height: ceil(elementHeight) + 'px',\n                        overflow: 'hidden'\n                    });\n                }\n            },\n            _uiHeight: function () {\n                var that = this, wrapper = that.wrapper, actionbar = wrapper.children(KBUTTONGROUP), actionbarHeight = actionbar[0] && actionbar[0].offsetHeight || 0, titlebar = wrapper.children(KDIALOGTITLEBAR), titlebarHeight = titlebar[0] && titlebar[0].offsetHeight || 0;\n                return actionbarHeight + titlebarHeight;\n            },\n            _overlay: function (visible) {\n                var overlay = this.appendTo.children(KOVERLAY), wrapper = this.wrapper;\n                if (!overlay.length) {\n                    overlay = $(templates.overlay);\n                }\n                overlay.insertBefore(wrapper[0]).toggle(visible).css(ZINDEX, parseInt(wrapper.css(ZINDEX), 10) - 1);\n                if (visible) {\n                    this._waiAriaOverlay();\n                } else {\n                    this._removeWaiAriaOverlay();\n                }\n                return overlay;\n            },\n            _waiAriaOverlay: function () {\n                var node = this.wrapper;\n                this._overlayedNodes = node.prevAll(overlaySelector).add(node.nextAll(overlaySelector)).each(function () {\n                    var jthis = $(this);\n                    jthis.data('ariaHidden', jthis.attr('aria-hidden'));\n                    jthis.attr('aria-hidden', 'true');\n                });\n            },\n            _removeWaiAriaOverlay: function () {\n                return this._overlayedNodes && this._overlayedNodes.each(function () {\n                    var node = $(this);\n                    var hiddenValue = node.data('ariaHidden');\n                    if (hiddenValue) {\n                        node.attr('aria-hidden', hiddenValue);\n                    } else {\n                        node.removeAttr('aria-hidden');\n                    }\n                });\n            },\n            _closeClick: function (e) {\n                e.preventDefault();\n                this.close();\n            },\n            _closeKeyHandler: function (e) {\n                if (buttonKeyTrigger(e) || e.keyCode == keys.ESC) {\n                    this.close();\n                }\n            },\n            _keydown: function (e) {\n                var that = this, options = that.options, keyCode = e.keyCode;\n                if (keyCode == keys.ESC && !that._closing && options.closable) {\n                    that.close();\n                }\n            },\n            _createDialog: function () {\n                var that = this, content = that.element, options = that.options, isRtl = kendo.support.isRtl(content), titlebar = $(templates.titlebar(options)), titlebarActions = titlebar.find('.k-window-actions'), titleId = (content.id || kendo.guid()) + '_title', wrapper = $(that.wrapperTemplate(options));\n                wrapper.toggleClass('k-rtl', isRtl);\n                content.addClass(KCONTENTCLASS);\n                that.appendTo.append(wrapper);\n                if (options.closable !== false) {\n                    if (options.title !== false) {\n                        titlebarActions.append(templates.close(options));\n                    } else {\n                        wrapper.append(templates.close(options));\n                    }\n                }\n                if (options.title !== false) {\n                    wrapper.append(titlebar);\n                    titlebar.attr('id', titleId);\n                    wrapper.attr('aria-labelledby', titleId);\n                } else {\n                    wrapper.addClass(KTITLELESS);\n                }\n                wrapper.append(content);\n                if (options.content) {\n                    kendo.destroy(content.children());\n                    content.html(options.content);\n                }\n                if (options.actions.length) {\n                    that._createActionbar(wrapper);\n                }\n            },\n            _createActionbar: function (wrapper) {\n                var isStretchedLayout = this.options.buttonLayout === 'stretched';\n                var buttonLayout = isStretchedLayout ? 'stretched' : 'normal';\n                var actionbar = $(templates.actionbar({ buttonLayout: buttonLayout }));\n                this._addButtons(actionbar);\n                if (isStretchedLayout) {\n                    this._normalizeButtonSize(actionbar);\n                }\n                wrapper.append(actionbar);\n            },\n            _addButtons: function (actionbar) {\n                var that = this, o = that.options, actionClick = proxy(that._actionClick, that), actionKeyHandler = proxy(that._actionKeyHandler, that), actions = that.options.actions, length = actions.length, buttonSize = HUNDREDPERCENT / length, action, text;\n                for (var i = 0; i < length; i++) {\n                    action = actions[i];\n                    text = that._mergeTextWithOptions(action);\n                    var btn = $(templates.action(action)).autoApplyNS(NS).html(text).appendTo(actionbar).data('action', action.action).on('click', actionClick).on('keydown', actionKeyHandler);\n                    if (o.buttonLayout === 'stretched') {\n                        btn.css(WIDTH, buttonSize + '%');\n                    }\n                }\n            },\n            _mergeTextWithOptions: function (action) {\n                var text = action.text;\n                return text ? template(text)(this.options) : '';\n            },\n            _normalizeButtonSize: function (actionbar) {\n                var that = this, options = that.options, lastButton = actionbar.children(KBUTTON + ':last'), currentSize = parseFloat(lastButton[0].style[WIDTH]), difference = HUNDREDPERCENT - options.actions.length * currentSize;\n                if (difference > 0) {\n                    lastButton.css(WIDTH, currentSize + difference + '%');\n                }\n            },\n            _tabindex: function (target) {\n                var that = this;\n                var wrapper = that.wrapper;\n                var closeBtn = wrapper.find(KICONCLOSE);\n                var actionButtons = wrapper.find(KBUTTONGROUP + ' ' + KBUTTON);\n                Widget.fn._tabindex.call(this, target);\n                var tabIndex = target.attr('tabindex');\n                closeBtn.attr('tabIndex', tabIndex);\n                actionButtons.attr('tabIndex', tabIndex);\n            },\n            _actionClick: function (e) {\n                this._runActionBtn(e.currentTarget);\n            },\n            _actionKeyHandler: function (e) {\n                if (buttonKeyTrigger(e)) {\n                    this._runActionBtn(e.currentTarget);\n                } else if (e.keyCode == keys.ESC) {\n                    this.close();\n                }\n            },\n            _runActionBtn: function (target) {\n                var that = this;\n                if (that._closing) {\n                    return;\n                }\n                var action = $(target).data('action'), preventClose = isFunction(action) && action({ sender: that }) === false;\n                if (!preventClose) {\n                    that.close();\n                }\n            },\n            open: function () {\n                var that = this, wrapper = that.wrapper, showOptions = this._animationOptions(OPEN), options = that.options, overlay, otherModalsVisible;\n                this._triggerInitOpen();\n                if (!that.trigger(OPEN)) {\n                    if (that._closing) {\n                        wrapper.kendoStop(true, true);\n                    }\n                    that._closing = false;\n                    that.toFront();\n                    options.visible = true;\n                    if (options.modal) {\n                        otherModalsVisible = !!that._modals().length;\n                        overlay = that._overlay(otherModalsVisible);\n                        overlay.kendoStop(true, true);\n                        if (showOptions.duration && kendo.effects.Fade && !otherModalsVisible) {\n                            var overlayFx = kendo.fx(overlay).fadeIn();\n                            overlayFx.duration(showOptions.duration || 0);\n                            overlayFx.endValue(0.5);\n                            overlayFx.play();\n                        } else {\n                            overlay.css('opacity', 0.5);\n                        }\n                        overlay.show();\n                    }\n                    wrapper.show().kendoStop().kendoAnimate({\n                        effects: showOptions.effects,\n                        duration: showOptions.duration,\n                        complete: proxy(that._openAnimationEnd, that)\n                    });\n                    wrapper.show();\n                }\n                return that;\n            },\n            _animationOptions: function (id) {\n                var animation = this.options.animation;\n                var basicAnimation = {\n                    open: { effects: {} },\n                    close: {\n                        hide: true,\n                        effects: {}\n                    }\n                };\n                return animation && animation[id] || basicAnimation[id];\n            },\n            _openAnimationEnd: function () {\n                if (this.options.modal) {\n                    this._focusDialog();\n                }\n                this.trigger(SHOW);\n            },\n            _triggerInitOpen: function () {\n                if (!defined(this._initOpenTriggered)) {\n                    this._initOpenTriggered = true;\n                    this.trigger(INITOPEN);\n                }\n            },\n            toFront: function () {\n                var that = this, wrapper = that.wrapper, zIndex = +wrapper.css(ZINDEX), originalZIndex = zIndex;\n                that.center();\n                $(KWINDOW).each(function (i, element) {\n                    var windowObject = $(element), zIndexNew = windowObject.css(ZINDEX);\n                    if (!isNaN(zIndexNew)) {\n                        zIndex = Math.max(+zIndexNew, zIndex);\n                    }\n                });\n                if (!wrapper[0].style.zIndex || originalZIndex < zIndex) {\n                    wrapper.css(ZINDEX, zIndex + 2);\n                }\n                that.element.find('> .k-overlay').remove();\n                wrapper = null;\n                return that;\n            },\n            close: function () {\n                this._close(true);\n                this._stopCenterOnResize();\n                return this;\n            },\n            _close: function (systemTriggered) {\n                var that = this, wrapper = that.wrapper, options = that.options, showOptions = this._animationOptions('open'), hideOptions = this._animationOptions('close');\n                if (wrapper.is(VISIBLE) && !that.trigger(CLOSE, { userTriggered: !systemTriggered })) {\n                    if (that._closing) {\n                        return;\n                    }\n                    that._closing = true;\n                    options.visible = false;\n                    this._removeOverlay();\n                    wrapper.kendoStop().kendoAnimate({\n                        effects: hideOptions.effects || showOptions.effects,\n                        reverse: hideOptions.reverse === true,\n                        duration: hideOptions.duration,\n                        complete: proxy(this._closeAnimationEnd, this)\n                    });\n                }\n                return that;\n            },\n            center: function () {\n                this._center();\n                this._centerOnResize();\n            },\n            _center: function () {\n                var that = this, wrapper = that.wrapper, documentWindow = $(window), scrollTop = 0, scrollLeft = 0, newLeft = scrollLeft + Math.max(0, (documentWindow.width() - wrapper.width()) / 2), newTop = scrollTop + Math.max(0, (documentWindow.height() - wrapper.height() - parseInt(wrapper.css('paddingTop'), 10)) / 2);\n                wrapper.css({\n                    left: newLeft,\n                    top: newTop\n                });\n                return that;\n            },\n            _centerOnResize: function () {\n                if (this._trackResize) {\n                    return;\n                }\n                kendo.onResize(this._centerCallback);\n                this._trackResize = true;\n            },\n            _stopCenterOnResize: function () {\n                kendo.unbindResize(this._centerCallback);\n                this._trackResize = false;\n            },\n            _removeOverlay: function () {\n                var modals = this._modals();\n                var options = this.options;\n                var hideOverlay = options.modal && !modals.length;\n                if (hideOverlay) {\n                    this._overlay(false).remove();\n                } else if (modals.length) {\n                    this._object(modals.last())._overlay(true);\n                }\n            },\n            _closeAnimationEnd: function () {\n                var that = this;\n                that._closing = false;\n                that.wrapper.hide().css('opacity', '');\n                that.trigger(HIDE);\n                if (that.options.modal) {\n                    var lastModal = that._object(that._modals().last());\n                    if (lastModal) {\n                        lastModal.toFront();\n                    }\n                }\n            },\n            _modals: function () {\n                var that = this;\n                var zStack = $(KWINDOW).filter(function () {\n                    var dom = $(this);\n                    var object = that._object(dom);\n                    var options = object && object.options;\n                    return options && options.modal && that.options.appendTo == options.appendTo && options.visible && dom.is(VISIBLE);\n                }).sort(function (a, b) {\n                    return +$(a).css('zIndex') - +$(b).css('zIndex');\n                });\n                that = null;\n                return zStack;\n            },\n            _object: function (element) {\n                var content = element.children(KCONTENT);\n                var widget = kendo.widgetInstance(content);\n                if (widget) {\n                    return widget;\n                }\n                return undefined;\n            },\n            destroy: function () {\n                var that = this;\n                that._destroy();\n                Widget.fn.destroy.call(that);\n                that.wrapper.remove();\n                that.wrapper = that.element = $();\n            },\n            _destroy: function () {\n                var that = this;\n                var ns = '.' + NS;\n                that.wrapper.off(ns);\n                that.element.off(ns);\n                that.wrapper.find(KICONCLOSE + ',' + KBUTTONGROUP + ' > ' + KBUTTON).off(ns);\n                that._stopCenterOnResize();\n            },\n            title: function (html) {\n                var that = this, wrapper = that.wrapper, options = that.options, titlebar = wrapper.children(KDIALOGTITLEBAR), title = titlebar.children(KDIALOGTITLE), encodedHtml = kendo.htmlEncode(html);\n                if (!arguments.length) {\n                    return title.html();\n                }\n                if (html === false) {\n                    titlebar.remove();\n                    wrapper.addClass(KTITLELESS);\n                } else {\n                    if (!titlebar.length) {\n                        titlebar = $(templates.titlebar(options)).prependTo(wrapper);\n                        title = titlebar.children(KDIALOGTITLE);\n                        wrapper.removeClass(KTITLELESS);\n                    }\n                    title.html(encodedHtml);\n                }\n                that.options.title = encodedHtml;\n                return that;\n            },\n            content: function (html, data) {\n                var that = this, content = that.wrapper.children(KCONTENT);\n                if (!defined(html)) {\n                    return content.html();\n                }\n                this.angular('cleanup', function () {\n                    return { elements: content.children() };\n                });\n                kendo.destroy(content.children());\n                content.html(html);\n                this.angular('compile', function () {\n                    var a = [];\n                    for (var i = content.length; --i >= 0;) {\n                        a.push({ dataItem: data });\n                    }\n                    return {\n                        elements: content.children(),\n                        data: a\n                    };\n                });\n                that.options.content = html;\n                return that;\n            },\n            _focusDialog: function () {\n                if (this._defaultFocus) {\n                    this._focus(this._defaultFocus);\n                }\n                this._tabKeyTrap.trap();\n            },\n            _focus: function (node) {\n                if (node) {\n                    node.focus();\n                }\n            },\n            events: [\n                INITOPEN,\n                OPEN,\n                CLOSE,\n                SHOW,\n                HIDE\n            ],\n            options: {\n                title: '',\n                buttonLayout: 'stretched',\n                actions: [],\n                modal: true,\n                width: null,\n                height: null,\n                minWidth: 0,\n                minHeight: 0,\n                maxWidth: Infinity,\n                maxHeight: Infinity,\n                content: null,\n                visible: null,\n                appendTo: BODY,\n                closable: true\n            }\n        });\n        var Dialog = DialogBase.extend({\n            options: {\n                name: 'Dialog',\n                messages: { close: 'Close' }\n            }\n        });\n        kendo.ui.plugin(Dialog);\n        var PopupBox = DialogBase.extend({\n            _init: function (element, options) {\n                var that = this;\n                that.wrapperTemplate = templates.alertWrapper;\n                options._defaultFocus = null;\n                that._ensureContentId(element);\n                DialogBase.fn._init.call(that, element, options);\n                that.bind(HIDE, proxy(that.destroy, that));\n                that._ariaDescribedBy();\n                that._initFocus();\n            },\n            _ensureContentId: function (element) {\n                var node = $(element);\n                if (!node.attr('id')) {\n                    node.attr('id', kendo.guid() + '_k-popup');\n                }\n            },\n            _ariaDescribedBy: function () {\n                this.wrapper.attr('aria-describedby', this.element.attr('id'));\n            },\n            _initFocus: function () {\n                var o = this.options;\n                this._defaultFocus = this._chooseEntryFocus();\n                if (this._defaultFocus && o.visible && o.modal) {\n                    this._focusDialog();\n                }\n            },\n            _chooseEntryFocus: function () {\n                return this.wrapper.find(KBUTTONGROUP + ' > ' + KBUTTON)[0];\n            },\n            options: {\n                title: window.location.host,\n                closable: false,\n                messages: messages\n            }\n        });\n        var Alert = PopupBox.extend({\n            _init: function (element, options) {\n                var that = this;\n                PopupBox.fn._init.call(that, element, options);\n                that.wrapper.addClass(KALERT);\n            },\n            options: {\n                name: 'Alert',\n                modal: true,\n                actions: [{ text: '#: messages.okText #' }]\n            }\n        });\n        kendo.ui.plugin(Alert);\n        var kendoAlert = function (text) {\n            return $(templates.alert).kendoAlert({ content: text }).data('kendoAlert').open();\n        };\n        var Confirm = PopupBox.extend({\n            _init: function (element, options) {\n                var that = this;\n                PopupBox.fn._init.call(that, element, options);\n                that.wrapper.addClass(KCONFIRM);\n                that.result = $.Deferred();\n            },\n            options: {\n                name: 'Confirm',\n                modal: true,\n                actions: [\n                    {\n                        text: '#: messages.okText #',\n                        primary: true,\n                        action: function (e) {\n                            e.sender.result.resolve();\n                        }\n                    },\n                    {\n                        text: '#: messages.cancel #',\n                        action: function (e) {\n                            e.sender.result.reject();\n                        }\n                    }\n                ]\n            }\n        });\n        kendo.ui.plugin(Confirm);\n        var kendoConfirm = function (text) {\n            var confirmDialog = $(templates.confirm).kendoConfirm({ content: text }).data('kendoConfirm').open();\n            return confirmDialog.result;\n        };\n        var Prompt = PopupBox.extend({\n            _init: function (element, options) {\n                var that = this;\n                PopupBox.fn._init.call(that, element, options);\n                that.wrapper.addClass(KPROMPT);\n                that._createPrompt();\n                that.result = $.Deferred();\n            },\n            _createPrompt: function () {\n                var value = this.options.value, promptContainer = $(templates.promptInputContainer(this.options)).insertAfter(this.element);\n                if (value) {\n                    promptContainer.children(KTEXTBOX).val(value);\n                }\n                this._defaultFocus = this._chooseEntryFocus();\n                this._focusDialog();\n            },\n            _chooseEntryFocus: function () {\n                return this.wrapper.find(KTEXTBOX)[0];\n            },\n            options: {\n                name: 'Prompt',\n                modal: true,\n                value: '',\n                actions: [\n                    {\n                        text: '#: messages.okText #',\n                        primary: true,\n                        action: function (e) {\n                            var sender = e.sender, value = sender.wrapper.find(KTEXTBOX).val();\n                            sender.result.resolve(value);\n                        }\n                    },\n                    {\n                        text: '#: messages.cancel #',\n                        action: function (e) {\n                            var sender = e.sender, value = sender.wrapper.find(KTEXTBOX).val();\n                            e.sender.result.reject(value);\n                        }\n                    }\n                ]\n            }\n        });\n        kendo.ui.plugin(Prompt);\n        var kendoPrompt = function (text, value) {\n            var promptDialog = $(templates.prompt).kendoPrompt({\n                content: text,\n                value: value\n            }).data('kendoPrompt').open();\n            return promptDialog.result;\n        };\n        templates = {\n            wrapper: template('<div class=\\'k-widget k-window k-dialog\\' role=\\'dialog\\' />'),\n            action: template('<button type=\\'button\\' class=\\'k-button# if (data.primary) { # k-primary# } role=\\'button\\' #\\'></button>'),\n            titlebar: template('<div class=\\'k-window-titlebar k-dialog-titlebar k-header\\'>' + '<span class=\\'k-window-title k-dialog-title\\'>#: title #</span>' + '<div class=\\'k-window-actions k-dialog-actions\\' />' + '</div>'),\n            close: template('<a role=\\'button\\' href=\\'\\\\#\\' class=\\'k-button k-bare k-button-icon k-window-action k-dialog-action k-dialog-close\\' title=\\'#: messages.close #\\' aria-label=\\'#: messages.close #\\' tabindex=\\'-1\\'><span class=\\'k-icon k-i-close\\'></span></a>'),\n            actionbar: template('<div class=\\'k-button-group k-dialog-buttongroup k-dialog-button-layout-#: buttonLayout #\\' role=\\'toolbar\\' />'),\n            overlay: '<div class=\\'k-overlay\\' />',\n            alertWrapper: template('<div class=\\'k-widget k-window k-dialog\\' role=\\'alertdialog\\' />'),\n            alert: '<div />',\n            confirm: '<div />',\n            prompt: '<div />',\n            promptInputContainer: template('<div class=\\'k-prompt-container\\'><input type=\\'text\\' class=\\'k-textbox\\' title=\\'#: messages.promptInput #\\' aria-label=\\'#: messages.promptInput #\\' /></div>')\n        };\n        kendo.alert = kendoAlert;\n        kendo.confirm = kendoConfirm;\n        kendo.prompt = kendoPrompt;\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.virtuallist', ['kendo.data'], f);\n}(function () {\n    var __meta__ = {\n        id: 'virtuallist',\n        name: 'VirtualList',\n        category: 'framework',\n        depends: ['data'],\n        hidden: true\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, ui = kendo.ui, Widget = ui.Widget, DataBoundWidget = ui.DataBoundWidget, proxy = $.proxy, WRAPPER = 'k-virtual-wrap', VIRTUALLIST = 'k-virtual-list', CONTENT = 'k-virtual-content', LIST = 'k-list', HEADER = 'k-group-header', VIRTUALITEM = 'k-virtual-item', ITEM = 'k-item', HEIGHTCONTAINER = 'k-height-container', GROUPITEM = 'k-group', SELECTED = 'k-state-selected', FOCUSED = 'k-state-focused', HOVER = 'k-state-hover', CHANGE = 'change', CLICK = 'click', LISTBOUND = 'listBound', ITEMCHANGE = 'itemChange', ACTIVATE = 'activate', DEACTIVATE = 'deactivate', VIRTUAL_LIST_NS = '.VirtualList';\n        function lastFrom(array) {\n            return array[array.length - 1];\n        }\n        function toArray(value) {\n            return value instanceof Array ? value : [value];\n        }\n        function isPrimitive(dataItem) {\n            return typeof dataItem === 'string' || typeof dataItem === 'number' || typeof dataItem === 'boolean';\n        }\n        function getItemCount(screenHeight, listScreens, itemHeight) {\n            return Math.ceil(screenHeight * listScreens / itemHeight);\n        }\n        function appendChild(parent, className, tagName) {\n            var element = document.createElement(tagName || 'div');\n            if (className) {\n                element.className = className;\n            }\n            parent.appendChild(element);\n            return element;\n        }\n        function getDefaultItemHeight() {\n            var mockList = $('<div class=\"k-popup\"><ul class=\"k-list\"><li class=\"k-item\"><li></ul></div>'), lineHeight;\n            mockList.css({\n                position: 'absolute',\n                left: '-200000px',\n                visibility: 'hidden'\n            });\n            mockList.appendTo(document.body);\n            lineHeight = parseFloat(kendo.getComputedStyles(mockList.find('.k-item')[0], ['line-height'])['line-height']);\n            mockList.remove();\n            return lineHeight;\n        }\n        function bufferSizes(screenHeight, listScreens, opposite) {\n            return {\n                down: screenHeight * opposite,\n                up: screenHeight * (listScreens - 1 - opposite)\n            };\n        }\n        function listValidator(options, screenHeight) {\n            var downThreshold = (options.listScreens - 1 - options.threshold) * screenHeight;\n            var upThreshold = options.threshold * screenHeight;\n            return function (list, scrollTop, lastScrollTop) {\n                if (scrollTop > lastScrollTop) {\n                    return scrollTop - list.top < downThreshold;\n                } else {\n                    return list.top === 0 || scrollTop - list.top > upThreshold;\n                }\n            };\n        }\n        function scrollCallback(element, callback) {\n            return function (force) {\n                return callback(element.scrollTop, force);\n            };\n        }\n        function syncList(reorder) {\n            return function (list, force) {\n                reorder(list.items, list.index, force);\n                return list;\n            };\n        }\n        function position(element, y) {\n            if (kendo.support.browser.msie && kendo.support.browser.version < 10) {\n                element.style.top = y + 'px';\n            } else {\n                element.style.webkitTransform = 'translateY(' + y + 'px)';\n                element.style.transform = 'translateY(' + y + 'px)';\n            }\n        }\n        function map2(callback, templates) {\n            return function (arr1, arr2) {\n                for (var i = 0, len = arr1.length; i < len; i++) {\n                    callback(arr1[i], arr2[i], templates);\n                    if (arr2[i].item) {\n                        this.trigger(ITEMCHANGE, {\n                            item: $(arr1[i]),\n                            data: arr2[i].item,\n                            ns: kendo.ui\n                        });\n                    }\n                }\n            };\n        }\n        function reshift(items, diff) {\n            var range;\n            if (diff > 0) {\n                range = items.splice(0, diff);\n                items.push.apply(items, range);\n            } else {\n                range = items.splice(diff, -diff);\n                items.unshift.apply(items, range);\n            }\n            return range;\n        }\n        function render(element, data, templates) {\n            var itemTemplate = templates.template;\n            element = $(element);\n            if (!data.item) {\n                itemTemplate = templates.placeholderTemplate;\n            }\n            this.angular('cleanup', function () {\n                return { elements: [element] };\n            });\n            element.attr('data-uid', data.item ? data.item.uid : '').attr('data-offset-index', data.index).html(itemTemplate(data.item || {}));\n            element.toggleClass(FOCUSED, data.current);\n            element.toggleClass(SELECTED, data.selected);\n            element.toggleClass('k-first', data.newGroup);\n            element.toggleClass('k-loading-item', !data.item);\n            if (data.index !== 0 && data.newGroup) {\n                $('<div class=' + GROUPITEM + '></div>').appendTo(element).html(templates.groupTemplate(data.group));\n            }\n            if (data.top !== undefined) {\n                position(element[0], data.top);\n            }\n            this.angular('compile', function () {\n                return {\n                    elements: [element],\n                    data: [{\n                            dataItem: data.item,\n                            group: data.group,\n                            newGroup: data.newGroup\n                        }]\n                };\n            });\n        }\n        function mapChangedItems(selected, itemsToMatch) {\n            var itemsLength = itemsToMatch.length;\n            var selectedLength = selected.length;\n            var dataItem;\n            var found;\n            var i, j;\n            var changed = [];\n            var unchanged = [];\n            if (selectedLength) {\n                for (i = 0; i < selectedLength; i++) {\n                    dataItem = selected[i];\n                    found = false;\n                    for (j = 0; j < itemsLength; j++) {\n                        if (dataItem === itemsToMatch[j]) {\n                            found = true;\n                            changed.push({\n                                index: i,\n                                item: dataItem\n                            });\n                            break;\n                        }\n                    }\n                    if (!found) {\n                        unchanged.push(dataItem);\n                    }\n                }\n            }\n            return {\n                changed: changed,\n                unchanged: unchanged\n            };\n        }\n        function isActivePromise(promise) {\n            return promise && promise.state() !== 'resolved';\n        }\n        var VirtualList = DataBoundWidget.extend({\n            init: function (element, options) {\n                var that = this;\n                that.bound(false);\n                that._fetching = false;\n                Widget.fn.init.call(that, element, options);\n                if (!that.options.itemHeight) {\n                    that.options.itemHeight = getDefaultItemHeight();\n                }\n                options = that.options;\n                that.element.addClass(LIST + ' ' + VIRTUALLIST).attr('role', 'listbox');\n                that.content = that.element.wrap('<div unselectable=\\'on\\' class=\\'' + CONTENT + '\\'></div>').parent();\n                that.wrapper = that.content.wrap('<div class=\\'' + WRAPPER + '\\'></div>').parent();\n                that.header = that.content.before('<div class=\\'' + HEADER + '\\'></div>').prev();\n                that.element.on('mouseenter' + VIRTUAL_LIST_NS, 'li:not(.k-loading-item)', function () {\n                    $(this).addClass(HOVER);\n                }).on('mouseleave' + VIRTUAL_LIST_NS, 'li', function () {\n                    $(this).removeClass(HOVER);\n                });\n                that._values = toArray(that.options.value);\n                that._selectedDataItems = [];\n                that._selectedIndexes = [];\n                that._rangesList = {};\n                that._promisesList = [];\n                that._optionID = kendo.guid();\n                that._templates();\n                that.setDataSource(options.dataSource);\n                that.content.on('scroll' + VIRTUAL_LIST_NS, kendo.throttle(function () {\n                    that._renderItems();\n                    that._triggerListBound();\n                }, options.delay));\n                that._selectable();\n            },\n            options: {\n                name: 'VirtualList',\n                autoBind: true,\n                delay: 100,\n                height: null,\n                listScreens: 4,\n                threshold: 0.5,\n                itemHeight: null,\n                oppositeBuffer: 1,\n                type: 'flat',\n                selectable: false,\n                value: [],\n                dataValueField: null,\n                template: '#:data#',\n                placeholderTemplate: 'loading...',\n                groupTemplate: '#:data#',\n                fixedGroupTemplate: 'fixed header template',\n                mapValueTo: 'index',\n                valueMapper: null\n            },\n            events: [\n                CHANGE,\n                CLICK,\n                LISTBOUND,\n                ITEMCHANGE,\n                ACTIVATE,\n                DEACTIVATE\n            ],\n            setOptions: function (options) {\n                Widget.fn.setOptions.call(this, options);\n                if (this._selectProxy && this.options.selectable === false) {\n                    this.element.off(CLICK, '.' + VIRTUALITEM, this._selectProxy);\n                } else if (!this._selectProxy && this.options.selectable) {\n                    this._selectable();\n                }\n                this._templates();\n                this.refresh();\n            },\n            items: function () {\n                return $(this._items);\n            },\n            destroy: function () {\n                this.wrapper.off(VIRTUAL_LIST_NS);\n                this.dataSource.unbind(CHANGE, this._refreshHandler);\n                Widget.fn.destroy.call(this);\n            },\n            setDataSource: function (source) {\n                var that = this;\n                var dataSource = source || {};\n                var value;\n                dataSource = $.isArray(dataSource) ? { data: dataSource } : dataSource;\n                dataSource = kendo.data.DataSource.create(dataSource);\n                if (that.dataSource) {\n                    that.dataSource.unbind(CHANGE, that._refreshHandler);\n                    that._clean();\n                    that.bound(false);\n                    that._deferValueSet = true;\n                    value = that.value();\n                    that.value([]);\n                    that.mute(function () {\n                        that.value(value);\n                    });\n                } else {\n                    that._refreshHandler = $.proxy(that.refresh, that);\n                }\n                that.dataSource = dataSource.bind(CHANGE, that._refreshHandler);\n                that.setDSFilter(dataSource.filter());\n                if (dataSource.view().length !== 0) {\n                    that.refresh();\n                } else if (that.options.autoBind) {\n                    dataSource.fetch();\n                }\n            },\n            skip: function () {\n                return this.dataSource.currentRangeStart();\n            },\n            _triggerListBound: function () {\n                var that = this;\n                var skip = that.skip();\n                if (that.bound() && !that._selectingValue && that._skip !== skip) {\n                    that._skip = skip;\n                    that.trigger(LISTBOUND);\n                }\n            },\n            _getValues: function (dataItems) {\n                var getter = this._valueGetter;\n                return $.map(dataItems, function (dataItem) {\n                    return getter(dataItem);\n                });\n            },\n            refresh: function (e) {\n                var that = this;\n                var action = e && e.action;\n                var isItemChange = action === 'itemchange';\n                var filtered = this.isFiltered();\n                var result;\n                if (that._mute) {\n                    return;\n                }\n                that._deferValueSet = false;\n                if (!that._fetching) {\n                    if (filtered) {\n                        that.focus(0);\n                    }\n                    that._createList();\n                    if (!action && that._values.length && !filtered && !that.options.skipUpdateOnBind) {\n                        that._selectingValue = true;\n                        that.value(that._values, true).done(function () {\n                            that.bound(true);\n                            that._selectingValue = false;\n                            that._triggerListBound();\n                        });\n                    } else {\n                        that.bound(true);\n                        that._triggerListBound();\n                    }\n                } else {\n                    if (that._renderItems) {\n                        that._renderItems(true);\n                    }\n                    that._triggerListBound();\n                }\n                if (isItemChange || action === 'remove') {\n                    result = mapChangedItems(that._selectedDataItems, e.items);\n                    if (result.changed.length) {\n                        if (isItemChange) {\n                            that.trigger('selectedItemChange', { items: result.changed });\n                        } else {\n                            that.value(that._getValues(result.unchanged));\n                        }\n                    }\n                }\n                that._fetching = false;\n            },\n            removeAt: function (position) {\n                this._selectedIndexes.splice(position, 1);\n                this._values.splice(position, 1);\n                return {\n                    position: position,\n                    dataItem: this._selectedDataItems.splice(position, 1)[0]\n                };\n            },\n            setValue: function (value) {\n                this._values = toArray(value);\n            },\n            value: function (value, _forcePrefetch) {\n                var that = this;\n                if (value === undefined) {\n                    return that._values.slice();\n                }\n                if (value === null) {\n                    value = [];\n                }\n                value = toArray(value);\n                if (!that._valueDeferred || that._valueDeferred.state() === 'resolved') {\n                    that._valueDeferred = $.Deferred();\n                }\n                var shouldClear = that.options.selectable === 'multiple' && that.select().length && value.length;\n                if (shouldClear || !value.length) {\n                    that.select(-1);\n                }\n                that._values = value;\n                if (that.bound() && !that._mute && !that._deferValueSet || _forcePrefetch) {\n                    that._prefetchByValue(value);\n                }\n                return that._valueDeferred;\n            },\n            _prefetchByValue: function (value) {\n                var that = this, dataView = that._dataView, valueGetter = that._valueGetter, mapValueTo = that.options.mapValueTo, item, match = false, forSelection = [];\n                for (var i = 0; i < value.length; i++) {\n                    for (var idx = 0; idx < dataView.length; idx++) {\n                        item = dataView[idx].item;\n                        if (item) {\n                            match = isPrimitive(item) ? value[i] === item : value[i] === valueGetter(item);\n                            if (match) {\n                                forSelection.push(dataView[idx].index);\n                            }\n                        }\n                    }\n                }\n                if (forSelection.length === value.length) {\n                    that._values = [];\n                    that.select(forSelection);\n                    return;\n                }\n                if (typeof that.options.valueMapper === 'function') {\n                    that.options.valueMapper({\n                        value: this.options.selectable === 'multiple' ? value : value[0],\n                        success: function (response) {\n                            if (mapValueTo === 'index') {\n                                that.mapValueToIndex(response);\n                            } else if (mapValueTo === 'dataItem') {\n                                that.mapValueToDataItem(response);\n                            }\n                        }\n                    });\n                } else {\n                    that.select([-1]);\n                }\n            },\n            mapValueToIndex: function (indexes) {\n                if (indexes === undefined || indexes === -1 || indexes === null) {\n                    indexes = [];\n                } else {\n                    indexes = toArray(indexes);\n                }\n                if (!indexes.length) {\n                    indexes = [-1];\n                } else {\n                    var removed = this._deselect([]).removed;\n                    if (removed.length) {\n                        this._triggerChange(removed, []);\n                    }\n                }\n                this.select(indexes);\n            },\n            mapValueToDataItem: function (dataItems) {\n                var removed, added;\n                if (dataItems === undefined || dataItems === null) {\n                    dataItems = [];\n                } else {\n                    dataItems = toArray(dataItems);\n                }\n                if (!dataItems.length) {\n                    this.select([-1]);\n                } else {\n                    removed = $.map(this._selectedDataItems, function (item, index) {\n                        return {\n                            index: index,\n                            dataItem: item\n                        };\n                    });\n                    added = $.map(dataItems, function (item, index) {\n                        return {\n                            index: index,\n                            dataItem: item\n                        };\n                    });\n                    this._selectedDataItems = dataItems;\n                    this._selectedIndexes = [];\n                    for (var i = 0; i < this._selectedDataItems.length; i++) {\n                        this._selectedIndexes.push(undefined);\n                    }\n                    this._triggerChange(removed, added);\n                    if (this._valueDeferred) {\n                        this._valueDeferred.resolve();\n                    }\n                }\n            },\n            deferredRange: function (index) {\n                var dataSource = this.dataSource;\n                var take = this.itemCount;\n                var ranges = this._rangesList;\n                var result = $.Deferred();\n                var defs = [];\n                var low = Math.floor(index / take) * take;\n                var high = Math.ceil(index / take) * take;\n                var pages = high === low ? [high] : [\n                    low,\n                    high\n                ];\n                $.each(pages, function (_, skip) {\n                    var end = skip + take;\n                    var existingRange = ranges[skip];\n                    var deferred;\n                    if (!existingRange || existingRange.end !== end) {\n                        deferred = $.Deferred();\n                        ranges[skip] = {\n                            end: end,\n                            deferred: deferred\n                        };\n                        dataSource._multiplePrefetch(skip, take, function () {\n                            deferred.resolve();\n                        });\n                    } else {\n                        deferred = existingRange.deferred;\n                    }\n                    defs.push(deferred);\n                });\n                $.when.apply($, defs).then(function () {\n                    result.resolve();\n                });\n                return result;\n            },\n            prefetch: function (indexes) {\n                var that = this, take = this.itemCount, isEmptyList = !that._promisesList.length;\n                if (!isActivePromise(that._activeDeferred)) {\n                    that._activeDeferred = $.Deferred();\n                    that._promisesList = [];\n                }\n                $.each(indexes, function (_, index) {\n                    that._promisesList.push(that.deferredRange(that._getSkip(index, take)));\n                });\n                if (isEmptyList) {\n                    $.when.apply($, that._promisesList).done(function () {\n                        that._promisesList = [];\n                        that._activeDeferred.resolve();\n                    });\n                }\n                return that._activeDeferred;\n            },\n            _findDataItem: function (view, index) {\n                var group;\n                if (this.options.type === 'group') {\n                    for (var i = 0; i < view.length; i++) {\n                        group = view[i].items;\n                        if (group.length <= index) {\n                            index = index - group.length;\n                        } else {\n                            return group[index];\n                        }\n                    }\n                }\n                return view[index];\n            },\n            _getRange: function (skip, take) {\n                return this.dataSource._findRange(skip, Math.min(skip + take, this.dataSource.total()));\n            },\n            dataItemByIndex: function (index) {\n                var take = this.itemCount;\n                var skip = this._getSkip(index, take);\n                var view = this._getRange(skip, take);\n                return this._findDataItem(view, [index - skip]);\n            },\n            selectedDataItems: function () {\n                return this._selectedDataItems.slice();\n            },\n            scrollWith: function (value) {\n                this.content.scrollTop(this.content.scrollTop() + value);\n            },\n            scrollTo: function (y) {\n                this.content.scrollTop(y);\n            },\n            scrollToIndex: function (index) {\n                this.scrollTo(index * this.options.itemHeight);\n            },\n            focus: function (candidate) {\n                var element, index, data, current, itemHeight = this.options.itemHeight, id = this._optionID, triggerEvent = true;\n                if (candidate === undefined) {\n                    current = this.element.find('.' + FOCUSED);\n                    return current.length ? current : null;\n                }\n                if (typeof candidate === 'function') {\n                    data = this.dataSource.flatView();\n                    for (var idx = 0; idx < data.length; idx++) {\n                        if (candidate(data[idx])) {\n                            candidate = idx;\n                            break;\n                        }\n                    }\n                }\n                if (candidate instanceof Array) {\n                    candidate = lastFrom(candidate);\n                }\n                if (isNaN(candidate)) {\n                    element = $(candidate);\n                    index = parseInt($(element).attr('data-offset-index'), 10);\n                } else {\n                    index = candidate;\n                    element = this._getElementByIndex(index);\n                }\n                if (index === -1) {\n                    this.element.find('.' + FOCUSED).removeClass(FOCUSED);\n                    this._focusedIndex = undefined;\n                    return;\n                }\n                if (element.length) {\n                    if (element.hasClass(FOCUSED)) {\n                        triggerEvent = false;\n                    }\n                    if (this._focusedIndex !== undefined) {\n                        current = this._getElementByIndex(this._focusedIndex);\n                        current.removeClass(FOCUSED).removeAttr('id');\n                        if (triggerEvent) {\n                            this.trigger(DEACTIVATE);\n                        }\n                    }\n                    this._focusedIndex = index;\n                    element.addClass(FOCUSED).attr('id', id);\n                    var position = this._getElementLocation(index);\n                    if (position === 'top') {\n                        this.scrollTo(index * itemHeight);\n                    } else if (position === 'bottom') {\n                        this.scrollTo(index * itemHeight + itemHeight - this._screenHeight);\n                    } else if (position === 'outScreen') {\n                        this.scrollTo(index * itemHeight);\n                    }\n                    if (triggerEvent) {\n                        this.trigger(ACTIVATE);\n                    }\n                } else {\n                    this._focusedIndex = index;\n                    this.items().removeClass(FOCUSED);\n                    this.scrollToIndex(index);\n                }\n            },\n            focusIndex: function () {\n                return this._focusedIndex;\n            },\n            focusFirst: function () {\n                this.scrollTo(0);\n                this.focus(0);\n            },\n            focusLast: function () {\n                var lastIndex = this.dataSource.total();\n                this.scrollTo(this.heightContainer.offsetHeight);\n                this.focus(lastIndex);\n            },\n            focusPrev: function () {\n                var index = this._focusedIndex;\n                var current;\n                if (!isNaN(index) && index > 0) {\n                    index -= 1;\n                    this.focus(index);\n                    current = this.focus();\n                    if (current && current.hasClass('k-loading-item')) {\n                        index += 1;\n                        this.focus(index);\n                    }\n                    return index;\n                } else {\n                    index = this.dataSource.total() - 1;\n                    this.focus(index);\n                    return index;\n                }\n            },\n            focusNext: function () {\n                var index = this._focusedIndex;\n                var lastIndex = this.dataSource.total() - 1;\n                var current;\n                if (!isNaN(index) && index < lastIndex) {\n                    index += 1;\n                    this.focus(index);\n                    current = this.focus();\n                    if (current && current.hasClass('k-loading-item')) {\n                        index -= 1;\n                        this.focus(index);\n                    }\n                    return index;\n                } else {\n                    index = 0;\n                    this.focus(index);\n                    return index;\n                }\n            },\n            _triggerChange: function (removed, added) {\n                removed = removed || [];\n                added = added || [];\n                if (removed.length || added.length) {\n                    this.trigger(CHANGE, {\n                        removed: removed,\n                        added: added\n                    });\n                }\n            },\n            select: function (candidate) {\n                var that = this, indices, singleSelection = that.options.selectable !== 'multiple', prefetchStarted = isActivePromise(that._activeDeferred), filtered = this.isFiltered(), isAlreadySelected, deferred, result, removed = [];\n                if (candidate === undefined) {\n                    return that._selectedIndexes.slice();\n                }\n                if (!that._selectDeferred || that._selectDeferred.state() === 'resolved') {\n                    that._selectDeferred = $.Deferred();\n                }\n                indices = that._getIndecies(candidate);\n                isAlreadySelected = singleSelection && !filtered && lastFrom(indices) === lastFrom(this._selectedIndexes);\n                removed = that._deselectCurrentValues(indices);\n                if (removed.length || !indices.length || isAlreadySelected) {\n                    that._triggerChange(removed);\n                    if (that._valueDeferred) {\n                        that._valueDeferred.resolve();\n                    }\n                    return that._selectDeferred.resolve().promise();\n                }\n                if (indices.length === 1 && indices[0] === -1) {\n                    indices = [];\n                }\n                result = that._deselect(indices);\n                removed = result.removed;\n                indices = result.indices;\n                if (singleSelection) {\n                    prefetchStarted = false;\n                    if (indices.length) {\n                        indices = [lastFrom(indices)];\n                    }\n                }\n                var done = function () {\n                    var added = that._select(indices);\n                    that.focus(indices);\n                    that._triggerChange(removed, added);\n                    if (that._valueDeferred) {\n                        that._valueDeferred.resolve();\n                    }\n                    that._selectDeferred.resolve();\n                };\n                deferred = that.prefetch(indices);\n                if (!prefetchStarted) {\n                    if (deferred) {\n                        deferred.done(done);\n                    } else {\n                        done();\n                    }\n                }\n                return that._selectDeferred.promise();\n            },\n            bound: function (bound) {\n                if (bound === undefined) {\n                    return this._listCreated;\n                }\n                this._listCreated = bound;\n            },\n            mute: function (callback) {\n                this._mute = true;\n                proxy(callback(), this);\n                this._mute = false;\n            },\n            setDSFilter: function (filter) {\n                this._lastDSFilter = $.extend({}, filter);\n            },\n            isFiltered: function () {\n                if (!this._lastDSFilter) {\n                    this.setDSFilter(this.dataSource.filter());\n                }\n                return !kendo.data.Query.compareFilters(this.dataSource.filter(), this._lastDSFilter);\n            },\n            skipUpdate: $.noop,\n            _getElementByIndex: function (index) {\n                return this.items().filter(function (idx, element) {\n                    return index === parseInt($(element).attr('data-offset-index'), 10);\n                });\n            },\n            _getElementByDataItem: function (dataItem) {\n                var dataView = this._dataView, valueGetter = this._valueGetter, element, match;\n                for (var i = 0; i < dataView.length; i++) {\n                    match = dataView[i].item && isPrimitive(dataView[i].item) ? dataView[i].item === dataItem : valueGetter(dataView[i].item) === valueGetter(dataItem);\n                    if (match) {\n                        element = dataView[i];\n                        break;\n                    }\n                }\n                return element ? this._getElementByIndex(element.index) : $();\n            },\n            _clean: function () {\n                this.result = undefined;\n                this._lastScrollTop = undefined;\n                this._skip = undefined;\n                $(this.heightContainer).remove();\n                this.heightContainer = undefined;\n                this.element.empty();\n            },\n            _height: function () {\n                var hasData = !!this.dataSource.view().length, height = this.options.height, itemHeight = this.options.itemHeight, total = this.dataSource.total();\n                if (!hasData) {\n                    height = 0;\n                } else if (height / itemHeight > total) {\n                    height = total * itemHeight;\n                }\n                return height;\n            },\n            setScreenHeight: function () {\n                var height = this._height();\n                this.content.height(height);\n                this._screenHeight = height;\n            },\n            screenHeight: function () {\n                return this._screenHeight;\n            },\n            _getElementLocation: function (index) {\n                var scrollTop = this.content.scrollTop(), screenHeight = this._screenHeight, itemHeight = this.options.itemHeight, yPosition = index * itemHeight, yDownPostion = yPosition + itemHeight, screenEnd = scrollTop + screenHeight, position;\n                if (yPosition === scrollTop - itemHeight || yDownPostion > scrollTop && yPosition < scrollTop) {\n                    position = 'top';\n                } else if (yPosition === screenEnd || yPosition < screenEnd && screenEnd < yDownPostion) {\n                    position = 'bottom';\n                } else if (yPosition >= scrollTop && yPosition <= scrollTop + (screenHeight - itemHeight)) {\n                    position = 'inScreen';\n                } else {\n                    position = 'outScreen';\n                }\n                return position;\n            },\n            _templates: function () {\n                var options = this.options;\n                var templates = {\n                    template: options.template,\n                    placeholderTemplate: options.placeholderTemplate,\n                    groupTemplate: options.groupTemplate,\n                    fixedGroupTemplate: options.fixedGroupTemplate\n                };\n                for (var key in templates) {\n                    if (typeof templates[key] !== 'function') {\n                        templates[key] = kendo.template(templates[key] || '');\n                    }\n                }\n                this.templates = templates;\n            },\n            _generateItems: function (element, count) {\n                var items = [], item, itemHeight = this.options.itemHeight + 'px';\n                while (count-- > 0) {\n                    item = document.createElement('li');\n                    item.tabIndex = -1;\n                    item.className = VIRTUALITEM + ' ' + ITEM;\n                    item.setAttribute('role', 'option');\n                    item.style.height = itemHeight;\n                    item.style.minHeight = itemHeight;\n                    element.appendChild(item);\n                    items.push(item);\n                }\n                return items;\n            },\n            _saveInitialRanges: function () {\n                var ranges = this.dataSource._ranges;\n                var deferred = $.Deferred();\n                deferred.resolve();\n                this._rangesList = {};\n                for (var i = 0; i < ranges.length; i++) {\n                    this._rangesList[ranges[i].start] = {\n                        end: ranges[i].end,\n                        deferred: deferred\n                    };\n                }\n            },\n            _createList: function () {\n                var that = this, content = that.content.get(0), options = that.options, dataSource = that.dataSource;\n                if (that.bound()) {\n                    that._clean();\n                }\n                that._saveInitialRanges();\n                that._buildValueGetter();\n                that.setScreenHeight();\n                that.itemCount = getItemCount(that._screenHeight, options.listScreens, options.itemHeight);\n                if (that.itemCount > dataSource.total()) {\n                    that.itemCount = dataSource.total();\n                }\n                that._items = that._generateItems(that.element[0], that.itemCount);\n                that._setHeight(options.itemHeight * dataSource.total());\n                that.options.type = (dataSource.group() || []).length ? 'group' : 'flat';\n                if (that.options.type === 'flat') {\n                    that.header.hide();\n                } else {\n                    that.header.show();\n                }\n                that.getter = that._getter(function () {\n                    that._renderItems(true);\n                });\n                that._onScroll = function (scrollTop, force) {\n                    var getList = that._listItems(that.getter);\n                    return that._fixedHeader(scrollTop, getList(scrollTop, force));\n                };\n                that._renderItems = that._whenChanged(scrollCallback(content, that._onScroll), syncList(that._reorderList(that._items, $.proxy(render, that))));\n                that._renderItems();\n                that._calculateGroupPadding(that._screenHeight);\n            },\n            _setHeight: function (height) {\n                var currentHeight, heightContainer = this.heightContainer;\n                if (!heightContainer) {\n                    heightContainer = this.heightContainer = appendChild(this.content[0], HEIGHTCONTAINER);\n                } else {\n                    currentHeight = heightContainer.offsetHeight;\n                }\n                if (height !== currentHeight) {\n                    heightContainer.innerHTML = '';\n                    while (height > 0) {\n                        var padHeight = Math.min(height, 250000);\n                        appendChild(heightContainer).style.height = padHeight + 'px';\n                        height -= padHeight;\n                    }\n                }\n            },\n            _getter: function () {\n                var lastRequestedRange = null, dataSource = this.dataSource, lastRangeStart = dataSource.skip(), type = this.options.type, pageSize = this.itemCount, flatGroups = {};\n                if (dataSource.pageSize() < pageSize) {\n                    this.mute(function () {\n                        dataSource.pageSize(pageSize);\n                    });\n                }\n                return function (index, rangeStart) {\n                    var that = this;\n                    if (!dataSource.inRange(rangeStart, pageSize)) {\n                        if (lastRequestedRange !== rangeStart) {\n                            lastRequestedRange = rangeStart;\n                            lastRangeStart = rangeStart;\n                            if (that._getterDeferred) {\n                                that._getterDeferred.reject();\n                            }\n                            that._getterDeferred = that.deferredRange(rangeStart);\n                            that._getterDeferred.then(function () {\n                                var firstItemIndex = that._indexConstraint(that.content[0].scrollTop);\n                                that._getterDeferred = null;\n                                if (rangeStart <= firstItemIndex && firstItemIndex <= rangeStart + pageSize) {\n                                    that._fetching = true;\n                                    dataSource.range(rangeStart, pageSize);\n                                }\n                            });\n                        }\n                        return null;\n                    } else {\n                        if (lastRangeStart !== rangeStart) {\n                            this.mute(function () {\n                                dataSource.range(rangeStart, pageSize);\n                                lastRangeStart = rangeStart;\n                            });\n                        }\n                        var result;\n                        if (type === 'group') {\n                            if (!flatGroups[rangeStart]) {\n                                var flatGroup = flatGroups[rangeStart] = [];\n                                var groups = dataSource.view();\n                                for (var i = 0, len = groups.length; i < len; i++) {\n                                    var group = groups[i];\n                                    for (var j = 0, groupLength = group.items.length; j < groupLength; j++) {\n                                        flatGroup.push({\n                                            item: group.items[j],\n                                            group: group.value\n                                        });\n                                    }\n                                }\n                            }\n                            result = flatGroups[rangeStart][index - rangeStart];\n                        } else {\n                            result = dataSource.view()[index - rangeStart];\n                        }\n                        return result;\n                    }\n                };\n            },\n            _fixedHeader: function (scrollTop, list) {\n                var group = this.currentVisibleGroup, itemHeight = this.options.itemHeight, firstVisibleDataItemIndex = Math.floor((scrollTop - list.top) / itemHeight), firstVisibleDataItem = list.items[firstVisibleDataItemIndex];\n                if (firstVisibleDataItem && firstVisibleDataItem.item) {\n                    var firstVisibleGroup = firstVisibleDataItem.group;\n                    if (firstVisibleGroup !== group) {\n                        this.header[0].innerHTML = firstVisibleGroup || '';\n                        this.currentVisibleGroup = firstVisibleGroup;\n                    }\n                }\n                return list;\n            },\n            _itemMapper: function (item, index, value) {\n                var listType = this.options.type, itemHeight = this.options.itemHeight, currentIndex = this._focusedIndex, selected = false, current = false, newGroup = false, group = null, match = false, valueGetter = this._valueGetter;\n                if (listType === 'group') {\n                    if (item) {\n                        newGroup = index === 0 || this._currentGroup && this._currentGroup !== item.group;\n                        this._currentGroup = item.group;\n                    }\n                    group = item ? item.group : null;\n                    item = item ? item.item : null;\n                }\n                if (!this.isFiltered() && value.length && item) {\n                    for (var i = 0; i < value.length; i++) {\n                        match = isPrimitive(item) ? value[i] === item : value[i] === valueGetter(item);\n                        if (match) {\n                            value.splice(i, 1);\n                            selected = true;\n                            break;\n                        }\n                    }\n                }\n                if (currentIndex === index) {\n                    current = true;\n                }\n                return {\n                    item: item ? item : null,\n                    group: group,\n                    newGroup: newGroup,\n                    selected: selected,\n                    current: current,\n                    index: index,\n                    top: index * itemHeight\n                };\n            },\n            _range: function (index) {\n                var itemCount = this.itemCount, value = this._values.slice(), items = [], item;\n                this._view = {};\n                this._currentGroup = null;\n                for (var i = index, length = index + itemCount; i < length; i++) {\n                    item = this._itemMapper(this.getter(i, index), i, value);\n                    items.push(item);\n                    this._view[item.index] = item;\n                }\n                this._dataView = items;\n                return items;\n            },\n            _getDataItemsCollection: function (scrollTop, lastScrollTop) {\n                var items = this._range(this._listIndex(scrollTop, lastScrollTop));\n                return {\n                    index: items.length ? items[0].index : 0,\n                    top: items.length ? items[0].top : 0,\n                    items: items\n                };\n            },\n            _listItems: function () {\n                var screenHeight = this._screenHeight, options = this.options;\n                var theValidator = listValidator(options, screenHeight);\n                return $.proxy(function (value, force) {\n                    var result = this.result, lastScrollTop = this._lastScrollTop;\n                    if (force || !result || !theValidator(result, value, lastScrollTop)) {\n                        result = this._getDataItemsCollection(value, lastScrollTop);\n                    }\n                    this._lastScrollTop = value;\n                    this.result = result;\n                    return result;\n                }, this);\n            },\n            _whenChanged: function (getter, callback) {\n                var current;\n                return function (force) {\n                    var theNew = getter(force);\n                    if (theNew !== current) {\n                        current = theNew;\n                        callback(theNew, force);\n                    }\n                };\n            },\n            _reorderList: function (list, reorder) {\n                var that = this;\n                var length = list.length;\n                var currentOffset = -Infinity;\n                reorder = $.proxy(map2(reorder, this.templates), this);\n                return function (list2, offset, force) {\n                    var diff = offset - currentOffset;\n                    var range, range2;\n                    if (force || Math.abs(diff) >= length) {\n                        range = list;\n                        range2 = list2;\n                    } else {\n                        range = reshift(list, diff);\n                        range2 = diff > 0 ? list2.slice(-diff) : list2.slice(0, -diff);\n                    }\n                    reorder(range, range2, that.bound());\n                    currentOffset = offset;\n                };\n            },\n            _bufferSizes: function () {\n                var options = this.options;\n                return bufferSizes(this._screenHeight, options.listScreens, options.oppositeBuffer);\n            },\n            _indexConstraint: function (position) {\n                var itemCount = this.itemCount, itemHeight = this.options.itemHeight, total = this.dataSource.total();\n                return Math.min(Math.max(total - itemCount, 0), Math.max(0, Math.floor(position / itemHeight)));\n            },\n            _listIndex: function (scrollTop, lastScrollTop) {\n                var buffers = this._bufferSizes(), position;\n                position = scrollTop - (scrollTop > lastScrollTop ? buffers.down : buffers.up);\n                return this._indexConstraint(position);\n            },\n            _selectable: function () {\n                if (this.options.selectable) {\n                    this._selectProxy = $.proxy(this, '_clickHandler');\n                    this.element.on(CLICK + VIRTUAL_LIST_NS, '.' + VIRTUALITEM, this._selectProxy);\n                }\n            },\n            getElementIndex: function (element) {\n                if (!(element instanceof jQuery)) {\n                    return undefined;\n                }\n                return parseInt(element.attr('data-offset-index'), 10);\n            },\n            _getIndecies: function (candidate) {\n                var result = [], data;\n                if (typeof candidate === 'function') {\n                    data = this.dataSource.flatView();\n                    for (var idx = 0; idx < data.length; idx++) {\n                        if (candidate(data[idx])) {\n                            result.push(idx);\n                            break;\n                        }\n                    }\n                }\n                if (typeof candidate === 'number') {\n                    result.push(candidate);\n                }\n                var elementIndex = this.getElementIndex(candidate);\n                if (!isNaN(elementIndex)) {\n                    result.push(elementIndex);\n                }\n                if (candidate instanceof Array) {\n                    result = candidate;\n                }\n                return result;\n            },\n            _deselect: function (indices) {\n                var removed = [], selectedIndex, dataItem, selectedIndexes = this._selectedIndexes, selectedDataItems = this._selectedDataItems, position = 0, selectable = this.options.selectable, removedindexesCounter = 0, valueGetter = this._valueGetter, item, match, result = null;\n                indices = indices.slice();\n                if (selectable === true || !indices.length) {\n                    for (var idx = 0; idx < selectedIndexes.length; idx++) {\n                        if (selectedIndexes[idx] !== undefined) {\n                            this._getElementByIndex(selectedIndexes[idx]).removeClass(SELECTED);\n                        } else if (selectedDataItems[idx]) {\n                            this._getElementByDataItem(selectedDataItems[idx]).removeClass(SELECTED);\n                        }\n                        removed.push({\n                            index: selectedIndexes[idx],\n                            position: idx,\n                            dataItem: selectedDataItems[idx]\n                        });\n                    }\n                    this._values = [];\n                    this._selectedDataItems = [];\n                    this._selectedIndexes = [];\n                } else if (selectable === 'multiple') {\n                    for (var i = 0; i < indices.length; i++) {\n                        result = null;\n                        position = $.inArray(indices[i], selectedIndexes);\n                        dataItem = this.dataItemByIndex(indices[i]);\n                        if (position === -1 && dataItem) {\n                            for (var j = 0; j < selectedDataItems.length; j++) {\n                                match = isPrimitive(dataItem) ? selectedDataItems[j] === dataItem : valueGetter(selectedDataItems[j]) === valueGetter(dataItem);\n                                if (match) {\n                                    item = this._getElementByIndex(indices[i]);\n                                    result = this._deselectSingleItem(item, j, indices[i], removedindexesCounter);\n                                }\n                            }\n                        } else {\n                            selectedIndex = selectedIndexes[position];\n                            if (selectedIndex !== undefined) {\n                                item = this._getElementByIndex(selectedIndex);\n                                result = this._deselectSingleItem(item, position, selectedIndex, removedindexesCounter);\n                            }\n                        }\n                        if (result) {\n                            indices.splice(i, 1);\n                            removed.push(result);\n                            removedindexesCounter++;\n                            i--;\n                        }\n                    }\n                }\n                return {\n                    indices: indices,\n                    removed: removed\n                };\n            },\n            _deselectSingleItem: function (item, position, selectedIndex, removedindexesCounter) {\n                var dataItem;\n                if (!item.hasClass('k-state-selected')) {\n                    return;\n                }\n                item.removeClass(SELECTED);\n                this._values.splice(position, 1);\n                this._selectedIndexes.splice(position, 1);\n                dataItem = this._selectedDataItems.splice(position, 1)[0];\n                return {\n                    index: selectedIndex,\n                    position: position + removedindexesCounter,\n                    dataItem: dataItem\n                };\n            },\n            _deselectCurrentValues: function (indices) {\n                var children = this.element[0].children;\n                var value, index, position;\n                var values = this._values;\n                var removed = [];\n                var idx = 0;\n                var j;\n                if (this.options.selectable !== 'multiple' || !this.isFiltered()) {\n                    return [];\n                }\n                if (indices[0] === -1) {\n                    $(children).removeClass('k-state-selected');\n                    removed = $.map(this._selectedDataItems.slice(0), function (dataItem, idx) {\n                        return {\n                            dataItem: dataItem,\n                            position: idx\n                        };\n                    });\n                    this._selectedIndexes = [];\n                    this._selectedDataItems = [];\n                    this._values = [];\n                    return removed;\n                }\n                for (; idx < indices.length; idx++) {\n                    position = -1;\n                    index = indices[idx];\n                    value = this._valueGetter(this.dataItemByIndex(index));\n                    for (j = 0; j < values.length; j++) {\n                        if (value == values[j]) {\n                            position = j;\n                            break;\n                        }\n                    }\n                    if (position > -1) {\n                        removed.push(this.removeAt(position));\n                        $(children[index]).removeClass('k-state-selected');\n                    }\n                }\n                return removed;\n            },\n            _getSkip: function (index, take) {\n                var page = index < take ? 1 : Math.floor(index / take) + 1;\n                return (page - 1) * take;\n            },\n            _select: function (indexes) {\n                var that = this, singleSelection = this.options.selectable !== 'multiple', dataSource = this.dataSource, dataItem, oldSkip, take = this.itemCount, valueGetter = this._valueGetter, added = [];\n                if (singleSelection) {\n                    that._selectedIndexes = [];\n                    that._selectedDataItems = [];\n                    that._values = [];\n                }\n                oldSkip = dataSource.skip();\n                $.each(indexes, function (_, index) {\n                    var skip = that._getSkip(index, take);\n                    that.mute(function () {\n                        dataSource.range(skip, take);\n                        dataItem = that._findDataItem(dataSource.view(), [index - skip]);\n                        that._selectedIndexes.push(index);\n                        that._selectedDataItems.push(dataItem);\n                        that._values.push(isPrimitive(dataItem) ? dataItem : valueGetter(dataItem));\n                        added.push({\n                            index: index,\n                            dataItem: dataItem\n                        });\n                        that._getElementByIndex(index).addClass(SELECTED);\n                        dataSource.range(oldSkip, take);\n                    });\n                });\n                return added;\n            },\n            _clickHandler: function (e) {\n                var item = $(e.currentTarget);\n                if (!e.isDefaultPrevented() && item.attr('data-uid')) {\n                    this.trigger(CLICK, { item: item });\n                }\n            },\n            _buildValueGetter: function () {\n                this._valueGetter = kendo.getter(this.options.dataValueField);\n            },\n            _calculateGroupPadding: function (height) {\n                var firstItem = this.items().first(), groupHeader = this.header, padding = 0;\n                if (groupHeader[0] && groupHeader[0].style.display !== 'none') {\n                    if (height !== 'auto') {\n                        padding = kendo.support.scrollbar();\n                    }\n                    padding += parseFloat(firstItem.css('border-right-width'), 10) + parseFloat(firstItem.children('.k-group').css('right'), 10);\n                    groupHeader.css('padding-right', padding);\n                }\n            }\n        });\n        kendo.ui.VirtualList = VirtualList;\n        kendo.ui.plugin(VirtualList);\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.scheduler.view', ['kendo.core'], f);\n}(function () {\n    var __meta__ = {\n        id: 'scheduler.view',\n        name: 'Scheduler View',\n        category: 'web',\n        description: 'The Scheduler Common View',\n        depends: ['core'],\n        hidden: true\n    };\n    kendo.ui.scheduler = {};\n    (function ($) {\n        var kendo = window.kendo, ui = kendo.ui, Widget = ui.Widget, outerHeight = kendo._outerHeight, keys = kendo.keys, NS = '.kendoSchedulerView', math = Math;\n        function levels(values, key) {\n            var result = [];\n            function collect(depth, values) {\n                values = values[key];\n                if (values) {\n                    var level = result[depth] = result[depth] || [];\n                    for (var idx = 0; idx < values.length; idx++) {\n                        level.push(values[idx]);\n                        collect(depth + 1, values[idx]);\n                    }\n                }\n            }\n            collect(0, values);\n            return result;\n        }\n        function cellspacing() {\n            if (kendo.support.cssBorderSpacing) {\n                return '';\n            }\n            return 'cellspacing=\"0\"';\n        }\n        function table(tableRows, className) {\n            if (!tableRows.length) {\n                return '';\n            }\n            return '<table ' + cellspacing() + ' class=\"' + $.trim('k-scheduler-table ' + (className || '')) + '\">' + '<tr>' + tableRows.join('</tr><tr>') + '</tr>' + '</table>';\n        }\n        function allDayTable(tableRows, className) {\n            if (!tableRows.length) {\n                return '';\n            }\n            return '<div style=\\'position:relative\\'>' + table(tableRows, className) + '</div>';\n        }\n        function timesHeader(columnLevelCount, allDaySlot, rowCount) {\n            var tableRows = [];\n            if (rowCount > 0) {\n                for (var idx = 0; idx < columnLevelCount; idx++) {\n                    tableRows.push('<th>&#8203;</th>');\n                }\n            }\n            if (allDaySlot) {\n                tableRows.push('<th class=\"k-scheduler-times-all-day\">' + allDaySlot.text + '</th>');\n            }\n            if (rowCount < 1) {\n                return $();\n            }\n            return $('<div class=\"k-scheduler-times\">' + table(tableRows) + '</div>');\n        }\n        function datesHeader(columnLevels, columnCount, allDaySlot) {\n            var dateTableRows = [];\n            var columnIndex;\n            for (var columnLevelIndex = 0; columnLevelIndex < columnLevels.length; columnLevelIndex++) {\n                var level = columnLevels[columnLevelIndex];\n                var th = [];\n                var colspan = columnCount / level.length;\n                for (columnIndex = 0; columnIndex < level.length; columnIndex++) {\n                    var column = level[columnIndex];\n                    th.push('<th colspan=\"' + (column.colspan || colspan) + '\" class=\"' + (column.className || '') + '\">' + column.text + '</th>');\n                }\n                dateTableRows.push(th.join(''));\n            }\n            var allDayTableRows = [];\n            if (allDaySlot) {\n                var lastLevel = columnLevels[columnLevels.length - 1];\n                var td = [];\n                var cellContent = allDaySlot.cellContent;\n                for (columnIndex = 0; columnIndex < lastLevel.length; columnIndex++) {\n                    td.push('<td class=\"' + (lastLevel[columnIndex].className || '') + '\">' + (cellContent ? cellContent(columnIndex) : '&nbsp;') + '</td>');\n                }\n                allDayTableRows.push(td.join(''));\n            }\n            return $('<div class=\"k-scheduler-header k-state-default\">' + '<div class=\"k-scheduler-header-wrap\">' + table(dateTableRows) + allDayTable(allDayTableRows, 'k-scheduler-header-all-day') + '</div>' + '</div>');\n        }\n        function times(rowLevels, rowCount) {\n            var rows = new Array(rowCount).join().split(',');\n            var rowHeaderRows = [];\n            var rowIndex;\n            for (var rowLevelIndex = 0; rowLevelIndex < rowLevels.length; rowLevelIndex++) {\n                var level = rowLevels[rowLevelIndex];\n                var rowspan = rowCount / level.length;\n                var className;\n                for (rowIndex = 0; rowIndex < level.length; rowIndex++) {\n                    className = level[rowIndex].className || '';\n                    if (level[rowIndex].allDay) {\n                        className = 'k-scheduler-times-all-day';\n                    }\n                    rows[rowspan * rowIndex] += '<th class=\"' + className + '\" rowspan=\"' + rowspan + '\">' + level[rowIndex].text + '</th>';\n                }\n            }\n            for (rowIndex = 0; rowIndex < rowCount; rowIndex++) {\n                rowHeaderRows.push(rows[rowIndex]);\n            }\n            if (rowCount < 1) {\n                return $();\n            }\n            return $('<div class=\"k-scheduler-times\">' + table(rowHeaderRows) + '</div>');\n        }\n        function content() {\n            return $('<div class=\"k-scheduler-content\">' + '<table ' + cellspacing() + ' class=\"k-scheduler-table\"/>' + '</div>');\n        }\n        var HINT = '<div class=\"k-marquee k-scheduler-marquee\">' + '<div class=\"k-marquee-color\"></div>' + '<div class=\"k-marquee-text\">' + '<div class=\"k-label-top\"></div>' + '<div class=\"k-label-bottom\"></div>' + '</div>' + '</div>';\n        var ResourceView = kendo.Class.extend({\n            init: function (index, isRtl) {\n                this._index = index;\n                this._timeSlotCollections = [];\n                this._daySlotCollections = [];\n                this._isRtl = isRtl;\n            },\n            addTimeSlotCollection: function (startDate, endDate) {\n                return this._addCollection(startDate, endDate, this._timeSlotCollections);\n            },\n            addDaySlotCollection: function (startDate, endDate) {\n                return this._addCollection(startDate, endDate, this._daySlotCollections);\n            },\n            _addCollection: function (startDate, endDate, collections) {\n                var collection = new SlotCollection(startDate, endDate, this._index, collections.length);\n                collections.push(collection);\n                return collection;\n            },\n            timeSlotCollectionCount: function () {\n                return this._timeSlotCollections.length;\n            },\n            daySlotCollectionCount: function () {\n                return this._daySlotCollections.length;\n            },\n            daySlotByPosition: function (x, y, byDate) {\n                return this._slotByPosition(x, y, this._daySlotCollections, byDate);\n            },\n            timeSlotByPosition: function (x, y, byDate) {\n                return this._slotByPosition(x, y, this._timeSlotCollections, byDate);\n            },\n            _slotByPosition: function (x, y, collections, byDate) {\n                for (var collectionIndex = 0; collectionIndex < collections.length; collectionIndex++) {\n                    var collection = collections[collectionIndex];\n                    for (var slotIndex = 0; slotIndex < collection.count(); slotIndex++) {\n                        var slot = collection.at(slotIndex);\n                        var width = slot.offsetWidth;\n                        var height = slot.offsetHeight;\n                        var nextSlot;\n                        var horizontalEnd = slot.offsetLeft + width;\n                        var verticalEnd = slot.offsetTop + height;\n                        if (!byDate) {\n                            nextSlot = collection.at(slotIndex + 1);\n                        }\n                        if (nextSlot) {\n                            if (nextSlot.offsetLeft != slot.offsetLeft) {\n                                if (this._isRtl) {\n                                    horizontalEnd = slot.offsetLeft + (slot.offsetLeft - nextSlot.offsetLeft);\n                                } else {\n                                    horizontalEnd = nextSlot.offsetLeft;\n                                }\n                            } else {\n                                verticalEnd = nextSlot.offsetTop;\n                            }\n                        }\n                        if (x >= slot.offsetLeft && x < horizontalEnd && y >= slot.offsetTop && y < verticalEnd) {\n                            return slot;\n                        }\n                    }\n                }\n            },\n            refresh: function () {\n                var collectionIndex;\n                for (collectionIndex = 0; collectionIndex < this._daySlotCollections.length; collectionIndex++) {\n                    this._daySlotCollections[collectionIndex].refresh();\n                }\n                for (collectionIndex = 0; collectionIndex < this._timeSlotCollections.length; collectionIndex++) {\n                    this._timeSlotCollections[collectionIndex].refresh();\n                }\n            },\n            timeSlotRanges: function (startTime, endTime) {\n                var collections = this._timeSlotCollections;\n                var start = this._startSlot(startTime, collections);\n                if (!start.inRange && startTime >= start.slot.end) {\n                    start = null;\n                }\n                var end = start;\n                if (startTime < endTime) {\n                    end = this._endSlot(endTime, collections);\n                }\n                if (end && !end.inRange && endTime <= end.slot.start) {\n                    end = null;\n                }\n                if (start === null && end === null) {\n                    return [];\n                }\n                if (start === null) {\n                    start = {\n                        inRange: true,\n                        slot: collections[end.slot.collectionIndex].first()\n                    };\n                }\n                if (end === null) {\n                    end = {\n                        inRange: true,\n                        slot: collections[start.slot.collectionIndex].last()\n                    };\n                }\n                return this._continuousRange(TimeSlotRange, collections, start, end);\n            },\n            daySlotRanges: function (startTime, endTime, isAllDay) {\n                var collections = this._daySlotCollections;\n                var start = this._startSlot(startTime, collections, isAllDay);\n                if (!start.inRange && startTime >= start.slot.end) {\n                    start = null;\n                }\n                var end = start;\n                if (startTime < endTime) {\n                    end = this._endSlot(endTime, collections, isAllDay);\n                }\n                if (end && !end.inRange && endTime <= end.slot.start) {\n                    end = null;\n                }\n                if (start === null && end === null) {\n                    return [];\n                }\n                if (start === null) {\n                    do {\n                        startTime += kendo.date.MS_PER_DAY;\n                        start = this._startSlot(startTime, collections, isAllDay);\n                    } while (!start.inRange && startTime >= start.slot.end);\n                }\n                if (end === null) {\n                    do {\n                        endTime -= kendo.date.MS_PER_DAY;\n                        end = this._endSlot(endTime, collections, isAllDay);\n                    } while (!end.inRange && endTime <= end.slot.start);\n                }\n                return this._continuousRange(DaySlotRange, collections, start, end);\n            },\n            _continuousRange: function (range, collections, start, end) {\n                var startSlot = start.slot;\n                var endSlot = end.slot;\n                var startIndex = startSlot.collectionIndex;\n                var endIndex = endSlot.collectionIndex;\n                var ranges = [];\n                for (var collectionIndex = startIndex; collectionIndex <= endIndex; collectionIndex++) {\n                    var collection = collections[collectionIndex];\n                    var first = collection.first();\n                    var last = collection.last();\n                    var head = false;\n                    var tail = false;\n                    if (collectionIndex == startIndex) {\n                        tail = !start.inRange;\n                    }\n                    if (collectionIndex == endIndex) {\n                        head = !end.inRange;\n                    }\n                    if (first.start < startSlot.start) {\n                        first = startSlot;\n                    }\n                    if (last.start > endSlot.start) {\n                        last = endSlot;\n                    }\n                    if (startIndex < endIndex) {\n                        if (collectionIndex == startIndex) {\n                            head = true;\n                        } else if (collectionIndex == endIndex) {\n                            tail = true;\n                        } else {\n                            head = tail = true;\n                        }\n                    }\n                    ranges.push(new range({\n                        start: first,\n                        end: last,\n                        collection: collection,\n                        head: head,\n                        tail: tail\n                    }));\n                }\n                return ranges;\n            },\n            slotRanges: function (event, isDay) {\n                var startTime = event._startTime || kendo.date.toUtcTime(event.start);\n                var endTime = event._endTime || kendo.date.toUtcTime(event.end);\n                if (isDay === undefined) {\n                    isDay = event.isMultiDay();\n                }\n                if (isDay) {\n                    return this.daySlotRanges(startTime, endTime, event.isAllDay);\n                }\n                return this.timeSlotRanges(startTime, endTime);\n            },\n            ranges: function (startTime, endTime, isDay, isAllDay) {\n                if (typeof startTime != 'number') {\n                    startTime = kendo.date.toUtcTime(startTime);\n                }\n                if (typeof endTime != 'number') {\n                    endTime = kendo.date.toUtcTime(endTime);\n                }\n                if (isDay) {\n                    return this.daySlotRanges(startTime, endTime, isAllDay);\n                }\n                return this.timeSlotRanges(startTime, endTime);\n            },\n            _startCollection: function (date, collections) {\n                for (var collectionIndex = 0; collectionIndex < collections.length; collectionIndex++) {\n                    var collection = collections[collectionIndex];\n                    if (collection.startInRange(date)) {\n                        return collection;\n                    }\n                }\n                return null;\n            },\n            _endCollection: function (date, collections, isAllDay) {\n                for (var collectionIndex = 0; collectionIndex < collections.length; collectionIndex++) {\n                    var collection = collections[collectionIndex];\n                    if (collection.endInRange(date, isAllDay)) {\n                        return collection;\n                    }\n                }\n                return null;\n            },\n            _getCollections: function (isDay) {\n                return isDay ? this._daySlotCollections : this._timeSlotCollections;\n            },\n            continuousSlot: function (slot, reverse) {\n                var pad = reverse ? -1 : 1;\n                var collections = this._getCollections(slot.isDaySlot);\n                var collection = collections[slot.collectionIndex + pad];\n                return collection ? collection[reverse ? 'last' : 'first']() : undefined;\n            },\n            firstSlot: function () {\n                var collections = this._getCollections(this.daySlotCollectionCount());\n                return collections[0].first();\n            },\n            lastSlot: function () {\n                var collections = this._getCollections(this.daySlotCollectionCount());\n                return collections[collections.length - 1].last();\n            },\n            upSlot: function (slot, keepCollection, groupByDateVertically) {\n                var that = this;\n                var moveToDaySlot = function (isDaySlot, collectionIndex, index) {\n                    var isFirstCell = index === 0;\n                    if (!keepCollection && !isDaySlot && isFirstCell && that.daySlotCollectionCount()) {\n                        return that._daySlotCollections[0].at(collectionIndex);\n                    }\n                };\n                if (!this.timeSlotCollectionCount()) {\n                    keepCollection = true;\n                }\n                return this._verticalSlot(slot, -1, moveToDaySlot, groupByDateVertically);\n            },\n            downSlot: function (slot, keepCollection, groupByDateVertically) {\n                var that = this;\n                var moveToTimeSlot = function (isDaySlot, collectionIndex, index) {\n                    if (!keepCollection && isDaySlot && that.timeSlotCollectionCount()) {\n                        return that._timeSlotCollections[index].at(0);\n                    }\n                };\n                if (!this.timeSlotCollectionCount()) {\n                    keepCollection = true;\n                }\n                return this._verticalSlot(slot, 1, moveToTimeSlot, groupByDateVertically);\n            },\n            leftSlot: function (slot, groupByDateVertically) {\n                return this._horizontalSlot(slot, -1, groupByDateVertically);\n            },\n            rightSlot: function (slot, groupByDateVertically) {\n                return this._horizontalSlot(slot, 1, groupByDateVertically);\n            },\n            _horizontalSlot: function (slot, step, groupByDateVertically) {\n                var index = slot.index;\n                var isDaySlot = slot.isDaySlot;\n                var collectionIndex = slot.collectionIndex;\n                var collections = this._getCollections(isDaySlot);\n                isDaySlot = groupByDateVertically ? false : isDaySlot;\n                if (isDaySlot) {\n                    index += step;\n                } else {\n                    collectionIndex += step;\n                }\n                var collection = collections[collectionIndex];\n                return collection ? collection.at(index) : undefined;\n            },\n            _verticalSlot: function (slot, step, swapCollection, groupByDateVertically) {\n                var index = slot.index;\n                var isDaySlot = slot.isDaySlot;\n                var collectionIndex = slot.collectionIndex;\n                var collections = this._getCollections(isDaySlot);\n                slot = swapCollection(isDaySlot, collectionIndex, index);\n                if (slot) {\n                    return slot;\n                }\n                isDaySlot = groupByDateVertically ? false : isDaySlot;\n                if (isDaySlot) {\n                    collectionIndex += step;\n                } else {\n                    index += step;\n                }\n                var collection = collections[collectionIndex];\n                return collection ? collection.at(index) : undefined;\n            },\n            _collection: function (index, multiday) {\n                var collections = multiday ? this._daySlotCollections : this._timeSlotCollections;\n                return collections[index];\n            },\n            _startSlot: function (time, collections, isAllDay) {\n                var collection = this._startCollection(time, collections);\n                var inRange = true;\n                if (!collection) {\n                    collection = collections[0];\n                    inRange = false;\n                }\n                var slot = collection.slotByStartDate(time, isAllDay);\n                if (!slot) {\n                    slot = collection.first();\n                    inRange = false;\n                }\n                return {\n                    slot: slot,\n                    inRange: inRange\n                };\n            },\n            _endSlot: function (time, collections, isAllDay) {\n                var collection = this._endCollection(time, collections, isAllDay);\n                var inRange = true;\n                if (!collection) {\n                    collection = collections[collections.length - 1];\n                    inRange = false;\n                }\n                var slot = collection.slotByEndDate(time, isAllDay);\n                if (!slot) {\n                    slot = collection.last();\n                    inRange = false;\n                }\n                return {\n                    slot: slot,\n                    inRange: inRange\n                };\n            },\n            getSlotCollection: function (index, isDay) {\n                return this[isDay ? 'getDaySlotCollection' : 'getTimeSlotCollection'](index);\n            },\n            getTimeSlotCollection: function (index) {\n                return this._timeSlotCollections[index];\n            },\n            getDaySlotCollection: function (index) {\n                return this._daySlotCollections[index];\n            }\n        });\n        var SlotRange = kendo.Class.extend({\n            init: function (options) {\n                $.extend(this, options);\n            },\n            innerHeight: function () {\n                var collection = this.collection;\n                var startIndex = this.start.index;\n                var endIndex = this.end.index;\n                var result = 0;\n                for (var slotIndex = startIndex; slotIndex <= endIndex; slotIndex++) {\n                    result += collection.at(slotIndex).offsetHeight;\n                }\n                return result;\n            },\n            events: function () {\n                return this.collection.events();\n            },\n            addEvent: function (event) {\n                this.events().push(event);\n            },\n            startSlot: function () {\n                if (this.start.offsetLeft > this.end.offsetLeft) {\n                    return this.end;\n                }\n                return this.start;\n            },\n            endSlot: function () {\n                if (this.start.offsetLeft > this.end.offsetLeft) {\n                    return this.start;\n                }\n                return this.end;\n            }\n        });\n        var TimeSlotRange = SlotRange.extend({\n            innerHeight: function () {\n                var collection = this.collection;\n                var startIndex = this.start.index;\n                var endIndex = this.end.index;\n                var result = 0;\n                for (var slotIndex = startIndex; slotIndex <= endIndex; slotIndex++) {\n                    result += collection.at(slotIndex).offsetHeight;\n                }\n                return result;\n            },\n            outerRect: function (start, end, snap) {\n                return this._rect('offset', start, end, snap);\n            },\n            _rect: function (property, start, end, snap) {\n                var top;\n                var bottom;\n                var left;\n                var right;\n                var startSlot = this.start;\n                var endSlot = this.end;\n                var isRtl = kendo.support.isRtl(startSlot.element);\n                if (typeof start != 'number') {\n                    start = kendo.date.toUtcTime(start);\n                }\n                if (typeof end != 'number') {\n                    end = kendo.date.toUtcTime(end);\n                }\n                if (snap) {\n                    top = startSlot.offsetTop;\n                    bottom = endSlot.offsetTop + endSlot[property + 'Height'];\n                    if (isRtl) {\n                        left = endSlot.offsetLeft;\n                        right = startSlot.offsetLeft + startSlot[property + 'Width'];\n                    } else {\n                        left = startSlot.offsetLeft;\n                        right = endSlot.offsetLeft + endSlot[property + 'Width'];\n                    }\n                } else {\n                    var startOffset = start - startSlot.start;\n                    if (startOffset < 0) {\n                        startOffset = 0;\n                    }\n                    var startSlotDuration = startSlot.end - startSlot.start;\n                    top = startSlot.offsetTop + startSlot[property + 'Height'] * startOffset / startSlotDuration;\n                    var endOffset = endSlot.end - end;\n                    if (endOffset < 0) {\n                        endOffset = 0;\n                    }\n                    var endSlotDuration = endSlot.end - endSlot.start;\n                    bottom = endSlot.offsetTop + endSlot[property + 'Height'] - endSlot[property + 'Height'] * endOffset / endSlotDuration;\n                    if (isRtl) {\n                        left = Math.round(endSlot.offsetLeft + endSlot[property + 'Width'] * endOffset / endSlotDuration);\n                        right = Math.round(startSlot.offsetLeft + startSlot[property + 'Width'] - startSlot[property + 'Width'] * startOffset / startSlotDuration);\n                    } else {\n                        left = Math.round(startSlot.offsetLeft + startSlot[property + 'Width'] * startOffset / startSlotDuration);\n                        right = Math.round(endSlot.offsetLeft + endSlot[property + 'Width'] - endSlot[property + 'Width'] * endOffset / endSlotDuration);\n                    }\n                }\n                return {\n                    top: top,\n                    bottom: bottom,\n                    left: left === 0 ? left : left + 1,\n                    right: right\n                };\n            },\n            innerRect: function (start, end, snap) {\n                return this._rect('client', start, end, snap);\n            }\n        });\n        var DaySlotRange = SlotRange.extend({\n            innerWidth: function () {\n                var collection = this.collection;\n                var startIndex = this.start.index;\n                var endIndex = this.end.index;\n                var result = 0;\n                var width = startIndex !== endIndex ? 'offsetWidth' : 'clientWidth';\n                for (var slotIndex = startIndex; slotIndex <= endIndex; slotIndex++) {\n                    result += collection.at(slotIndex)[width];\n                }\n                return result;\n            }\n        });\n        var SlotCollection = kendo.Class.extend({\n            init: function (startDate, endDate, groupIndex, collectionIndex) {\n                this._slots = [];\n                this._events = [];\n                this._start = kendo.date.toUtcTime(startDate);\n                this._end = kendo.date.toUtcTime(endDate);\n                this._groupIndex = groupIndex;\n                this._collectionIndex = collectionIndex;\n            },\n            refresh: function () {\n                for (var slotIndex = 0; slotIndex < this._slots.length; slotIndex++) {\n                    this._slots[slotIndex].refresh();\n                }\n            },\n            startInRange: function (date) {\n                return this._start <= date && date < this._end;\n            },\n            endInRange: function (date, isAllDay) {\n                var end = isAllDay ? date < this._end : date <= this._end;\n                return this._start <= date && end;\n            },\n            slotByStartDate: function (date) {\n                var time = date;\n                if (typeof time != 'number') {\n                    time = kendo.date.toUtcTime(date);\n                }\n                for (var slotIndex = 0; slotIndex < this._slots.length; slotIndex++) {\n                    var slot = this._slots[slotIndex];\n                    if (slot.startInRange(time)) {\n                        return slot;\n                    }\n                }\n                return null;\n            },\n            slotByEndDate: function (date, allday) {\n                var time = date;\n                if (typeof time != 'number') {\n                    time = kendo.date.toUtcTime(date);\n                }\n                if (allday) {\n                    return this.slotByStartDate(date, false);\n                }\n                for (var slotIndex = 0; slotIndex < this._slots.length; slotIndex++) {\n                    var slot = this._slots[slotIndex];\n                    if (slot.endInRange(time)) {\n                        return slot;\n                    }\n                }\n                return null;\n            },\n            count: function () {\n                return this._slots.length;\n            },\n            events: function () {\n                return this._events;\n            },\n            addTimeSlot: function (element, start, end, isHorizontal) {\n                var slot = new TimeSlot(element, start, end, this._groupIndex, this._collectionIndex, this._slots.length, isHorizontal);\n                this._slots.push(slot);\n            },\n            addDaySlot: function (element, start, end, eventCount) {\n                var slot = new DaySlot(element, start, end, this._groupIndex, this._collectionIndex, this._slots.length, eventCount);\n                this._slots.push(slot);\n            },\n            first: function () {\n                return this._slots[0];\n            },\n            last: function () {\n                return this._slots[this._slots.length - 1];\n            },\n            at: function (index) {\n                return this._slots[index];\n            }\n        });\n        var Slot = kendo.Class.extend({\n            init: function (element, start, end, groupIndex, collectionIndex, index) {\n                this.element = element;\n                this.clientWidth = element.clientWidth;\n                this.clientHeight = element.clientHeight;\n                this.offsetWidth = element.offsetWidth;\n                this.offsetHeight = element.offsetHeight;\n                this.offsetTop = element.offsetTop;\n                this.offsetLeft = element.offsetLeft;\n                this.start = start;\n                this.end = end;\n                this.element = element;\n                this.groupIndex = groupIndex;\n                this.collectionIndex = collectionIndex;\n                this.index = index;\n                this.isDaySlot = false;\n            },\n            refresh: function () {\n                var element = this.element;\n                this.clientWidth = element.clientWidth;\n                this.clientHeight = element.clientHeight;\n                this.offsetWidth = element.offsetWidth;\n                this.offsetHeight = element.offsetHeight;\n                this.offsetTop = element.offsetTop;\n                this.offsetLeft = element.offsetLeft;\n            },\n            startDate: function () {\n                return kendo.timezone.toLocalDate(this.start);\n            },\n            endDate: function () {\n                return kendo.timezone.toLocalDate(this.end);\n            },\n            startInRange: function (date) {\n                return this.start <= date && date < this.end;\n            },\n            endInRange: function (date) {\n                return this.start < date && date <= this.end;\n            },\n            startOffset: function () {\n                return this.start;\n            },\n            endOffset: function () {\n                return this.end;\n            }\n        });\n        var TimeSlot = Slot.extend({\n            init: function (element, start, end, groupIndex, collectionIndex, index, isHorizontal) {\n                Slot.fn.init.apply(this, arguments);\n                this.isHorizontal = isHorizontal ? true : false;\n            },\n            offsetX: function (rtl, offset) {\n                if (rtl) {\n                    return this.offsetLeft + offset;\n                } else {\n                    return this.offsetLeft + offset;\n                }\n            },\n            startInRange: function (date) {\n                return this.start <= date && date < this.end;\n            },\n            endInRange: function (date) {\n                return this.start < date && date <= this.end;\n            },\n            startOffset: function (x, y, snap) {\n                if (snap) {\n                    return this.start;\n                }\n                var offset = $(this.element).offset();\n                var duration = this.end - this.start;\n                var difference;\n                var time;\n                if (this.isHorizontal) {\n                    var isRtl = kendo.support.isRtl(this.element);\n                    difference = x - offset.left;\n                    time = Math.floor(duration * (difference / this.offsetWidth));\n                    if (isRtl) {\n                        return this.start + duration - time;\n                    }\n                } else {\n                    difference = y - offset.top;\n                    time = Math.floor(duration * (difference / this.offsetHeight));\n                }\n                return this.start + time;\n            },\n            endOffset: function (x, y, snap) {\n                if (snap) {\n                    return this.end;\n                }\n                var offset = $(this.element).offset();\n                var duration = this.end - this.start;\n                var difference;\n                var time;\n                if (this.isHorizontal) {\n                    var isRtl = kendo.support.isRtl(this.element);\n                    difference = x - offset.left;\n                    time = Math.floor(duration * (difference / this.offsetWidth));\n                    if (isRtl) {\n                        return this.start + duration - time;\n                    }\n                } else {\n                    difference = y - offset.top;\n                    time = Math.floor(duration * (difference / this.offsetHeight));\n                }\n                return this.start + time;\n            }\n        });\n        var DaySlot = Slot.extend({\n            init: function (element, start, end, groupIndex, collectionIndex, index, eventCount) {\n                Slot.fn.init.apply(this, arguments);\n                this.eventCount = eventCount;\n                this.isDaySlot = true;\n                if (this.element.children.length) {\n                    this.firstChildHeight = this.element.children[0].offsetHeight + 3;\n                    this.firstChildTop = this.element.children[0].offsetTop;\n                } else {\n                    this.firstChildHeight = 3;\n                    this.firstChildTop = 0;\n                }\n            },\n            startDate: function () {\n                var date = new Date(this.start);\n                return kendo.timezone.apply(date, 'Etc/UTC');\n            },\n            endDate: function () {\n                var date = new Date(this.end);\n                return kendo.timezone.apply(date, 'Etc/UTC');\n            },\n            startInRange: function (date) {\n                return this.start <= date && date < this.end;\n            },\n            endInRange: function (date) {\n                return this.start < date && date <= this.end;\n            }\n        });\n        var scrollbarWidth;\n        function scrollbar() {\n            scrollbarWidth = scrollbarWidth ? scrollbarWidth : kendo.support.scrollbar();\n            return scrollbarWidth;\n        }\n        kendo.ui.SchedulerView = Widget.extend({\n            init: function (element, options) {\n                Widget.fn.init.call(this, element, options);\n                this._normalizeOptions();\n                this._scrollbar = scrollbar();\n                this._isRtl = kendo.support.isRtl(element);\n                this._resizeHint = $();\n                this._moveHint = $();\n                this._cellId = kendo.guid();\n                this._resourcesForGroups();\n                this._selectedSlots = [];\n            },\n            _normalizeOptions: function () {\n                var options = this.options;\n                if (options.startTime) {\n                    options.startTime.setMilliseconds(0);\n                }\n                if (options.endTime) {\n                    options.endTime.setMilliseconds(0);\n                }\n                if (options.workDayStart) {\n                    options.workDayStart.setMilliseconds(0);\n                }\n                if (options.workDayEnd) {\n                    options.workDayEnd.setMilliseconds(0);\n                }\n            },\n            _isMobile: function () {\n                var options = this.options;\n                return options.mobile === true && kendo.support.mobileOS || options.mobile === 'phone' || options.mobile === 'tablet';\n            },\n            _isMobilePhoneView: function () {\n                var options = this.options;\n                return options.mobile === true && kendo.support.mobileOS && !kendo.support.mobileOS.tablet || options.mobile === 'phone';\n            },\n            _addResourceView: function () {\n                var resourceView = new ResourceView(this.groups.length, this._isRtl);\n                this.groups.push(resourceView);\n                return resourceView;\n            },\n            dateForTitle: function () {\n                return kendo.format(this.options.selectedDateFormat, this.startDate(), this.endDate());\n            },\n            shortDateForTitle: function () {\n                return kendo.format(this.options.selectedShortDateFormat, this.startDate(), this.endDate());\n            },\n            _changeGroup: function (selection, previous) {\n                var method = previous ? 'prevGroupSlot' : 'nextGroupSlot';\n                var slot = this[method](selection.start, selection.groupIndex, selection.isAllDay);\n                if (slot) {\n                    selection.groupIndex += previous ? -1 : 1;\n                }\n                if (this._isGroupedByDate() && !slot) {\n                    selection.groupIndex = previous ? this.groups.length - 1 : 0;\n                }\n                return slot;\n            },\n            _changeDate: function (selection, slot, previous) {\n                var group = this.groups[selection.groupIndex];\n                var collections, index;\n                if (previous) {\n                    collections = group._getCollections(false);\n                    index = group.daySlotCollectionCount() ? slot.index - 1 : slot.collectionIndex - 1;\n                    if (index >= 0) {\n                        return collections[index]._slots[collections[index]._slots.length - 1];\n                    }\n                } else {\n                    collections = group._getCollections(group.daySlotCollectionCount());\n                    index = group.daySlotCollectionCount() ? 0 : slot.collectionIndex + 1;\n                    var slotIndex = group.daySlotCollectionCount() ? slot.collectionIndex + 1 : 0;\n                    if (collections[index] && collections[index]._slots[slotIndex]) {\n                        return collections[index]._slots[slotIndex];\n                    }\n                }\n            },\n            _changeGroupContinuously: function () {\n                return null;\n            },\n            _changeViewPeriod: function () {\n                return false;\n            },\n            _horizontalSlots: function (selection, ranges, multiple, reverse) {\n                var method = reverse ? 'leftSlot' : 'rightSlot';\n                var horizontalRange = {\n                    startSlot: ranges[0].start,\n                    endSlot: ranges[ranges.length - 1].end\n                };\n                var group = this.groups[selection.groupIndex];\n                var isVertical = this._isVerticallyGrouped();\n                if (!multiple) {\n                    var slot = this._normalizeHorizontalSelection(selection, ranges, reverse);\n                    if (slot) {\n                        horizontalRange.startSlot = horizontalRange.endSlot = slot;\n                    }\n                }\n                if (this._isGroupedByDate() && !multiple) {\n                    var tempSlot = this._changeGroup(selection, reverse);\n                    if (!tempSlot) {\n                        horizontalRange = this._getNextHorizontalRange(group, method, horizontalRange);\n                    } else {\n                        horizontalRange.startSlot = horizontalRange.endSlot = tempSlot;\n                    }\n                } else {\n                    horizontalRange.startSlot = group[method](horizontalRange.startSlot);\n                    horizontalRange.endSlot = group[method](horizontalRange.endSlot);\n                    if (!multiple && !isVertical && (!horizontalRange.startSlot || !horizontalRange.endSlot)) {\n                        horizontalRange.startSlot = horizontalRange.endSlot = this._changeGroup(selection, reverse);\n                    }\n                }\n                var continuousSlot;\n                if ((!horizontalRange.startSlot || !horizontalRange.endSlot) && !this._isGroupedByDate()) {\n                    continuousSlot = this._continuousSlot(selection, ranges, reverse);\n                    continuousSlot = this._changeGroupContinuously(selection, continuousSlot, multiple, reverse);\n                    if (continuousSlot) {\n                        horizontalRange.startSlot = horizontalRange.endSlot = continuousSlot;\n                    }\n                }\n                return horizontalRange;\n            },\n            _getNextHorizontalRange: function (group, method, horizontalRange) {\n                if (!this._isVerticallyGrouped()) {\n                    horizontalRange.startSlot = group[method](horizontalRange.startSlot);\n                    horizontalRange.endSlot = group[method](horizontalRange.endSlot);\n                }\n                return horizontalRange;\n            },\n            _verticalSlots: function (selection, ranges, multiple, reverse) {\n                var group = this.groups[selection.groupIndex];\n                var slot;\n                var verticalRange = {\n                    startSlot: ranges[0].start,\n                    endSlot: ranges[ranges.length - 1].end\n                };\n                if (!multiple) {\n                    slot = this._normalizeVerticalSelection(selection, ranges, reverse);\n                    if (slot) {\n                        verticalRange.startSlot = verticalRange.endSlot = slot;\n                    }\n                }\n                var method = reverse ? 'upSlot' : 'downSlot';\n                verticalRange = this._getNextVerticalRange(group, method, verticalRange, multiple);\n                if (!multiple && this._isVerticallyGrouped() && (!verticalRange.startSlot || !verticalRange.endSlot)) {\n                    if (this._isGroupedByDate()) {\n                        verticalRange.startSlot = verticalRange.endSlot = this._changeDate(selection, slot, reverse);\n                    } else {\n                        verticalRange.startSlot = verticalRange.endSlot = this._changeGroup(selection, reverse);\n                    }\n                }\n                return verticalRange;\n            },\n            _getNextVerticalRange: function (group, method, verticalRange, multiple) {\n                verticalRange.startSlot = group[method](verticalRange.startSlot, multiple);\n                verticalRange.endSlot = group[method](verticalRange.endSlot, multiple);\n                return verticalRange;\n            },\n            _normalizeHorizontalSelection: function () {\n                return null;\n            },\n            _normalizeVerticalSelection: function (selection, ranges, reverse) {\n                var slot;\n                if (reverse) {\n                    slot = ranges[0].start;\n                } else {\n                    slot = ranges[ranges.length - 1].end;\n                }\n                return slot;\n            },\n            _continuousSlot: function () {\n                return null;\n            },\n            constrainSelection: function (selection) {\n                var group = this.groups[0];\n                var slot;\n                if (!this.inRange(selection)) {\n                    slot = group.firstSlot();\n                    selection.isAllDay = slot.isDaySlot;\n                    selection.start = slot.startDate();\n                    selection.end = slot.endDate();\n                } else {\n                    if (!group.daySlotCollectionCount()) {\n                        selection.isAllDay = false;\n                    } else if (!group.timeSlotCollectionCount()) {\n                        selection.isAllDay = true;\n                    }\n                }\n                if (!this.groups[selection.groupIndex]) {\n                    selection.groupIndex = 0;\n                }\n            },\n            move: function (selection, key, shift) {\n                var handled = false;\n                var group = this.groups[selection.groupIndex];\n                var verticalByDate = this._isGroupedByDate() && this._isVerticallyGrouped();\n                if (!group.timeSlotCollectionCount()) {\n                    selection.isAllDay = true;\n                }\n                var ranges = group.ranges(selection.start, selection.end, selection.isAllDay, false);\n                var startSlot, endSlot, reverse, slots;\n                if (key === keys.DOWN || key === keys.UP) {\n                    handled = true;\n                    reverse = key === keys.UP;\n                    this._updateDirection(selection, ranges, shift, reverse, true);\n                    slots = this._verticalSlots(selection, ranges, shift, reverse);\n                    if (!slots.startSlot && !shift && this._changeViewPeriod(selection, reverse, !verticalByDate)) {\n                        return handled;\n                    }\n                } else if (key === keys.LEFT || key === keys.RIGHT) {\n                    handled = true;\n                    reverse = key === keys.LEFT;\n                    this._updateDirection(selection, ranges, shift, reverse, false);\n                    slots = this._horizontalSlots(selection, ranges, shift, reverse);\n                    if (!slots.startSlot && !shift && this._changeViewPeriod(selection, reverse, verticalByDate)) {\n                        return handled;\n                    }\n                }\n                if (handled) {\n                    startSlot = slots.startSlot;\n                    endSlot = slots.endSlot;\n                    if (shift) {\n                        var backward = selection.backward;\n                        if (backward && startSlot) {\n                            selection.start = startSlot.startDate();\n                        } else if (!backward && endSlot) {\n                            selection.end = endSlot.endDate();\n                        }\n                    } else if (startSlot && endSlot) {\n                        selection.isAllDay = startSlot.isDaySlot;\n                        selection.start = startSlot.startDate();\n                        selection.end = endSlot.endDate();\n                    }\n                    selection.events = [];\n                }\n                return handled;\n            },\n            moveToEventInGroup: function (group, slot, selectedEvents, prev) {\n                var events = group._continuousEvents || [];\n                var found, event;\n                var pad = prev ? -1 : 1;\n                var length = events.length;\n                var idx = prev ? length - 1 : 0;\n                while (idx < length && idx > -1) {\n                    event = events[idx];\n                    if (!prev && event.start.startDate() >= slot.startDate() || prev && event.start.startDate() <= slot.startDate()) {\n                        if (selectedEvents.length) {\n                            event = events[idx + pad];\n                        }\n                        if (event && $.inArray(event.uid, selectedEvents) === -1) {\n                            found = !!event;\n                            break;\n                        }\n                    }\n                    idx += pad;\n                }\n                return event;\n            },\n            moveToEvent: function (selection, prev) {\n                var groupIndex = selection.groupIndex;\n                var group = this.groups[groupIndex];\n                var slot = group.ranges(selection.start, selection.end, selection.isAllDay, false)[0].start;\n                var length = this.groups.length;\n                var pad = prev ? -1 : 1;\n                var events = selection.events;\n                var event;\n                if (this._isGroupedByDate()) {\n                    var allEvents = this._getAllEvents();\n                    var uniqueAllEvents = this._getUniqueEvents(allEvents);\n                    var sortedEvents = this._getSortedEvents(uniqueAllEvents);\n                    if (events.length === 0) {\n                        var eventIndex = this._getNextEventIndexBySlot(slot, sortedEvents, groupIndex);\n                        if (prev) {\n                            eventIndex--;\n                        }\n                        event = sortedEvents[eventIndex];\n                    } else {\n                        var idx = this._getStartIdx(events, sortedEvents);\n                        while (idx < sortedEvents.length && idx > -1) {\n                            if (events.length > 0) {\n                                slot = this._getSelectedSlot(slot, sortedEvents, event, idx, pad, prev);\n                            }\n                            if (!slot) {\n                                break;\n                            }\n                            if (!prev && sortedEvents[idx].start.startDate() >= slot.startDate() || prev && sortedEvents[idx].start.startDate() <= slot.startDate()) {\n                                if (events[0] != sortedEvents[idx].uid) {\n                                    event = sortedEvents[idx];\n                                    break;\n                                }\n                            }\n                            idx += pad;\n                        }\n                    }\n                } else {\n                    while (groupIndex < length && groupIndex > -1) {\n                        event = this.moveToEventInGroup(group, slot, events, prev);\n                        groupIndex += pad;\n                        group = this.groups[groupIndex];\n                        if (!group || event) {\n                            break;\n                        }\n                        events = [];\n                        if (prev) {\n                            slot = group.lastSlot();\n                        } else {\n                            slot = group.firstSlot(true);\n                        }\n                    }\n                }\n                if (event) {\n                    selection.events = [event.uid];\n                    selection.start = event.start.startDate();\n                    selection.end = event.end.endDate();\n                    selection.isAllDay = event.start.isDaySlot;\n                    selection.groupIndex = event.start.groupIndex;\n                }\n                return !!event;\n            },\n            current: function (candidate) {\n                if (candidate !== undefined) {\n                    this._current = candidate;\n                    if (this.content.has(candidate)) {\n                        this._scrollTo(candidate, this.content[0]);\n                    }\n                } else {\n                    return this._current;\n                }\n            },\n            select: function (selection) {\n                this.clearSelection();\n                if (!this._selectEvents(selection)) {\n                    this._selectSlots(selection);\n                }\n            },\n            _getNextEventIndexBySlot: function (slot, sortedEvents, groupIndex) {\n                var tempIndex = 0;\n                var slotStartDate = kendo.date.getDate(slot.startDate());\n                for (var i = 0; i < sortedEvents.length; i++) {\n                    var eventStartDate = kendo.date.getDate(sortedEvents[i].start.startDate());\n                    if (slotStartDate > eventStartDate) {\n                        tempIndex++;\n                        continue;\n                    }\n                    if (slotStartDate.getTime() === eventStartDate.getTime() && groupIndex > sortedEvents[i].start.groupIndex) {\n                        tempIndex++;\n                        continue;\n                    }\n                    if (slotStartDate.getTime() === eventStartDate.getTime() && groupIndex >= sortedEvents[i].start.groupIndex && slot.startDate() > sortedEvents[i].start.startDate()) {\n                        tempIndex++;\n                        continue;\n                    }\n                    break;\n                }\n                return tempIndex;\n            },\n            _getSelectedSlot: function (slot, sortedEvents, event, idx, pad, prev) {\n                if (sortedEvents[idx + pad] && sortedEvents[idx].start.groupIndex !== sortedEvents[idx + pad].start.groupIndex) {\n                    var groupIndex = sortedEvents[idx + pad].start.groupIndex;\n                    var group = this.groups[groupIndex];\n                    if (!group || event) {\n                        slot = null;\n                    }\n                    if (prev) {\n                        slot = group.lastSlot();\n                    } else {\n                        slot = group.firstSlot(true);\n                    }\n                }\n                return slot;\n            },\n            _getStartIdx: function (events, sortedEvents) {\n                var selectedEventIndex = 0;\n                $.each(sortedEvents, function () {\n                    if (this.uid === events[0]) {\n                        return false;\n                    }\n                    selectedEventIndex++;\n                });\n                return selectedEventIndex;\n            },\n            _getAllEvents: function () {\n                var allEvents = [];\n                var groups = this.groups;\n                for (var idx = 0; idx < groups.length; idx++) {\n                    if (groups[idx]._continuousEvents) {\n                        allEvents = allEvents.concat(groups[idx]._continuousEvents);\n                    }\n                }\n                return allEvents;\n            },\n            _getUniqueEvents: function (allEvents) {\n                var uniqueAllEvents = [];\n                for (var i = 0; i < allEvents.length; i++) {\n                    var exists = false;\n                    for (var j = 0; j < uniqueAllEvents.length; j++) {\n                        if (allEvents[i].uid === uniqueAllEvents[j].uid) {\n                            exists = true;\n                            break;\n                        }\n                    }\n                    if (!exists) {\n                        uniqueAllEvents.push(allEvents[i]);\n                    }\n                }\n                return uniqueAllEvents;\n            },\n            _getSortedEvents: function (uniqueAllEvents) {\n                return uniqueAllEvents.sort(function (first, second) {\n                    var firstStartDate = first.start.startDate();\n                    var secondStartDate = second.start.startDate();\n                    var result = kendo.date.getDate(firstStartDate) - kendo.date.getDate(secondStartDate);\n                    if (result === 0) {\n                        result = first.start.groupIndex - second.start.groupIndex;\n                    }\n                    if (result === 0) {\n                        result = firstStartDate.getTime() - secondStartDate.getTime();\n                    }\n                    if (result === 0) {\n                        if (first.start.isDaySlot && !second.start.isDaySlot) {\n                            result = -1;\n                        }\n                        if (!first.start.isDaySlot && second.start.isDaySlot) {\n                            result = 1;\n                        }\n                    }\n                    if (result === 0) {\n                        result = $(first.element).index() - $(second.element).index();\n                    }\n                    return result;\n                });\n            },\n            _selectSlots: function (selection) {\n                var isAllDay = selection.isAllDay;\n                var group = this.groups[selection.groupIndex];\n                if (!group.timeSlotCollectionCount()) {\n                    isAllDay = true;\n                }\n                this._selectedSlots = [];\n                var ranges = group.ranges(selection.start, selection.end, isAllDay, false);\n                var element;\n                var slot;\n                for (var rangeIndex = 0; rangeIndex < ranges.length; rangeIndex++) {\n                    var range = ranges[rangeIndex];\n                    var collection = range.collection;\n                    for (var slotIndex = range.start.index; slotIndex <= range.end.index; slotIndex++) {\n                        slot = collection.at(slotIndex);\n                        element = slot.element;\n                        element.setAttribute('aria-selected', true);\n                        addSelectedState(element);\n                        this._selectedSlots.push({\n                            start: slot.startDate(),\n                            end: slot.endDate(),\n                            element: element\n                        });\n                    }\n                }\n                if (selection.backward) {\n                    element = ranges[0].start.element;\n                }\n                this.current(element);\n            },\n            _selectEvents: function (selection) {\n                var found = false;\n                var events = selection.events;\n                var groupEvents = this.groups[selection.groupIndex]._continuousEvents || [];\n                var idx, length = groupEvents.length;\n                if (!events[0] || !groupEvents[0]) {\n                    return found;\n                }\n                var result = $();\n                selection.events = [];\n                for (idx = 0; idx < length; idx++) {\n                    if ($.inArray(groupEvents[idx].uid, events) > -1) {\n                        result = result.add(groupEvents[idx].element);\n                        selection.events.push(groupEvents[idx].uid);\n                    }\n                }\n                if (result[0]) {\n                    result.addClass('k-state-selected').attr('aria-selected', true);\n                    this.current(result.last()[0]);\n                    this._selectedSlots = [];\n                    found = true;\n                }\n                return found;\n            },\n            inRange: function (options) {\n                var startDate = this.startDate();\n                var endDate = kendo.date.addDays(this.endDate(), 1);\n                var start = options.start;\n                var end = options.end;\n                return startDate <= start && start < endDate && startDate < end && end <= endDate;\n            },\n            _resourceValue: function (resource, item) {\n                if (resource.valuePrimitive) {\n                    item = kendo.getter(resource.dataValueField)(item);\n                }\n                return item;\n            },\n            _resourceBySlot: function (slot) {\n                var resources = this.groupedResources;\n                var result = {};\n                if (resources.length) {\n                    var resourceIndex = slot.groupIndex;\n                    for (var idx = resources.length - 1; idx >= 0; idx--) {\n                        var resource = resources[idx];\n                        var value = this._resourceValue(resource, resource.dataSource.view()[resourceIndex % resource.dataSource.total()]);\n                        if (resource.multiple) {\n                            value = [value];\n                        }\n                        var setter = kendo.setter(resource.field);\n                        setter(result, value);\n                        resourceIndex = Math.floor(resourceIndex / resource.dataSource.total());\n                    }\n                }\n                return result;\n            },\n            _createResizeHint: function (left, top, width, height) {\n                return $(HINT).css({\n                    left: left,\n                    top: top,\n                    width: width,\n                    height: height\n                });\n            },\n            _removeResizeHint: function () {\n                this._resizeHint.remove();\n                this._resizeHint = $();\n            },\n            _removeMoveHint: function () {\n                this._moveHint.remove();\n                this._moveHint = $();\n            },\n            _scrollTo: function (element, container) {\n                var elementOffset = element.offsetTop, elementOffsetDir = element.offsetHeight, containerScroll = container.scrollTop, containerOffsetDir = container.clientHeight, bottomDistance = elementOffset + elementOffsetDir, result = 0;\n                if (containerScroll > elementOffset) {\n                    result = elementOffset;\n                } else if (bottomDistance > containerScroll + containerOffsetDir) {\n                    if (elementOffsetDir <= containerOffsetDir) {\n                        result = bottomDistance - containerOffsetDir;\n                    } else {\n                        result = elementOffset;\n                    }\n                } else {\n                    result = containerScroll;\n                }\n                container.scrollTop = result;\n            },\n            _shouldInverseResourceColor: function (resource) {\n                var resourceColorIsDark = new Color(resource.color).isDark();\n                var currentColor = this.element.css('color');\n                var currentColorIsDark = new Color(currentColor).isDark();\n                return resourceColorIsDark == currentColorIsDark;\n            },\n            _eventTmpl: function (template, wrapper) {\n                var options = this.options, settings = $.extend({}, kendo.Template, options.templateSettings), paramName = settings.paramName, html = '', type = typeof template, state = {\n                        storage: {},\n                        count: 0\n                    };\n                if (type === 'function') {\n                    state.storage['tmpl' + state.count] = template;\n                    html += '#=this.tmpl' + state.count + '(' + paramName + ')#';\n                    state.count++;\n                } else if (type === 'string') {\n                    html += template;\n                }\n                var tmpl = kendo.template(kendo.format(wrapper, html), settings);\n                if (state.count > 0) {\n                    tmpl = $.proxy(tmpl, state.storage);\n                }\n                return tmpl;\n            },\n            eventResources: function (event) {\n                var resources = [], options = this.options;\n                if (!options.resources) {\n                    return resources;\n                }\n                for (var idx = 0; idx < options.resources.length; idx++) {\n                    var resource = options.resources[idx];\n                    var field = resource.field;\n                    var eventResources = kendo.getter(field)(event);\n                    if (eventResources == null) {\n                        continue;\n                    }\n                    if (!resource.multiple) {\n                        eventResources = [eventResources];\n                    }\n                    var data = resource.dataSource.view();\n                    for (var resourceIndex = 0; resourceIndex < eventResources.length; resourceIndex++) {\n                        var eventResource = null;\n                        var value = eventResources[resourceIndex];\n                        if (!resource.valuePrimitive) {\n                            value = kendo.getter(resource.dataValueField)(value);\n                        }\n                        for (var dataIndex = 0; dataIndex < data.length; dataIndex++) {\n                            if (data[dataIndex].get(resource.dataValueField) == value) {\n                                eventResource = data[dataIndex];\n                                break;\n                            }\n                        }\n                        if (eventResource !== null) {\n                            var resourceColor = kendo.getter(resource.dataColorField)(eventResource);\n                            resources.push({\n                                field: resource.field,\n                                title: resource.title,\n                                name: resource.name,\n                                text: kendo.getter(resource.dataTextField)(eventResource),\n                                value: value,\n                                color: resourceColor\n                            });\n                        }\n                    }\n                }\n                return resources;\n            },\n            createLayout: function (layout) {\n                var allDayIndex = -1;\n                if (!layout.rows) {\n                    layout.rows = [];\n                }\n                for (var idx = 0; idx < layout.rows.length; idx++) {\n                    if (layout.rows[idx].allDay) {\n                        allDayIndex = idx;\n                        break;\n                    }\n                }\n                var allDaySlot = layout.rows[allDayIndex];\n                if (allDayIndex >= 0) {\n                    layout.rows.splice(allDayIndex, 1);\n                }\n                var columnLevels = this.columnLevels = levels(layout, 'columns');\n                var rowLevels = this.rowLevels = levels(layout, 'rows');\n                this.table = $('<table ' + cellspacing() + ' class=\"k-scheduler-layout k-scheduler-' + this.name + 'view\"><tbody></tbody></table>');\n                var rowCount = rowLevels[rowLevels.length - 1].length;\n                this.table.find('tbody:first').append(this._topSection(columnLevels, allDaySlot, rowCount));\n                this.table.find('tbody:first').append(this._bottomSection(columnLevels, rowLevels, rowCount));\n                this.element.append(this.table);\n                this._scroller();\n            },\n            refreshLayout: function () {\n                var that = this, toolbar = that.element.find('>.k-scheduler-toolbar'), height = that.element.innerHeight(), scrollbar = this._scrollbar, headerHeight = 0, paddingDirection = this._isRtl ? 'left' : 'right';\n                for (var idx = 0; idx < toolbar.length; idx++) {\n                    height -= outerHeight(toolbar.eq(idx));\n                }\n                if (that.datesHeader) {\n                    headerHeight = outerHeight(that.datesHeader);\n                }\n                if (that.timesHeader && outerHeight(that.timesHeader) > headerHeight) {\n                    headerHeight = outerHeight(that.timesHeader);\n                }\n                if (that.datesHeader && that.timesHeader) {\n                    var datesHeaderRows = that.datesHeader.find('table:first tr');\n                    that.timesHeader.find('tr').height(function (index) {\n                        $(this).height(datesHeaderRows.eq(index).height());\n                    });\n                }\n                if (headerHeight) {\n                    height -= headerHeight;\n                }\n                if (that.footer) {\n                    height -= outerHeight(that.footer);\n                }\n                var isSchedulerHeightSet = function (el) {\n                    var initialHeight, newHeight;\n                    if (el[0].style.height) {\n                        return true;\n                    } else {\n                        initialHeight = el.height();\n                    }\n                    el.height('auto');\n                    newHeight = el.height();\n                    if (initialHeight != newHeight) {\n                        el.height('');\n                        return true;\n                    }\n                    el.height('');\n                    return false;\n                };\n                var contentDiv = that.content[0], scrollbarWidth = !kendo.support.kineticScrollNeeded ? scrollbar : 0;\n                if (isSchedulerHeightSet(that.element)) {\n                    if (height > scrollbar * 2) {\n                        that.content.height(height);\n                    } else {\n                        that.content.height(scrollbar * 2 + 1);\n                    }\n                    that.times.height(contentDiv.clientHeight);\n                    var timesTable = that.times.find('table');\n                    if (timesTable.length) {\n                        timesTable.height(that.content.find('table')[0].clientHeight);\n                    }\n                }\n                if (contentDiv.offsetWidth - contentDiv.clientWidth > 0) {\n                    that.table.addClass('k-scrollbar-v');\n                    that.datesHeader.css('padding-' + paddingDirection, scrollbarWidth - parseInt(that.datesHeader.children().css('border-' + paddingDirection + '-width'), 10));\n                } else {\n                    that.datesHeader.css('padding-' + paddingDirection, '');\n                }\n                if (contentDiv.offsetHeight - contentDiv.clientHeight > 0 || contentDiv.clientHeight > that.content.children('.k-scheduler-table').height()) {\n                    that.table.addClass('k-scrollbar-h');\n                } else {\n                    that.table.removeClass('k-scrollbar-h');\n                }\n            },\n            _topSection: function (columnLevels, allDaySlot, rowCount) {\n                this.timesHeader = timesHeader(columnLevels.length, allDaySlot, rowCount);\n                var columnCount = columnLevels[columnLevels.length - 1].length;\n                this.datesHeader = datesHeader(columnLevels, columnCount, allDaySlot);\n                return $('<tr>').append(this.timesHeader.add(this.datesHeader).wrap('<td>').parent());\n            },\n            _bottomSection: function (columnLevels, rowLevels, rowCount) {\n                this.times = times(rowLevels, rowCount);\n                this.content = content(columnLevels[columnLevels.length - 1], rowLevels[rowLevels.length - 1]);\n                return $('<tr>').append(this.times.add(this.content).wrap('<td>').parent());\n            },\n            _scroller: function () {\n                var that = this;\n                this.content.bind('scroll' + NS, function () {\n                    that.datesHeader.find('>.k-scheduler-header-wrap').scrollLeft(this.scrollLeft);\n                    that.times.scrollTop(this.scrollTop);\n                });\n                var touchScroller = kendo.touchScroller(this.content, {\n                    avoidScrolling: function (e) {\n                        return $(e.event.target).closest('.k-event.k-event-active').length > 0;\n                    }\n                });\n                if (touchScroller && touchScroller.movable) {\n                    this._touchScroller = touchScroller;\n                    this.content = touchScroller.scrollElement;\n                    touchScroller.movable.bind('change', function (e) {\n                        that.datesHeader.find('>.k-scheduler-header-wrap').scrollLeft(-e.sender.x);\n                        that.times.scrollTop(-e.sender.y);\n                    });\n                }\n            },\n            _resourcesForGroups: function () {\n                var result = [];\n                var groups = this.options.group;\n                var resources = this.options.resources;\n                groups = groups && groups.resources ? groups.resources : [];\n                if (resources && groups.length) {\n                    for (var idx = 0, length = resources.length; idx < length; idx++) {\n                        for (var groupIdx = 0, groupLength = groups.length; groupIdx < groupLength; groupIdx++) {\n                            if (resources[idx].name === groups[groupIdx]) {\n                                result.push(resources[idx]);\n                            }\n                        }\n                    }\n                }\n                this.groupedResources = result;\n            },\n            _createDateLayout: function (dates, inner, times) {\n                return createDateLayoutConfiguration('rows', dates, inner, times);\n            },\n            _createColumnsLayout: function (resources, inner, template, dates, times) {\n                return createLayoutConfiguration('columns', resources, inner, template, dates, times);\n            },\n            _groupOrientation: function () {\n                var groups = this.options.group;\n                return groups && groups.resources ? groups.orientation : 'horizontal';\n            },\n            _isGroupedByDate: function () {\n                return this.options.group && this.options.group.date;\n            },\n            _isVerticallyGrouped: function () {\n                return this.groupedResources.length && this._groupOrientation() === 'vertical';\n            },\n            _createRowsLayout: function (resources, inner, template, dates) {\n                return createLayoutConfiguration('rows', resources, inner, template, dates);\n            },\n            selectionByElement: function () {\n                return null;\n            },\n            clearSelection: function () {\n                this.content.find('.k-state-selected').removeAttr('id').attr('aria-selected', false).removeClass('k-state-selected');\n            },\n            destroy: function () {\n                var that = this;\n                Widget.fn.destroy.call(this);\n                if (that.table) {\n                    kendo.destroy(that.table);\n                    that.table.remove();\n                }\n                that.groups = null;\n                that.table = null;\n                that.content = null;\n                that.times = null;\n                that.datesHeader = null;\n                that.timesHeader = null;\n                that.footer = null;\n                that._resizeHint = null;\n                that._moveHint = null;\n            },\n            calendarInfo: function () {\n                return kendo.getCulture().calendars.standard;\n            },\n            prevGroupSlot: function (date, groupIndex, isDay) {\n                var collection;\n                var group = this.groups[groupIndex];\n                var slot = group.ranges(date, date, isDay, false)[0].start;\n                if (groupIndex <= 0) {\n                    return;\n                }\n                if (this._isGroupedByDate()) {\n                    return slot;\n                }\n                if (this._isVerticallyGrouped()) {\n                    if (!group.timeSlotCollectionCount()) {\n                        collection = group._collection(group.daySlotCollectionCount() - 1, true);\n                        return collection.at(slot.index);\n                    } else {\n                        collection = group._collection(isDay ? slot.index : slot.collectionIndex, false);\n                        return collection.last();\n                    }\n                } else {\n                    if (!group.timeSlotCollectionCount()) {\n                        collection = group._collection(slot.collectionIndex, true);\n                        return collection.last();\n                    } else {\n                        collection = group._collection(isDay ? 0 : group.timeSlotCollectionCount() - 1, isDay);\n                        return isDay ? collection.last() : collection.at(slot.index);\n                    }\n                }\n            },\n            nextGroupSlot: function (date, groupIndex, isDay) {\n                var collection;\n                var group = this.groups[groupIndex];\n                var slot = group.ranges(date, date, isDay, false)[0].start;\n                var daySlotCollectionCount;\n                if (groupIndex >= this.groups.length - 1) {\n                    return;\n                }\n                if (this._isGroupedByDate()) {\n                    return slot;\n                }\n                if (this._isVerticallyGrouped()) {\n                    if (!group.timeSlotCollectionCount()) {\n                        collection = group._collection(0, true);\n                        return collection.at(slot.index);\n                    } else {\n                        daySlotCollectionCount = group.daySlotCollectionCount();\n                        collection = group._collection(daySlotCollectionCount ? 0 : slot.collectionIndex, daySlotCollectionCount);\n                        return isDay ? collection.first() : collection.at(slot.collectionIndex);\n                    }\n                } else {\n                    if (!group.timeSlotCollectionCount()) {\n                        collection = group._collection(slot.collectionIndex, true);\n                        return collection.first();\n                    } else {\n                        collection = group._collection(0, isDay);\n                        return isDay ? collection.first() : collection.at(slot.index);\n                    }\n                }\n            },\n            _eventOptionsForMove: function () {\n                return {};\n            },\n            _updateEventForResize: function () {\n                return;\n            },\n            _updateEventForSelection: function (event) {\n                return event;\n            }\n        });\n        function collidingEvents(elements, start, end) {\n            var idx, index, startIndex, overlaps, endIndex;\n            for (idx = elements.length - 1; idx >= 0; idx--) {\n                index = rangeIndex(elements[idx]);\n                startIndex = index.start;\n                endIndex = index.end;\n                overlaps = startIndex <= start && endIndex >= start;\n                if (overlaps || startIndex >= start && endIndex <= end || start <= startIndex && end >= startIndex) {\n                    if (startIndex < start) {\n                        start = startIndex;\n                    }\n                    if (endIndex > end) {\n                        end = endIndex;\n                    }\n                }\n            }\n            return eventsForSlot(elements, start, end);\n        }\n        function rangeIndex(eventElement) {\n            return {\n                start: eventElement.start,\n                end: eventElement.end\n            };\n        }\n        function eventsForSlot(elements, slotStart, slotEnd) {\n            var events = [];\n            for (var idx = 0; idx < elements.length; idx++) {\n                var event = rangeIndex(elements[idx]);\n                if (event.start < slotStart && event.end > slotStart || event.start >= slotStart && event.end <= slotEnd) {\n                    events.push(elements[idx]);\n                }\n            }\n            return events;\n        }\n        function createColumns(eventElements) {\n            return _createColumns(eventElements);\n        }\n        function createRows(eventElements) {\n            return _createColumns(eventElements);\n        }\n        var Color = function (value) {\n            var color = this, formats = Color.formats, re, processor, parts, i, channels;\n            if (arguments.length === 1) {\n                value = color.resolveColor(value);\n                for (i = 0; i < formats.length; i++) {\n                    re = formats[i].re;\n                    processor = formats[i].process;\n                    parts = re.exec(value);\n                    if (parts) {\n                        channels = processor(parts);\n                        color.r = channels[0];\n                        color.g = channels[1];\n                        color.b = channels[2];\n                    }\n                }\n            } else {\n                color.r = arguments[0];\n                color.g = arguments[1];\n                color.b = arguments[2];\n            }\n            color.r = color.normalizeByte(color.r);\n            color.g = color.normalizeByte(color.g);\n            color.b = color.normalizeByte(color.b);\n        };\n        Color.prototype = {\n            resolveColor: function (value) {\n                value = value || '#000';\n                if (value.charAt(0) == '#') {\n                    value = value.substr(1, 6);\n                }\n                value = value.replace(/ /g, '');\n                value = value.toLowerCase();\n                value = Color.namedColors[value] || value;\n                return value;\n            },\n            normalizeByte: function (value) {\n                return value < 0 || isNaN(value) ? 0 : value > 255 ? 255 : value;\n            },\n            percBrightness: function () {\n                var color = this;\n                return math.sqrt(0.241 * color.r * color.r + 0.691 * color.g * color.g + 0.068 * color.b * color.b);\n            },\n            isDark: function () {\n                var color = this;\n                var brightnessValue = color.percBrightness();\n                return brightnessValue < 180;\n            }\n        };\n        Color.formats = [\n            {\n                re: /^rgb\\((\\d{1,3}),\\s*(\\d{1,3}),\\s*(\\d{1,3})\\)$/,\n                process: function (parts) {\n                    return [\n                        parseInt(parts[1], 10),\n                        parseInt(parts[2], 10),\n                        parseInt(parts[3], 10)\n                    ];\n                }\n            },\n            {\n                re: /^(\\w{2})(\\w{2})(\\w{2})$/,\n                process: function (parts) {\n                    return [\n                        parseInt(parts[1], 16),\n                        parseInt(parts[2], 16),\n                        parseInt(parts[3], 16)\n                    ];\n                }\n            },\n            {\n                re: /^(\\w{1})(\\w{1})(\\w{1})$/,\n                process: function (parts) {\n                    return [\n                        parseInt(parts[1] + parts[1], 16),\n                        parseInt(parts[2] + parts[2], 16),\n                        parseInt(parts[3] + parts[3], 16)\n                    ];\n                }\n            }\n        ];\n        Color.namedColors = {\n            aqua: '00ffff',\n            azure: 'f0ffff',\n            beige: 'f5f5dc',\n            black: '000000',\n            blue: '0000ff',\n            brown: 'a52a2a',\n            coral: 'ff7f50',\n            cyan: '00ffff',\n            darkblue: '00008b',\n            darkcyan: '008b8b',\n            darkgray: 'a9a9a9',\n            darkgreen: '006400',\n            darkorange: 'ff8c00',\n            darkred: '8b0000',\n            dimgray: '696969',\n            fuchsia: 'ff00ff',\n            gold: 'ffd700',\n            goldenrod: 'daa520',\n            gray: '808080',\n            green: '008000',\n            greenyellow: 'adff2f',\n            indigo: '4b0082',\n            ivory: 'fffff0',\n            khaki: 'f0e68c',\n            lightblue: 'add8e6',\n            lightgrey: 'd3d3d3',\n            lightgreen: '90ee90',\n            lightpink: 'ffb6c1',\n            lightyellow: 'ffffe0',\n            lime: '00ff00',\n            limegreen: '32cd32',\n            linen: 'faf0e6',\n            magenta: 'ff00ff',\n            maroon: '800000',\n            mediumblue: '0000cd',\n            navy: '000080',\n            olive: '808000',\n            orange: 'ffa500',\n            orangered: 'ff4500',\n            orchid: 'da70d6',\n            pink: 'ffc0cb',\n            plum: 'dda0dd',\n            purple: '800080',\n            red: 'ff0000',\n            royalblue: '4169e1',\n            salmon: 'fa8072',\n            silver: 'c0c0c0',\n            skyblue: '87ceeb',\n            slateblue: '6a5acd',\n            slategray: '708090',\n            snow: 'fffafa',\n            steelblue: '4682b4',\n            tan: 'd2b48c',\n            teal: '008080',\n            tomato: 'ff6347',\n            turquoise: '40e0d0',\n            violet: 'ee82ee',\n            wheat: 'f5deb3',\n            white: 'ffffff',\n            whitesmoke: 'f5f5f5',\n            yellow: 'ffff00',\n            yellowgreen: '9acd32'\n        };\n        function _createColumns(eventElements) {\n            var columns = [];\n            for (var idx = 0; idx < eventElements.length; idx++) {\n                var event = eventElements[idx];\n                var eventRange = rangeIndex(event);\n                var column = null;\n                for (var j = 0, columnLength = columns.length; j < columnLength; j++) {\n                    var endOverlaps = eventRange.start > columns[j].end;\n                    if (eventRange.start < columns[j].start || endOverlaps) {\n                        column = columns[j];\n                        if (column.end < eventRange.end) {\n                            column.end = eventRange.end;\n                        }\n                        break;\n                    }\n                }\n                if (!column) {\n                    column = {\n                        start: eventRange.start,\n                        end: eventRange.end,\n                        events: []\n                    };\n                    columns.push(column);\n                }\n                column.events.push(event);\n            }\n            return columns;\n        }\n        function createDateLayoutConfiguration(name, dates, inner, times) {\n            var configuration = [];\n            $.each(dates, function (index, item) {\n                var className = item.className ? 'k-slot-cell ' + item.className : 'k-slot-cell';\n                var obj = {\n                    text: item.text,\n                    className: className\n                };\n                if (times && !item.minorTicks) {\n                    obj[name] = createDateLayoutConfiguration(name, item.columns, inner, times);\n                } else {\n                    obj[name] = inner;\n                }\n                configuration.push(obj);\n            });\n            return configuration;\n        }\n        function createLayoutConfiguration(name, resources, inner, template, dates, times) {\n            var resource = resources[0];\n            var configuration = [];\n            if (resource) {\n                if (dates && inner) {\n                    $.each(dates, function (index, item) {\n                        if (times && !item.minorTicks) {\n                            item[name] = createLayoutConfiguration(name, resources, item.columns, template, item.columns, times);\n                        } else {\n                            item[name] = createLayoutConfiguration(name, resources, null, template);\n                        }\n                    });\n                    configuration = dates;\n                } else {\n                    var data = resource.dataSource.view();\n                    for (var dataIndex = 0; dataIndex < data.length; dataIndex++) {\n                        var obj = {\n                            text: template({\n                                text: kendo.htmlEncode(kendo.getter(resource.dataTextField)(data[dataIndex])),\n                                color: kendo.getter(resource.dataColorField)(data[dataIndex]),\n                                field: resource.field,\n                                title: resource.title,\n                                name: resource.name,\n                                value: kendo.getter(resource.dataValueField)(data[dataIndex])\n                            }),\n                            className: 'k-slot-cell'\n                        };\n                        obj[name] = createLayoutConfiguration(name, resources.slice(1), inner, template);\n                        configuration.push(obj);\n                    }\n                }\n                return configuration;\n            }\n            return inner;\n        }\n        function groupEqFilter(value) {\n            return function (item) {\n                if ($.isArray(item) || item instanceof kendo.data.ObservableArray) {\n                    for (var idx = 0; idx < item.length; idx++) {\n                        if (item[idx] == value) {\n                            return true;\n                        }\n                    }\n                    return false;\n                }\n                return item == value;\n            };\n        }\n        var selectedStateRegExp = /\\s*k-state-selected/;\n        function addSelectedState(cell) {\n            cell.className = cell.className.replace(selectedStateRegExp, '') + ' k-state-selected';\n        }\n        $.extend(ui.SchedulerView, {\n            createColumns: createColumns,\n            createRows: createRows,\n            rangeIndex: rangeIndex,\n            collidingEvents: collidingEvents,\n            groupEqFilter: groupEqFilter\n        });\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.scheduler.dayview', ['kendo.scheduler.view'], f);\n}(function () {\n    var __meta__ = {\n        id: 'scheduler.dayview',\n        name: 'Scheduler Day View',\n        category: 'web',\n        description: 'The Scheduler Day View',\n        depends: ['scheduler.view'],\n        hidden: true\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, ui = kendo.ui, setTime = kendo.date.setTime, SchedulerView = ui.SchedulerView, outerWidth = kendo._outerWidth, outerHeight = kendo._outerHeight, extend = $.extend, proxy = $.proxy, getDate = kendo.date.getDate, MS_PER_MINUTE = kendo.date.MS_PER_MINUTE, MS_PER_DAY = kendo.date.MS_PER_DAY, CURRENT_TIME_MARKER_CLASS = 'k-current-time', CURRENT_TIME_MARKER_ARROW_CLASS = 'k-current-time-arrow', BORDER_SIZE_COEFF = 0.8666, getMilliseconds = kendo.date.getMilliseconds, NS = '.kendoMultiDayView';\n        var DAY_VIEW_EVENT_TEMPLATE = kendo.template('<div title=\"(#=kendo.format(\"{0:t} - {1:t}\", start, end)#): #=title.replace(/\"/g,\"&\\\\#34;\")#\">' + '<div class=\"k-event-template k-event-time\">#:kendo.format(\"{0:t} - {1:t}\", start, end)#</div>' + '<div class=\"k-event-template\">${title}</div>' + '</div>'), DAY_VIEW_ALL_DAY_EVENT_TEMPLATE = kendo.template('<div title=\"(#=kendo.format(\"{0:t}\", start)#): #=title.replace(/\"/g,\"&\\\\#34;\")#\">' + '<div class=\"k-event-template\">${title}</div>' + '</div>'), DATA_HEADER_TEMPLATE = kendo.template('<span class=\\'k-link k-nav-day\\'>#=kendo.toString(date, \\'ddd M/dd\\')#</span>'), ALLDAY_EVENT_WRAPPER_STRING = '<div role=\"gridcell\" aria-selected=\"false\" ' + 'data-#=ns#uid=\"#=uid#\"' + '#if (resources[0]) { #' + 'style=\"background-color:#=resources[0].color#; border-color: #=resources[0].color#\"' + 'class=\"k-event#=inverseColor ? \" k-event-inverse\" : \"\"#\" ' + '#} else {#' + 'class=\"k-event\"' + '#}#' + '>' + '<span class=\"k-event-actions\">' + '# if(data.tail || data.middle) {#' + '<span class=\"k-icon k-i-arrow-60-left\"></span>' + '#}#' + '# if(data.isException()) {#' + '<span class=\"k-icon k-i-non-recurrence\"></span>' + '# } else if(data.isRecurring()) {#' + '<span class=\"k-icon k-i-reload\"></span>' + '# } #' + '</span>' + '{0}' + '<span class=\"k-event-actions\">' + '#if (showDelete) {#' + '<a href=\"\\\\#\" class=\"k-link k-event-delete\" title=\"${data.messages.destroy}\" aria-label=\"${data.messages.destroy}\"><span class=\"k-icon k-i-close\"></span></a>' + '#}#' + '# if(data.head || data.middle) {#' + '<span class=\"k-icon k-i-arrow-60-right\"></span>' + '#}#' + '</span>' + '#if(resizable && !singleDay && !data.tail && !data.middle){#' + '<span class=\"k-resize-handle k-resize-w\"></span>' + '#}#' + '#if(resizable && !singleDay && !data.head && !data.middle){#' + '<span class=\"k-resize-handle k-resize-e\"></span>' + '#}#' + '</div>', EVENT_WRAPPER_STRING = '<div role=\"gridcell\" aria-selected=\"false\" ' + 'data-#=ns#uid=\"#=uid#\" ' + '#if (resources[0]) { #' + 'style=\"background-color:#=resources[0].color #; border-color: #=resources[0].color#\"' + 'class=\"k-event#=inverseColor ? \" k-event-inverse\" : \"\"#\"' + '#} else {#' + 'class=\"k-event\"' + '#}#' + '>' + '<span class=\"k-event-actions\">' + '# if(data.isException()) {#' + '<span class=\"k-icon k-i-non-recurrence\"></span>' + '# } else if(data.isRecurring()) {#' + '<span class=\"k-icon k-i-reload\"></span>' + '# } #' + '</span>' + '{0}' + '<span class=\"k-event-actions\">' + '#if (showDelete) {#' + '<a href=\"\\\\#\" class=\"k-link k-event-delete\" title=\"${data.messages.destroy}\" aria-label=\"${data.messages.destroy}\"><span class=\"k-icon k-i-close\"></span></a>' + '#}#' + '</span>' + '<span class=\"k-event-top-actions\">' + '# if(data.tail || data.middle) {#' + '<span class=\"k-icon k-i-arrow-60-up\"></span>' + '# } #' + '</span>' + '<span class=\"k-event-bottom-actions\">' + '# if(data.head || data.middle) {#' + '<span class=\"k-icon k-i-arrow-60-down\"></span>' + '# } #' + '</span>' + '# if(resizable && !data.tail && !data.middle) {#' + '<span class=\"k-resize-handle k-resize-n\"></span>' + '# } #' + '# if(resizable && !data.head && !data.middle) {#' + '<span class=\"k-resize-handle k-resize-s\"></span>' + '# } #' + '</div>';\n        function toInvariantTime(date) {\n            var staticDate = new Date(1980, 1, 1, 0, 0, 0);\n            setTime(staticDate, getMilliseconds(date));\n            return staticDate;\n        }\n        function isInDateRange(value, min, max) {\n            return value >= min && value <= max;\n        }\n        function isInTimeRange(value, min, max, overlaps) {\n            overlaps = overlaps ? value <= max : value < max;\n            return value > min && overlaps;\n        }\n        function addContinuousEvent(group, range, element, isAllDay) {\n            var events = group._continuousEvents;\n            var lastEvent = events[events.length - 1];\n            var startDate = getDate(range.start.startDate()).getTime();\n            if (isAllDay && lastEvent && getDate(lastEvent.start.startDate()).getTime() == startDate) {\n                var idx = events.length - 1;\n                for (; idx > -1; idx--) {\n                    if (events[idx].isAllDay || getDate(events[idx].start.startDate()).getTime() < startDate) {\n                        break;\n                    }\n                }\n                events.splice(idx + 1, 0, {\n                    element: element,\n                    isAllDay: true,\n                    uid: element.attr(kendo.attr('uid')),\n                    start: range.start,\n                    end: range.end\n                });\n            } else {\n                events.push({\n                    element: element,\n                    isAllDay: isAllDay,\n                    uid: element.attr(kendo.attr('uid')),\n                    start: range.start,\n                    end: range.end\n                });\n            }\n        }\n        function getWorkDays(options) {\n            var workDays = [];\n            var dayIndex = options.workWeekStart;\n            workDays.push(dayIndex);\n            while (options.workWeekEnd != dayIndex) {\n                if (dayIndex > 6) {\n                    dayIndex -= 7;\n                } else {\n                    dayIndex++;\n                }\n                workDays.push(dayIndex);\n            }\n            return workDays;\n        }\n        var MultiDayView = SchedulerView.extend({\n            init: function (element, options) {\n                var that = this;\n                SchedulerView.fn.init.call(that, element, options);\n                that.title = that.options.title || that.options.name;\n                that._workDays = getWorkDays(that.options);\n                that._templates();\n                that._editable();\n                that.calculateDateRange();\n                that._groups();\n                that._currentTime(true);\n            },\n            _currentTimeMarkerUpdater: function () {\n                this._updateCurrentTimeMarker(new Date());\n            },\n            _updateCurrentTimeMarker: function (currentTime) {\n                var options = this.options;\n                if (options.currentTimeMarker.useLocalTimezone === false) {\n                    var timezone = options.dataSource.options.schema.timezone;\n                    if (options.dataSource && timezone) {\n                        var timezoneOffset = kendo.timezone.offset(currentTime, timezone);\n                        currentTime = kendo.timezone.convert(currentTime, currentTime.getTimezoneOffset(), timezoneOffset);\n                    }\n                }\n                this.times.find('.' + CURRENT_TIME_MARKER_CLASS).remove();\n                this.content.find('.' + CURRENT_TIME_MARKER_CLASS).remove();\n                var groupsCount = !options.group || options.group.orientation == 'horizontal' ? 1 : this.groups.length;\n                var firstTimesCell = this.times.find('tr:first th:first');\n                var lastTimesCell = this.times.find('tr:first th:last');\n                for (var groupIndex = 0; groupIndex < groupsCount; groupIndex++) {\n                    var currentGroup = this.groups[groupIndex];\n                    if (!currentGroup) {\n                        return;\n                    }\n                    var utcCurrentTime = kendo.date.toUtcTime(currentTime);\n                    var ranges = currentGroup.timeSlotRanges(utcCurrentTime, utcCurrentTime + 1);\n                    if (ranges.length === 0) {\n                        return;\n                    }\n                    var collection = ranges[0].collection;\n                    var slotElement = collection.slotByStartDate(currentTime);\n                    if (slotElement) {\n                        var elementHtml = '<div class=\\'' + CURRENT_TIME_MARKER_CLASS + '\\'></div>';\n                        var timesTableMarker = $(elementHtml).prependTo(this.times);\n                        var markerTopPosition = Math.round(ranges[0].innerRect(currentTime, new Date(currentTime.getTime() + 1), false).top);\n                        var timesTableMarkerCss = {};\n                        if (this._isRtl) {\n                            timesTableMarkerCss.right = firstTimesCell.position().left + outerHeight(firstTimesCell) - outerHeight(lastTimesCell);\n                            timesTableMarker.addClass(CURRENT_TIME_MARKER_ARROW_CLASS + '-left');\n                        } else {\n                            timesTableMarkerCss.left = lastTimesCell.position().left;\n                            timesTableMarker.addClass(CURRENT_TIME_MARKER_ARROW_CLASS + '-right');\n                        }\n                        timesTableMarkerCss.top = markerTopPosition - outerWidth(timesTableMarker) * BORDER_SIZE_COEFF / 2;\n                        timesTableMarker.css(timesTableMarkerCss);\n                        $(elementHtml).prependTo(this.content).css({\n                            top: markerTopPosition,\n                            height: '1px',\n                            right: '1px',\n                            width: this.content[0].scrollWidth,\n                            left: 0\n                        });\n                    }\n                }\n            },\n            _currentTime: function (setUpdateTimer) {\n                var that = this;\n                var markerOptions = that.options.currentTimeMarker;\n                if (markerOptions !== false && markerOptions.updateInterval !== undefined) {\n                    that._currentTimeMarkerUpdater();\n                    if (setUpdateTimer) {\n                        that._currentTimeUpdateTimer = setInterval(proxy(this._currentTimeMarkerUpdater, that), markerOptions.updateInterval);\n                    }\n                }\n            },\n            _updateResizeHint: function (event, groupIndex, startTime, endTime) {\n                var multiday = event.isMultiDay();\n                var group = this.groups[groupIndex];\n                var ranges = group.ranges(startTime, endTime, multiday, event.isAllDay);\n                var width, height, top, hint;\n                this._removeResizeHint();\n                for (var rangeIndex = 0; rangeIndex < ranges.length; rangeIndex++) {\n                    var range = ranges[rangeIndex];\n                    var start = range.startSlot();\n                    if (this._isGroupedByDate() && multiday) {\n                        for (var slotIdx = start.index; slotIdx <= range.end.index; slotIdx++) {\n                            var slot = range.collection._slots[slotIdx];\n                            width = slot.offsetWidth;\n                            height = slot.clientHeight;\n                            top = slot.offsetTop;\n                            hint = SchedulerView.fn._createResizeHint.call(this, slot.offsetLeft, top, width, height);\n                            this._resizeHint = this._resizeHint.add(hint);\n                        }\n                    } else {\n                        width = start.offsetWidth;\n                        height = start.clientHeight;\n                        top = start.offsetTop;\n                        if (multiday) {\n                            width = range.innerWidth();\n                        } else {\n                            var rect = range.outerRect(startTime, endTime, this.options.snap);\n                            top = rect.top;\n                            height = rect.bottom - rect.top;\n                        }\n                        hint = SchedulerView.fn._createResizeHint.call(this, start.offsetLeft, top, width, height);\n                        this._resizeHint = this._resizeHint.add(hint);\n                    }\n                }\n                var format = 't';\n                var container = this.content;\n                if (multiday) {\n                    format = 'M/dd';\n                    container = this.element.find('.k-scheduler-header-wrap:has(.k-scheduler-header-all-day) > div');\n                    if (!container.length) {\n                        container = this.content;\n                    }\n                }\n                this._resizeHint.appendTo(container);\n                this._resizeHint.find('.k-label-top,.k-label-bottom').text('');\n                this._resizeHint.first().addClass('k-first').find('.k-label-top').text(kendo.toString(kendo.timezone.toLocalDate(startTime), format));\n                this._resizeHint.last().addClass('k-last').find('.k-label-bottom').text(kendo.toString(kendo.timezone.toLocalDate(endTime), format));\n            },\n            _updateMoveHint: function (event, groupIndex, distance) {\n                var multiday = event.isMultiDay();\n                var group = this.groups[groupIndex];\n                var start = kendo.date.toUtcTime(event.start) + distance;\n                var end = start + event.duration();\n                var ranges = group.ranges(start, end, multiday, event.isAllDay);\n                start = kendo.timezone.toLocalDate(start);\n                end = kendo.timezone.toLocalDate(end);\n                this._removeMoveHint();\n                if (!multiday && (getMilliseconds(end) === 0 || getMilliseconds(end) < getMilliseconds(this.startTime()))) {\n                    if (ranges.length > 1) {\n                        ranges.pop();\n                    }\n                }\n                for (var rangeIndex = 0; rangeIndex < ranges.length; rangeIndex++) {\n                    var range = ranges[rangeIndex];\n                    var startSlot = range.start;\n                    var hint;\n                    var css = {\n                        left: startSlot.offsetLeft + 2,\n                        top: startSlot.offsetTop\n                    };\n                    if (this._isGroupedByDate() && multiday) {\n                        for (var slotIdx = startSlot.index; slotIdx <= range.end.index; slotIdx++) {\n                            var slot = range.collection._slots[slotIdx];\n                            css.left = this._isRtl ? slot.clientWidth * 0.1 + slot.offsetLeft + 2 : slot.offsetLeft + 2;\n                            css.height = slot.offsetHeight;\n                            css.width = slot.clientWidth * 0.9 - 4;\n                            hint = this._createEventElement(event.clone({\n                                start: start,\n                                end: end\n                            }), !multiday);\n                            this._appendMoveHint(hint, css);\n                        }\n                    } else {\n                        if (this._isRtl) {\n                            css.left = startSlot.clientWidth * 0.1 + startSlot.offsetLeft + 2;\n                        }\n                        if (multiday) {\n                            css.width = range.innerWidth() - 4;\n                        } else {\n                            var rect = range.outerRect(start, end, this.options.snap);\n                            css.top = rect.top;\n                            css.height = rect.bottom - rect.top;\n                            css.width = startSlot.clientWidth * 0.9 - 4;\n                        }\n                        hint = this._createEventElement(event.clone({\n                            start: start,\n                            end: end\n                        }), !multiday);\n                        this._appendMoveHint(hint, css);\n                    }\n                }\n                var content = this.content;\n                if (multiday) {\n                    content = this.element.find('.k-scheduler-header-wrap:has(.k-scheduler-header-all-day) > div');\n                    if (!content.length) {\n                        content = this.content;\n                    }\n                }\n                this._moveHint.appendTo(content);\n            },\n            _appendMoveHint: function (hint, css) {\n                hint.addClass('k-event-drag-hint');\n                hint.css(css);\n                this._moveHint = this._moveHint.add(hint);\n            },\n            _slotByPosition: function (x, y) {\n                var slot, offset;\n                if (this._isVerticallyGrouped()) {\n                    offset = this.content.offset();\n                    y += this.content[0].scrollTop;\n                    x += this.content[0].scrollLeft;\n                } else {\n                    offset = this.element.find('.k-scheduler-header-wrap:has(.k-scheduler-header-all-day)').find('>div').offset();\n                }\n                if (offset) {\n                    x -= offset.left;\n                    y -= offset.top;\n                }\n                x = Math.ceil(x);\n                y = Math.ceil(y);\n                var group;\n                var groupIndex;\n                for (groupIndex = 0; groupIndex < this.groups.length; groupIndex++) {\n                    group = this.groups[groupIndex];\n                    slot = group.daySlotByPosition(x, y, this._isGroupedByDate());\n                    if (slot) {\n                        return slot;\n                    }\n                }\n                if (offset) {\n                    x += offset.left;\n                    y += offset.top;\n                }\n                offset = this.content.offset();\n                x -= offset.left;\n                y -= offset.top;\n                if (!this._isVerticallyGrouped()) {\n                    y += this.content[0].scrollTop;\n                    x += this.content[0].scrollLeft;\n                }\n                x = Math.ceil(x);\n                y = Math.ceil(y);\n                for (groupIndex = 0; groupIndex < this.groups.length; groupIndex++) {\n                    group = this.groups[groupIndex];\n                    slot = group.timeSlotByPosition(x, y);\n                    if (slot) {\n                        return slot;\n                    }\n                }\n                return null;\n            },\n            _groupCount: function () {\n                var resources = this.groupedResources;\n                var byDate = this._isGroupedByDate();\n                if (resources.length) {\n                    if (this._groupOrientation() === 'vertical') {\n                        if (byDate) {\n                            return this._columnCountForLevel(resources.length - 1);\n                        } else {\n                            return this._rowCountForLevel(resources.length - 1);\n                        }\n                    } else {\n                        if (byDate) {\n                            return this._columnCountForLevel(resources.length) / this._columnCountForLevel(0);\n                        } else {\n                            return this._columnCountForLevel(resources.length) / this._columnOffsetForResource(resources.length);\n                        }\n                    }\n                }\n                return 1;\n            },\n            _columnCountInResourceView: function () {\n                var resources = this.groupedResources;\n                var byDate = this._isGroupedByDate();\n                if (!resources.length || this._isVerticallyGrouped()) {\n                    if (byDate) {\n                        return this._rowCountForLevel(0);\n                    } else {\n                        return this._columnCountForLevel(0);\n                    }\n                }\n                if (byDate) {\n                    return this._columnCountForLevel(0);\n                } else {\n                    return this._columnOffsetForResource(resources.length);\n                }\n            },\n            _timeSlotGroups: function (groupCount, columnCount) {\n                var interval = this._timeSlotInterval();\n                var verticalViews = groupCount;\n                var byDate = this._isGroupedByDate();\n                var tableRows = this.content.find('tr:not(.k-scheduler-header-all-day)');\n                var group, time, rowIndex, cellIndex;\n                tableRows.attr('role', 'row');\n                var rowCount = tableRows.length;\n                if (this._isVerticallyGrouped()) {\n                    if (byDate) {\n                        verticalViews = columnCount;\n                    }\n                    rowCount = Math.floor(rowCount / verticalViews);\n                }\n                for (var groupIndex = 0; groupIndex < verticalViews; groupIndex++) {\n                    var rowMultiplier = 0;\n                    var cellMultiplier = 0;\n                    if (this._isVerticallyGrouped()) {\n                        rowMultiplier = groupIndex;\n                    } else {\n                        cellMultiplier = groupIndex;\n                    }\n                    rowIndex = rowMultiplier * rowCount;\n                    while (rowIndex < (rowMultiplier + 1) * rowCount) {\n                        var cells = tableRows[rowIndex].children;\n                        if (rowIndex % rowCount === 0) {\n                            time = getMilliseconds(new Date(+this.startTime()));\n                        }\n                        var timeIndex = 0;\n                        if (byDate) {\n                            if (this._isVerticallyGrouped()) {\n                                for (cellIndex = 0; cellIndex < groupCount; cellIndex++) {\n                                    group = this.groups[cellIndex];\n                                    this._addTimeSlotGroup(group, cells, cellIndex, time, interval, groupIndex);\n                                }\n                            } else {\n                                group = this.groups[groupIndex];\n                                for (cellIndex = cellMultiplier; cellIndex < groupCount * columnCount; cellIndex = cellIndex + groupCount) {\n                                    this._addTimeSlotGroup(group, cells, cellIndex, time, interval, timeIndex);\n                                    timeIndex++;\n                                }\n                            }\n                        } else {\n                            group = this.groups[groupIndex];\n                            for (cellIndex = cellMultiplier * columnCount; cellIndex < (cellMultiplier + 1) * columnCount; cellIndex++) {\n                                this._addTimeSlotGroup(group, cells, cellIndex, time, interval, timeIndex);\n                                timeIndex++;\n                            }\n                        }\n                        time += interval;\n                        rowIndex++;\n                    }\n                }\n            },\n            _addTimeSlotGroup: function (group, cells, cellIndex, time, interval, timeIndex) {\n                var cell = cells[cellIndex];\n                var collection = group.getTimeSlotCollection(timeIndex);\n                var currentDate = this._dates[timeIndex];\n                var currentTime = Date.UTC(currentDate.getFullYear(), currentDate.getMonth(), currentDate.getDate());\n                var start = currentTime + time;\n                var end = start + interval;\n                cell.setAttribute('role', 'gridcell');\n                cell.setAttribute('aria-selected', false);\n                collection.addTimeSlot(cell, start, end);\n            },\n            _addDaySlotGroup: function (collection, cells, cellIndex, columnCount, cellCount) {\n                var cell = cells[cellIndex];\n                var start = this._dates[cellCount];\n                var currentTime = Date.UTC(start.getFullYear(), start.getMonth(), start.getDate());\n                cell.setAttribute('role', 'gridcell');\n                cell.setAttribute('aria-selected', false);\n                collection.addDaySlot(cell, currentTime, currentTime + kendo.date.MS_PER_DAY);\n            },\n            _daySlotGroups: function (groupCount, columnCount) {\n                var tableRows, cellIndex;\n                var verticalViews = groupCount;\n                var byDate = this._isGroupedByDate();\n                if (this._isVerticallyGrouped()) {\n                    if (byDate) {\n                        verticalViews = columnCount;\n                    }\n                    tableRows = this.element.find('.k-scheduler-header-all-day');\n                } else {\n                    tableRows = this.element.find('.k-scheduler-header-all-day tr');\n                }\n                tableRows.attr('role', 'row');\n                for (var groupIndex = 0; groupIndex < verticalViews; groupIndex++) {\n                    var rowMultiplier = 0;\n                    var group, collection;\n                    if (this._isVerticallyGrouped()) {\n                        rowMultiplier = groupIndex;\n                    }\n                    var cells = tableRows[rowMultiplier].children;\n                    var cellMultiplier = 0;\n                    if (!this._isVerticallyGrouped()) {\n                        cellMultiplier = groupIndex;\n                    }\n                    var cellCount = 0;\n                    if (byDate) {\n                        if (this._isVerticallyGrouped()) {\n                            for (cellIndex = 0; cellIndex < groupCount; cellIndex++) {\n                                group = this.groups[cellIndex];\n                                collection = group.getDaySlotCollection(0);\n                                this._addDaySlotGroup(collection, cells, cellIndex, columnCount, groupIndex);\n                            }\n                        } else {\n                            group = this.groups[groupIndex];\n                            collection = group.getDaySlotCollection(0);\n                            for (cellIndex = cellMultiplier; cellIndex < groupCount * columnCount; cellIndex = cellIndex + groupCount) {\n                                this._addDaySlotGroup(collection, cells, cellIndex, columnCount, cellCount);\n                                cellCount++;\n                            }\n                        }\n                    } else {\n                        group = this.groups[groupIndex];\n                        collection = group.getDaySlotCollection(0);\n                        for (cellIndex = cellMultiplier * columnCount; cellIndex < (cellMultiplier + 1) * columnCount; cellIndex++) {\n                            this._addDaySlotGroup(collection, cells, cellIndex, columnCount, cellCount);\n                            cellCount++;\n                        }\n                    }\n                }\n            },\n            _groups: function () {\n                var groupCount = this._groupCount();\n                var columnCount = this._columnCountInResourceView();\n                this.groups = [];\n                for (var idx = 0; idx < groupCount; idx++) {\n                    var view = this._addResourceView(idx);\n                    for (var columnIndex = 0; columnIndex < columnCount; columnIndex++) {\n                        view.addTimeSlotCollection(this._dates[columnIndex], kendo.date.addDays(this._dates[columnIndex], 1));\n                    }\n                    if (this.options.allDaySlot) {\n                        view.addDaySlotCollection(this._dates[0], kendo.date.addDays(this._dates[this._dates.length - 1], 1));\n                    }\n                }\n                this._timeSlotGroups(groupCount, columnCount);\n                if (this.options.allDaySlot) {\n                    this._daySlotGroups(groupCount, columnCount);\n                }\n            },\n            options: {\n                name: 'MultiDayView',\n                selectedDateFormat: '{0:D}',\n                selectedShortDateFormat: '{0:d}',\n                allDaySlot: true,\n                showWorkHours: false,\n                title: '',\n                startTime: kendo.date.today(),\n                endTime: kendo.date.today(),\n                minorTickCount: 2,\n                majorTick: 60,\n                majorTimeHeaderTemplate: '#=kendo.toString(date, \\'t\\')#',\n                minorTimeHeaderTemplate: '&\\\\#8203;',\n                groupHeaderTemplate: '#=text#',\n                slotTemplate: '&nbsp;',\n                allDaySlotTemplate: '&nbsp;',\n                eventTemplate: DAY_VIEW_EVENT_TEMPLATE,\n                allDayEventTemplate: DAY_VIEW_ALL_DAY_EVENT_TEMPLATE,\n                dateHeaderTemplate: DATA_HEADER_TEMPLATE,\n                editable: true,\n                workDayStart: new Date(1980, 1, 1, 8, 0, 0),\n                workDayEnd: new Date(1980, 1, 1, 17, 0, 0),\n                workWeekStart: 1,\n                workWeekEnd: 5,\n                footer: { command: 'workDay' },\n                messages: {\n                    allDay: 'all day',\n                    showFullDay: 'Show full day',\n                    showWorkDay: 'Show business hours'\n                },\n                currentTimeMarker: {\n                    updateInterval: 10000,\n                    useLocalTimezone: true\n                }\n            },\n            events: [\n                'remove',\n                'add',\n                'edit'\n            ],\n            _templates: function () {\n                var options = this.options, settings = extend({}, kendo.Template, options.templateSettings);\n                this.eventTemplate = this._eventTmpl(options.eventTemplate, EVENT_WRAPPER_STRING);\n                this.allDayEventTemplate = this._eventTmpl(options.allDayEventTemplate, ALLDAY_EVENT_WRAPPER_STRING);\n                this.majorTimeHeaderTemplate = kendo.template(options.majorTimeHeaderTemplate, settings);\n                this.minorTimeHeaderTemplate = kendo.template(options.minorTimeHeaderTemplate, settings);\n                this.dateHeaderTemplate = kendo.template(options.dateHeaderTemplate, settings);\n                this.slotTemplate = kendo.template(options.slotTemplate, settings);\n                this.allDaySlotTemplate = kendo.template(options.allDaySlotTemplate, settings);\n                this.groupHeaderTemplate = kendo.template(options.groupHeaderTemplate, settings);\n            },\n            _editable: function () {\n                if (this.options.editable) {\n                    if (this._isMobile()) {\n                        this._touchEditable();\n                    } else {\n                        this._mouseEditable();\n                    }\n                }\n            },\n            _mouseEditable: function () {\n                var that = this;\n                that.element.on('click' + NS, '.k-event a:has(.k-i-close)', function (e) {\n                    that.trigger('remove', { uid: $(this).closest('.k-event').attr(kendo.attr('uid')) });\n                    e.preventDefault();\n                });\n                if (that.options.editable.create !== false) {\n                    that.element.on('dblclick' + NS, '.k-scheduler-content td', function (e) {\n                        if (!$(this).parent().hasClass('k-scheduler-header-all-day')) {\n                            var slot = that._slotByPosition(e.pageX, e.pageY);\n                            if (slot) {\n                                var resourceInfo = that._resourceBySlot(slot);\n                                that.trigger('add', {\n                                    eventInfo: extend({\n                                        start: slot.startDate(),\n                                        end: slot.endDate()\n                                    }, resourceInfo)\n                                });\n                            }\n                            e.preventDefault();\n                        }\n                    }).on('dblclick' + NS, '.k-scheduler-header-all-day td', function (e) {\n                        var slot = that._slotByPosition(e.pageX, e.pageY);\n                        if (slot) {\n                            var resourceInfo = that._resourceBySlot(slot);\n                            that.trigger('add', {\n                                eventInfo: extend({}, {\n                                    isAllDay: true,\n                                    start: kendo.date.getDate(slot.startDate()),\n                                    end: kendo.date.getDate(slot.startDate())\n                                }, resourceInfo)\n                            });\n                        }\n                        e.preventDefault();\n                    });\n                }\n                if (that.options.editable.update !== false) {\n                    that.element.on('dblclick' + NS, '.k-event', function (e) {\n                        that.trigger('edit', { uid: $(this).closest('.k-event').attr(kendo.attr('uid')) });\n                        e.preventDefault();\n                    });\n                }\n            },\n            _touchEditable: function () {\n                var that = this;\n                var threshold = 0;\n                if (kendo.support.mobileOS.android) {\n                    threshold = 5;\n                }\n                if (that.options.editable.create !== false) {\n                    that._addUserEvents = new kendo.UserEvents(that.element, {\n                        threshold: threshold,\n                        filter: '.k-scheduler-content td',\n                        tap: function (e) {\n                            if (!$(e.target).parent().hasClass('k-scheduler-header-all-day')) {\n                                var x = e.x.location !== undefined ? e.x.location : e.x;\n                                var y = e.y.location !== undefined ? e.y.location : e.y;\n                                var slot = that._slotByPosition(x, y);\n                                if (slot) {\n                                    var resourceInfo = that._resourceBySlot(slot);\n                                    that.trigger('add', {\n                                        eventInfo: extend({\n                                            start: slot.startDate(),\n                                            end: slot.endDate()\n                                        }, resourceInfo)\n                                    });\n                                }\n                                e.preventDefault();\n                            }\n                        }\n                    });\n                    that._allDayUserEvents = new kendo.UserEvents(that.element, {\n                        threshold: threshold,\n                        filter: '.k-scheduler-header-all-day td',\n                        tap: function (e) {\n                            var x = e.x.location !== undefined ? e.x.location : e.x;\n                            var y = e.y.location !== undefined ? e.y.location : e.y;\n                            var slot = that._slotByPosition(x, y);\n                            if (slot) {\n                                var resourceInfo = that._resourceBySlot(slot);\n                                that.trigger('add', {\n                                    eventInfo: extend({}, {\n                                        isAllDay: true,\n                                        start: kendo.date.getDate(slot.startDate()),\n                                        end: kendo.date.getDate(slot.startDate())\n                                    }, resourceInfo)\n                                });\n                            }\n                            e.preventDefault();\n                        }\n                    });\n                }\n                if (that.options.editable.update !== false) {\n                    that._editUserEvents = new kendo.UserEvents(that.element, {\n                        threshold: threshold,\n                        filter: '.k-event',\n                        tap: function (e) {\n                            var eventElement = $(e.target).closest('.k-event');\n                            if (!eventElement.hasClass('k-event-active')) {\n                                that.trigger('edit', { uid: eventElement.attr(kendo.attr('uid')) });\n                            }\n                            e.preventDefault();\n                        }\n                    });\n                }\n            },\n            _layout: function (dates) {\n                var columns = [];\n                var rows = [];\n                var options = this.options;\n                var that = this;\n                var byDate = that._isGroupedByDate();\n                for (var idx = 0; idx < dates.length; idx++) {\n                    var column = {};\n                    column.text = that.dateHeaderTemplate({ date: dates[idx] });\n                    if (kendo.date.isToday(dates[idx])) {\n                        column.className = 'k-today';\n                    }\n                    columns.push(column);\n                }\n                var resources = this.groupedResources;\n                if (options.allDaySlot) {\n                    rows.push({\n                        text: options.messages.allDay,\n                        allDay: true,\n                        cellContent: function (idx) {\n                            var groupIndex = idx;\n                            idx = resources.length && that._groupOrientation() !== 'vertical' ? idx % dates.length : idx;\n                            return that.allDaySlotTemplate({\n                                date: dates[idx],\n                                resources: function () {\n                                    return that._resourceBySlot({ groupIndex: groupIndex });\n                                }\n                            });\n                        }\n                    });\n                }\n                this._forTimeRange(this.startTime(), this.endTime(), function (date, majorTick, middleRow, lastSlotRow) {\n                    var template = majorTick ? that.majorTimeHeaderTemplate : that.minorTimeHeaderTemplate;\n                    var row = {\n                        text: template({ date: date }),\n                        className: lastSlotRow ? 'k-slot-cell' : ''\n                    };\n                    rows.push(row);\n                });\n                if (resources.length) {\n                    if (this._groupOrientation() === 'vertical') {\n                        if (byDate) {\n                            rows = this._createDateLayout(columns, rows);\n                            columns = this._createColumnsLayout(resources, null, this.groupHeaderTemplate);\n                        } else {\n                            rows = this._createRowsLayout(resources, rows, this.groupHeaderTemplate);\n                        }\n                    } else {\n                        if (byDate) {\n                            columns = this._createColumnsLayout(resources, columns, this.groupHeaderTemplate, columns);\n                        } else {\n                            columns = this._createColumnsLayout(resources, columns, this.groupHeaderTemplate);\n                        }\n                    }\n                }\n                return {\n                    columns: columns,\n                    rows: rows\n                };\n            },\n            _footer: function () {\n                var options = this.options;\n                if (options.footer !== false) {\n                    var html = '<div class=\"k-header k-scheduler-footer\">';\n                    var command = options.footer.command;\n                    if (command && command === 'workDay') {\n                        html += '<ul class=\"k-reset k-header\">';\n                        html += '<li class=\"k-state-default k-scheduler-fullday\"><a href=\"#\" class=\"k-link\"><span class=\"k-icon k-i-clock\"></span>';\n                        html += (options.showWorkHours ? options.messages.showFullDay : options.messages.showWorkDay) + '</a></li>';\n                        html += '</ul>';\n                    } else {\n                        html += '&nbsp;';\n                    }\n                    html += '</div>';\n                    this.footer = $(html).appendTo(this.element);\n                    var that = this;\n                    this.footer.on('click' + NS, '.k-scheduler-fullday', function (e) {\n                        e.preventDefault();\n                        that.trigger('navigate', {\n                            view: that.name || options.name,\n                            date: options.date,\n                            isWorkDay: !options.showWorkHours\n                        });\n                    });\n                }\n            },\n            _forTimeRange: function (min, max, action, after) {\n                min = toInvariantTime(min);\n                max = toInvariantTime(max);\n                var that = this, msMin = getMilliseconds(min), msMax = getMilliseconds(max), minorTickCount = that.options.minorTickCount, msMajorInterval = that.options.majorTick * MS_PER_MINUTE, msInterval = msMajorInterval / minorTickCount || 1, start = new Date(+min), startDay = start.getDate(), msStart, idx = 0, length, html = '';\n                length = MS_PER_DAY / msInterval;\n                if (msMin != msMax) {\n                    if (msMin > msMax) {\n                        msMax += MS_PER_DAY;\n                    }\n                    length = (msMax - msMin) / msInterval;\n                }\n                length = Math.round(length);\n                for (; idx < length; idx++) {\n                    var majorTickDivider = idx % (msMajorInterval / msInterval), isMajorTickRow = majorTickDivider === 0, isMiddleRow = majorTickDivider < minorTickCount - 1, isLastSlotRow = majorTickDivider === minorTickCount - 1;\n                    html += action(start, isMajorTickRow, isMiddleRow, isLastSlotRow);\n                    setTime(start, msInterval, false);\n                }\n                if (msMax) {\n                    msStart = getMilliseconds(start);\n                    if (startDay < start.getDate()) {\n                        msStart += MS_PER_DAY;\n                    }\n                    if (msStart > msMax) {\n                        start = new Date(+max);\n                    }\n                }\n                if (after) {\n                    html += after(start);\n                }\n                return html;\n            },\n            _content: function (dates) {\n                var that = this;\n                var options = that.options;\n                var start = that.startTime();\n                var end = this.endTime();\n                var groupsCount = 1;\n                var rowCount = 1;\n                var columnCount = dates.length;\n                var html = '';\n                var resources = this.groupedResources;\n                var allDaySlotTemplate = this.allDaySlotTemplate;\n                var isVerticalGroupped = false;\n                var allDayVerticalGroupRow;\n                var byDate = that._isGroupedByDate();\n                var dateID = 0;\n                if (resources.length) {\n                    isVerticalGroupped = that._groupOrientation() === 'vertical';\n                    if (isVerticalGroupped) {\n                        rowCount = this._rowCountForLevel(this.rowLevels.length - 2);\n                        if (byDate) {\n                            groupsCount = this._columnCountForLevel(this.columnLevels.length - 1);\n                        }\n                        if (options.allDaySlot) {\n                            allDayVerticalGroupRow = function (groupIndex) {\n                                var result = '<tr class=\"k-scheduler-header-all-day\">';\n                                var dateGroupIndex = byDate ? 0 : groupIndex;\n                                var resources = function () {\n                                    return that._resourceBySlot({ groupIndex: dateGroupIndex });\n                                };\n                                if (byDate) {\n                                    for (; dateGroupIndex < groupsCount; dateGroupIndex++) {\n                                        result += '<td>' + allDaySlotTemplate({\n                                            date: dates[dateID],\n                                            resources: resources\n                                        }) + '</td>';\n                                    }\n                                } else {\n                                    for (var idx = 0; idx < dates.length; idx++) {\n                                        result += '<td>' + allDaySlotTemplate({\n                                            date: dates[idx],\n                                            resources: resources\n                                        }) + '</td>';\n                                    }\n                                }\n                                return result + '</tr>';\n                            };\n                        }\n                    } else {\n                        if (byDate) {\n                            groupsCount = this._columnCountForLevel(this.columnLevels.length - 1) / this._columnCountForLevel(0);\n                        } else {\n                            groupsCount = this._columnCountForLevel(this.columnLevels.length - 2);\n                        }\n                    }\n                }\n                html += '<tbody>';\n                var appendRow = function (date, majorTick) {\n                    var content = '';\n                    var groupIdx = 0;\n                    var idx, length;\n                    content = '<tr' + (majorTick ? ' class=\"k-middle-row\"' : '') + '>';\n                    if (byDate) {\n                        for (idx = 0, length = columnCount; idx < length; idx++) {\n                            for (groupIdx = 0; groupIdx < groupsCount; groupIdx++) {\n                                var dateIndex = idx;\n                                if (isVerticalGroupped) {\n                                    dateIndex = dateID;\n                                }\n                                content = that._addCellsToContent(content, dates, date, dateIndex, groupIdx, rowIdx);\n                            }\n                            if (isVerticalGroupped) {\n                                break;\n                            }\n                        }\n                    } else {\n                        for (; groupIdx < groupsCount; groupIdx++) {\n                            for (idx = 0, length = columnCount; idx < length; idx++) {\n                                content = that._addCellsToContent(content, dates, date, idx, groupIdx, rowIdx);\n                            }\n                        }\n                    }\n                    content += '</tr>';\n                    return content;\n                };\n                for (var rowIdx = 0; rowIdx < rowCount; rowIdx++) {\n                    html += allDayVerticalGroupRow ? allDayVerticalGroupRow(rowIdx) : '';\n                    html += this._forTimeRange(start, end, appendRow);\n                    if (isVerticalGroupped) {\n                        dateID++;\n                    }\n                }\n                html += '</tbody>';\n                this.content.find('table').append(html);\n            },\n            _addCellsToContent: function (content, dates, date, idx, groupIdx, rowIdx) {\n                var that = this;\n                var classes = '';\n                var tmplDate;\n                var slotTemplate = this.slotTemplate;\n                var isVerticalGroupped = this._groupOrientation() === 'vertical';\n                var resources = function (groupIndex) {\n                    return function () {\n                        return that._resourceBySlot({ groupIndex: groupIndex });\n                    };\n                };\n                if (kendo.date.isToday(dates[idx])) {\n                    classes += 'k-today';\n                }\n                if (kendo.date.getMilliseconds(date) < kendo.date.getMilliseconds(this.options.workDayStart) || kendo.date.getMilliseconds(date) >= kendo.date.getMilliseconds(this.options.workDayEnd) || !this._isWorkDay(dates[idx])) {\n                    classes += ' k-nonwork-hour';\n                }\n                content += '<td' + (classes !== '' ? ' class=\"' + classes + '\"' : '') + '>';\n                tmplDate = kendo.date.getDate(dates[idx]);\n                kendo.date.setTime(tmplDate, kendo.date.getMilliseconds(date));\n                content += slotTemplate({\n                    date: tmplDate,\n                    resources: resources(isVerticalGroupped && !that._isGroupedByDate() ? rowIdx : groupIdx)\n                });\n                content += '</td>';\n                return content;\n            },\n            _isWorkDay: function (date) {\n                var day = date.getDay();\n                var workDays = this._workDays;\n                for (var i = 0; i < workDays.length; i++) {\n                    if (workDays[i] === day) {\n                        return true;\n                    }\n                }\n                return false;\n            },\n            _render: function (dates) {\n                var that = this;\n                dates = dates || [];\n                this._dates = dates;\n                this._startDate = dates[0];\n                this._endDate = dates[dates.length - 1 || 0];\n                this.createLayout(this._layout(dates));\n                this._content(dates);\n                this._footer();\n                this.refreshLayout();\n                var allDayHeader = this.element.find('.k-scheduler-header-all-day td');\n                if (allDayHeader.length) {\n                    this._allDayHeaderHeight = allDayHeader.first()[0].clientHeight;\n                }\n                that.element.on('click' + NS, '.k-nav-day', function (e) {\n                    var th = $(e.currentTarget).closest('th');\n                    var offset = th.offset();\n                    var additioanlWidth = 0;\n                    var additionalHeight = outerHeight(th);\n                    if (that._isGroupedByDate()) {\n                        if (that._isVerticallyGrouped()) {\n                            additioanlWidth = outerWidth(that.times);\n                            additionalHeight = 0;\n                        } else {\n                            additionalHeight = outerHeight(that.datesHeader);\n                        }\n                    }\n                    var slot = that._slotByPosition(offset.left + additioanlWidth, offset.top + additionalHeight);\n                    that.trigger('navigate', {\n                        view: 'day',\n                        date: slot.startDate()\n                    });\n                });\n            },\n            startTime: function () {\n                var options = this.options;\n                return options.showWorkHours ? options.workDayStart : options.startTime;\n            },\n            endTime: function () {\n                var options = this.options;\n                return options.showWorkHours ? options.workDayEnd : options.endTime;\n            },\n            startDate: function () {\n                return this._startDate;\n            },\n            endDate: function () {\n                return this._endDate;\n            },\n            _end: function (isAllDay) {\n                var time = getMilliseconds(this.endTime()) || MS_PER_DAY;\n                if (isAllDay) {\n                    time = 0;\n                }\n                return new Date(this._endDate.getTime() + time);\n            },\n            nextDate: function () {\n                return kendo.date.nextDay(this.endDate());\n            },\n            previousDate: function () {\n                return kendo.date.previousDay(this.startDate());\n            },\n            calculateDateRange: function () {\n                this._render([this.options.date]);\n            },\n            destroy: function () {\n                var that = this;\n                if (that._currentTimeUpdateTimer) {\n                    clearInterval(that._currentTimeUpdateTimer);\n                }\n                if (that.datesHeader) {\n                    that.datesHeader.off(NS);\n                }\n                if (that.element) {\n                    that.element.off(NS);\n                }\n                if (that.footer) {\n                    that.footer.remove();\n                }\n                SchedulerView.fn.destroy.call(this);\n                if (this._isMobile() && that.options.editable) {\n                    if (that.options.editable.create !== false) {\n                        that._addUserEvents.destroy();\n                        that._allDayUserEvents.destroy();\n                    }\n                    if (that.options.editable.update !== false) {\n                        that._editUserEvents.destroy();\n                    }\n                }\n            },\n            inRange: function (options) {\n                var inRange = SchedulerView.fn.inRange.call(this, options);\n                if (options.isAllDay) {\n                    return inRange;\n                }\n                var startTime = getMilliseconds(this.startTime());\n                var endTime = getMilliseconds(this.endTime()) || kendo.date.MS_PER_DAY;\n                var start = getMilliseconds(options.start);\n                var end = getMilliseconds(options.end) || kendo.date.MS_PER_DAY;\n                return inRange && startTime <= start && end <= endTime;\n            },\n            selectionByElement: function (cell) {\n                var offset = cell.offset();\n                return this._slotByPosition(offset.left, offset.top);\n            },\n            _timeSlotInterval: function () {\n                var options = this.options;\n                return options.majorTick / options.minorTickCount * MS_PER_MINUTE;\n            },\n            _timeSlotIndex: function (date) {\n                var options = this.options;\n                var eventStartTime = getMilliseconds(date);\n                var startTime = getMilliseconds(this.startTime());\n                var timeSlotInterval = options.majorTick / options.minorTickCount * MS_PER_MINUTE;\n                return (eventStartTime - startTime) / timeSlotInterval;\n            },\n            _slotIndex: function (date, multiday) {\n                if (multiday) {\n                    return this._dateSlotIndex(date);\n                }\n                return this._timeSlotIndex(date);\n            },\n            _dateSlotIndex: function (date, overlaps) {\n                var idx;\n                var length;\n                var slots = this._dates || [];\n                var slotStart;\n                var slotEnd;\n                var offset = 1;\n                for (idx = 0, length = slots.length; idx < length; idx++) {\n                    slotStart = kendo.date.getDate(slots[idx]);\n                    slotEnd = new Date(kendo.date.getDate(slots[idx]).getTime() + MS_PER_DAY - (overlaps ? 0 : 1));\n                    if (isInDateRange(date, slotStart, slotEnd)) {\n                        return idx * offset;\n                    }\n                }\n                return -1;\n            },\n            _positionAllDayEvent: function (element, slotRange) {\n                var slotWidth = slotRange.innerWidth();\n                var startIndex = slotRange.start.index;\n                var endIndex = slotRange.end.index;\n                var allDayEvents = SchedulerView.collidingEvents(slotRange.events(), startIndex, endIndex);\n                var currentColumnCount = this._headerColumnCount || 0;\n                var leftOffset = 2;\n                var rightOffset = startIndex !== endIndex ? 5 : 4;\n                var eventHeight = this._allDayHeaderHeight;\n                var start = slotRange.startSlot();\n                element.css({\n                    left: start.offsetLeft + leftOffset,\n                    width: slotWidth - rightOffset\n                });\n                slotRange.addEvent({\n                    slotIndex: startIndex,\n                    start: startIndex,\n                    end: endIndex,\n                    element: element\n                });\n                allDayEvents.push({\n                    slotIndex: startIndex,\n                    start: startIndex,\n                    end: endIndex,\n                    element: element\n                });\n                var rows = SchedulerView.createRows(allDayEvents);\n                if (rows.length && rows.length > currentColumnCount) {\n                    this._headerColumnCount = rows.length;\n                }\n                var top = slotRange.start.offsetTop;\n                for (var idx = 0, length = rows.length; idx < length; idx++) {\n                    var rowEvents = rows[idx].events;\n                    for (var j = 0, eventLength = rowEvents.length; j < eventLength; j++) {\n                        $(rowEvents[j].element).css({ top: top + idx * eventHeight });\n                    }\n                }\n            },\n            _arrangeColumns: function (element, top, height, slotRange) {\n                var startSlot = slotRange.start;\n                element = {\n                    element: element,\n                    slotIndex: startSlot.index,\n                    start: top,\n                    end: top + height\n                };\n                var columns, slotWidth = startSlot.clientWidth, eventRightOffset = slotWidth * 0.1, columnEvents, eventElements = slotRange.events(), slotEvents = SchedulerView.collidingEvents(eventElements, element.start, element.end);\n                slotRange.addEvent(element);\n                slotEvents.push(element);\n                columns = SchedulerView.createColumns(slotEvents);\n                var columnWidth = (slotWidth - eventRightOffset) / columns.length;\n                for (var idx = 0, length = columns.length; idx < length; idx++) {\n                    columnEvents = columns[idx].events;\n                    for (var j = 0, eventLength = columnEvents.length; j < eventLength; j++) {\n                        columnEvents[j].element[0].style.width = columnWidth - 4 + 'px';\n                        columnEvents[j].element[0].style.left = (this._isRtl ? eventRightOffset : 0) + startSlot.offsetLeft + idx * columnWidth + 2 + 'px';\n                    }\n                }\n            },\n            _positionEvent: function (event, element, slotRange) {\n                var start = event._startTime || event.start;\n                var end = event._endTime || event.end;\n                var rect = slotRange.innerRect(start, end, false);\n                var height = rect.bottom - rect.top - 2;\n                if (height < 0) {\n                    height = 0;\n                }\n                element.css({\n                    top: rect.top,\n                    height: height\n                });\n                this._arrangeColumns(element, rect.top, element[0].clientHeight, slotRange);\n            },\n            _createEventElement: function (event, isOneDayEvent, head, tail) {\n                var template = isOneDayEvent ? this.eventTemplate : this.allDayEventTemplate;\n                var options = this.options;\n                var editable = options.editable;\n                var isMobile = this._isMobile();\n                var showDelete = editable && editable.destroy !== false && !isMobile;\n                var resizable = editable && editable.resize !== false;\n                var startDate = getDate(this.startDate());\n                var endDate = getDate(this.endDate());\n                var startTime = getMilliseconds(this.startTime());\n                var endTime = getMilliseconds(this.endTime());\n                var eventStartTime = event._time('start');\n                var eventEndTime = event._time('end');\n                var middle;\n                if (startTime >= endTime) {\n                    endTime = getMilliseconds(new Date(this.endTime().getTime() + MS_PER_DAY - 1));\n                }\n                if (!isOneDayEvent && !event.isAllDay) {\n                    endDate = new Date(endDate.getTime() + MS_PER_DAY);\n                }\n                var eventStartDate = event.start;\n                var eventEndDate = event.end;\n                if (event.isAllDay) {\n                    eventEndDate = getDate(event.end);\n                }\n                if (!isInDateRange(getDate(eventStartDate), startDate, endDate) && !isInDateRange(eventEndDate, startDate, endDate) || isOneDayEvent && eventStartTime < startTime && eventEndTime > endTime) {\n                    middle = true;\n                } else if (getDate(eventStartDate) < startDate || isOneDayEvent && eventStartTime < startTime) {\n                    tail = true;\n                } else if (eventEndDate > endDate && !isOneDayEvent || isOneDayEvent && eventEndTime > endTime) {\n                    head = true;\n                }\n                var resources = this.eventResources(event);\n                if (event._startTime && eventStartTime !== kendo.date.getMilliseconds(event.start)) {\n                    eventStartDate = new Date(eventStartTime);\n                    eventStartDate = kendo.timezone.apply(eventStartDate, 'Etc/UTC');\n                }\n                if (event._endTime && eventEndTime !== kendo.date.getMilliseconds(event.end)) {\n                    eventEndDate = new Date(eventEndTime);\n                    eventEndDate = kendo.timezone.apply(eventEndDate, 'Etc/UTC');\n                }\n                var data = extend({}, {\n                    ns: kendo.ns,\n                    resizable: resizable,\n                    showDelete: showDelete,\n                    middle: middle,\n                    head: head,\n                    tail: tail,\n                    singleDay: this._dates.length == 1,\n                    resources: resources,\n                    inverseColor: resources && resources[0] ? this._shouldInverseResourceColor(resources[0]) : false,\n                    messages: options.messages\n                }, event, {\n                    start: eventStartDate,\n                    end: eventEndDate\n                });\n                var element = $(template(data));\n                this.angular('compile', function () {\n                    return {\n                        elements: element,\n                        data: [{ dataItem: data }]\n                    };\n                });\n                return element;\n            },\n            _isInTimeSlot: function (event) {\n                var slotStartTime = this.startTime(), slotEndTime = this.endTime(), startTime = event._startTime || event.start, endTime = event._endTime || event.end;\n                if (getMilliseconds(slotEndTime) === getMilliseconds(kendo.date.getDate(slotEndTime))) {\n                    slotEndTime = kendo.date.getDate(slotEndTime);\n                    setTime(slotEndTime, MS_PER_DAY - 1);\n                }\n                if (event._date('end') > event._date('start')) {\n                    endTime = +event._date('end') + (MS_PER_DAY - 1);\n                }\n                endTime = endTime - event._date('end');\n                startTime = startTime - event._date('start');\n                slotEndTime = getMilliseconds(slotEndTime);\n                slotStartTime = getMilliseconds(slotStartTime);\n                if (slotStartTime === startTime && startTime === endTime) {\n                    return true;\n                }\n                var overlaps = startTime !== slotEndTime;\n                return isInTimeRange(startTime, slotStartTime, slotEndTime, overlaps) || isInTimeRange(endTime, slotStartTime, slotEndTime, overlaps) || isInTimeRange(slotStartTime, startTime, endTime) || isInTimeRange(slotEndTime, startTime, endTime);\n            },\n            _isInDateSlot: function (event) {\n                var groups = this.groups[0];\n                var slotStart = groups.firstSlot().start;\n                var slotEnd = groups.lastSlot().end - 1;\n                var startTime = kendo.date.toUtcTime(event.start);\n                var endTime = kendo.date.toUtcTime(event.end);\n                return (isInDateRange(startTime, slotStart, slotEnd) || isInDateRange(endTime, slotStart, slotEnd) || isInDateRange(slotStart, startTime, endTime) || isInDateRange(slotEnd, startTime, endTime)) && (!isInDateRange(endTime, slotStart, slotStart) || isInDateRange(endTime, startTime, startTime) || event.isAllDay);\n            },\n            _updateAllDayHeaderHeight: function (height) {\n                if (this._height !== height) {\n                    this._height = height;\n                    var allDaySlots = this.element.find('.k-scheduler-header-all-day td');\n                    if (allDaySlots.length) {\n                        allDaySlots.parent().add(this.element.find('.k-scheduler-times-all-day').parent()).height(height);\n                        for (var groupIndex = 0; groupIndex < this.groups.length; groupIndex++) {\n                            this.groups[groupIndex].refresh();\n                        }\n                    }\n                }\n            },\n            _renderEvents: function (events, groupIndex) {\n                var allDayEventContainer = this.datesHeader.find('.k-scheduler-header-wrap > div');\n                var byDate = this._isGroupedByDate();\n                var event;\n                var idx;\n                var length;\n                for (idx = 0, length = events.length; idx < length; idx++) {\n                    event = events[idx];\n                    if (this._isInDateSlot(event)) {\n                        var isMultiDayEvent = event.isAllDay || event.end.getTime() - event.start.getTime() >= MS_PER_DAY;\n                        var container = isMultiDayEvent && !this._isVerticallyGrouped() ? allDayEventContainer : this.content;\n                        var element, ranges, range, start, end, group;\n                        if (!isMultiDayEvent) {\n                            if (this._isInTimeSlot(event)) {\n                                group = this.groups[groupIndex];\n                                if (!group._continuousEvents) {\n                                    group._continuousEvents = [];\n                                }\n                                ranges = group.slotRanges(event);\n                                var rangeCount = ranges.length;\n                                for (var rangeIndex = 0; rangeIndex < rangeCount; rangeIndex++) {\n                                    range = ranges[rangeIndex];\n                                    start = event.start;\n                                    end = event.end;\n                                    if (rangeCount > 1) {\n                                        if (rangeIndex === 0) {\n                                            end = range.end.endDate();\n                                        } else if (rangeIndex == rangeCount - 1) {\n                                            start = range.start.startDate();\n                                        } else {\n                                            start = range.start.startDate();\n                                            end = range.end.endDate();\n                                        }\n                                    }\n                                    var occurrence = event.clone({\n                                        start: start,\n                                        end: end,\n                                        _startTime: event._startTime,\n                                        _endTime: event.endTime\n                                    });\n                                    if (this._isInTimeSlot(occurrence)) {\n                                        var head = range.head;\n                                        element = this._createEventElement(event, !isMultiDayEvent, head, range.tail);\n                                        element.appendTo(container);\n                                        this._positionEvent(occurrence, element, range);\n                                        addContinuousEvent(group, range, element, false);\n                                    }\n                                }\n                            }\n                        } else if (this.options.allDaySlot) {\n                            group = this.groups[groupIndex];\n                            if (!group._continuousEvents) {\n                                group._continuousEvents = [];\n                            }\n                            ranges = group.slotRanges(event);\n                            if (ranges.length) {\n                                range = ranges[0];\n                                var startIndex = range.start.index;\n                                var endIndex = range.end.index;\n                                if (byDate && startIndex !== endIndex) {\n                                    start = range.start.start;\n                                    end = range.end.end;\n                                    var newStart = new Date(start);\n                                    var newEnd = new Date(start);\n                                    for (var i = range.start.index; i <= range.end.index; i++) {\n                                        element = this._createEventElement(event, !isMultiDayEvent, i !== endIndex, i !== startIndex);\n                                        var dateRange = group.daySlotRanges(newStart, newEnd, true)[0];\n                                        newEnd.setDate(newEnd.getDate() + 1);\n                                        newStart.setDate(newStart.getDate() + 1);\n                                        this._positionAllDayEvent(element, dateRange);\n                                        addContinuousEvent(group, dateRange, element, true);\n                                        element.appendTo(container);\n                                    }\n                                } else {\n                                    element = this._createEventElement(event, !isMultiDayEvent);\n                                    this._positionAllDayEvent(element, ranges[0]);\n                                    addContinuousEvent(group, ranges[0], element, true);\n                                    element.appendTo(container);\n                                }\n                            }\n                        }\n                    }\n                }\n            },\n            render: function (events) {\n                this._headerColumnCount = 0;\n                this._groups();\n                this.element.find('.k-event').remove();\n                events = new kendo.data.Query(events).sort([\n                    {\n                        field: 'start',\n                        dir: 'asc'\n                    },\n                    {\n                        field: 'end',\n                        dir: 'desc'\n                    }\n                ]).toArray();\n                var eventsByResource = [];\n                this._eventsByResource(events, this.groupedResources, eventsByResource);\n                var eventsPerDate = $.map(this._dates, function (date) {\n                    return Math.max.apply(null, $.map(eventsByResource, function (events) {\n                        return $.grep(events, function (event) {\n                            return event.isMultiDay() && isInDateRange(date, getDate(event.start), getDate(event.end));\n                        }).length;\n                    }));\n                });\n                var height = Math.max.apply(null, eventsPerDate);\n                this._updateAllDayHeaderHeight((height + 1) * this._allDayHeaderHeight);\n                for (var groupIndex = 0; groupIndex < eventsByResource.length; groupIndex++) {\n                    this._renderEvents(eventsByResource[groupIndex], groupIndex);\n                }\n                this.refreshLayout();\n                this._currentTime(false);\n                this.trigger('activate');\n            },\n            _eventsByResource: function (events, resources, result) {\n                var resource = resources[0];\n                if (resource) {\n                    var view = resource.dataSource.view();\n                    for (var itemIdx = 0; itemIdx < view.length; itemIdx++) {\n                        var value = this._resourceValue(resource, view[itemIdx]);\n                        var eventsFilteredByResource = new kendo.data.Query(events).filter({\n                            field: resource.field,\n                            operator: SchedulerView.groupEqFilter(value)\n                        }).toArray();\n                        if (resources.length > 1) {\n                            this._eventsByResource(eventsFilteredByResource, resources.slice(1), result);\n                        } else {\n                            result.push(eventsFilteredByResource);\n                        }\n                    }\n                } else {\n                    result.push(events);\n                }\n            },\n            _columnOffsetForResource: function (index) {\n                return this._columnCountForLevel(index) / this._columnCountForLevel(index - 1);\n            },\n            _columnCountForLevel: function (level) {\n                var columnLevel = this.columnLevels[level];\n                return columnLevel ? columnLevel.length : 0;\n            },\n            _rowCountForLevel: function (level) {\n                var rowLevel = this.rowLevels[level];\n                return rowLevel ? rowLevel.length : 0;\n            },\n            clearSelection: function () {\n                this.content.add(this.datesHeader).find('.k-state-selected').removeAttr('id').attr('aria-selected', false).removeClass('k-state-selected');\n            },\n            _updateDirection: function (selection, ranges, multiple, reverse, vertical) {\n                var isDaySlot = selection.isAllDay;\n                var startSlot = ranges[0].start;\n                var endSlot = ranges[ranges.length - 1].end;\n                if (multiple) {\n                    if (vertical) {\n                        if (!isDaySlot && startSlot.index === endSlot.index && startSlot.collectionIndex === endSlot.collectionIndex) {\n                            selection.backward = reverse;\n                        }\n                    } else {\n                        if (isDaySlot && startSlot.index === endSlot.index || !isDaySlot && startSlot.collectionIndex === endSlot.collectionIndex) {\n                            selection.backward = reverse;\n                        }\n                    }\n                }\n            },\n            _changeViewPeriod: function (selection, reverse, vertical) {\n                if (!vertical) {\n                    var date = reverse ? this.previousDate() : this.nextDate();\n                    var start = selection.start;\n                    var end = selection.end;\n                    var verticalByDate = this._isGroupedByDate() && this._isVerticallyGrouped();\n                    var group = this.groups[selection.groupIndex];\n                    var collection = reverse ? group._timeSlotCollections : group._getCollections(group.daySlotCollectionCount());\n                    var slots = collection[collection.length - 1]._slots;\n                    var slotIndex = !reverse && !group.daySlotCollectionCount() ? 0 : slots.length - 1;\n                    var endMilliseconds;\n                    selection.start = new Date(date);\n                    selection.end = new Date(date);\n                    if (verticalByDate) {\n                        var newStart = new Date(slots[slotIndex].startDate());\n                        var newEnd = new Date(slots[slotIndex].endDate());\n                        endMilliseconds = getMilliseconds(newEnd) ? getMilliseconds(newEnd) : MS_PER_DAY;\n                        setTime(selection.start, getMilliseconds(newStart));\n                        setTime(selection.end, endMilliseconds);\n                        if (group.daySlotCollectionCount()) {\n                            selection.isAllDay = !selection.isAllDay;\n                        }\n                    } else {\n                        endMilliseconds = selection.isAllDay || !getMilliseconds(end) ? MS_PER_DAY : getMilliseconds(end);\n                        setTime(selection.start, getMilliseconds(start));\n                        setTime(selection.end, endMilliseconds);\n                    }\n                    if (!this._isVerticallyGrouped()) {\n                        selection.groupIndex = reverse ? this.groups.length - 1 : 0;\n                    }\n                    selection.events = [];\n                    return true;\n                }\n            }\n        });\n        extend(true, ui, {\n            MultiDayView: MultiDayView,\n            DayView: MultiDayView.extend({\n                options: {\n                    name: 'DayView',\n                    title: 'Day'\n                },\n                name: 'day'\n            }),\n            WeekView: MultiDayView.extend({\n                options: {\n                    name: 'WeekView',\n                    title: 'Week',\n                    selectedDateFormat: '{0:D} - {1:D}',\n                    selectedShortDateFormat: '{0:d} - {1:d}'\n                },\n                name: 'week',\n                calculateDateRange: function () {\n                    var selectedDate = this.options.date, start = kendo.date.dayOfWeek(selectedDate, this.calendarInfo().firstDay, -1), idx, length, dates = [];\n                    for (idx = 0, length = 7; idx < length; idx++) {\n                        dates.push(start);\n                        start = kendo.date.nextDay(start);\n                    }\n                    this._render(dates);\n                }\n            }),\n            WorkWeekView: MultiDayView.extend({\n                options: {\n                    name: 'WorkWeekView',\n                    title: 'Work Week',\n                    selectedDateFormat: '{0:D} - {1:D}',\n                    selectedShortDateFormat: '{0:d} - {1:d}'\n                },\n                name: 'workWeek',\n                nextDate: function () {\n                    var weekStart = kendo.date.dayOfWeek(kendo.date.nextDay(this.startDate()), this.calendarInfo().firstDay, 1);\n                    return kendo.date.addDays(weekStart, this._workDays[0]);\n                },\n                previousDate: function () {\n                    var weekStart = kendo.date.dayOfWeek(this.startDate(), this.calendarInfo().firstDay, -1);\n                    var workDays = this._workDays;\n                    return kendo.date.addDays(weekStart, workDays[workDays.length - 1] - 7);\n                },\n                calculateDateRange: function () {\n                    var selectedDate = this.options.date, dayOfWeek = kendo.date.dayOfWeek, weekStart = dayOfWeek(selectedDate, this.calendarInfo().firstDay, -1), start = dayOfWeek(weekStart, this.options.workWeekStart, 1), end = dayOfWeek(start, this.options.workWeekEnd, 1), dates = [];\n                    while (start <= end) {\n                        dates.push(start);\n                        start = kendo.date.nextDay(start);\n                    }\n                    this._render(dates);\n                }\n            })\n        });\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.scheduler.agendaview', ['kendo.scheduler.view'], f);\n}(function () {\n    var __meta__ = {\n        id: 'scheduler.agendaview',\n        name: 'Scheduler Agenda View',\n        category: 'web',\n        description: 'The Scheduler Agenda View',\n        depends: ['scheduler.view'],\n        hidden: true\n    };\n    (function ($) {\n        var kendo = window.kendo, ui = kendo.ui, NS = '.kendoAgendaView';\n        var EVENT_WRAPPER_FORMAT = '<div class=\"k-task\" title=\"#:title.replace(/\"/g,\"\\'\")#\" data-#=kendo.ns#uid=\"#=uid#\">' + '# if (resources[0]) {#' + '<span class=\"k-scheduler-mark\" style=\"background-color:#=resources[0].color#\"></span>' + '# } #' + '# if (data.isException()) { #' + '<span class=\"k-icon k-i-non-recurrence\"></span>' + '# } else if (data.isRecurring()) {#' + '<span class=\"k-icon k-i-reload\"></span>' + '# } #' + '{0}' + '#if (showDelete) {#' + '<a href=\"\\\\#\" class=\"k-link k-event-delete\" title=\"${data.messages.destroy}\" aria-label=\"${data.messages.destroy}\"><span class=\"k-icon k-i-close\"></span></a>' + '#}#' + '</div>';\n        var AgendaGroupedView = kendo.Class.extend({\n            init: function (view) {\n                this._view = view;\n            },\n            _getColumns: function (groupHeaders, columns) {\n                return groupHeaders.concat(columns);\n            },\n            _getGroupsInDay: function () {\n                return [];\n            },\n            _getSumOfItemsForDate: function () {\n                return 0;\n            },\n            _renderTaskGroupsCells: function (headerCells, groups, taskGroupIndex, taskIndex) {\n                var view = this._view;\n                if (taskGroupIndex === 0 && taskIndex === 0 && groups.length) {\n                    view._renderTaskGroupsCells(headerCells, groups);\n                }\n            },\n            _renderDateCell: function (tableRow, groups, tasks, date, taskGroupIndex, tasksGroups) {\n                var view = this._view;\n                tableRow.push(kendo.format('<td class=\"k-scheduler-datecolumn{3}{2}\" rowspan=\"{0}\">{1}</td>', tasks.length, view._dateTemplate({ date: date }), taskGroupIndex == tasksGroups.length - 1 && !groups.length ? ' k-last' : '', !groups.length ? ' k-first' : ''));\n            },\n            _renderDates: function () {\n                return undefined;\n            },\n            _getParents: function (parentGroups) {\n                return parentGroups.splice(0);\n            },\n            _getGroupsByDate: function () {\n                return undefined;\n            },\n            _renderTaskGroups: function (table, items, parents) {\n                var view = this._view;\n                table.append(view._renderTaskGroups(items, parents));\n            }\n        });\n        var AgendaGroupedByDateView = kendo.Class.extend({\n            init: function (view) {\n                this._view = view;\n            },\n            _getColumns: function (groupHeaders, columns) {\n                var view = this._view;\n                if (view._isMobilePhoneView()) {\n                    return groupHeaders.concat(columns);\n                } else {\n                    var date = columns.slice(0, 1);\n                    var columnsWithoutDate = columns.slice(1);\n                    return date.concat(groupHeaders).concat(columnsWithoutDate);\n                }\n            },\n            _compareDateGroups: function (currentGroup, prevGroup, index) {\n                if (currentGroup[index].text == prevGroup[index].text) {\n                    if (index === 0) {\n                        return true;\n                    } else {\n                        return this._compareDateGroups(currentGroup, prevGroup, index - 1);\n                    }\n                }\n                return false;\n            },\n            _getGroupsInDay: function (tasksGroups, groups) {\n                var groupsInDay = [];\n                var prevGroup = null;\n                for (var tasksGroupIdx = 0; tasksGroupIdx < tasksGroups.length; tasksGroupIdx++) {\n                    for (var itemsIdx = 0; itemsIdx < tasksGroups[tasksGroupIdx].items.length; itemsIdx++) {\n                        var idx = 0;\n                        if (groupsInDay.length === 0) {\n                            for (idx; idx < groups[tasksGroupIdx].length; idx++) {\n                                groupsInDay.push([1]);\n                            }\n                        } else {\n                            for (idx; idx < groups[tasksGroupIdx].length; idx++) {\n                                if (this._compareDateGroups(groups[tasksGroupIdx], prevGroup, idx)) {\n                                    groupsInDay[idx][groupsInDay[idx].length - 1]++;\n                                } else {\n                                    var lastItemValue = groupsInDay[idx][groupsInDay[idx].length - 1] - 1;\n                                    for (var i = 0; i < lastItemValue; i++) {\n                                        groupsInDay[idx].push(0);\n                                    }\n                                    groupsInDay[idx].push(1);\n                                }\n                            }\n                        }\n                        prevGroup = groups[tasksGroupIdx];\n                    }\n                }\n                return groupsInDay;\n            },\n            _getSumOfItemsForDate: function (tasksGroups) {\n                var sumOfItemsForDate = 0;\n                for (var i = 0; i < tasksGroups.length; i++) {\n                    sumOfItemsForDate += tasksGroups[i].items.length;\n                }\n                return sumOfItemsForDate;\n            },\n            _renderTaskGroupsCells: function (headerCells, groups, taskGroupIndex, taskIndex, groupsInDay, sumOfItemsForDate, date, groupsRowSpanIndex) {\n                var view = this._view;\n                var isPhoneView = view._isMobilePhoneView();\n                if (!isPhoneView) {\n                    if (taskGroupIndex === 0 && taskIndex === 0) {\n                        headerCells.push(kendo.format('<td class=\"k-scheduler-datecolumn k-first\" rowspan=\"{0}\">{1}</td>', sumOfItemsForDate, view._dateTemplate({ date: date })));\n                    }\n                    for (var idx = 0; idx < groups[taskGroupIndex].length; idx++) {\n                        if (groupsInDay[idx][groupsRowSpanIndex]) {\n                            headerCells.push(kendo.format('<td class=\"k-scheduler-groupcolumn\" rowspan=\"{0}\">{1}</td>', groupsInDay[idx][groupsRowSpanIndex], view._groupTemplate({ value: groups[taskGroupIndex][idx].text }), groups[taskGroupIndex][idx].className));\n                        }\n                    }\n                } else {\n                    if (taskGroupIndex === 0 && taskIndex === 0 && groups.length) {\n                        view._renderTaskGroupsCells(headerCells, groups);\n                    }\n                }\n            },\n            _renderDateCell: function () {\n                return undefined;\n            },\n            _renderDates: function (table) {\n                var view = this._view;\n                var sortedArray = view._groupsByDate.sort(function (a, b) {\n                    return a.array[0].value.getTime() - b.array[0].value.getTime();\n                });\n                for (var i = 0; i < sortedArray.length; i++) {\n                    table.append(view._renderTaskGroups(sortedArray[i].array, sortedArray[i].groups));\n                }\n            },\n            _getParents: function (parentGroups) {\n                return parentGroups.slice(0);\n            },\n            _getGroupsByDate: function (groups, idx, parents) {\n                var view = this._view;\n                if (groups[idx].items) {\n                    for (var taskGroupIndex = 0; taskGroupIndex < groups[idx].items.length; taskGroupIndex++) {\n                        var date = groups[idx].items[taskGroupIndex].value;\n                        var dateExists = false;\n                        for (var i = 0; i < view._groupsByDate.length; i++) {\n                            if (view._groupsByDate[i].array[0].value.getTime() === date.getTime()) {\n                                dateExists = true;\n                                view._groupsByDate[i].array.push(groups[idx].items[taskGroupIndex]);\n                                view._groupsByDate[i].groups.push(parents);\n                            }\n                        }\n                        if (!dateExists) {\n                            view._groupsByDate.push({\n                                array: [groups[idx].items[taskGroupIndex]],\n                                groups: [parents]\n                            });\n                        }\n                    }\n                }\n            },\n            _renderTaskGroups: function () {\n                return undefined;\n            }\n        });\n        kendo.ui.scheduler.AgendaGroupedView = AgendaGroupedView;\n        kendo.ui.scheduler.AgendaGroupedByDateView = AgendaGroupedByDateView;\n        ui.AgendaView = ui.SchedulerView.extend({\n            init: function (element, options) {\n                ui.SchedulerView.fn.init.call(this, element, options);\n                this._groupedView = this._getGroupedView();\n                options = this.options;\n                if (options.editable) {\n                    options.editable = $.extend({ 'delete': true }, options.editable, {\n                        create: false,\n                        update: false\n                    }, { messages: options.messages });\n                }\n                this.title = options.title;\n                this._eventTemplate = this._eventTmpl(options.eventTemplate, EVENT_WRAPPER_FORMAT);\n                this._dateTemplate = kendo.template(options.eventDateTemplate);\n                this._groupTemplate = kendo.template(options.eventGroupTemplate);\n                this._timeTemplate = kendo.template(options.eventTimeTemplate);\n                this.element.on('mouseenter' + NS, '.k-scheduler-agenda .k-scheduler-content tr', '_mouseenter').on('mouseleave' + NS, '.k-scheduler-agenda .k-scheduler-content tr', '_mouseleave').on('click' + NS, '.k-scheduler-agenda .k-scheduler-content .k-link:has(.k-i-close)', '_remove');\n                this._renderLayout(options.date);\n            },\n            name: 'agenda',\n            _getGroupedView: function () {\n                if (this._isGroupedByDate()) {\n                    return new kendo.ui.scheduler.AgendaGroupedByDateView(this);\n                } else {\n                    return new kendo.ui.scheduler.AgendaGroupedView(this);\n                }\n            },\n            _mouseenter: function (e) {\n                $(e.currentTarget).addClass('k-state-hover');\n            },\n            _mouseleave: function (e) {\n                $(e.currentTarget).removeClass('k-state-hover');\n            },\n            _remove: function (e) {\n                e.preventDefault();\n                this.trigger('remove', { uid: $(e.currentTarget).closest('.k-task').attr(kendo.attr('uid')) });\n            },\n            nextDate: function () {\n                return kendo.date.nextDay(this.startDate());\n            },\n            startDate: function () {\n                return this._startDate;\n            },\n            endDate: function () {\n                return this._endDate;\n            },\n            previousDate: function () {\n                return kendo.date.previousDay(this.startDate());\n            },\n            _renderLayout: function (date) {\n                this._startDate = date;\n                this._endDate = kendo.date.addDays(date, 7);\n                this.createLayout(this._layout());\n                this.table.addClass('k-scheduler-agenda');\n            },\n            _layout: function () {\n                var columns = [\n                    {\n                        text: this.options.messages.time,\n                        className: 'k-scheduler-timecolumn'\n                    },\n                    { text: this.options.messages.event }\n                ];\n                if (!this._isMobilePhoneView()) {\n                    columns.splice(0, 0, {\n                        text: this.options.messages.date,\n                        className: 'k-scheduler-datecolumn'\n                    });\n                }\n                var resources = this.groupedResources;\n                if (resources.length) {\n                    var groupHeaders = [];\n                    for (var idx = 0; idx < resources.length; idx++) {\n                        groupHeaders.push({\n                            text: '',\n                            className: 'k-scheduler-groupcolumn'\n                        });\n                    }\n                    columns = this._groupedView._getColumns(groupHeaders, columns);\n                }\n                return { columns: columns };\n            },\n            _tasks: function (events) {\n                var tasks = [];\n                for (var idx = 0; idx < events.length; idx++) {\n                    var event = events[idx];\n                    var start = event.start;\n                    var end = event.isAllDay ? kendo.date.getDate(event.end) : event.end;\n                    var eventDurationInDays = Math.ceil((end - kendo.date.getDate(start)) / kendo.date.MS_PER_DAY);\n                    if (event.isAllDay) {\n                        eventDurationInDays += 1;\n                    }\n                    var task = event.clone();\n                    task.startDate = kendo.date.getDate(start);\n                    if (task.startDate >= this.startDate()) {\n                        tasks.push(task);\n                    }\n                    if (eventDurationInDays > 1) {\n                        task.end = kendo.date.nextDay(start);\n                        task.head = true;\n                        for (var day = 1; day < eventDurationInDays; day++) {\n                            start = task.end;\n                            task = event.clone();\n                            task.start = task.startDate = kendo.date.getDate(start);\n                            task.end = kendo.date.nextDay(start);\n                            if (day == eventDurationInDays - 1) {\n                                task.end = new Date(task.start.getFullYear(), task.start.getMonth(), task.start.getDate(), end.getHours(), end.getMinutes(), end.getSeconds(), end.getMilliseconds());\n                                task.tail = true;\n                            } else {\n                                task.isAllDay = true;\n                                task.middle = true;\n                            }\n                            if (kendo.date.getDate(task.end) <= this.endDate() && task.start >= this.startDate() || kendo.date.getDate(task.start).getTime() == this.endDate().getTime()) {\n                                tasks.push(task);\n                            }\n                        }\n                    }\n                }\n                return new kendo.data.Query(tasks).sort([\n                    {\n                        field: 'start',\n                        dir: 'asc'\n                    },\n                    {\n                        field: 'end',\n                        dir: 'asc'\n                    }\n                ]).groupBy({ field: 'startDate' }).toArray();\n            },\n            _renderTaskGroups: function (tasksGroups, groups) {\n                var tableRows = [];\n                var editable = this.options.editable;\n                var showDelete = editable && editable.destroy !== false && !this._isMobile();\n                var isPhoneView = this._isMobilePhoneView();\n                var sumOfItemsForDate = this._groupedView._getSumOfItemsForDate(tasksGroups);\n                var groupsInDay = this._groupedView._getGroupsInDay(tasksGroups, groups);\n                var groupsRowSpanIndex = 0;\n                for (var taskGroupIndex = 0; taskGroupIndex < tasksGroups.length; taskGroupIndex++) {\n                    var date = tasksGroups[taskGroupIndex].value;\n                    var tasks = tasksGroups[taskGroupIndex].items;\n                    var today = kendo.date.isToday(date);\n                    for (var taskIndex = 0; taskIndex < tasks.length; taskIndex++) {\n                        var task = tasks[taskIndex];\n                        var tableRow = [];\n                        var headerCells = !isPhoneView ? tableRow : [];\n                        this._groupedView._renderTaskGroupsCells(headerCells, groups, taskGroupIndex, taskIndex, groupsInDay, sumOfItemsForDate, date, groupsRowSpanIndex);\n                        groupsRowSpanIndex++;\n                        if (taskIndex === 0) {\n                            if (isPhoneView) {\n                                headerCells.push(kendo.format('<td class=\"k-scheduler-datecolumn\" colspan=\"2\">{0}</td>', this._dateTemplate({ date: date })));\n                                tableRows.push('<tr role=\"row\" aria-selected=\"false\"' + (today ? ' class=\"k-today\">' : '>') + headerCells.join('') + '</tr>');\n                            } else {\n                                this._groupedView._renderDateCell(tableRow, groups, tasks, date, taskGroupIndex, tasksGroups);\n                            }\n                        }\n                        if (task.head) {\n                            task.format = '{0:t}';\n                        } else if (task.tail) {\n                            task.format = '{1:t}';\n                        } else {\n                            task.format = '{0:t}-{1:t}';\n                        }\n                        task.resources = this.eventResources(task);\n                        tableRow.push(kendo.format('<td class=\"k-scheduler-timecolumn\"><div>{0}{1}{2}</div></td><td>{3}</td>', task.tail || task.middle ? '<span class=\"k-icon k-i-arrow-60-left\"></span>' : '', this._timeTemplate(task.clone({\n                            start: task._startTime || task.start,\n                            end: task.endTime || task.end\n                        })), task.head || task.middle ? '<span class=\"k-icon k-i-arrow-60-right\"></span>' : '', this._eventTemplate(task.clone({\n                            showDelete: showDelete,\n                            messages: this.options.messages\n                        }))));\n                        tableRows.push('<tr role=\"row\" aria-selected=\"false\"' + (today ? ' class=\"k-today\">' : '>') + tableRow.join('') + '</tr>');\n                    }\n                }\n                return tableRows.join('');\n            },\n            _renderTaskGroupsCells: function (headerCells, groups) {\n                for (var idx = 0; idx < groups.length; idx++) {\n                    headerCells.push(kendo.format('<td class=\"k-scheduler-groupcolumn{2}\" rowspan=\"{0}\">{1}</td>', groups[idx].rowSpan, this._groupTemplate({ value: groups[idx].text }), groups[idx].className));\n                }\n            },\n            render: function (events) {\n                var table = this.content.find('table').empty();\n                var groups = [];\n                if (events.length > 0) {\n                    var resources = this.groupedResources;\n                    if (resources.length) {\n                        groups = this._createGroupConfiguration(events, resources, null);\n                        this._groupsByDate = [];\n                        this._renderGroups(groups, table, []);\n                        this._groupedView._renderDates(table);\n                    } else {\n                        groups = this._tasks(events);\n                        table.append(this._renderTaskGroups(groups, []));\n                    }\n                }\n                var items = this._eventsList = flattenTaskGroups(groups);\n                this._angularItems(table, items);\n                this.refreshLayout();\n                this.trigger('activate');\n            },\n            _angularItems: function (table, items) {\n                this.angular('compile', function () {\n                    var data = [], elements = items.map(function (item) {\n                            data.push({ dataItem: item });\n                            return table.find('.k-task[' + kendo.attr('uid') + '=' + item.uid + ']');\n                        });\n                    return {\n                        elements: elements,\n                        data: data\n                    };\n                });\n            },\n            _renderGroups: function (groups, table, parentGroups) {\n                for (var idx = 0, length = groups.length; idx < length; idx++) {\n                    var parents = this._groupedView._getParents(parentGroups);\n                    parents.push(groups[idx]);\n                    this._groupedView._getGroupsByDate(groups, idx, parents);\n                    if (groups[idx].groups) {\n                        this._renderGroups(groups[idx].groups, table, parents);\n                    } else {\n                        this._groupedView._renderTaskGroups(table, groups[idx].items, parents);\n                    }\n                }\n            },\n            _createGroupConfiguration: function (events, resources, parent) {\n                var resource = resources[0];\n                var configuration = [];\n                var data = resource.dataSource.view();\n                var isPhoneView = this._isMobilePhoneView();\n                for (var dataIndex = 0; dataIndex < data.length; dataIndex++) {\n                    var value = resourceValue(resource, data[dataIndex]);\n                    var tmp = new kendo.data.Query(events).filter({\n                        field: resource.field,\n                        operator: ui.SchedulerView.groupEqFilter(value)\n                    }).toArray();\n                    if (tmp.length) {\n                        var tasks = this._tasks(tmp);\n                        var className = parent ? '' : ' k-first';\n                        if (dataIndex === data.length - 1 && (!parent || parent.className.indexOf('k-last') > -1)) {\n                            className += ' k-last';\n                        }\n                        var obj = {\n                            text: kendo.getter(resource.dataTextField)(data[dataIndex]),\n                            value: value,\n                            rowSpan: 0,\n                            className: className\n                        };\n                        if (resources.length > 1) {\n                            obj.groups = this._createGroupConfiguration(tmp, resources.slice(1), obj);\n                            if (parent) {\n                                parent.rowSpan += obj.rowSpan;\n                            }\n                        } else {\n                            obj.items = tasks;\n                            var span = rowSpan(obj.items);\n                            if (isPhoneView) {\n                                span += obj.items.length;\n                            }\n                            obj.rowSpan = span;\n                            if (parent) {\n                                parent.rowSpan += span;\n                            }\n                        }\n                        configuration.push(obj);\n                    }\n                }\n                return configuration;\n            },\n            selectionByElement: function (cell) {\n                var index, event;\n                cell = $(cell);\n                if (cell.hasClass('k-scheduler-datecolumn') || !this._eventsList.length) {\n                    return;\n                }\n                if (cell.is('.k-task')) {\n                    cell = cell.closest('td');\n                }\n                if (this._isMobile()) {\n                    var parent = cell.parent();\n                    index = parent.parent().children().filter(function () {\n                        return $(this).children(':not(.k-scheduler-datecolumn)').length;\n                    }).index(parent);\n                } else {\n                    index = cell.parent().index();\n                }\n                event = this._eventsList[index];\n                return {\n                    index: index,\n                    start: event.start,\n                    end: event.end,\n                    isAllDay: event.isAllDay,\n                    uid: event.uid\n                };\n            },\n            select: function (selection) {\n                this.clearSelection();\n                var row = this.table.find('.k-task').eq(selection.index).closest('tr').addClass('k-state-selected').attr('aria-selected', true)[0];\n                this.current(row);\n            },\n            move: function (selection, key) {\n                var handled = false;\n                var index = selection.index;\n                if (key == kendo.keys.UP) {\n                    index--;\n                    handled = true;\n                } else if (key == kendo.keys.DOWN) {\n                    index++;\n                    handled = true;\n                }\n                if (handled) {\n                    var event = this._eventsList[index];\n                    if (event) {\n                        selection.start = event.start;\n                        selection.end = event.end;\n                        selection.isAllDay = event.isAllDay;\n                        selection.events = [event.uid];\n                        selection.index = index;\n                    }\n                }\n                return handled;\n            },\n            moveToEvent: function () {\n                return false;\n            },\n            constrainSelection: function (selection) {\n                var event = this._eventsList[0];\n                if (event) {\n                    selection.start = event.start;\n                    selection.end = event.end;\n                    selection.isAllDay = event.isAllDay;\n                    selection.events = [event.uid];\n                    selection.index = 0;\n                }\n            },\n            isInRange: function () {\n                return true;\n            },\n            destroy: function () {\n                if (this.element) {\n                    this.element.off(NS);\n                }\n                ui.SchedulerView.fn.destroy.call(this);\n            },\n            options: {\n                title: 'Agenda',\n                name: 'agenda',\n                editable: true,\n                selectedDateFormat: '{0:D}-{1:D}',\n                selectedShortDateFormat: '{0:d} - {1:d}',\n                eventTemplate: '#:title#',\n                eventTimeTemplate: '#if(data.isAllDay) {#' + '#=this.options.messages.allDay#' + '#} else { #' + '#=kendo.format(format, start, end)#' + '# } #',\n                eventDateTemplate: '<strong class=\"k-scheduler-agendaday\">' + '#=kendo.toString(date, \"dd\")#' + '</strong>' + '<em class=\"k-scheduler-agendaweek\">' + '#=kendo.toString(date,\"dddd\")#' + '</em>' + '<span class=\"k-scheduler-agendadate\">' + '#=kendo.toString(date, \"y\")#' + '</span>',\n                eventGroupTemplate: '<strong class=\"k-scheduler-adgendagroup\">' + '#=value#' + '</strong>',\n                messages: {\n                    event: 'Event',\n                    date: 'Date',\n                    time: 'Time',\n                    allDay: 'all day'\n                }\n            }\n        });\n        function rowSpan(tasks) {\n            var result = 0;\n            for (var idx = 0, length = tasks.length; idx < length; idx++) {\n                result += tasks[idx].items.length;\n            }\n            return result;\n        }\n        function resourceValue(resource, item) {\n            if (resource.valuePrimitive) {\n                item = kendo.getter(resource.dataValueField)(item);\n            }\n            return item;\n        }\n        function flattenTaskGroups(groups) {\n            var idx = 0, length = groups.length, item, result = [];\n            for (; idx < length; idx++) {\n                item = groups[idx];\n                if (item.groups) {\n                    item = flattenGroup(item.groups);\n                    result = result.concat(item);\n                } else {\n                    result = result.concat(flattenGroup(item.items));\n                }\n            }\n            return result;\n        }\n        function flattenGroup(groups) {\n            var items = [].concat(groups), item = items.shift(), result = [], push = [].push;\n            while (item) {\n                if (item.groups) {\n                    push.apply(items, item.groups);\n                } else if (item.items) {\n                    push.apply(items, item.items);\n                } else {\n                    push.call(result, item);\n                }\n                item = items.shift();\n            }\n            return result;\n        }\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.scheduler.monthview', ['kendo.scheduler.view'], f);\n}(function () {\n    var __meta__ = {\n        id: 'scheduler.monthview',\n        name: 'Scheduler Month View',\n        category: 'web',\n        description: 'The Scheduler Month View',\n        depends: ['scheduler.view'],\n        hidden: true\n    };\n    (function ($) {\n        var kendo = window.kendo, ui = kendo.ui, SchedulerView = ui.SchedulerView, NS = '.kendoMonthView', extend = $.extend, getDate = kendo.date.getDate, MS_PER_DAY = kendo.date.MS_PER_DAY, NUMBER_OF_ROWS = 6, NUMBER_OF_COLUMNS = 7, DAY_TEMPLATE = kendo.template('<span class=\"k-link k-nav-day\">#:kendo.toString(date, \"dd\")#</span>'), EVENT_WRAPPER_STRING = '<div role=\"gridcell\" aria-selected=\"false\" data-#=ns#uid=\"#=uid#\"' + '#if (resources[0]) { #' + 'style=\"background-color:#=resources[0].color #; border-color: #=resources[0].color#\"' + 'class=\"k-event#=inverseColor ? \" k-event-inverse\" : \"\"#\"' + '#} else {#' + 'class=\"k-event\"' + '#}#' + '>' + '<span class=\"k-event-actions\">' + '# if(data.tail || data.middle) {#' + '<span class=\"k-icon k-i-arrow-60-left\"></span>' + '#}#' + '# if(data.isException()) {#' + '<span class=\"k-icon k-i-non-recurrence\"></span>' + '# } else if(data.isRecurring()) {#' + '<span class=\"k-icon k-i-reload\"></span>' + '#}#' + '</span>' + '{0}' + '<span class=\"k-event-actions\">' + '#if (showDelete) {#' + '<a href=\"\\\\#\" class=\"k-link k-event-delete\" title=\"${data.messages.destroy}\" aria-label=\"${data.messages.destroy}\"><span class=\"k-icon k-i-close\"></span></a>' + '#}#' + '# if(data.head || data.middle) {#' + '<span class=\"k-icon k-i-arrow-60-right\"></span>' + '#}#' + '</span>' + '# if(resizable && !data.tail && !data.middle) {#' + '<span class=\"k-resize-handle k-resize-w\"></span>' + '#}#' + '# if(resizable && !data.head && !data.middle) {#' + '<span class=\"k-resize-handle k-resize-e\"></span>' + '#}#' + '</div>', EVENT_TEMPLATE = kendo.template('<div title=\"#=title.replace(/\"/g,\"&\\\\#34;\")#\">' + '<div class=\"k-event-template\">#:title#</div>' + '</div>');\n        var MORE_BUTTON_TEMPLATE = kendo.template('<div style=\"width:#=width#px;left:#=left#px;top:#=top#px\" class=\"k-more-events k-button\"><span>...</span></div>');\n        var MonthGroupedView = kendo.Class.extend({\n            init: function (view) {\n                this._view = view;\n            },\n            _verticalRowCountForLevel: function (level) {\n                var view = this._view;\n                return view._rowCountForLevel(level);\n            },\n            _horizontalGroupCountForLevel: function (level) {\n                var view = this._view;\n                return view._columnCountForLevel(level);\n            },\n            _getCalendarRowsLength: function (cellsPerRow, cellCount) {\n                return cellCount / cellsPerRow;\n            },\n            _createRows: function (start, startIdx, horizontalGroupCount, verticalGroupIndex) {\n                var view = this._view;\n                var cellsPerRow = NUMBER_OF_COLUMNS;\n                var isVerticallyGrouped = view._isVerticallyGrouped();\n                var html = '';\n                for (var groupIdx = 0; groupIdx < horizontalGroupCount; groupIdx++) {\n                    html += view._createRow(start, startIdx, cellsPerRow, isVerticallyGrouped ? verticalGroupIndex : groupIdx);\n                }\n                return html;\n            },\n            _adjustStartDate: function (start) {\n                return kendo.date.addDays(start, NUMBER_OF_COLUMNS);\n            },\n            _getContent: function (content, startDate, resources) {\n                return content({\n                    date: startDate,\n                    resources: resources\n                });\n            },\n            _getTimeSlotByPosition: function (x, y, groupIndex) {\n                var group = this._view.groups[groupIndex];\n                return group.daySlotByPosition(x, y);\n            },\n            _nextSlotStartDate: function (startDate) {\n                return kendo.date.nextDay(startDate);\n            },\n            _createRowsLayout: function (resources, rows, groupHeaderTemplate) {\n                var view = this._view;\n                return view._createRowsLayout(resources, rows, groupHeaderTemplate);\n            },\n            _createVerticalColumnsLayout: function (resources, rows, groupHeaderTemplate, columns) {\n                return columns;\n            },\n            _createColumnsLayout: function (resources, columns, groupHeaderTemplate) {\n                var view = this._view;\n                return view._createColumnsLayout(resources, columns, groupHeaderTemplate);\n            },\n            _verticalGroupCount: function (level) {\n                var view = this._view;\n                return view._rowCountForLevel(level);\n            },\n            _horizontalGroupCount: function (level) {\n                var view = this._view;\n                return view._columnCountForLevel(level) / view._columnOffsetForResource(level);\n            },\n            _positionEvent: function (event, group, range, rangeCount, start, end, rangeIndex) {\n                var view = this._view;\n                var isMobilePhoneView = view._isMobilePhoneView();\n                if (rangeCount > 1) {\n                    if (rangeIndex === 0) {\n                        end = range.end.endDate();\n                    } else if (rangeIndex == rangeCount - 1) {\n                        start = range.start.startDate();\n                    } else {\n                        start = range.start.startDate();\n                        end = range.end.endDate();\n                    }\n                }\n                var occurrence = event.clone({\n                    start: start,\n                    end: end,\n                    head: range.head,\n                    tail: range.tail\n                });\n                if (isMobilePhoneView) {\n                    view._positionMobileEvent(range, view._createEventElement(occurrence), group);\n                } else {\n                    view._positionEvent(range, view._createEventElement(occurrence), group);\n                }\n            },\n            _addDaySlotCollections: function (groupCount, tableRows, startDate) {\n                var view = this._view;\n                var columnCount = NUMBER_OF_COLUMNS;\n                var rowCount = NUMBER_OF_ROWS;\n                for (var groupIndex = 0; groupIndex < groupCount; groupIndex++) {\n                    var cellCount = 0;\n                    var rowMultiplier = 0;\n                    if (view._isVerticallyGrouped()) {\n                        rowMultiplier = groupIndex;\n                    }\n                    for (var rowIndex = rowMultiplier * rowCount; rowIndex < (rowMultiplier + 1) * rowCount; rowIndex++) {\n                        var group = view.groups[groupIndex];\n                        var collection = group.addDaySlotCollection(kendo.date.addDays(startDate, cellCount), kendo.date.addDays(startDate, cellCount + columnCount));\n                        var tableRow = tableRows[rowIndex];\n                        var cells = tableRow.children;\n                        var cellMultiplier = 0;\n                        tableRow.setAttribute('role', 'row');\n                        if (!view._isVerticallyGrouped()) {\n                            cellMultiplier = groupIndex;\n                        }\n                        for (var cellIndex = cellMultiplier * columnCount; cellIndex < (cellMultiplier + 1) * columnCount; cellIndex++) {\n                            var cell = cells[cellIndex];\n                            view.addDaySlot(collection, cell, startDate, cellCount);\n                            cellCount++;\n                        }\n                    }\n                }\n            },\n            _changePeriodGroupIndex: function (reverse) {\n                var view = this._view;\n                return reverse ? view.groups.length - 1 : 0;\n            },\n            _createResizeHint: function (range) {\n                var view = this._view;\n                var left = range.startSlot().offsetLeft;\n                var top = range.start.offsetTop;\n                var width = range.innerWidth();\n                var height = range.start.clientHeight - 2;\n                var hint = SchedulerView.fn._createResizeHint.call(view, left, top, width, height);\n                view._appendResizeHint(hint);\n            },\n            _createMoveHint: function (range, event) {\n                var view = this._view;\n                var startSlot = range.startSlot();\n                var endSlot = range.endSlot();\n                var hint = view._createEventElement(event.clone({\n                    head: range.head,\n                    tail: range.tail\n                }));\n                hint.css({\n                    left: startSlot.offsetLeft + 2,\n                    top: startSlot.offsetTop + startSlot.firstChildHeight,\n                    height: view.options.eventHeight,\n                    width: range.innerWidth() - (startSlot.index !== endSlot.index ? 5 : 4)\n                });\n                hint.addClass('k-event-drag-hint');\n                view._appendMoveHint(hint);\n            }\n        });\n        var MonthGroupedByDateView = kendo.Class.extend({\n            init: function (view) {\n                this._view = view;\n            },\n            _verticalRowCountForLevel: function () {\n                return 1;\n            },\n            _horizontalGroupCountForLevel: function (level) {\n                var view = this._view;\n                return view._columnCountForLevel(level + 1) / NUMBER_OF_COLUMNS;\n            },\n            _createRows: function (start, startIdx, horizontalGroupCount) {\n                var view = this._view;\n                var cellsPerRow = NUMBER_OF_COLUMNS;\n                var isVerticallyGrouped = view._isVerticallyGrouped();\n                var html = '';\n                var dateIdx = 0;\n                if (isVerticallyGrouped) {\n                    var verticalStart = new Date(start);\n                    var groupCount = view._groupCount();\n                    for (dateIdx; dateIdx < NUMBER_OF_ROWS; dateIdx++) {\n                        html += view._createRow(verticalStart, startIdx, groupCount, dateIdx);\n                        verticalStart = kendo.date.addDays(verticalStart, cellsPerRow);\n                    }\n                    start = kendo.date.nextDay(start);\n                } else {\n                    for (dateIdx; dateIdx < cellsPerRow; dateIdx++) {\n                        html += view._createRow(start, startIdx, horizontalGroupCount, dateIdx);\n                        start = kendo.date.nextDay(start);\n                    }\n                    start = kendo.date.addDays(start, cellsPerRow);\n                }\n                return html;\n            },\n            _adjustStartDate: function (start, isLastRow) {\n                var view = this._view;\n                var isVerticallyGrouped = view._isVerticallyGrouped();\n                if (isVerticallyGrouped) {\n                    if (isLastRow) {\n                        return kendo.date.addDays(start, NUMBER_OF_COLUMNS * (NUMBER_OF_ROWS - 1) + 1);\n                    } else {\n                        return kendo.date.nextDay(start);\n                    }\n                }\n                return kendo.date.addDays(start, NUMBER_OF_COLUMNS);\n            },\n            _getContent: function (content, startDate, resources, cellIdx) {\n                if (cellIdx === 0) {\n                    return content({\n                        date: startDate,\n                        resources: resources\n                    });\n                }\n                return '';\n            },\n            _getTimeSlotByPosition: function (x, y, groupIndex) {\n                var group = this._view.groups[groupIndex];\n                return group.daySlotByPosition(x, y, true);\n            },\n            _nextSlotStartDate: function (startDate) {\n                return startDate;\n            },\n            _getCalendarRowsLength: function () {\n                var view = this._view;\n                var isVerticallyGrouped = view._isVerticallyGrouped();\n                return isVerticallyGrouped ? NUMBER_OF_COLUMNS : NUMBER_OF_ROWS;\n            },\n            _createRowsLayout: function (resources, rows, groupHeaderTemplate, columns) {\n                var view = this._view;\n                return view._createDateLayout(columns, null, false);\n            },\n            _createVerticalColumnsLayout: function (resources, rows, groupHeaderTemplate) {\n                var view = this._view;\n                var resource = resources[0];\n                var configuration = [];\n                var data = resource.dataSource.view();\n                for (var dataIndex = 0; dataIndex < data.length * NUMBER_OF_ROWS; dataIndex++) {\n                    var obj = {\n                        text: groupHeaderTemplate({\n                            text: kendo.htmlEncode(kendo.getter(resource.dataTextField)(data[dataIndex % data.length])),\n                            color: kendo.getter(resource.dataColorField)(data[dataIndex % data.length]),\n                            field: resource.field,\n                            title: resource.title,\n                            name: resource.name,\n                            value: kendo.getter(resource.dataValueField)(data[dataIndex % data.length])\n                        }),\n                        className: 'k-slot-cell'\n                    };\n                    obj.columns = view._createColumnsLayout(resources.slice(1), null, groupHeaderTemplate);\n                    configuration.push(obj);\n                }\n                return configuration;\n            },\n            _createColumnsLayout: function (resources, columns, groupHeaderTemplate, subColumns) {\n                var view = this._view;\n                return view._createColumnsLayout(resources, columns, groupHeaderTemplate, subColumns, true);\n            },\n            _verticalGroupCount: function (level) {\n                var view = this._view;\n                return view._columnCountForLevel(level) / NUMBER_OF_ROWS;\n            },\n            _horizontalGroupCount: function (level) {\n                var view = this._view;\n                return view._columnCountForLevel(level) / NUMBER_OF_COLUMNS;\n            },\n            _positionEvent: function (event, group, range, rangeCount, start, end) {\n                var view = this._view;\n                var startIndex = range.start.index;\n                var endIndex = range.end.index;\n                var isMobilePhoneView = view._isMobilePhoneView();\n                for (var i = range.start.index; i <= range.end.index; i++) {\n                    var currentSlot = range.collection._slots[i];\n                    var dateRange = group.daySlotRanges(currentSlot.start, currentSlot.start, true)[0];\n                    var occurrence = event.clone({\n                        start: i === startIndex ? currentSlot.start : start,\n                        end: i === endIndex ? currentSlot.end : end,\n                        head: i !== endIndex || range.head,\n                        tail: i !== startIndex || range.tail\n                    });\n                    if (isMobilePhoneView) {\n                        view._positionMobileEvent(dateRange, view._createEventElement(occurrence), group);\n                    } else {\n                        view._positionEvent(dateRange, view._createEventElement(occurrence), group);\n                    }\n                }\n            },\n            _addDaySlotCollections: function (groupCount, tableRows, startDate) {\n                var view = this._view;\n                var columnCount = NUMBER_OF_COLUMNS;\n                var rowCount = NUMBER_OF_ROWS;\n                var isVerticallyGrouped = view._isVerticallyGrouped();\n                for (var dateIndex = 0; dateIndex < columnCount; dateIndex++) {\n                    for (var rowIndex = 0; rowIndex < rowCount; rowIndex++) {\n                        var groupIndex = 0;\n                        var currentTableIndex = isVerticallyGrouped ? dateIndex : rowIndex;\n                        var tableRow = tableRows[currentTableIndex];\n                        var cells = tableRow.children;\n                        var cellMultiplier = 0;\n                        tableRow.setAttribute('role', 'row');\n                        if (!view._isVerticallyGrouped()) {\n                            cellMultiplier = dateIndex;\n                        }\n                        for (var cellIndex = cellMultiplier * groupCount; cellIndex < (cellMultiplier + 1) * groupCount; cellIndex++) {\n                            var cellCount = rowIndex * columnCount + dateIndex;\n                            var currentCellIndex = isVerticallyGrouped ? cellIndex + rowIndex * groupCount : cellIndex;\n                            var cell = cells[currentCellIndex];\n                            var currentGroupIndex = isVerticallyGrouped ? cellIndex : groupIndex;\n                            var group = view.groups[currentGroupIndex];\n                            var collection;\n                            if (dateIndex === 0) {\n                                collection = group.addDaySlotCollection(kendo.date.addDays(startDate, cellCount), kendo.date.addDays(startDate, cellCount + columnCount));\n                            } else {\n                                collection = group._daySlotCollections[rowIndex];\n                            }\n                            view.addDaySlot(collection, cell, startDate, cellCount);\n                            groupIndex++;\n                        }\n                    }\n                }\n            },\n            _changePeriodGroupIndex: function (reverse, vertical, selectionGroupIndex) {\n                var view = this._view;\n                if (vertical && view._isVerticallyGrouped()) {\n                    return reverse ? view.groups.length - 1 : 0;\n                }\n                return selectionGroupIndex;\n            },\n            _createResizeHint: function (range) {\n                var view = this._view;\n                var left, top, width, height, hint;\n                if (view._isVerticallyGrouped()) {\n                    left = range.startSlot().offsetLeft;\n                    top = range.start.offsetTop;\n                    width = range.startSlot().offsetWidth;\n                    height = range.endSlot().offsetTop + range.startSlot().offsetHeight - range.startSlot().offsetTop - 2;\n                    hint = SchedulerView.fn._createResizeHint.call(view, left, top, width, height);\n                    view._appendResizeHint(hint);\n                } else {\n                    for (var slotIdx = range.startSlot().index; slotIdx <= range.endSlot().index; slotIdx++) {\n                        var slot = range.collection._slots[slotIdx];\n                        left = slot.offsetLeft;\n                        top = slot.offsetTop;\n                        width = slot.offsetWidth;\n                        height = slot.offsetHeight - 2;\n                        hint = SchedulerView.fn._createResizeHint.call(view, left, top, width, height);\n                        view._appendResizeHint(hint);\n                    }\n                }\n            },\n            _createMoveHint: function (range, event) {\n                var view = this._view;\n                var startSlot = range.startSlot();\n                var endSlot = range.endSlot();\n                for (var slotIdx = startSlot.index; slotIdx <= endSlot.index; slotIdx++) {\n                    var slot = range.collection._slots[slotIdx];\n                    var hint = view._createEventElement(event.clone({\n                        head: range.head,\n                        tail: range.tail\n                    }));\n                    hint.css({\n                        left: slot.offsetLeft,\n                        top: slot.offsetTop + slot.firstChildHeight,\n                        height: view.options.eventHeight,\n                        width: slot.offsetWidth - 2\n                    });\n                    hint.addClass('k-event-drag-hint');\n                    view._appendMoveHint(hint);\n                }\n            }\n        });\n        kendo.ui.scheduler.MonthGroupedView = MonthGroupedView;\n        kendo.ui.scheduler.MonthGroupedByDateView = MonthGroupedByDateView;\n        ui.MonthView = SchedulerView.extend({\n            init: function (element, options) {\n                var that = this;\n                SchedulerView.fn.init.call(that, element, options);\n                that._groupedView = that._getGroupedView();\n                that.title = that.options.title;\n                that._templates();\n                that._editable();\n                that._renderLayout(that.options.date);\n                that._groups();\n            },\n            name: 'month',\n            _getGroupedView: function () {\n                if (this._isGroupedByDate()) {\n                    return new kendo.ui.scheduler.MonthGroupedByDateView(this);\n                } else {\n                    return new kendo.ui.scheduler.MonthGroupedView(this);\n                }\n            },\n            _updateDirection: function (selection, ranges, multiple, reverse, vertical) {\n                if (multiple) {\n                    var startSlot = ranges[0].start;\n                    var endSlot = ranges[ranges.length - 1].end;\n                    var isSameSlot = startSlot.index === endSlot.index;\n                    var isSameCollection = startSlot.collectionIndex === endSlot.collectionIndex;\n                    var updateDirection;\n                    if (vertical) {\n                        updateDirection = isSameSlot && isSameCollection || isSameCollection;\n                    } else {\n                        updateDirection = isSameSlot && isSameCollection;\n                    }\n                    if (updateDirection) {\n                        selection.backward = reverse;\n                    }\n                }\n            },\n            _changeDate: function (selection, slot, previous) {\n                var group = this.groups[selection.groupIndex];\n                var collections, index;\n                if (previous) {\n                    collections = group._getCollections(group.daySlotCollectionCount());\n                    index = slot.collectionIndex - 1;\n                    if (index >= 0) {\n                        return collections[index]._slots[collections[index]._slots.length - 1];\n                    }\n                } else {\n                    collections = group._getCollections(group.daySlotCollectionCount());\n                    index = slot.collectionIndex + 1;\n                    var slotIndex = 0;\n                    if (collections[index] && collections[index]._slots[slotIndex]) {\n                        return collections[index]._slots[slotIndex];\n                    }\n                }\n            },\n            _getNextHorizontalRange: function (group, method, horizontalRange) {\n                var isVertical = this._isVerticallyGrouped();\n                horizontalRange.startSlot = group[method](horizontalRange.startSlot, isVertical);\n                horizontalRange.endSlot = group[method](horizontalRange.endSlot, isVertical);\n                return horizontalRange;\n            },\n            _getNextVerticalRange: function (group, method, verticalRange, multiple) {\n                var isVertical = this._isVerticallyGrouped() && this._isGroupedByDate();\n                verticalRange.startSlot = group[method](verticalRange.startSlot, multiple, isVertical);\n                verticalRange.endSlot = group[method](verticalRange.endSlot, multiple, isVertical);\n                return verticalRange;\n            },\n            _changeViewPeriod: function (selection, reverse, vertical) {\n                var pad = vertical ? 7 : 1;\n                if (reverse) {\n                    pad *= -1;\n                }\n                selection.start = kendo.date.addDays(selection.start, pad);\n                selection.end = kendo.date.addDays(selection.end, pad);\n                if (!vertical || vertical && this._isVerticallyGrouped()) {\n                    selection.groupIndex = this._groupedView._changePeriodGroupIndex(reverse, vertical, selection.groupIndex);\n                }\n                selection.events = [];\n                return true;\n            },\n            _continuousSlot: function (selection, ranges, reverse) {\n                var index = selection.backward ? 0 : ranges.length - 1;\n                var group = this.groups[selection.groupIndex];\n                return group.continuousSlot(ranges[index].start, reverse);\n            },\n            _changeGroupContinuously: function (selection, continuousSlot, multiple, reverse) {\n                if (!multiple) {\n                    var groupIndex = selection.groupIndex;\n                    var lastGroupIndex = this.groups.length - 1;\n                    var vertical = this._isVerticallyGrouped();\n                    var group = this.groups[groupIndex];\n                    if (!continuousSlot && vertical) {\n                        continuousSlot = group[reverse ? 'lastSlot' : 'firstSlot']();\n                        groupIndex += reverse ? -1 : 1;\n                    } else if (continuousSlot && !vertical) {\n                        groupIndex = reverse ? lastGroupIndex : 0;\n                    }\n                    if (groupIndex < 0 || groupIndex > lastGroupIndex) {\n                        groupIndex = reverse ? lastGroupIndex : 0;\n                        continuousSlot = null;\n                    }\n                    selection.groupIndex = groupIndex;\n                }\n                return continuousSlot;\n            },\n            _normalizeHorizontalSelection: function (selection, ranges, reverse) {\n                var slot;\n                if (reverse) {\n                    slot = ranges[0].start;\n                } else {\n                    slot = ranges[ranges.length - 1].end;\n                }\n                return slot;\n            },\n            _normalizeVerticalSelection: function (selection, ranges) {\n                var slot;\n                if (selection.backward) {\n                    slot = ranges[0].start;\n                } else {\n                    slot = ranges[ranges.length - 1].end;\n                }\n                return slot;\n            },\n            _templates: function () {\n                var options = this.options, settings = extend({}, kendo.Template, options.templateSettings);\n                this.eventTemplate = this._eventTmpl(options.eventTemplate, EVENT_WRAPPER_STRING);\n                this.dayTemplate = kendo.template(options.dayTemplate, settings);\n                this.groupHeaderTemplate = kendo.template(options.groupHeaderTemplate, settings);\n            },\n            dateForTitle: function () {\n                return kendo.format(this.options.selectedDateFormat, this._firstDayOfMonth, this._lastDayOfMonth);\n            },\n            shortDateForTitle: function () {\n                return kendo.format(this.options.selectedShortDateFormat, this._firstDayOfMonth, this._lastDayOfMonth);\n            },\n            nextDate: function () {\n                return kendo.date.nextDay(this._lastDayOfMonth);\n            },\n            previousDate: function () {\n                return kendo.date.previousDay(this._firstDayOfMonth);\n            },\n            startDate: function () {\n                return this._startDate;\n            },\n            endDate: function () {\n                return this._endDate;\n            },\n            _renderLayout: function (date) {\n                var that = this;\n                this._firstDayOfMonth = kendo.date.firstDayOfMonth(date);\n                this._lastDayOfMonth = kendo.date.lastDayOfMonth(date);\n                this._startDate = firstVisibleMonthDay(date, this.calendarInfo());\n                this.createLayout(this._layout());\n                this._content();\n                this.refreshLayout();\n                this.content.on('click' + NS, '.k-nav-day,.k-more-events', function (e) {\n                    var offset = $(e.currentTarget).offset();\n                    var slot = that._slotByPosition(offset.left, offset.top);\n                    e.preventDefault();\n                    that.trigger('navigate', {\n                        view: 'day',\n                        date: slot.startDate()\n                    });\n                });\n            },\n            _editable: function () {\n                if (this.options.editable && !this._isMobilePhoneView()) {\n                    if (this._isMobile()) {\n                        this._touchEditable();\n                    } else {\n                        this._mouseEditable();\n                    }\n                }\n            },\n            _mouseEditable: function () {\n                var that = this;\n                that.element.on('click' + NS, '.k-scheduler-monthview .k-event a:has(.k-i-close)', function (e) {\n                    that.trigger('remove', { uid: $(this).closest('.k-event').attr(kendo.attr('uid')) });\n                    e.preventDefault();\n                });\n                if (that.options.editable.create !== false) {\n                    that.element.on('dblclick' + NS, '.k-scheduler-monthview .k-scheduler-content td', function (e) {\n                        var offset = $(e.currentTarget).offset();\n                        var slot = that._slotByPosition(offset.left, offset.top);\n                        if (slot) {\n                            var resourceInfo = that._resourceBySlot(slot);\n                            that.trigger('add', {\n                                eventInfo: extend({\n                                    isAllDay: true,\n                                    start: slot.startDate(),\n                                    end: slot.startDate()\n                                }, resourceInfo)\n                            });\n                        }\n                        e.preventDefault();\n                    });\n                }\n                if (that.options.editable.update !== false) {\n                    that.element.on('dblclick' + NS, '.k-scheduler-monthview .k-event', function (e) {\n                        that.trigger('edit', { uid: $(this).closest('.k-event').attr(kendo.attr('uid')) });\n                        e.preventDefault();\n                    });\n                }\n            },\n            _touchEditable: function () {\n                var that = this;\n                var threshold = 0;\n                if (kendo.support.mobileOS.android) {\n                    threshold = 5;\n                }\n                if (that.options.editable.create !== false) {\n                    that._addUserEvents = new kendo.UserEvents(that.element, {\n                        threshold: threshold,\n                        filter: '.k-scheduler-monthview .k-scheduler-content td',\n                        tap: function (e) {\n                            var offset = $(e.target).offset();\n                            var slot = that._slotByPosition(offset.left, offset.top);\n                            if (slot) {\n                                var resourceInfo = that._resourceBySlot(slot);\n                                that.trigger('add', {\n                                    eventInfo: extend({\n                                        isAllDay: true,\n                                        start: slot.startDate(),\n                                        end: slot.startDate()\n                                    }, resourceInfo)\n                                });\n                            }\n                            e.preventDefault();\n                        }\n                    });\n                }\n                if (that.options.editable.update !== false) {\n                    that._editUserEvents = new kendo.UserEvents(that.element, {\n                        threshold: threshold,\n                        filter: '.k-scheduler-monthview .k-event',\n                        tap: function (e) {\n                            if ($(e.event.target).closest('a:has(.k-i-close)').length === 0) {\n                                that.trigger('edit', { uid: $(e.target).closest('.k-event').attr(kendo.attr('uid')) });\n                                e.preventDefault();\n                            }\n                        }\n                    });\n                }\n            },\n            selectionByElement: function (cell) {\n                var offset = $(cell).offset();\n                return this._slotByPosition(offset.left, offset.top);\n            },\n            _columnCountForLevel: function (level) {\n                var columnLevel = this.columnLevels[level];\n                return columnLevel ? columnLevel.length : 0;\n            },\n            _rowCountForLevel: function (level) {\n                var rowLevel = this.rowLevels[level];\n                return rowLevel ? rowLevel.length : 0;\n            },\n            _content: function () {\n                var html = '<tbody>';\n                var verticalGroupCount = 1;\n                var groupedView = this._groupedView;\n                var resources = this.groupedResources;\n                if (resources.length) {\n                    if (this._isVerticallyGrouped()) {\n                        verticalGroupCount = groupedView._verticalRowCountForLevel(resources.length - 1);\n                    }\n                }\n                for (var verticalGroupIdx = 0; verticalGroupIdx < verticalGroupCount; verticalGroupIdx++) {\n                    html += this._createCalendar(verticalGroupIdx);\n                }\n                html += '</tbody>';\n                this.content.find('table').html(html);\n            },\n            _createCalendar: function (verticalGroupIndex) {\n                var start = this.startDate();\n                var cellCount = NUMBER_OF_COLUMNS * NUMBER_OF_ROWS;\n                var cellsPerRow = NUMBER_OF_COLUMNS;\n                var weekStartDates = [start];\n                var html = '';\n                var horizontalGroupCount = 1;\n                var isVerticallyGrouped = this._isVerticallyGrouped();\n                var groupedView = this._groupedView;\n                var resources = this.groupedResources;\n                if (resources.length) {\n                    if (!isVerticallyGrouped) {\n                        horizontalGroupCount = groupedView._horizontalGroupCountForLevel(resources.length - 1);\n                    }\n                }\n                this._slotIndices = {};\n                var calendarRowsLength = groupedView._getCalendarRowsLength(cellsPerRow, cellCount);\n                for (var rowIdx = 0; rowIdx < calendarRowsLength; rowIdx++) {\n                    html += '<tr>';\n                    weekStartDates.push(start);\n                    var startIdx = rowIdx * cellsPerRow;\n                    html += groupedView._createRows(start, startIdx, horizontalGroupCount, verticalGroupIndex);\n                    start = groupedView._adjustStartDate(start, rowIdx === calendarRowsLength - 1);\n                    html += '</tr>';\n                }\n                this._weekStartDates = weekStartDates;\n                this._endDate = kendo.date.previousDay(start);\n                return html;\n            },\n            _createRow: function (startDate, startIdx, cellsPerRow, groupIndex) {\n                var that = this;\n                var min = that._firstDayOfMonth;\n                var max = that._lastDayOfMonth;\n                var content = that.dayTemplate;\n                var classes = '';\n                var html = '';\n                var groupedView = this._groupedView;\n                var resources = function () {\n                    return that._resourceBySlot({ groupIndex: groupIndex });\n                };\n                for (var cellIdx = 0; cellIdx < cellsPerRow; cellIdx++) {\n                    classes = '';\n                    if (kendo.date.isToday(startDate)) {\n                        classes += 'k-today';\n                    }\n                    if (!kendo.date.isInDateRange(startDate, min, max)) {\n                        classes += ' k-other-month';\n                    }\n                    html += '<td ';\n                    if (classes !== '') {\n                        html += 'class=\"' + classes + '\"';\n                    }\n                    html += '>';\n                    html += groupedView._getContent(content, startDate, resources, cellIdx);\n                    html += '</td>';\n                    that._slotIndices[getDate(startDate).getTime()] = startIdx + cellIdx;\n                    startDate = groupedView._nextSlotStartDate(startDate);\n                }\n                return html;\n            },\n            _layout: function () {\n                var calendarInfo = this.calendarInfo();\n                var weekDayNames = this._isMobile() ? calendarInfo.days.namesShort : calendarInfo.days.names;\n                var names = shiftArray(weekDayNames, calendarInfo.firstDay);\n                var columns = $.map(names, function (value) {\n                    return { text: value };\n                });\n                var resources = this.groupedResources;\n                var rows;\n                var groupedView = this._groupedView;\n                if (resources.length) {\n                    if (this._isVerticallyGrouped()) {\n                        var inner = [];\n                        for (var idx = 0; idx < 6; idx++) {\n                            inner.push({\n                                text: '<div>&nbsp;</div>',\n                                className: 'k-hidden k-slot-cell'\n                            });\n                        }\n                        rows = groupedView._createRowsLayout(resources, inner, this.groupHeaderTemplate, columns);\n                        columns = groupedView._createVerticalColumnsLayout(resources, inner, this.groupHeaderTemplate, columns);\n                    } else {\n                        columns = groupedView._createColumnsLayout(resources, columns, this.groupHeaderTemplate, columns);\n                    }\n                }\n                return {\n                    columns: columns,\n                    rows: rows\n                };\n            },\n            _createEventElement: function (event) {\n                var options = this.options;\n                var editable = options.editable;\n                var isMobile = this._isMobile();\n                event.showDelete = editable && editable.destroy !== false && !isMobile;\n                event.resizable = editable && editable.resize !== false && !isMobile;\n                event.ns = kendo.ns;\n                event.resources = this.eventResources(event);\n                event.inverseColor = event.resources && event.resources[0] ? this._shouldInverseResourceColor(event.resources[0]) : false;\n                event.messages = options.messages || { destroy: 'Delete' };\n                var element = $(this.eventTemplate(event));\n                this.angular('compile', function () {\n                    return {\n                        elements: element,\n                        data: [{ dataItem: event }]\n                    };\n                });\n                return element;\n            },\n            _isInDateSlot: function (event) {\n                var groups = this.groups[0];\n                var slotStart = groups.firstSlot().start;\n                var slotEnd = groups.lastSlot().end - 1;\n                var startTime = kendo.date.toUtcTime(event.start);\n                var endTime = kendo.date.toUtcTime(event.end);\n                return (isInDateRange(startTime, slotStart, slotEnd) || isInDateRange(endTime, slotStart, slotEnd) || isInDateRange(slotStart, startTime, endTime) || isInDateRange(slotEnd, startTime, endTime)) && (!isInDateRange(endTime, slotStart, slotStart) || isInDateRange(endTime, startTime, startTime) || event.isAllDay);\n            },\n            _slotIndex: function (date) {\n                return this._slotIndices[getDate(date).getTime()];\n            },\n            _positionMobileEvent: function (slotRange, element, group) {\n                var startSlot = slotRange.start;\n                if (slotRange.start.offsetLeft > slotRange.end.offsetLeft) {\n                    startSlot = slotRange.end;\n                }\n                var startIndex = slotRange.start.index;\n                var endIndex = startIndex;\n                var eventCount = 3;\n                var events = SchedulerView.collidingEvents(slotRange.events(), startIndex, endIndex);\n                events.push({\n                    element: element,\n                    start: startIndex,\n                    end: endIndex\n                });\n                var rows = SchedulerView.createRows(events);\n                var slot = slotRange.collection.at(startIndex);\n                var container = slot.container;\n                if (!container) {\n                    container = $(kendo.format('<div class=\"k-events-container\" style=\"top:{0};left:{1};width:{2}\"/>', startSlot.offsetTop + startSlot.firstChildTop + startSlot.firstChildHeight - 3 + 'px', startSlot.offsetLeft + 'px', startSlot.offsetWidth + 'px'));\n                    slot.container = container;\n                    this.content[0].appendChild(container[0]);\n                }\n                if (rows.length <= eventCount) {\n                    slotRange.addEvent({\n                        element: element,\n                        start: startIndex,\n                        end: endIndex,\n                        groupIndex: startSlot.groupIndex\n                    });\n                    group._continuousEvents.push({\n                        element: element,\n                        uid: element.attr(kendo.attr('uid')),\n                        start: slotRange.start,\n                        end: slotRange.end\n                    });\n                    container[0].appendChild(element[0]);\n                }\n            },\n            _positionEvent: function (slotRange, element, group) {\n                var eventHeight = this.options.eventHeight;\n                var startSlot = slotRange.start;\n                if (slotRange.start.offsetLeft > slotRange.end.offsetLeft) {\n                    startSlot = slotRange.end;\n                }\n                var startIndex = slotRange.start.index;\n                var endIndex = slotRange.end.index;\n                var eventCount = startSlot.eventCount;\n                var events = SchedulerView.collidingEvents(slotRange.events(), startIndex, endIndex);\n                var rightOffset = startIndex !== endIndex ? 5 : 4;\n                events.push({\n                    element: element,\n                    start: startIndex,\n                    end: endIndex\n                });\n                var rows = SchedulerView.createRows(events);\n                for (var idx = 0, length = Math.min(rows.length, eventCount); idx < length; idx++) {\n                    var rowEvents = rows[idx].events;\n                    var eventTop = startSlot.offsetTop + startSlot.firstChildHeight + idx * eventHeight + 3 * idx + 'px';\n                    for (var j = 0, eventLength = rowEvents.length; j < eventLength; j++) {\n                        rowEvents[j].element[0].style.top = eventTop;\n                    }\n                }\n                if (rows.length > eventCount) {\n                    for (var slotIndex = startIndex; slotIndex <= endIndex; slotIndex++) {\n                        var collection = slotRange.collection;\n                        var slot = collection.at(slotIndex);\n                        if (slot.more) {\n                            return;\n                        }\n                        slot.more = $(MORE_BUTTON_TEMPLATE({\n                            ns: kendo.ns,\n                            start: slotIndex,\n                            end: slotIndex,\n                            width: slot.clientWidth - 2,\n                            left: slot.offsetLeft + 2,\n                            top: slot.offsetTop + slot.firstChildHeight + eventCount * eventHeight + 3 * eventCount\n                        }));\n                        this.content[0].appendChild(slot.more[0]);\n                    }\n                } else {\n                    slotRange.addEvent({\n                        element: element,\n                        start: startIndex,\n                        end: endIndex,\n                        groupIndex: startSlot.groupIndex\n                    });\n                    element[0].style.width = slotRange.innerWidth() - rightOffset + 'px';\n                    element[0].style.left = startSlot.offsetLeft + 2 + 'px';\n                    element[0].style.height = eventHeight + 'px';\n                    group._continuousEvents.push({\n                        element: element,\n                        uid: element.attr(kendo.attr('uid')),\n                        start: slotRange.start,\n                        end: slotRange.end\n                    });\n                    element.appendTo(this.content);\n                }\n            },\n            _slotByPosition: function (x, y) {\n                var offset = this.content.offset();\n                x -= offset.left;\n                y -= offset.top;\n                y += this.content[0].scrollTop;\n                x += this.content[0].scrollLeft;\n                x = Math.ceil(x);\n                y = Math.ceil(y);\n                for (var groupIndex = 0; groupIndex < this.groups.length; groupIndex++) {\n                    var slot = this._groupedView._getTimeSlotByPosition(x, y, groupIndex);\n                    if (slot) {\n                        return slot;\n                    }\n                }\n                return null;\n            },\n            _appendResizeHint: function (hint) {\n                hint.appendTo(this.content);\n                this._resizeHint = this._resizeHint.add(hint);\n            },\n            _updateResizeHint: function (event, groupIndex, startTime, endTime) {\n                this._removeResizeHint();\n                var group = this.groups[groupIndex];\n                var ranges = group.ranges(startTime, endTime, true, event.isAllDay);\n                for (var rangeIndex = 0; rangeIndex < ranges.length; rangeIndex++) {\n                    this._groupedView._createResizeHint(ranges[rangeIndex]);\n                }\n                this._resizeHint.find('.k-label-top,.k-label-bottom').text('');\n                this._resizeHint.first().addClass('k-first').find('.k-label-top').text(kendo.toString(kendo.timezone.toLocalDate(startTime), 'M/dd'));\n                this._resizeHint.last().addClass('k-last').find('.k-label-bottom').text(kendo.toString(kendo.timezone.toLocalDate(endTime), 'M/dd'));\n            },\n            _updateMoveHint: function (event, groupIndex, distance) {\n                var start = kendo.date.toUtcTime(event.start) + distance;\n                var end = start + event.duration();\n                var group = this.groups[groupIndex];\n                var ranges = group.ranges(start, end, true, event.isAllDay);\n                this._removeMoveHint();\n                for (var rangeIndex = 0; rangeIndex < ranges.length; rangeIndex++) {\n                    this._groupedView._createMoveHint(ranges[rangeIndex], event);\n                }\n            },\n            _appendMoveHint: function (hint) {\n                hint.appendTo(this.content);\n                this._moveHint = this._moveHint.add(hint);\n            },\n            _groups: function () {\n                var groupCount = this._groupCount();\n                var tableRows = this.content[0].getElementsByTagName('tr');\n                var startDate = this.startDate();\n                this.groups = [];\n                for (var idx = 0; idx < groupCount; idx++) {\n                    this._addResourceView(idx);\n                }\n                this._groupedView._addDaySlotCollections(groupCount, tableRows, startDate);\n            },\n            addDaySlot: function (collection, cell, startDate, cellCount) {\n                var clientHeight = cell.clientHeight;\n                var firstChildHeight = cell.children.length ? cell.children[0].offsetHeight + 3 : 0;\n                var start = kendo.date.addDays(startDate, cellCount);\n                var end = kendo.date.MS_PER_DAY;\n                if (startDate.getHours() !== start.getHours()) {\n                    end += (startDate.getHours() - start.getHours()) * kendo.date.MS_PER_HOUR;\n                }\n                start = kendo.date.toUtcTime(start);\n                end += start;\n                var eventCount = Math.floor((clientHeight - firstChildHeight - this.options.moreButtonHeight) / (this.options.eventHeight + 3));\n                cell.setAttribute('role', 'gridcell');\n                cell.setAttribute('aria-selected', false);\n                collection.addDaySlot(cell, start, end, eventCount);\n            },\n            render: function (events) {\n                this.content.children('.k-event,.k-more-events,.k-events-container').remove();\n                this._groups();\n                events = new kendo.data.Query(events).sort([\n                    {\n                        field: 'start',\n                        dir: 'asc'\n                    },\n                    {\n                        field: 'end',\n                        dir: 'desc'\n                    }\n                ]).toArray();\n                var resources = this.groupedResources;\n                if (resources.length) {\n                    this._renderGroups(events, resources, 0, 1);\n                } else {\n                    this._renderEvents(events, 0);\n                }\n                this.refreshLayout();\n                this.trigger('activate');\n            },\n            _renderEvents: function (events, groupIndex) {\n                var event;\n                var idx;\n                var length;\n                for (idx = 0, length = events.length; idx < length; idx++) {\n                    event = events[idx];\n                    if (this._isInDateSlot(event)) {\n                        var group = this.groups[groupIndex];\n                        if (!group._continuousEvents) {\n                            group._continuousEvents = [];\n                        }\n                        var ranges = group.slotRanges(event, true);\n                        var rangeCount = ranges.length;\n                        for (var rangeIndex = 0; rangeIndex < rangeCount; rangeIndex++) {\n                            var range = ranges[rangeIndex];\n                            var start = event.start;\n                            var end = event.end;\n                            this._groupedView._positionEvent(event, group, range, rangeCount, start, end, rangeIndex);\n                        }\n                    }\n                }\n            },\n            _renderGroups: function (events, resources, offset, columnLevel) {\n                var resource = resources[0];\n                if (resource) {\n                    var view = resource.dataSource.view();\n                    for (var itemIdx = 0; itemIdx < view.length; itemIdx++) {\n                        var value = this._resourceValue(resource, view[itemIdx]);\n                        var tmp = new kendo.data.Query(events).filter({\n                            field: resource.field,\n                            operator: SchedulerView.groupEqFilter(value)\n                        }).toArray();\n                        if (resources.length > 1) {\n                            offset = this._renderGroups(tmp, resources.slice(1), offset++, columnLevel + 1);\n                        } else {\n                            this._renderEvents(tmp, offset++);\n                        }\n                    }\n                }\n                return offset;\n            },\n            _groupCount: function () {\n                var resources = this.groupedResources;\n                var groupedView = this._groupedView;\n                if (resources.length) {\n                    if (this._isVerticallyGrouped()) {\n                        return groupedView._verticalGroupCount(resources.length - 1);\n                    } else {\n                        return groupedView._horizontalGroupCount(resources.length);\n                    }\n                }\n                return 1;\n            },\n            _columnOffsetForResource: function (index) {\n                return this._columnCountForLevel(index) / this._columnCountForLevel(index - 1);\n            },\n            destroy: function () {\n                if (this.table) {\n                    this.table.removeClass('k-scheduler-monthview');\n                }\n                if (this.content) {\n                    this.content.off(NS);\n                }\n                if (this.element) {\n                    this.element.off(NS);\n                }\n                SchedulerView.fn.destroy.call(this);\n                if (this._isMobile() && !this._isMobilePhoneView() && this.options.editable) {\n                    if (this.options.editable.create !== false) {\n                        this._addUserEvents.destroy();\n                    }\n                    if (this.options.editable.update !== false) {\n                        this._editUserEvents.destroy();\n                    }\n                }\n            },\n            events: [\n                'remove',\n                'add',\n                'edit',\n                'navigate'\n            ],\n            options: {\n                title: 'Month',\n                name: 'month',\n                eventHeight: 25,\n                moreButtonHeight: 13,\n                editable: true,\n                selectedDateFormat: '{0:y}',\n                selectedShortDateFormat: '{0:y}',\n                groupHeaderTemplate: '#=text#',\n                dayTemplate: DAY_TEMPLATE,\n                eventTemplate: EVENT_TEMPLATE\n            }\n        });\n        function shiftArray(array, idx) {\n            return array.slice(idx).concat(array.slice(0, idx));\n        }\n        function firstVisibleMonthDay(date, calendarInfo) {\n            var firstDay = calendarInfo.firstDay, firstVisibleDay = new Date(date.getFullYear(), date.getMonth(), 0, date.getHours(), date.getMinutes(), date.getSeconds(), date.getMilliseconds());\n            while (firstVisibleDay.getDay() != firstDay) {\n                kendo.date.setTime(firstVisibleDay, -1 * MS_PER_DAY);\n            }\n            return firstVisibleDay;\n        }\n        function isInDateRange(value, min, max) {\n            var msMin = min, msMax = max, msValue;\n            msValue = value;\n            return msValue >= msMin && msValue <= msMax;\n        }\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.scheduler.recurrence', [\n        'kendo.dropdownlist',\n        'kendo.datepicker',\n        'kendo.numerictextbox'\n    ], f);\n}(function () {\n    var __meta__ = {\n        id: 'scheduler.recurrence',\n        name: 'Recurrence',\n        category: 'web',\n        depends: [\n            'dropdownlist',\n            'datepicker',\n            'numerictextbox'\n        ],\n        hidden: true\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, timezone = kendo.timezone, Class = kendo.Class, ui = kendo.ui, Widget = ui.Widget, DropDownList = ui.DropDownList, kendoDate = kendo.date, setTime = kendoDate.setTime, setDayOfWeek = kendoDate.setDayOfWeek, adjustDST = kendoDate.adjustDST, firstDayOfMonth = kendoDate.firstDayOfMonth, getMilliseconds = kendoDate.getMilliseconds, DAYS_IN_LEAPYEAR = [\n                0,\n                31,\n                60,\n                91,\n                121,\n                152,\n                182,\n                213,\n                244,\n                274,\n                305,\n                335,\n                366\n            ], DAYS_IN_YEAR = [\n                0,\n                31,\n                59,\n                90,\n                120,\n                151,\n                181,\n                212,\n                243,\n                273,\n                304,\n                334,\n                365\n            ], MONTHS = [\n                31,\n                28,\n                30,\n                31,\n                30,\n                31,\n                30,\n                31,\n                30,\n                31,\n                30,\n                31\n            ], WEEK_DAYS = {\n                0: 'SU',\n                1: 'MO',\n                2: 'TU',\n                3: 'WE',\n                4: 'TH',\n                5: 'FR',\n                6: 'SA'\n            }, WEEK_DAYS_IDX = {\n                'SU': 0,\n                'MO': 1,\n                'TU': 2,\n                'WE': 3,\n                'TH': 4,\n                'FR': 5,\n                'SA': 6\n            }, DATE_FORMATS = [\n                'yyyy-MM-ddTHH:mm:ss.fffzzz',\n                'yyyy-MM-ddTHH:mm:sszzz',\n                'yyyy-MM-ddTHH:mm:ss',\n                'yyyy-MM-ddTHH:mm',\n                'yyyy-MM-ddTHH',\n                'yyyy-MM-dd',\n                'yyyyMMddTHHmmssfffzzz',\n                'yyyyMMddTHHmmsszzz',\n                'yyyyMMddTHHmmss',\n                'yyyyMMddTHHmm',\n                'yyyyMMddTHH',\n                'yyyyMMdd'\n            ], RULE_NAMES = [\n                'months',\n                'weeks',\n                'yearDays',\n                'monthDays',\n                'weekDays',\n                'hours',\n                'minutes',\n                'seconds'\n            ], RULE_NAMES_LENGTH = RULE_NAMES.length, RECURRENCE_DATE_FORMAT = 'yyyyMMddTHHmmssZ', limitation = {\n                months: function (date, end, rule) {\n                    var monthRules = rule.months, months = ruleValues(monthRules, date.getMonth() + 1), changed = false;\n                    if (months !== null) {\n                        if (months.length) {\n                            date.setMonth(months[0] - 1, 1);\n                        } else {\n                            date.setFullYear(date.getFullYear() + 1, monthRules[0] - 1, 1);\n                        }\n                        changed = true;\n                    }\n                    return changed;\n                },\n                monthDays: function (date, end, rule) {\n                    var monthLength, month, days, changed = false, hours = date.getHours(), normalize = function (monthDay) {\n                            if (monthDay < 0) {\n                                monthDay = monthLength + monthDay;\n                            }\n                            return monthDay;\n                        };\n                    while (date <= end) {\n                        month = date.getMonth();\n                        monthLength = getMonthLength(date);\n                        days = ruleValues(rule.monthDays, date.getDate(), normalize);\n                        if (days === null) {\n                            return changed;\n                        }\n                        changed = true;\n                        if (days.length) {\n                            date.setMonth(month, days.sort(numberSortPredicate)[0]);\n                            adjustDST(date, hours);\n                            if (month === date.getMonth()) {\n                                break;\n                            }\n                        } else {\n                            date.setMonth(month + 1, 1);\n                        }\n                    }\n                    return changed;\n                },\n                yearDays: function (date, end, rule) {\n                    var year, yearDays, changed = false, hours = date.getHours(), normalize = function (yearDay) {\n                            if (yearDay < 0) {\n                                yearDay = year + yearDay;\n                            }\n                            return yearDay;\n                        };\n                    while (date < end) {\n                        year = leapYear(date) ? 366 : 365;\n                        yearDays = ruleValues(rule.yearDays, dayInYear(date), normalize);\n                        if (yearDays === null) {\n                            return changed;\n                        }\n                        changed = true;\n                        year = date.getFullYear();\n                        if (yearDays.length) {\n                            date.setFullYear(year, 0, yearDays.sort(numberSortPredicate)[0]);\n                            adjustDST(date, hours);\n                            break;\n                        } else {\n                            date.setFullYear(year + 1, 0, 1);\n                        }\n                    }\n                    return changed;\n                },\n                weeks: function (date, end, rule) {\n                    var weekStart = rule.weekStart, year, weeks, day, changed = false, hours = date.getHours(), normalize = function (week) {\n                            if (week < 0) {\n                                week = 53 + week;\n                            }\n                            return week;\n                        };\n                    while (date < end) {\n                        weeks = ruleValues(rule.weeks, weekInYear(date, weekStart), normalize);\n                        if (weeks === null) {\n                            return changed;\n                        }\n                        changed = true;\n                        year = date.getFullYear();\n                        if (weeks.length) {\n                            day = weeks.sort(numberSortPredicate)[0] * 7 - 1;\n                            date.setFullYear(year, 0, day);\n                            setDayOfWeek(date, weekStart, -1);\n                            adjustDST(date, hours);\n                            break;\n                        } else {\n                            date.setFullYear(year + 1, 0, 1);\n                        }\n                    }\n                    return changed;\n                },\n                weekDays: function (date, end, rule) {\n                    var weekDays = rule.weekDays;\n                    var weekStart = rule.weekStart;\n                    var weekDayRules = ruleWeekValues(weekDays, date, weekStart);\n                    var hours = date.getHours();\n                    var weekDayRule, day;\n                    if (weekDayRules === null) {\n                        return false;\n                    }\n                    weekDayRule = weekDayRules[0];\n                    if (!weekDayRule) {\n                        weekDayRule = weekDays[0];\n                        setDayOfWeek(date, weekStart);\n                    }\n                    day = weekDayRule.day;\n                    if (weekDayRule.offset) {\n                        while (date <= end && !isInWeek(date, weekDayRule, weekStart)) {\n                            if (weekInMonth(date, weekStart) === numberOfWeeks(date, weekStart)) {\n                                date.setMonth(date.getMonth() + 1, 1);\n                                adjustDST(date, hours);\n                            } else {\n                                date.setDate(date.getDate() + 7);\n                                adjustDST(date, hours);\n                                setDayOfWeek(date, weekStart, -1);\n                            }\n                        }\n                    }\n                    if (date.getDay() !== day) {\n                        setDayOfWeek(date, day);\n                    }\n                    return true;\n                },\n                hours: function (date, end, rule) {\n                    var hourRules = rule.hours, startTime = rule._startTime, startHours = startTime.getHours(), hours = ruleValues(hourRules, startHours), changed = false;\n                    if (hours !== null) {\n                        changed = true;\n                        date.setHours(startHours);\n                        adjustDST(date, startHours);\n                        if (hours.length) {\n                            hours = hours[0];\n                            date.setHours(hours);\n                        } else {\n                            hours = date.getHours();\n                            date.setDate(date.getDate() + 1);\n                            adjustDST(date, hours);\n                            hours = hourRules[0];\n                            date.setHours(hours);\n                            adjustDST(date, hours);\n                        }\n                        if (rule.minutes) {\n                            date.setMinutes(0);\n                        }\n                        startTime.setHours(hours, date.getMinutes());\n                    }\n                    return changed;\n                },\n                minutes: function (date, end, rule) {\n                    var minuteRules = rule.minutes, currentMinutes = date.getMinutes(), minutes = ruleValues(minuteRules, currentMinutes), hours = rule._startTime.getHours(), changed = false;\n                    if (minutes !== null) {\n                        changed = true;\n                        if (minutes.length) {\n                            minutes = minutes[0];\n                        } else {\n                            hours += 1;\n                            minutes = minuteRules[0];\n                        }\n                        if (rule.seconds) {\n                            date.setSeconds(0);\n                        }\n                        date.setHours(hours, minutes);\n                        hours = hours % 24;\n                        adjustDST(date, hours);\n                        rule._startTime.setHours(hours, minutes, date.getSeconds());\n                    }\n                    return changed;\n                },\n                seconds: function (date, end, rule) {\n                    var secondRules = rule.seconds, hours = rule._startTime.getHours(), seconds = ruleValues(secondRules, date.getSeconds()), minutes = date.getMinutes(), changed = false;\n                    if (seconds !== null) {\n                        changed = true;\n                        if (seconds.length) {\n                            date.setSeconds(seconds[0]);\n                        } else {\n                            minutes += 1;\n                            date.setMinutes(minutes, secondRules[0]);\n                            if (minutes > 59) {\n                                minutes = minutes % 60;\n                                hours = (hours + 1) % 24;\n                            }\n                        }\n                        rule._startTime.setHours(hours, minutes, date.getSeconds());\n                    }\n                    return changed;\n                }\n            }, BaseFrequency = Class.extend({\n                next: function (date, rule) {\n                    var startTime = rule._startTime, day = startTime.getDate(), minutes, seconds;\n                    if (rule.seconds) {\n                        seconds = date.getSeconds() + 1;\n                        date.setSeconds(seconds);\n                        startTime.setSeconds(seconds);\n                        startTime.setDate(day);\n                    } else if (rule.minutes) {\n                        minutes = date.getMinutes() + 1;\n                        date.setMinutes(minutes);\n                        startTime.setMinutes(minutes);\n                        startTime.setDate(day);\n                    } else {\n                        return false;\n                    }\n                    return true;\n                },\n                normalize: function (options) {\n                    var rule = options.rule;\n                    if (options.idx === 4 && rule.hours) {\n                        rule._startTime.setHours(0);\n                        this._hour(options.date, rule);\n                    }\n                },\n                limit: function (date, end, rule) {\n                    var interval = rule.interval, ruleName, firstRule, modified, idx, day;\n                    while (date <= end) {\n                        modified = firstRule = undefined;\n                        day = date.getDate();\n                        for (idx = 0; idx < RULE_NAMES_LENGTH; idx++) {\n                            ruleName = RULE_NAMES[idx];\n                            if (rule[ruleName]) {\n                                modified = limitation[ruleName](date, end, rule);\n                                if (firstRule !== undefined && modified) {\n                                    break;\n                                } else {\n                                    firstRule = modified;\n                                }\n                            }\n                            if (modified) {\n                                this.normalize({\n                                    date: date,\n                                    rule: rule,\n                                    day: day,\n                                    idx: idx\n                                });\n                            }\n                        }\n                        if ((interval === 1 || !this.interval(rule, date)) && idx === RULE_NAMES_LENGTH) {\n                            break;\n                        }\n                    }\n                },\n                interval: function (rule, current) {\n                    var start = new Date(rule._startPeriod);\n                    var date = new Date(current);\n                    var hours = current.getHours();\n                    var weekStart = rule.weekStart;\n                    var interval = rule.interval;\n                    var frequency = rule.freq;\n                    var modified = false;\n                    var excess = 0;\n                    var month = 0;\n                    var day = 1;\n                    var diff;\n                    var startTimeHours;\n                    if (frequency === 'hourly') {\n                        diff = date.getTimezoneOffset() - start.getTimezoneOffset();\n                        startTimeHours = rule._startTime.getHours();\n                        date = date.getTime();\n                        if (hours !== startTimeHours) {\n                            date += (startTimeHours - hours) * kendoDate.MS_PER_HOUR;\n                        }\n                        date -= start;\n                        if (diff) {\n                            date -= diff * kendoDate.MS_PER_MINUTE;\n                        }\n                        diff = Math.floor(date / kendoDate.MS_PER_HOUR);\n                        excess = intervalExcess(diff, interval);\n                        if (excess !== 0) {\n                            this._hour(current, rule, excess);\n                            modified = true;\n                        }\n                    } else if (frequency === 'daily') {\n                        kendoDate.setTime(date, -start, true);\n                        diff = Math.ceil(date / kendoDate.MS_PER_DAY);\n                        excess = intervalExcess(diff, interval);\n                        if (excess !== 0) {\n                            this._date(current, rule, excess);\n                            modified = true;\n                        }\n                    } else if (frequency === 'weekly') {\n                        excess = this._getNumberOfWeeksBetweenDates(start, current);\n                        var normalizedCurrentIndex = normalizeDayIndex(current.getDay(), weekStart);\n                        var normalizedStartIndex = normalizeDayIndex(start.getDay(), weekStart);\n                        if (normalizedCurrentIndex < normalizedStartIndex) {\n                            excess += 1;\n                        }\n                        excess = intervalExcess(excess, interval);\n                        if (excess !== 0) {\n                            kendoDate.setDayOfWeek(current, rule.weekStart, -1);\n                            current.setDate(current.getDate() + excess * 7);\n                            adjustDST(current, hours);\n                            modified = true;\n                        }\n                    } else if (frequency === 'monthly') {\n                        diff = current.getFullYear() - start.getFullYear();\n                        diff = current.getMonth() - start.getMonth() + diff * 12;\n                        excess = intervalExcess(diff, interval);\n                        if (excess !== 0) {\n                            day = rule._hasRuleValue ? 1 : current.getDate();\n                            current.setFullYear(current.getFullYear(), current.getMonth() + excess, day);\n                            adjustDST(current, hours);\n                            modified = true;\n                        }\n                    } else if (frequency === 'yearly') {\n                        diff = current.getFullYear() - start.getFullYear();\n                        excess = intervalExcess(diff, interval);\n                        if (!rule.months) {\n                            month = current.getMonth();\n                        }\n                        if (!rule.yearDays && !rule.monthDays && !rule.weekDays) {\n                            day = current.getDate();\n                        }\n                        if (excess !== 0) {\n                            current.setFullYear(current.getFullYear() + excess, month, day);\n                            adjustDST(current, hours);\n                            modified = true;\n                        }\n                    }\n                    return modified;\n                },\n                _getNumberOfWeeksBetweenDates: function (first, second) {\n                    var weeks = (second - first) / 604800000;\n                    var exactWeeks = Math.floor(weeks);\n                    if (weeks - exactWeeks > 0.99) {\n                        exactWeeks = Math.round(weeks);\n                    }\n                    return exactWeeks;\n                },\n                _hour: function (date, rule, interval) {\n                    var startTime = rule._startTime, hours = startTime.getHours();\n                    if (interval) {\n                        hours += interval;\n                    }\n                    date.setHours(hours);\n                    hours = hours % 24;\n                    startTime.setHours(hours);\n                    adjustDST(date, hours);\n                },\n                _date: function (date, rule, interval) {\n                    var hours = date.getHours();\n                    date.setDate(date.getDate() + interval);\n                    if (!adjustDST(date, hours)) {\n                        this._hour(date, rule);\n                    }\n                }\n            }), HourlyFrequency = BaseFrequency.extend({\n                next: function (date, rule) {\n                    if (!BaseFrequency.fn.next(date, rule)) {\n                        this._hour(date, rule, 1);\n                    }\n                },\n                normalize: function (options) {\n                    var rule = options.rule;\n                    if (options.idx === 4) {\n                        rule._startTime.setHours(0);\n                        this._hour(options.date, rule);\n                    }\n                }\n            }), DailyFrequency = BaseFrequency.extend({\n                next: function (date, rule) {\n                    if (!BaseFrequency.fn.next(date, rule)) {\n                        this[rule.hours ? '_hour' : '_date'](date, rule, 1);\n                    }\n                }\n            }), WeeklyFrequency = DailyFrequency.extend({\n                setup: function (rule, eventStartDate) {\n                    if (!rule.weekDays) {\n                        rule.weekDays = [{\n                                day: eventStartDate.getDay(),\n                                offset: 0\n                            }];\n                    }\n                }\n            }), MonthlyFrequency = BaseFrequency.extend({\n                next: function (date, rule) {\n                    var day, hours;\n                    if (!BaseFrequency.fn.next(date, rule)) {\n                        if (rule.hours) {\n                            this._hour(date, rule, 1);\n                        } else if (rule.monthDays || rule.weekDays || rule.yearDays || rule.weeks) {\n                            this._date(date, rule, 1);\n                        } else {\n                            day = date.getDate();\n                            hours = date.getHours();\n                            date.setMonth(date.getMonth() + 1);\n                            adjustDST(date, hours);\n                            while (date.getDate() !== day) {\n                                date.setDate(day);\n                                adjustDST(date, hours);\n                            }\n                            this._hour(date, rule);\n                        }\n                    }\n                },\n                normalize: function (options) {\n                    var rule = options.rule, date = options.date, hours = date.getHours();\n                    if (options.idx === 0 && !rule.monthDays && !rule.weekDays) {\n                        date.setDate(options.day);\n                        adjustDST(date, hours);\n                    } else {\n                        BaseFrequency.fn.normalize(options);\n                    }\n                },\n                setup: function (rule, eventStartDate, date) {\n                    if (!rule.monthDays && !rule.weekDays) {\n                        date.setDate(eventStartDate.getDate());\n                    }\n                }\n            }), YearlyFrequency = MonthlyFrequency.extend({\n                next: function (date, rule) {\n                    var day, hours = date.getHours();\n                    if (!BaseFrequency.fn.next(date, rule)) {\n                        if (rule.hours) {\n                            this._hour(date, rule, 1);\n                        } else if (rule.monthDays || rule.weekDays || rule.yearDays || rule.weeks) {\n                            this._date(date, rule, 1);\n                        } else if (rule.months) {\n                            day = date.getDate();\n                            date.setMonth(date.getMonth() + 1);\n                            adjustDST(date, hours);\n                            while (date.getDate() !== day) {\n                                date.setDate(day);\n                                adjustDST(date, hours);\n                            }\n                            this._hour(date, rule);\n                        } else {\n                            date.setFullYear(date.getFullYear() + 1);\n                            adjustDST(date, hours);\n                            this._hour(date, rule);\n                        }\n                    }\n                },\n                setup: function () {\n                }\n            }), frequencies = {\n                'hourly': new HourlyFrequency(),\n                'daily': new DailyFrequency(),\n                'weekly': new WeeklyFrequency(),\n                'monthly': new MonthlyFrequency(),\n                'yearly': new YearlyFrequency()\n            }, CLICK = 'click';\n        function intervalExcess(diff, interval) {\n            var excess;\n            if (diff !== 0 && diff < interval) {\n                excess = interval - diff;\n            } else {\n                excess = diff % interval;\n                if (excess) {\n                    excess = interval - excess;\n                }\n            }\n            return excess;\n        }\n        function dayInYear(date) {\n            var month = date.getMonth();\n            var days = leapYear(date) ? DAYS_IN_LEAPYEAR[month] : DAYS_IN_YEAR[month];\n            return days + date.getDate();\n        }\n        function weekInYear(date, weekStart) {\n            var year, days;\n            date = new Date(date.getFullYear(), date.getMonth(), date.getDate());\n            adjustDST(date, 0);\n            year = date.getFullYear();\n            if (weekStart !== undefined) {\n                setDayOfWeek(date, weekStart, -1);\n                date.setDate(date.getDate() + 4);\n            } else {\n                date.setDate(date.getDate() + (4 - (date.getDay() || 7)));\n            }\n            adjustDST(date, 0);\n            days = Math.floor((date.getTime() - new Date(year, 0, 1, -6)) / 86400000);\n            return 1 + Math.floor(days / 7);\n        }\n        function weekInMonth(date, weekStart) {\n            var firstWeekDay = firstDayOfMonth(date).getDay();\n            var firstWeekLength = 7 - (firstWeekDay + 7 - (weekStart || 7)) || 7;\n            if (firstWeekLength < 0) {\n                firstWeekLength += 7;\n            }\n            return Math.ceil((date.getDate() - firstWeekLength) / 7) + 1;\n        }\n        function normalizeDayIndex(weekDay, weekStart) {\n            return weekDay + (weekDay < weekStart ? 7 : 0);\n        }\n        function normalizeOffset(date, rule, weekStart) {\n            var offset = rule.offset;\n            if (!offset) {\n                return weekInMonth(date, weekStart);\n            }\n            var lastDate = new Date(date.getFullYear(), date.getMonth() + 1, 0);\n            var weeksInMonth = weekInMonth(lastDate, weekStart);\n            var day = normalizeDayIndex(rule.day, weekStart);\n            var skipFirst = day < normalizeDayIndex(new Date(date.getFullYear(), date.getMonth(), 1).getDay(), weekStart);\n            var skipLast = day > normalizeDayIndex(lastDate.getDay(), weekStart);\n            if (offset < 0) {\n                offset = weeksInMonth + (offset + 1 - (skipLast ? 1 : 0));\n            } else if (skipFirst) {\n                offset += 1;\n            }\n            weeksInMonth -= skipLast ? 1 : 0;\n            if (offset < (skipFirst ? 1 : 0) || offset > weeksInMonth) {\n                return null;\n            }\n            return offset;\n        }\n        function numberOfWeeks(date, weekStart) {\n            return weekInMonth(new Date(date.getFullYear(), date.getMonth() + 1, 0), weekStart);\n        }\n        function isInWeek(date, rule, weekStart) {\n            return weekInMonth(date, weekStart) === normalizeOffset(date, rule, weekStart);\n        }\n        function ruleWeekValues(weekDays, date, weekStart) {\n            var currentDay = normalizeDayIndex(date.getDay(), weekStart);\n            var length = weekDays.length;\n            var ruleWeekOffset;\n            var weekDay, day;\n            var weekNumber;\n            var result = [];\n            var idx = 0;\n            for (; idx < length; idx++) {\n                weekDay = weekDays[idx];\n                weekNumber = weekInMonth(date, weekStart);\n                ruleWeekOffset = normalizeOffset(date, weekDay, weekStart);\n                if (ruleWeekOffset === null) {\n                    continue;\n                }\n                if (weekNumber < ruleWeekOffset) {\n                    result.push(weekDay);\n                } else if (weekNumber === ruleWeekOffset) {\n                    day = normalizeDayIndex(weekDay.day, weekStart);\n                    if (currentDay < day) {\n                        result.push(weekDay);\n                    } else if (currentDay === day) {\n                        return null;\n                    }\n                }\n            }\n            return result;\n        }\n        function ruleValues(rules, value, normalize) {\n            var idx = 0, length = rules.length, availableRules = [], ruleValue;\n            for (; idx < length; idx++) {\n                ruleValue = rules[idx];\n                if (normalize) {\n                    ruleValue = normalize(ruleValue);\n                }\n                if (value === ruleValue) {\n                    return null;\n                } else if (value < ruleValue) {\n                    availableRules.push(ruleValue);\n                }\n            }\n            return availableRules;\n        }\n        function parseArray(list, range) {\n            var idx = 0, length = list.length, value;\n            for (; idx < length; idx++) {\n                value = parseInt(list[idx], 10);\n                if (isNaN(value) || value < range.start || value > range.end || value === 0 && range.start < 0) {\n                    return null;\n                }\n                list[idx] = value;\n            }\n            return list.sort(numberSortPredicate);\n        }\n        function parseWeekDayList(list) {\n            var idx = 0, length = list.length, value, valueLength, day;\n            for (; idx < length; idx++) {\n                value = list[idx];\n                valueLength = value.length;\n                day = value.substring(valueLength - 2).toUpperCase();\n                day = WEEK_DAYS_IDX[day];\n                if (day === undefined) {\n                    return null;\n                }\n                list[idx] = {\n                    offset: parseInt(value.substring(0, valueLength - 2), 10) || 0,\n                    day: day\n                };\n            }\n            return list;\n        }\n        function serializeWeekDayList(list) {\n            var idx = 0, length = list.length, value, valueString, result = [];\n            for (; idx < length; idx++) {\n                value = list[idx];\n                if (typeof value === 'string') {\n                    valueString = value;\n                } else {\n                    valueString = '' + WEEK_DAYS[value.day];\n                    if (value.offset) {\n                        valueString = value.offset + valueString;\n                    }\n                }\n                result.push(valueString);\n            }\n            return result.toString();\n        }\n        function getMonthLength(date) {\n            var month = date.getMonth();\n            if (month === 1) {\n                if (new Date(date.getFullYear(), 1, 29).getMonth() === 1) {\n                    return 29;\n                }\n                return 28;\n            }\n            return MONTHS[month];\n        }\n        function leapYear(year) {\n            year = year.getFullYear();\n            return year % 4 === 0 && year % 100 !== 0 || year % 400 === 0;\n        }\n        function numberSortPredicate(a, b) {\n            return a - b;\n        }\n        function parseExceptions(exceptions, zone) {\n            var idx = 0, length, date, dates = [];\n            if (exceptions) {\n                exceptions = exceptions.split(exceptions.indexOf(';') !== -1 ? ';' : ',');\n                length = exceptions.length;\n                for (; idx < length; idx++) {\n                    date = parseUTCDate(exceptions[idx], zone);\n                    if (date) {\n                        dates.push(date);\n                    }\n                }\n            }\n            return dates;\n        }\n        function isException(exceptions, date, zone) {\n            var dates = $.isArray(exceptions) ? exceptions : parseExceptions(exceptions, zone), dateTime = date.getTime() - date.getMilliseconds(), idx = 0, length = dates.length;\n            for (; idx < length; idx++) {\n                if (dates[idx].getTime() === dateTime) {\n                    return true;\n                }\n            }\n            return false;\n        }\n        function toExceptionString(dates, zone) {\n            var idx = 0;\n            var length;\n            var date;\n            var result = [].concat(dates);\n            for (length = result.length; idx < length; idx++) {\n                date = result[idx];\n                date = kendo.timezone.convert(date, zone || date.getTimezoneOffset(), 'Etc/UTC');\n                result[idx] = kendo.toString(date, RECURRENCE_DATE_FORMAT);\n            }\n            return result.join(',');\n        }\n        function startPeriodByFreq(start, rule) {\n            var date = new Date(start);\n            switch (rule.freq) {\n            case 'yearly':\n                date.setFullYear(date.getFullYear(), 0, 1);\n                break;\n            case 'monthly':\n                date.setFullYear(date.getFullYear(), date.getMonth(), 1);\n                break;\n            case 'weekly':\n                setDayOfWeek(date, rule.weekStart, -1);\n                break;\n            default:\n                break;\n            }\n            if (rule.hours) {\n                date.setHours(0);\n            }\n            if (rule.minutes) {\n                date.setMinutes(0);\n            }\n            if (rule.seconds) {\n                date.setSeconds(0);\n            }\n            return date;\n        }\n        function endPeriodByFreq(start, rule) {\n            var date = new Date(start);\n            switch (rule.freq) {\n            case 'yearly':\n                date.setFullYear(date.getFullYear(), 11, 31);\n                break;\n            case 'monthly':\n                date.setFullYear(date.getFullYear(), date.getMonth() + 1, 0);\n                break;\n            case 'weekly':\n                setDayOfWeek(date, rule.weekStart, -1);\n                date.setDate(date.getDate() + 6);\n                break;\n            default:\n                break;\n            }\n            if (rule.hours) {\n                date.setHours(23);\n            }\n            if (rule.minutes) {\n                date.setMinutes(59);\n            }\n            if (rule.seconds) {\n                date.setSeconds(59);\n            }\n            return date;\n        }\n        function eventsByPosition(periodEvents, start, positions) {\n            var periodEventsLength = periodEvents.length;\n            var events = [];\n            var position;\n            var event;\n            for (var idx = 0, length = positions.length; idx < length; idx++) {\n                position = positions[idx];\n                if (position < 0) {\n                    position = periodEventsLength + position;\n                } else {\n                    position -= 1;\n                }\n                event = periodEvents[position];\n                if (event && event.start >= start) {\n                    events.push(event);\n                }\n            }\n            return events;\n        }\n        function removeExceptionDates(periodEvents, exceptionDates, zone) {\n            var events = [];\n            var event;\n            for (var idx = 0; idx < periodEvents.length; idx++) {\n                event = periodEvents[idx];\n                if (!isException(exceptionDates, event.start, zone)) {\n                    events.push(event);\n                }\n            }\n            return events;\n        }\n        function expand(event, start, end, zone) {\n            var rule = parseRule(event.recurrenceRule, zone), startTime, endTime, endDate, hours, minutes, seconds, durationMS, startPeriod, inPeriod, ruleStart, ruleEnd, useEventStart, freqName, exceptionDates, eventStartTime, eventStartMS, eventStart, count, freq, positions, currentIdx, periodEvents, events = [];\n            if (!rule) {\n                return [event];\n            }\n            positions = rule.positions;\n            currentIdx = positions ? 0 : 1;\n            ruleStart = rule.start;\n            ruleEnd = rule.end;\n            if (ruleStart || ruleEnd) {\n                event = event.clone({\n                    start: ruleStart ? new Date(ruleStart.value[0]) : undefined,\n                    end: ruleEnd ? new Date(ruleEnd.value[0]) : undefined\n                });\n            }\n            eventStart = event.start;\n            eventStartMS = eventStart.getTime();\n            eventStartTime = getMilliseconds(eventStart);\n            exceptionDates = parseExceptions(event.recurrenceException, zone);\n            if (!exceptionDates[0] && rule.exdates) {\n                exceptionDates = rule.exdates.value;\n                event.set('recurrenceException', toExceptionString(exceptionDates, zone));\n            }\n            startPeriod = start = new Date(start);\n            end = new Date(end);\n            freqName = rule.freq;\n            freq = frequencies[freqName];\n            count = rule.count;\n            if (rule.until && rule.until < end) {\n                end = new Date(rule.until);\n            }\n            useEventStart = freqName === 'yearly' || freqName === 'monthly' || freqName === 'weekly';\n            if (start < eventStartMS || count || rule.interval > 1 || useEventStart) {\n                start = new Date(eventStartMS);\n            } else {\n                hours = start.getHours();\n                minutes = start.getMinutes();\n                seconds = start.getSeconds();\n                if (!rule.hours) {\n                    hours = eventStart.getHours();\n                }\n                if (!rule.minutes) {\n                    minutes = eventStart.getMinutes();\n                }\n                if (!rule.seconds) {\n                    seconds = eventStart.getSeconds();\n                }\n                start.setHours(hours, minutes, seconds, eventStart.getMilliseconds());\n            }\n            rule._startPeriod = new Date(start);\n            if (positions) {\n                start = startPeriodByFreq(start, rule);\n                end = endPeriodByFreq(end, rule);\n                var diff = getMilliseconds(end) - getMilliseconds(start);\n                if (diff < 0) {\n                    hours = start.getHours();\n                    end.setHours(hours, start.getMinutes(), start.getSeconds(), start.getMilliseconds());\n                    kendoDate.adjustDST(end, hours);\n                }\n                rule._startPeriod = new Date(start);\n                rule._endPeriod = endPeriodByFreq(start, rule);\n            }\n            durationMS = event.duration();\n            rule._startTime = startTime = kendoDate.toInvariantTime(start);\n            if (freq.setup) {\n                freq.setup(rule, eventStart, start);\n            }\n            freq.limit(start, end, rule);\n            while (start <= end) {\n                endDate = new Date(start);\n                setTime(endDate, durationMS);\n                inPeriod = start >= startPeriod || endDate > startPeriod;\n                if (inPeriod && !isException(exceptionDates, start, zone) || positions) {\n                    startTime = kendoDate.toUtcTime(kendoDate.getDate(start)) + getMilliseconds(rule._startTime);\n                    endTime = startTime + durationMS;\n                    if (eventStartMS !== start.getTime() || eventStartTime !== getMilliseconds(rule._startTime)) {\n                        events.push(event.toOccurrence({\n                            start: new Date(start),\n                            end: endDate,\n                            _startTime: startTime,\n                            _endTime: endTime\n                        }));\n                    } else {\n                        event._startTime = startTime;\n                        event._endTime = endTime;\n                        events.push(event);\n                    }\n                }\n                if (positions) {\n                    freq.next(start, rule);\n                    freq.limit(start, end, rule);\n                    if (start > rule._endPeriod) {\n                        periodEvents = eventsByPosition(events.slice(currentIdx), eventStart, positions);\n                        periodEvents = removeExceptionDates(periodEvents, exceptionDates, zone);\n                        events = events.slice(0, currentIdx).concat(periodEvents);\n                        rule._endPeriod = endPeriodByFreq(start, rule);\n                        currentIdx = events.length;\n                    }\n                    if (count && count === currentIdx) {\n                        break;\n                    }\n                } else {\n                    if (count && count === currentIdx) {\n                        break;\n                    }\n                    currentIdx += 1;\n                    freq.next(start, rule);\n                    freq.limit(start, end, rule);\n                }\n            }\n            return events;\n        }\n        function parseUTCDate(value, zone) {\n            value = kendo.parseDate(value, DATE_FORMATS);\n            if (value && zone) {\n                value = timezone.convert(value, value.getTimezoneOffset(), zone);\n            }\n            return value;\n        }\n        function parseDateRule(dateRule, zone) {\n            var pairs = dateRule.split(';');\n            var pair;\n            var property;\n            var value;\n            var tzid;\n            var valueIdx, valueLength;\n            for (var idx = 0, length = pairs.length; idx < length; idx++) {\n                pair = pairs[idx].split(':');\n                property = pair[0];\n                value = pair[1];\n                if (property.indexOf('TZID') !== -1) {\n                    tzid = property.substring(property.indexOf('TZID')).split('=')[1];\n                }\n                if (value) {\n                    value = value.split(',');\n                    for (valueIdx = 0, valueLength = value.length; valueIdx < valueLength; valueIdx++) {\n                        value[valueIdx] = parseUTCDate(value[valueIdx], tzid || zone);\n                    }\n                }\n            }\n            if (value) {\n                return {\n                    value: value,\n                    tzid: tzid\n                };\n            }\n        }\n        function parseRule(recur, zone) {\n            var instance = {};\n            var splits, value;\n            var idx = 0, length;\n            var ruleValue = false;\n            var rule, part, parts;\n            var property, weekStart, weekDays;\n            var predicate = function (a, b) {\n                var day1 = a.day, day2 = b.day;\n                if (day1 < weekStart) {\n                    day1 += 7;\n                }\n                if (day2 < weekStart) {\n                    day2 += 7;\n                }\n                return day1 - day2;\n            };\n            if (!recur) {\n                return null;\n            }\n            parts = recur.split('\\n');\n            if (!parts[1] && (recur.indexOf('DTSTART') !== -1 || recur.indexOf('DTEND') !== -1 || recur.indexOf('EXDATE') !== -1)) {\n                parts = recur.split(' ');\n            }\n            for (idx = 0, length = parts.length; idx < length; idx++) {\n                part = $.trim(parts[idx]);\n                if (part.indexOf('DTSTART') !== -1) {\n                    instance.start = parseDateRule(part, zone);\n                } else if (part.indexOf('DTEND') !== -1) {\n                    instance.end = parseDateRule(part, zone);\n                } else if (part.indexOf('EXDATE') !== -1) {\n                    instance.exdates = parseDateRule(part, zone);\n                } else if (part.indexOf('RRULE') !== -1) {\n                    rule = part.substring(6);\n                } else if ($.trim(part)) {\n                    rule = part;\n                }\n            }\n            rule = rule.split(';');\n            for (idx = 0, length = rule.length; idx < length; idx++) {\n                property = rule[idx];\n                splits = property.split('=');\n                value = $.trim(splits[1]).split(',');\n                switch ($.trim(splits[0]).toUpperCase()) {\n                case 'FREQ':\n                    instance.freq = value[0].toLowerCase();\n                    break;\n                case 'UNTIL':\n                    instance.until = parseUTCDate(value[0], zone);\n                    break;\n                case 'COUNT':\n                    instance.count = parseInt(value[0], 10);\n                    break;\n                case 'INTERVAL':\n                    instance.interval = parseInt(value[0], 10);\n                    break;\n                case 'BYSECOND':\n                    instance.seconds = parseArray(value, {\n                        start: 0,\n                        end: 60\n                    });\n                    ruleValue = true;\n                    break;\n                case 'BYMINUTE':\n                    instance.minutes = parseArray(value, {\n                        start: 0,\n                        end: 59\n                    });\n                    ruleValue = true;\n                    break;\n                case 'BYHOUR':\n                    instance.hours = parseArray(value, {\n                        start: 0,\n                        end: 23\n                    });\n                    ruleValue = true;\n                    break;\n                case 'BYMONTHDAY':\n                    instance.monthDays = parseArray(value, {\n                        start: -31,\n                        end: 31\n                    });\n                    ruleValue = true;\n                    break;\n                case 'BYYEARDAY':\n                    instance.yearDays = parseArray(value, {\n                        start: -366,\n                        end: 366\n                    });\n                    ruleValue = true;\n                    break;\n                case 'BYMONTH':\n                    instance.months = parseArray(value, {\n                        start: 1,\n                        end: 12\n                    });\n                    ruleValue = true;\n                    break;\n                case 'BYDAY':\n                    instance.weekDays = weekDays = parseWeekDayList(value);\n                    ruleValue = true;\n                    break;\n                case 'BYWEEKNO':\n                    instance.weeks = parseArray(value, {\n                        start: -53,\n                        end: 53\n                    });\n                    ruleValue = true;\n                    break;\n                case 'BYSETPOS':\n                    instance.positions = parseArray(value, {\n                        start: -366,\n                        end: 366\n                    });\n                    break;\n                case 'WKST':\n                    instance.weekStart = weekStart = WEEK_DAYS_IDX[value[0]];\n                    break;\n                }\n            }\n            if (instance.freq === undefined || instance.count !== undefined && instance.until) {\n                return null;\n            }\n            if (!instance.interval) {\n                instance.interval = 1;\n            }\n            if (weekStart === undefined) {\n                instance.weekStart = weekStart = kendo.culture().calendar.firstDay;\n            }\n            if (weekDays) {\n                instance.weekDays = weekDays.sort(predicate);\n            }\n            if (instance.positions && !ruleValue) {\n                instance.positions = null;\n            }\n            instance._hasRuleValue = ruleValue;\n            return instance;\n        }\n        function serializeDateRule(dateRule, zone) {\n            var value = dateRule.value;\n            var tzid = dateRule.tzid || '';\n            var length = value.length;\n            var idx = 0;\n            var val;\n            for (; idx < length; idx++) {\n                val = value[idx];\n                val = timezone.convert(val, tzid || zone || val.getTimezoneOffset(), 'Etc/UTC');\n                value[idx] = kendo.toString(val, 'yyyyMMddTHHmmssZ');\n            }\n            if (tzid) {\n                tzid = ';TZID=' + tzid;\n            }\n            return tzid + ':' + value.join(',') + ' ';\n        }\n        function serialize(rule, zone) {\n            var weekStart = rule.weekStart;\n            var ruleString = 'FREQ=' + rule.freq.toUpperCase();\n            var exdates = rule.exdates || '';\n            var start = rule.start || '';\n            var end = rule.end || '';\n            var until = rule.until;\n            if (rule.interval > 1) {\n                ruleString += ';INTERVAL=' + rule.interval;\n            }\n            if (rule.count) {\n                ruleString += ';COUNT=' + rule.count;\n            }\n            if (until) {\n                until = timezone.convert(until, zone || until.getTimezoneOffset(), 'Etc/UTC');\n                ruleString += ';UNTIL=' + kendo.toString(until, 'yyyyMMddTHHmmssZ');\n            }\n            if (rule.months) {\n                ruleString += ';BYMONTH=' + rule.months;\n            }\n            if (rule.weeks) {\n                ruleString += ';BYWEEKNO=' + rule.weeks;\n            }\n            if (rule.yearDays) {\n                ruleString += ';BYYEARDAY=' + rule.yearDays;\n            }\n            if (rule.monthDays) {\n                ruleString += ';BYMONTHDAY=' + rule.monthDays;\n            }\n            if (rule.weekDays) {\n                ruleString += ';BYDAY=' + serializeWeekDayList(rule.weekDays);\n            }\n            if (rule.hours) {\n                ruleString += ';BYHOUR=' + rule.hours;\n            }\n            if (rule.minutes) {\n                ruleString += ';BYMINUTE=' + rule.minutes;\n            }\n            if (rule.seconds) {\n                ruleString += ';BYSECOND=' + rule.seconds;\n            }\n            if (rule.positions) {\n                ruleString += ';BYSETPOS=' + rule.positions;\n            }\n            if (weekStart !== undefined) {\n                ruleString += ';WKST=' + WEEK_DAYS[weekStart];\n            }\n            if (start) {\n                start = 'DTSTART' + serializeDateRule(start, zone);\n            }\n            if (end) {\n                end = 'DTEND' + serializeDateRule(end, zone);\n            }\n            if (exdates) {\n                exdates = 'EXDATE' + serializeDateRule(exdates, zone);\n            }\n            if (start || end || exdates) {\n                ruleString = start + end + exdates + 'RRULE:' + ruleString;\n            }\n            return ruleString;\n        }\n        kendo.recurrence = {\n            rule: {\n                parse: parseRule,\n                serialize: serialize\n            },\n            expand: expand,\n            dayInYear: dayInYear,\n            weekInYear: weekInYear,\n            weekInMonth: weekInMonth,\n            numberOfWeeks: numberOfWeeks,\n            isException: isException,\n            toExceptionString: toExceptionString\n        };\n        var weekDayCheckBoxes = function (firstDay) {\n            var shortNames = kendo.culture().calendar.days.namesShort, length = shortNames.length, result = '', idx = 0, values = [];\n            for (; idx < length; idx++) {\n                values.push(idx);\n            }\n            shortNames = shortNames.slice(firstDay).concat(shortNames.slice(0, firstDay));\n            values = values.slice(firstDay).concat(values.slice(0, firstDay));\n            for (idx = 0; idx < length; idx++) {\n                result += '<label class=\"k-check\"><input class=\"k-recur-weekday-checkbox\" type=\"checkbox\" value=\"' + values[idx] + '\" /> ' + shortNames[idx] + '</label>';\n            }\n            return result;\n        };\n        var RECURRENCE_VIEW_TEMPLATE = kendo.template('# if (frequency !== \"never\") { #' + '<div class=\"k-edit-label\"><label>#:messages.repeatEvery#</label></div>' + '<div class=\"k-edit-field\"><input class=\"k-recur-interval\" title=\"#:messages.interval#\"/>#:messages.interval#</div>' + '# } #' + '# if (frequency === \"weekly\") { #' + '<div class=\"k-edit-label\"><label>#:messages.repeatOn#</label></div>' + '<div class=\"k-edit-field\">#=weekDayCheckBoxes(firstWeekDay)#</div>' + '# } else if (frequency === \"monthly\") { #' + '<div class=\"k-edit-label\"><label>#:messages.repeatOn#</label></div>' + '<div class=\"k-edit-field\">' + '<ul class=\"k-reset\">' + '<li>' + '<label><input class=\"k-recur-month-radio\" type=\"radio\" name=\"month\" value=\"monthday\" title=\"#:messages.day#\" />#:messages.day#</label>' + '<input class=\"k-recur-monthday\" title=\"#:messages.day#\" />' + '</li>' + '<li>' + '<input class=\"k-recur-month-radio\" type=\"radio\" name=\"month\" value=\"weekday\" title=\"#:messages.repeatOn#\" />' + '<input class=\"k-recur-weekday-offset\" title=\"#:messages.repeatOn#\" /><input class=\"k-recur-weekday\" title=\"#:messages.day#\" />' + '</li>' + '</ul>' + '</div>' + '# } else if (frequency === \"yearly\") { #' + '<div class=\"k-edit-label\"><label>#:messages.repeatOn#</label></div>' + '<div class=\"k-edit-field\">' + '<ul class=\"k-reset\">' + '<li>' + '<input class=\"k-recur-year-radio\" type=\"radio\" name=\"year\" value=\"monthday\" title=\"#:messages.repeatOn#\" />' + '<input class=\"k-recur-month\" title=\"#:messages.repeatOn#\" /><input class=\"k-recur-monthday\" title=\"#:messages.day#\" />' + '</li>' + '<li>' + '<input class=\"k-recur-year-radio\" type=\"radio\" name=\"year\" value=\"weekday\" title=\"#:messages.repeatOn#\" />' + '<input class=\"k-recur-weekday-offset\" title=\"#:messages.repeatOn#\" /><input class=\"k-recur-weekday\" title=\"#:messages.day#\"  />#:messages.of#<input class=\"k-recur-month\" title=\"#:messages.of#\"/>' + '</li>' + '</ul>' + '</div>' + '# } #' + '# if (frequency !== \"never\") { #' + '<div class=\"k-edit-label\"><label>#:end.label#</label></div>' + '<div class=\"k-edit-field\">' + '<ul class=\"k-reset\">' + '<li>' + '<label><input class=\"k-recur-end-never\" type=\"radio\" name=\"end\" value=\"never\" />#:end.never#</label>' + '</li>' + '<li>' + '<label><input class=\"k-recur-end-count\" type=\"radio\" name=\"end\" value=\"count\" />#:end.after#</label>' + '<input class=\"k-recur-count\" title=\"#:end.occurrence#\" />#:end.occurrence#' + '</li>' + '<li>' + '<label><input class=\"k-recur-end-until\" type=\"radio\" name=\"end\" value=\"until\" />#:end.on#</label>' + '<input class=\"k-recur-until\" title=\"#:end.on#\" />' + '</li>' + '</ul>' + '</div>' + '# } #');\n        var DAY_RULE = [\n            {\n                day: 0,\n                offset: 0\n            },\n            {\n                day: 1,\n                offset: 0\n            },\n            {\n                day: 2,\n                offset: 0\n            },\n            {\n                day: 3,\n                offset: 0\n            },\n            {\n                day: 4,\n                offset: 0\n            },\n            {\n                day: 5,\n                offset: 0\n            },\n            {\n                day: 6,\n                offset: 0\n            }\n        ];\n        var WEEKDAY_RULE = [\n            {\n                day: 1,\n                offset: 0\n            },\n            {\n                day: 2,\n                offset: 0\n            },\n            {\n                day: 3,\n                offset: 0\n            },\n            {\n                day: 4,\n                offset: 0\n            },\n            {\n                day: 5,\n                offset: 0\n            }\n        ];\n        var WEEKEND_RULE = [\n            {\n                day: 0,\n                offset: 0\n            },\n            {\n                day: 6,\n                offset: 0\n            }\n        ];\n        var BaseRecurrenceEditor = Widget.extend({\n            init: function (element, options) {\n                var start;\n                var that = this;\n                var frequencies = options && options.frequencies;\n                Widget.fn.init.call(that, element, options);\n                that.wrapper = that.element;\n                options = that.options;\n                options.start = start = options.start || kendoDate.today();\n                if (frequencies) {\n                    options.frequencies = frequencies;\n                }\n                if (typeof start === 'string') {\n                    options.start = kendo.parseDate(start, 'yyyyMMddTHHmmss');\n                }\n                if (options.firstWeekDay === null) {\n                    options.firstWeekDay = kendo.culture().calendar.firstDay;\n                }\n                that._namespace = '.' + options.name;\n            },\n            options: {\n                value: '',\n                start: '',\n                timezone: '',\n                spinners: true,\n                firstWeekDay: null,\n                frequencies: [\n                    'never',\n                    'daily',\n                    'weekly',\n                    'monthly',\n                    'yearly'\n                ],\n                mobile: false,\n                messages: {\n                    recurrenceEditorTitle: 'Recurrence editor',\n                    frequencies: {\n                        never: 'Never',\n                        hourly: 'Hourly',\n                        daily: 'Daily',\n                        weekly: 'Weekly',\n                        monthly: 'Monthly',\n                        yearly: 'Yearly'\n                    },\n                    hourly: {\n                        repeatEvery: 'Repeat every: ',\n                        interval: ' hour(s)'\n                    },\n                    daily: {\n                        repeatEvery: 'Repeat every: ',\n                        interval: ' day(s)'\n                    },\n                    weekly: {\n                        interval: ' week(s)',\n                        repeatEvery: 'Repeat every: ',\n                        repeatOn: 'Repeat on: '\n                    },\n                    monthly: {\n                        repeatEvery: 'Repeat every: ',\n                        repeatOn: 'Repeat on: ',\n                        interval: ' month(s)',\n                        day: 'Day '\n                    },\n                    yearly: {\n                        repeatEvery: 'Repeat every: ',\n                        repeatOn: 'Repeat on: ',\n                        interval: ' year(s)',\n                        of: ' of '\n                    },\n                    end: {\n                        label: 'End:',\n                        mobileLabel: 'Ends',\n                        never: 'Never',\n                        after: 'After ',\n                        occurrence: ' occurrence(s)',\n                        on: 'On '\n                    },\n                    offsetPositions: {\n                        first: 'first',\n                        second: 'second',\n                        third: 'third',\n                        fourth: 'fourth',\n                        last: 'last'\n                    },\n                    weekdays: {\n                        day: 'day',\n                        weekday: 'weekday',\n                        weekend: 'weekend day'\n                    }\n                }\n            },\n            events: ['change'],\n            _initInterval: function () {\n                var that = this;\n                var rule = that._value;\n                that._container.find('.k-recur-interval').kendoNumericTextBox({\n                    spinners: that.options.spinners,\n                    value: rule.interval || 1,\n                    decimals: 0,\n                    format: '#',\n                    min: 1,\n                    change: function () {\n                        rule.interval = this.value();\n                        that._trigger();\n                    }\n                });\n            },\n            _weekDayRule: function (clear) {\n                var that = this;\n                var weekday = (that._weekDay.element || that._weekDay).val();\n                var offset = Number((that._weekDayOffset.element || that._weekDayOffset).val());\n                var weekDays = null;\n                var positions = null;\n                if (!clear) {\n                    if (weekday === 'day') {\n                        weekDays = DAY_RULE;\n                        positions = offset;\n                    } else if (weekday === 'weekday') {\n                        weekDays = WEEKDAY_RULE;\n                        positions = offset;\n                    } else if (weekday === 'weekend') {\n                        weekDays = WEEKEND_RULE;\n                        positions = offset;\n                    } else {\n                        weekDays = [{\n                                offset: offset,\n                                day: Number(weekday)\n                            }];\n                    }\n                }\n                that._value.weekDays = weekDays;\n                that._value.positions = positions;\n            },\n            _weekDayView: function () {\n                var that = this;\n                var weekDays = that._value.weekDays;\n                var positions = that._value.positions;\n                var weekDayOffsetWidget = that._weekDayOffset;\n                var weekDayOffset;\n                var weekDayValue;\n                var length;\n                var method;\n                if (weekDays) {\n                    length = weekDays.length;\n                    if (positions) {\n                        if (length === 7) {\n                            weekDayValue = 'day';\n                            weekDayOffset = positions;\n                        } else if (length === 5) {\n                            weekDayValue = 'weekday';\n                            weekDayOffset = positions;\n                        } else if (length === 2) {\n                            weekDayValue = 'weekend';\n                            weekDayOffset = positions;\n                        }\n                    }\n                    if (!weekDayValue) {\n                        weekDays = weekDays[0];\n                        weekDayValue = weekDays.day;\n                        weekDayOffset = weekDays.offset || '';\n                    }\n                    method = weekDayOffsetWidget.value ? 'value' : 'val';\n                    weekDayOffsetWidget[method](weekDayOffset);\n                    that._weekDay[method](weekDayValue);\n                }\n            },\n            _initWeekDay: function () {\n                var that = this, data;\n                var weekdayMessage = that.options.messages.weekdays;\n                var offsetMessage = that.options.messages.offsetPositions;\n                var weekDayInput = that._container.find('.k-recur-weekday');\n                var change = function () {\n                    that._weekDayRule();\n                    that._trigger();\n                };\n                if (weekDayInput[0]) {\n                    that._weekDayOffset = new DropDownList(that._container.find('.k-recur-weekday-offset'), {\n                        change: change,\n                        dataTextField: 'text',\n                        dataValueField: 'value',\n                        dataSource: [\n                            {\n                                text: offsetMessage.first,\n                                value: '1'\n                            },\n                            {\n                                text: offsetMessage.second,\n                                value: '2'\n                            },\n                            {\n                                text: offsetMessage.third,\n                                value: '3'\n                            },\n                            {\n                                text: offsetMessage.fourth,\n                                value: '4'\n                            },\n                            {\n                                text: offsetMessage.last,\n                                value: '-1'\n                            }\n                        ]\n                    });\n                    data = [\n                        {\n                            text: weekdayMessage.day,\n                            value: 'day'\n                        },\n                        {\n                            text: weekdayMessage.weekday,\n                            value: 'weekday'\n                        },\n                        {\n                            text: weekdayMessage.weekend,\n                            value: 'weekend'\n                        }\n                    ];\n                    that._weekDay = new DropDownList(weekDayInput, {\n                        value: that.options.start.getDay(),\n                        change: change,\n                        dataTextField: 'text',\n                        dataValueField: 'value',\n                        dataSource: data.concat($.map(kendo.culture().calendar.days.names, function (dayName, idx) {\n                            return {\n                                text: dayName,\n                                value: idx\n                            };\n                        }))\n                    });\n                    that._weekDayView();\n                }\n            },\n            _initWeekDays: function () {\n                var that = this;\n                var rule = that._value;\n                var weekDays = that._container.find('.k-recur-weekday-checkbox');\n                if (weekDays[0]) {\n                    weekDays.on(CLICK + that._namespace, function () {\n                        rule.weekDays = $.map(weekDays.filter(':checked'), function (checkbox) {\n                            return {\n                                day: Number(checkbox.value),\n                                offset: 0\n                            };\n                        });\n                        if (!that.options.mobile) {\n                            that._trigger();\n                        }\n                    });\n                    if (rule.weekDays) {\n                        var idx, weekDay;\n                        var i = 0, l = weekDays.length;\n                        var length = rule.weekDays.length;\n                        for (; i < l; i++) {\n                            weekDay = weekDays[i];\n                            for (idx = 0; idx < length; idx++) {\n                                if (weekDay.value == rule.weekDays[idx].day) {\n                                    weekDay.checked = true;\n                                }\n                            }\n                        }\n                    }\n                }\n            },\n            _initMonthDay: function () {\n                var that = this;\n                var rule = that._value;\n                var monthDayInput = that._container.find('.k-recur-monthday');\n                if (monthDayInput[0]) {\n                    that._monthDay = new kendo.ui.NumericTextBox(monthDayInput, {\n                        spinners: that.options.spinners,\n                        min: 1,\n                        max: 31,\n                        decimals: 0,\n                        format: '#',\n                        value: rule.monthDays ? rule.monthDays[0] : that.options.start.getDate(),\n                        change: function () {\n                            var value = this.value();\n                            rule.monthDays = value ? [value] : value;\n                            that._trigger();\n                        }\n                    });\n                }\n            },\n            _initCount: function () {\n                var that = this, input = that._container.find('.k-recur-count'), rule = that._value;\n                that._count = input.kendoNumericTextBox({\n                    spinners: that.options.spinners,\n                    value: rule.count || 1,\n                    decimals: 0,\n                    format: '#',\n                    min: 1,\n                    change: function () {\n                        rule.count = this.value();\n                        that._trigger();\n                    }\n                }).data('kendoNumericTextBox');\n            },\n            _initUntil: function () {\n                var that = this, input = that._container.find('.k-recur-until'), start = that.options.start, rule = that._value, until = rule.until;\n                that._until = input.kendoDatePicker({\n                    min: until && until < start ? until : start,\n                    value: until || new Date(start.getFullYear(), start.getMonth(), start.getDate(), 23, 59, 59),\n                    change: function () {\n                        var date = this.value();\n                        rule.until = new Date(date.getFullYear(), date.getMonth(), date.getDate(), 23, 59, 59);\n                        that._trigger();\n                    }\n                }).data('kendoDatePicker');\n            },\n            _trigger: function () {\n                if (!this.options.mobile) {\n                    this.trigger('change');\n                }\n            }\n        });\n        var RecurrenceEditor = BaseRecurrenceEditor.extend({\n            init: function (element, options) {\n                var that = this;\n                BaseRecurrenceEditor.fn.init.call(that, element, options);\n                that._initFrequency();\n                that._initContainer();\n                that.value(that.options.value);\n            },\n            options: { name: 'RecurrenceEditor' },\n            events: ['change'],\n            destroy: function () {\n                var that = this;\n                that._frequency.destroy();\n                that._container.find('input[type=radio],input[type=checkbox]').off(CLICK + that._namespace);\n                kendo.destroy(that._container);\n                BaseRecurrenceEditor.fn.destroy.call(that);\n            },\n            value: function (value) {\n                var that = this;\n                var timezone = that.options.timezone;\n                var freq;\n                if (value === undefined) {\n                    if (!that._value.freq) {\n                        return '';\n                    }\n                    return serialize(that._value, timezone);\n                }\n                that._value = parseRule(value, timezone) || {};\n                freq = that._value.freq;\n                if (freq) {\n                    that._frequency.value(freq);\n                } else {\n                    that._frequency.select(0);\n                }\n                that._initView(that._frequency.value());\n            },\n            _initContainer: function () {\n                var element = this.element, container = $('<div class=\"k-recur-view\" />'), editContainer = element.parent('.k-edit-field');\n                if (editContainer[0]) {\n                    container.insertAfter(editContainer);\n                } else {\n                    element.append(container);\n                }\n                this._container = container;\n            },\n            _initFrequency: function () {\n                var that = this, options = that.options, frequencies = options.frequencies, messages = options.messages.frequencies, ddl = $('<input />').attr({ title: options.messages.recurrenceEditorTitle }), frequency;\n                frequencies = $.map(frequencies, function (frequency) {\n                    return {\n                        text: messages[frequency],\n                        value: frequency\n                    };\n                });\n                frequency = frequencies[0];\n                if (frequency && frequency.value === 'never') {\n                    frequency.value = '';\n                }\n                that.element.append(ddl);\n                that._frequency = new DropDownList(ddl, {\n                    dataTextField: 'text',\n                    dataValueField: 'value',\n                    dataSource: frequencies,\n                    change: function () {\n                        that._value = {};\n                        that._initView(that._frequency.value());\n                        that.trigger('change');\n                    }\n                });\n            },\n            _initView: function (frequency) {\n                var that = this;\n                var rule = that._value;\n                var options = that.options;\n                var data = {\n                    frequency: frequency || 'never',\n                    weekDayCheckBoxes: weekDayCheckBoxes,\n                    firstWeekDay: options.firstWeekDay,\n                    messages: options.messages[frequency],\n                    end: options.messages.end\n                };\n                kendo.destroy(that._container);\n                that._container.html(RECURRENCE_VIEW_TEMPLATE(data));\n                if (!frequency) {\n                    that._value = {};\n                    return;\n                }\n                rule.freq = frequency;\n                if (frequency === 'weekly' && !rule.weekDays) {\n                    rule.weekDays = [{\n                            day: options.start.getDay(),\n                            offset: 0\n                        }];\n                }\n                that._initInterval();\n                that._initWeekDays();\n                that._initMonthDay();\n                that._initWeekDay();\n                that._initMonth();\n                that._initCount();\n                that._initUntil();\n                that._period();\n                that._end();\n            },\n            _initMonth: function () {\n                var that = this;\n                var rule = that._value;\n                var month = rule.months || [that.options.start.getMonth() + 1];\n                var monthInputs = that._container.find('.k-recur-month');\n                var options;\n                if (monthInputs[0]) {\n                    options = {\n                        change: function () {\n                            rule.months = [Number(this.value())];\n                            that.trigger('change');\n                        },\n                        dataTextField: 'text',\n                        dataValueField: 'value',\n                        dataSource: $.map(kendo.culture().calendar.months.names, function (monthName, idx) {\n                            return {\n                                text: monthName,\n                                value: idx + 1\n                            };\n                        })\n                    };\n                    that._month1 = new DropDownList(monthInputs[0], options);\n                    that._month2 = new DropDownList(monthInputs[1], options);\n                    if (month) {\n                        month = month[0];\n                        that._month1.value(month);\n                        that._month2.value(month);\n                    }\n                }\n            },\n            _end: function () {\n                var that = this;\n                var rule = that._value;\n                var container = that._container;\n                var namespace = that._namespace;\n                var click = function (e) {\n                    that._toggleEnd(e.currentTarget.value);\n                    that.trigger('change');\n                };\n                var endRule;\n                that._buttonNever = container.find('.k-recur-end-never').on(CLICK + namespace, click);\n                that._buttonCount = container.find('.k-recur-end-count').on(CLICK + namespace, click);\n                that._buttonUntil = container.find('.k-recur-end-until').on(CLICK + namespace, click);\n                if (rule.count) {\n                    endRule = 'count';\n                } else if (rule.until) {\n                    endRule = 'until';\n                }\n                that._toggleEnd(endRule);\n            },\n            _period: function () {\n                var that = this;\n                var rule = that._value;\n                var monthly = rule.freq === 'monthly';\n                var toggleRule = monthly ? that._toggleMonthDay : that._toggleYear;\n                var selector = '.k-recur-' + (monthly ? 'month' : 'year') + '-radio';\n                var radioButtons = that._container.find(selector);\n                if (!monthly && rule.freq !== 'yearly') {\n                    return;\n                }\n                radioButtons.on(CLICK + that._namespace, function (e) {\n                    toggleRule.call(that, e.currentTarget.value);\n                    that.trigger('change');\n                });\n                that._buttonMonthDay = radioButtons.eq(0);\n                that._buttonWeekDay = radioButtons.eq(1);\n                toggleRule.call(that, rule.weekDays ? 'weekday' : 'monthday');\n            },\n            _toggleEnd: function (endRule) {\n                var that = this;\n                var count, until;\n                var enableCount, enableUntil;\n                if (endRule === 'count') {\n                    that._buttonCount.prop('checked', true);\n                    enableCount = true;\n                    enableUntil = false;\n                    count = that._count.value();\n                    until = null;\n                } else if (endRule === 'until') {\n                    that._buttonUntil.prop('checked', true);\n                    enableCount = false;\n                    enableUntil = true;\n                    count = null;\n                    until = that._until.value();\n                } else {\n                    that._buttonNever.prop('checked', true);\n                    enableCount = enableUntil = false;\n                    count = until = null;\n                }\n                that._count.enable(enableCount);\n                that._until.enable(enableUntil);\n                that._value.count = count;\n                that._value.until = until;\n            },\n            _toggleMonthDay: function (monthRule) {\n                var that = this;\n                var enableMonthDay = false;\n                var enableWeekDay = true;\n                var clear = false;\n                var monthDays;\n                if (monthRule === 'monthday') {\n                    that._buttonMonthDay.prop('checked', true);\n                    monthDays = [that._monthDay.value()];\n                    enableMonthDay = true;\n                    enableWeekDay = false;\n                    clear = true;\n                } else {\n                    that._buttonWeekDay.prop('checked', true);\n                    monthDays = null;\n                }\n                that._weekDay.enable(enableWeekDay);\n                that._weekDayOffset.enable(enableWeekDay);\n                that._monthDay.enable(enableMonthDay);\n                that._value.monthDays = monthDays;\n                that._weekDayRule(clear);\n            },\n            _toggleYear: function (yearRule) {\n                var that = this;\n                var enableMonth1 = false;\n                var enableMonth2 = true;\n                var month;\n                if (yearRule === 'monthday') {\n                    enableMonth1 = true;\n                    enableMonth2 = false;\n                    month = that._month1.value();\n                } else {\n                    month = that._month2.value();\n                }\n                that._month1.enable(enableMonth1);\n                that._month2.enable(enableMonth2);\n                that._value.months = [month];\n                that._toggleMonthDay(yearRule);\n            }\n        });\n        ui.plugin(RecurrenceEditor);\n        var RECURRENCE_HEADER_TEMPLATE = kendo.template('<div class=\"k-edit-label\"><label>#:headerTitle#</label></div>' + '<div class=\"k-edit-field k-recur-pattern k-scheduler-toolbar\"></div>' + '<div class=\"k-recur-view\"></div>');\n        var RECURRENCE_REPEAT_PATTERN_TEMPLATE = kendo.template('# if (frequency !== \"never\") { #' + '<div class=\"k-edit-label\"><label>#:messages.repeatEvery#</label></div>' + '<div class=\"k-edit-field\"><input class=\"k-recur-interval\" pattern=\"\\\\\\\\d*\"/>#:messages.interval#</div>' + '# } #' + '# if (frequency === \"weekly\") { #' + '<div class=\"k-edit-label\"><label>#:messages.repeatOn#</label></div>' + '<div class=\"k-edit-field\">#=weekDayCheckBoxes(firstWeekDay)#</div>' + '# } else if (frequency === \"monthly\") { #' + '<div class=\"k-edit-label\"><label>#:messages.repeatBy#</label></div>' + '<div class=\"k-edit-field k-scheduler-toolbar k-repeat-rule\"></div>' + '<div class=\"k-monthday-view\" style=\"display:none\">' + '<div class=\"k-edit-label\"><label>#:messages.day#</label></div>' + '<div class=\"k-edit-field\"><input class=\"k-recur-monthday\" title=\"#:messages.day#\" pattern=\"\\\\\\\\d*\"/></div>' + '</div>' + '<div class=\"k-weekday-view\" style=\"display:none\">' + '<div class=\"k-edit-label\"><label>#:messages.every#</label></div>' + '<div class=\"k-edit-field\"><select class=\"k-recur-weekday-offset\" title=\"#:messages.every#\"></select></div>' + '<div class=\"k-edit-label\"><label>#:messages.day#</label></div>' + '<div class=\"k-edit-field\"><select class=\"k-recur-weekday\" title=\"#:messages.day#\"></select></div>' + '</div>' + '# } else if (frequency === \"yearly\") { #' + '<div class=\"k-edit-label\"><label>#:messages.repeatBy#</label></div>' + '<div class=\"k-edit-field k-scheduler-toolbar k-repeat-rule\"></div>' + '<div class=\"k-monthday-view\" style=\"display:none\">' + '<div class=\"k-edit-label\"><label>#:messages.day#</label></div>' + '<div class=\"k-edit-field\"><input class=\"k-recur-monthday\" title=\"#:messages.day#\" pattern=\"\\\\\\\\d*\"/></div>' + '</div>' + '<div class=\"k-weekday-view\" style=\"display:none\">' + '<div class=\"k-edit-label\"><label>#:messages.every#</label></div>' + '<div class=\"k-edit-field\"><select class=\"k-recur-weekday-offset\" title=\"#:messages.every#\"></select></div>' + '<div class=\"k-edit-label\"><label>#:messages.day#</label></div>' + '<div class=\"k-edit-field\"><select class=\"k-recur-weekday\" title=\"#:messages.day#\"></select></div>' + '</div>' + '<div class=\"k-edit-label\"><label>#:messages.month#</label></div>' + '<div class=\"k-edit-field\"><select class=\"k-recur-month\" title=\"#:messages.month#\"></select></div>' + '# } #');\n        var RECURRENCE_END_PATTERN_TEMPLATE = kendo.template('# if (endPattern === \"count\") { #' + '<div class=\"k-edit-label\"><label>#:messages.after#</label></div>' + '<div class=\"k-edit-field\"><input class=\"k-recur-count\" pattern=\"\\\\\\\\d*\" /></div>' + '# } else if (endPattern === \"until\") { #' + '<div class=\"k-edit-label\"><label>#:messages.on#</label></div>' + '<div class=\"k-edit-field\"><input type=\"date\" class=\"k-recur-until\" /></div>' + '# } #');\n        var RECURRENCE_GROUP_BUTTON_TEMPLATE = kendo.template('<ul class=\"k-reset k-header k-scheduler-navigation\">' + '#for (var i = 0, length = dataSource.length; i < length; i++) {#' + '<li class=\"k-state-default #= value === dataSource[i].value ? \"k-state-selected\" : \"\" #\">' + '<a role=\"button\" href=\"\\\\#\" class=\"k-link\" data-#=ns#value=\"#=dataSource[i].value#\">#:dataSource[i].text#</a>' + '</li>' + '#}#' + '</ul>');\n        var MobileRecurrenceEditor = BaseRecurrenceEditor.extend({\n            init: function (element, options) {\n                var that = this;\n                BaseRecurrenceEditor.fn.init.call(that, element, options);\n                options = that.options;\n                that._optionTemplate = kendo.template('<option value=\"#:value#\">#:text#</option>');\n                that.value(options.value);\n                that._pane = options.pane;\n                that._initRepeatButton();\n                that._initRepeatEnd();\n                that._defaultValue = that._value;\n            },\n            options: {\n                name: 'MobileRecurrenceEditor',\n                animations: {\n                    left: 'slide',\n                    right: 'slide:right'\n                },\n                mobile: true,\n                messages: {\n                    cancel: 'Cancel',\n                    update: 'Save',\n                    endTitle: 'Repeat ends',\n                    repeatTitle: 'Repeat pattern',\n                    headerTitle: 'Repeat event',\n                    end: {\n                        patterns: {\n                            never: 'Never',\n                            after: 'After...',\n                            on: 'On...'\n                        },\n                        never: 'Never',\n                        after: 'End repeat after',\n                        on: 'End repeat on'\n                    },\n                    daily: { interval: '' },\n                    hourly: { interval: '' },\n                    weekly: { interval: '' },\n                    monthly: {\n                        interval: '',\n                        repeatBy: 'Repeat by: ',\n                        dayOfMonth: 'Day of the month',\n                        dayOfWeek: 'Day of the week',\n                        repeatEvery: 'Repeat every',\n                        every: 'Every',\n                        day: 'Day '\n                    },\n                    yearly: {\n                        interval: '',\n                        repeatBy: 'Repeat by: ',\n                        dayOfMonth: 'Day of the month',\n                        dayOfWeek: 'Day of the week',\n                        repeatEvery: 'Repeat every: ',\n                        every: 'Every',\n                        month: 'Month',\n                        day: 'Day'\n                    }\n                }\n            },\n            events: ['change'],\n            value: function (value) {\n                var that = this;\n                var timezone = that.options.timezone;\n                if (value === undefined) {\n                    if (!that._value.freq) {\n                        return '';\n                    }\n                    return serialize(that._value, timezone);\n                }\n                that._value = parseRule(value, timezone) || {};\n            },\n            destroy: function () {\n                this._destroyView();\n                kendo.destroy(this._endFields);\n                this._repeatButton.off(CLICK + this._namespace);\n                BaseRecurrenceEditor.fn.destroy.call(this);\n            },\n            _initRepeatButton: function () {\n                var that = this;\n                var freq = that.options.messages.frequencies[this._value.freq || 'never'];\n                that._repeatButton = $('<a href=\"#\" class=\"k-button k-scheduler-recur\">' + freq + '</a>').on(CLICK + that._namespace, function (e) {\n                    e.preventDefault();\n                    that._createView('repeat');\n                    that._pane.navigate('recurrence', that.options.animations.left);\n                });\n                that.element.append(that._repeatButton);\n            },\n            _initRepeatEnd: function () {\n                var that = this;\n                var endLabelField = $('<div class=\"k-edit-label\"><label>' + that.options.messages.end.mobileLabel + '</label></div>').insertAfter(that.element.parent('.k-edit-field'));\n                var endEditField = $('<div class=\"k-edit-field\"><a href=\"#\" class=\"k-button k-scheduler-recur-end\"></a></div>').on(CLICK + that._namespace, function (e) {\n                    e.preventDefault();\n                    if (!that._value.freq) {\n                        return;\n                    }\n                    that._createView('end');\n                    that._pane.navigate('recurrence', that.options.animations.left);\n                }).insertAfter(endLabelField);\n                that._endFields = endLabelField.add(endEditField).toggleClass('k-state-disabled', !that._value.freq);\n                that._endButton = endEditField.find('.k-scheduler-recur-end').text(that._endText());\n            },\n            _endText: function () {\n                var rule = this._value;\n                var messages = this.options.messages.end;\n                var text = messages.never;\n                if (rule.count) {\n                    text = kendo.format('{0} {1}', messages.after, rule.count);\n                } else if (rule.until) {\n                    text = kendo.format('{0} {1:d}', messages.on, rule.until);\n                }\n                return text;\n            },\n            _initFrequency: function () {\n                var that = this;\n                var frequencyMessages = that.options.messages.frequencies;\n                var html = RECURRENCE_GROUP_BUTTON_TEMPLATE({\n                    dataSource: $.map(this.options.frequencies, function (frequency) {\n                        return {\n                            text: frequencyMessages[frequency],\n                            value: frequency !== 'never' ? frequency : ''\n                        };\n                    }),\n                    value: that._value.freq || '',\n                    ns: kendo.ns\n                });\n                that._view.element.find('.k-recur-pattern').append(html).on(CLICK + that._namespace, '.k-scheduler-navigation li', function (e) {\n                    var li = $(this);\n                    e.preventDefault();\n                    li.addClass('k-state-selected').siblings().removeClass('k-state-selected');\n                    that._value = { freq: li.children('a').attr(kendo.attr('value')) };\n                    that._initRepeatView();\n                });\n            },\n            _initEndNavigation: function () {\n                var that = this;\n                var endMessages = that.options.messages.end.patterns;\n                var rule = that._value;\n                var value = '';\n                if (rule.count) {\n                    value = 'count';\n                } else if (rule.until) {\n                    value = 'until';\n                }\n                var html = RECURRENCE_GROUP_BUTTON_TEMPLATE({\n                    dataSource: [\n                        {\n                            text: endMessages.never,\n                            value: ''\n                        },\n                        {\n                            text: endMessages.after,\n                            value: 'count'\n                        },\n                        {\n                            text: endMessages.on,\n                            value: 'until'\n                        }\n                    ],\n                    value: value,\n                    ns: kendo.ns\n                });\n                that._view.element.find('.k-recur-pattern').append(html).on(CLICK + that._namespace, '.k-scheduler-navigation li', function (e) {\n                    var li = $(this);\n                    var count = null;\n                    var until = null;\n                    e.preventDefault();\n                    li.addClass('k-state-selected').siblings().removeClass('k-state-selected');\n                    that._initEndView(li.children('a').attr(kendo.attr('value')));\n                    if (that._count) {\n                        count = that._count.value();\n                        until = null;\n                    } else if (that._until) {\n                        count = null;\n                        until = that._until.val ? kendo.parseDate(that._until.val(), 'yyyy-MM-dd') : that._until.value();\n                    }\n                    rule.count = count;\n                    rule.until = until;\n                });\n            },\n            _createView: function (viewType) {\n                var that = this;\n                var options = that.options;\n                var messages = options.messages;\n                var headerTitle = messages[viewType === 'repeat' ? 'repeatTitle' : 'endTitle'];\n                var html = '<div data-role=\"view\" class=\"k-popup-edit-form k-scheduler-edit-form k-mobile-list\" id=\"recurrence\">' + '<div data-role=\"header\" class=\"k-header\">' + '<a href=\"#\" class=\"k-button k-scheduler-cancel\">' + messages.cancel + '</a>' + messages.headerTitle + '<a href=\"#\" class=\"k-button k-scheduler-update\">' + messages.update + '</a>' + '</div>';\n                var returnViewId = that._pane.view().id;\n                that._view = that._pane.append(html + RECURRENCE_HEADER_TEMPLATE({ headerTitle: headerTitle }));\n                that._view.element.on(CLICK + that._namespace, 'a.k-scheduler-cancel, a.k-scheduler-update', function (e) {\n                    e.preventDefault();\n                    e.stopPropagation();\n                    if ($(this).hasClass('k-scheduler-update')) {\n                        that.trigger('change');\n                        that._defaultValue = $.extend({}, that._value);\n                    } else {\n                        that._value = that._defaultValue;\n                    }\n                    var frequency = that._value.freq;\n                    that._endButton.text(that._endText());\n                    that._endFields.toggleClass('k-state-disabled', !frequency);\n                    that._repeatButton.text(messages.frequencies[frequency || 'never']);\n                    that._pane.one('viewShow', function () {\n                        that._destroyView();\n                    });\n                    that._pane.navigate(returnViewId, that.options.animations.right);\n                });\n                that._container = that._view.element.find('.k-recur-view');\n                if (viewType === 'repeat') {\n                    that._initFrequency();\n                    that._initRepeatView();\n                } else {\n                    that._initEndNavigation();\n                    that._initEndView();\n                }\n            },\n            _destroyView: function () {\n                if (this._view) {\n                    this._view.destroy();\n                    this._view.element.remove();\n                }\n                this._view = null;\n            },\n            _initRepeatView: function () {\n                var that = this;\n                var frequency = that._value.freq || 'never';\n                var data = {\n                    frequency: frequency,\n                    weekDayCheckBoxes: weekDayCheckBoxes,\n                    firstWeekDay: that.options.firstWeekDay,\n                    messages: that.options.messages[frequency]\n                };\n                var html = RECURRENCE_REPEAT_PATTERN_TEMPLATE(data);\n                var container = that._container;\n                var rule = that._value;\n                kendo.destroy(container);\n                container.html(html);\n                if (!html) {\n                    that._value = {};\n                    return;\n                }\n                if (frequency === 'weekly' && !rule.weekDays) {\n                    rule.weekDays = [{\n                            day: that.options.start.getDay(),\n                            offset: 0\n                        }];\n                }\n                that._initInterval();\n                that._initMonthDay();\n                that._initWeekDays();\n                that._initWeekDay();\n                that._initMonth();\n                that._period();\n            },\n            _initEndView: function (endPattern) {\n                var that = this;\n                var rule = that._value;\n                if (endPattern === undefined) {\n                    if (rule.count) {\n                        endPattern = 'count';\n                    } else if (rule.until) {\n                        endPattern = 'until';\n                    }\n                }\n                var data = {\n                    endPattern: endPattern,\n                    messages: that.options.messages.end\n                };\n                kendo.destroy(that._container);\n                that._container.html(RECURRENCE_END_PATTERN_TEMPLATE(data));\n                that._initCount();\n                that._initUntil();\n            },\n            _initWeekDay: function () {\n                var that = this, data;\n                var weekdayMessage = that.options.messages.weekdays;\n                var offsetMessage = that.options.messages.offsetPositions;\n                var weekDaySelect = that._container.find('.k-recur-weekday');\n                var change = function () {\n                    that._weekDayRule();\n                    that.trigger('change');\n                };\n                if (weekDaySelect[0]) {\n                    that._weekDayOffset = that._container.find('.k-recur-weekday-offset').html(that._options([\n                        {\n                            text: offsetMessage.first,\n                            value: '1'\n                        },\n                        {\n                            text: offsetMessage.second,\n                            value: '2'\n                        },\n                        {\n                            text: offsetMessage.third,\n                            value: '3'\n                        },\n                        {\n                            text: offsetMessage.fourth,\n                            value: '4'\n                        },\n                        {\n                            text: offsetMessage.last,\n                            value: '-1'\n                        }\n                    ])).change(change);\n                    data = [\n                        {\n                            text: weekdayMessage.day,\n                            value: 'day'\n                        },\n                        {\n                            text: weekdayMessage.weekday,\n                            value: 'weekday'\n                        },\n                        {\n                            text: weekdayMessage.weekend,\n                            value: 'weekend'\n                        }\n                    ];\n                    data = data.concat($.map(kendo.culture().calendar.days.names, function (dayName, idx) {\n                        return {\n                            text: dayName,\n                            value: idx\n                        };\n                    }));\n                    that._weekDay = weekDaySelect.html(that._options(data)).change(change).val(that.options.start.getDay());\n                    that._weekDayView();\n                }\n            },\n            _initMonth: function () {\n                var that = this;\n                var rule = that._value;\n                var start = that.options.start;\n                var month = rule.months || [start.getMonth() + 1];\n                var monthSelect = that._container.find('.k-recur-month');\n                var monthNames = kendo.culture().calendar.months.names;\n                if (monthSelect[0]) {\n                    var data = $.map(monthNames, function (monthName, idx) {\n                        return {\n                            text: monthName,\n                            value: idx + 1\n                        };\n                    });\n                    monthSelect.html(that._options(data)).change(function () {\n                        rule.months = [Number(this.value)];\n                    });\n                    that._monthSelect = monthSelect;\n                    if (month) {\n                        monthSelect.val(month[0]);\n                    }\n                }\n            },\n            _period: function () {\n                var that = this;\n                var rule = that._value;\n                var container = that._container;\n                var messages = that.options.messages[rule.freq];\n                var repeatRuleGroupButton = container.find('.k-repeat-rule');\n                var weekDayView = container.find('.k-weekday-view');\n                var monthDayView = container.find('.k-monthday-view');\n                if (repeatRuleGroupButton[0]) {\n                    var currentValue = rule.weekDays ? 'weekday' : 'monthday';\n                    var html = RECURRENCE_GROUP_BUTTON_TEMPLATE({\n                        value: currentValue,\n                        dataSource: [\n                            {\n                                text: messages.dayOfMonth,\n                                value: 'monthday'\n                            },\n                            {\n                                text: messages.dayOfWeek,\n                                value: 'weekday'\n                            }\n                        ],\n                        ns: kendo.ns\n                    });\n                    var init = function (val) {\n                        var weekDayName = that._weekDay.val();\n                        var weekDayOffset = that._weekDayOffset.val();\n                        var monthDay = that._monthDay.value();\n                        var month = that._monthSelect ? that._monthSelect.val() : null;\n                        if (val === 'monthday') {\n                            rule.weekDays = null;\n                            rule.monthDays = monthDay ? [monthDay] : monthDay;\n                            rule.months = month ? [Number(month)] : month;\n                            weekDayView.hide();\n                            monthDayView.show();\n                        } else {\n                            rule.monthDays = null;\n                            rule.months = month ? [Number(month)] : month;\n                            rule.weekDays = [{\n                                    offset: Number(weekDayOffset),\n                                    day: Number(weekDayName)\n                                }];\n                            weekDayView.show();\n                            monthDayView.hide();\n                        }\n                    };\n                    repeatRuleGroupButton.append(html).on(CLICK + that._namespace, '.k-scheduler-navigation li', function (e) {\n                        var li = $(this).addClass('k-state-selected');\n                        e.preventDefault();\n                        li.siblings().removeClass('k-state-selected');\n                        var value = li.children('a').attr(kendo.attr('value'));\n                        init(value);\n                    });\n                    init(currentValue);\n                }\n            },\n            _initUntil: function () {\n                var that = this;\n                var input = that._container.find('.k-recur-until');\n                var start = that.options.start;\n                var rule = that._value;\n                var until = rule.until;\n                var min = until && until < start ? until : start;\n                if (kendo.support.input.date) {\n                    that._until = input.attr('min', kendo.toString(min, 'yyyy-MM-dd')).val(kendo.toString(until || start, 'yyyy-MM-dd')).on('change', function () {\n                        rule.until = kendo.parseDate(this.value, 'yyyy-MM-dd');\n                    });\n                } else {\n                    that._until = input.kendoDatePicker({\n                        min: min,\n                        value: until || start,\n                        change: function () {\n                            rule.until = this.value();\n                        }\n                    }).data('kendoDatePicker');\n                }\n            },\n            _options: function (data, optionLabel) {\n                var idx = 0;\n                var html = '';\n                var length = data.length;\n                var template = this._optionTemplate;\n                if (optionLabel) {\n                    html += template({\n                        value: '',\n                        text: optionLabel\n                    });\n                }\n                for (; idx < length; idx++) {\n                    html += template(data[idx]);\n                }\n                return html;\n            }\n        });\n        ui.plugin(MobileRecurrenceEditor);\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.scheduler.timelineview', ['kendo.scheduler.view'], f);\n}(function () {\n    var __meta__ = {\n        id: 'scheduler.timelineview',\n        name: 'Scheduler Timeline View',\n        category: 'web',\n        description: 'The Scheduler Timeline View',\n        depends: ['scheduler.view'],\n        hidden: true\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, ui = kendo.ui, setTime = kendo.date.setTime, SchedulerView = ui.SchedulerView, outerWidth = kendo._outerWidth, outerHeight = kendo._outerHeight, extend = $.extend, proxy = $.proxy, getDate = kendo.date.getDate, getMilliseconds = kendo.date.getMilliseconds, MS_PER_DAY = kendo.date.MS_PER_DAY, MS_PER_MINUTE = kendo.date.MS_PER_MINUTE, CURRENT_TIME_MARKER_CLASS = 'k-current-time', CURRENT_TIME_MARKER_ARROW_CLASS = 'k-current-time-arrow', SCHEDULER_HEADER_WRAP_CLASS = 'k-scheduler-header-wrap', BORDER_SIZE_COEFF = 0.8666, NS = '.kendoTimelineView';\n        var EVENT_TEMPLATE = kendo.template('<div>' + '<div class=\"k-event-template k-event-time\">#:kendo.format(\"{0:t} - {1:t}\", start, end)#</div>' + '<div class=\"k-event-template\">${title}</div></div>'), DATA_HEADER_TEMPLATE = kendo.template('<span class=\\'k-link k-nav-day\\'>#=kendo.format(\\'{0:m}\\', date)#</span>'), EVENT_WRAPPER_STRING = '<div role=\"gridcell\" aria-selected=\"false\" ' + 'data-#=ns#uid=\"#=uid#\"' + '#if (resources[0]) { #' + 'style=\"background-color:#=resources[0].color#; border-color: #=resources[0].color#\"' + 'class=\"k-event#=inverseColor ? \" k-event-inverse\" : \"\"#\" ' + '#} else {#' + 'class=\"k-event\"' + '#}#' + '>' + '<span class=\"k-event-actions\">' + '# if(data.tail) {#' + '<span class=\"k-icon k-i-arrow-60-left\"></span>' + '#}#' + '# if(data.isException()) {#' + '<span class=\"k-icon k-i-non-recurrence\"></span>' + '# } else if(data.isRecurring()) {#' + '<span class=\"k-icon k-i-reload\"></span>' + '# } #' + '</span>' + '{0}' + '<span class=\"k-event-actions\">' + '#if (showDelete) {#' + '<a href=\"\\\\#\" class=\"k-link k-event-delete\" title=\"${data.messages.destroy}\" aria-label=\"${data.messages.destroy}\"><span class=\"k-icon k-i-close\"></span></a>' + '#}#' + '# if(data.head) {#' + '<span class=\"k-icon k-i-arrow-60-right\"></span>' + '#}#' + '</span>' + '#if(resizable && !data.tail){#' + '<span class=\"k-resize-handle k-resize-w\"></span>' + '#}#' + '#if(resizable && !data.head){#' + '<span class=\"k-resize-handle k-resize-e\"></span>' + '#}#' + '</div>';\n        function toInvariantTime(date) {\n            var staticDate = new Date(1980, 1, 1, 0, 0, 0);\n            setTime(staticDate, getMilliseconds(date));\n            return staticDate;\n        }\n        function getWorkDays(options) {\n            var workDays = [];\n            var dayIndex = options.workWeekStart;\n            workDays.push(dayIndex);\n            while (options.workWeekEnd != dayIndex) {\n                if (dayIndex > 6) {\n                    dayIndex -= 7;\n                } else {\n                    dayIndex++;\n                }\n                workDays.push(dayIndex);\n            }\n            return workDays;\n        }\n        function setColspan(columnLevel) {\n            var count = 0;\n            if (columnLevel.columns) {\n                for (var i = 0; i < columnLevel.columns.length; i++) {\n                    count += setColspan(columnLevel.columns[i]);\n                }\n                columnLevel.colspan = count;\n                return count;\n            } else {\n                columnLevel.colspan = 1;\n                return 1;\n            }\n        }\n        function collidingEvents(elements, left, right) {\n            var idx, startPosition, overlaps, endPosition;\n            for (idx = elements.length - 1; idx >= 0; idx--) {\n                startPosition = elements[idx].rectLeft;\n                endPosition = elements[idx].rectRight;\n                overlaps = startPosition <= left && endPosition >= left;\n                if (overlaps || startPosition >= left && endPosition <= right || left <= startPosition && right >= startPosition) {\n                    if (startPosition < left) {\n                        left = startPosition;\n                    }\n                    if (endPosition > right) {\n                        right = endPosition;\n                    }\n                }\n            }\n            return eventsForSlot(elements, left, right);\n        }\n        function eventsForSlot(elements, left, right) {\n            var events = [];\n            for (var idx = 0; idx < elements.length; idx++) {\n                var event = {\n                    rectLeft: elements[idx].rectLeft,\n                    rectRight: elements[idx].rectRight\n                };\n                if (event.rectLeft < left && event.rectRight > left || event.rectLeft >= left && event.rectRight <= right) {\n                    events.push(elements[idx]);\n                }\n            }\n            return events;\n        }\n        var TimelineGroupedView = kendo.Class.extend({\n            init: function (view) {\n                this._view = view;\n            },\n            _getTimeSlotByPosition: function (x, y, groupIndex) {\n                var group = this._view.groups[groupIndex];\n                return group.timeSlotByPosition(x, y);\n            },\n            _hideHeaders: function () {\n                var view = this._view;\n                view.timesHeader.find('table tr:last').hide();\n                view.datesHeader.find('table tr:last').hide();\n            },\n            _setColspan: function (timeColumn) {\n                setColspan(timeColumn);\n            },\n            _createRowsLayout: function (resources, rows, groupHeaderTemplate) {\n                var view = this._view;\n                return view._createRowsLayout(resources, rows, groupHeaderTemplate);\n            },\n            _createVerticalColumnsLayout: function (resources, rows, groupHeaderTemplate, columns) {\n                return columns;\n            },\n            _createColumnsLayout: function (resources, columns, groupHeaderTemplate) {\n                var view = this._view;\n                return view._createColumnsLayout(resources, columns, groupHeaderTemplate);\n            },\n            _getRowCount: function () {\n                var view = this._view;\n                return view._groupCount();\n            },\n            _getGroupsCount: function () {\n                return 1;\n            },\n            _addContent: function (dates, columnCount, groupsCount, rowCount, start, end, slotTemplate, isVerticalGrouped) {\n                var view = this._view;\n                var html = '';\n                var options = view.options;\n                var appendRow = function (date) {\n                    var content = '';\n                    var classes = '';\n                    var tmplDate;\n                    var resources = function (groupIndex) {\n                        return function () {\n                            return view._resourceBySlot({ groupIndex: groupIndex });\n                        };\n                    };\n                    if (kendo.date.isToday(dates[idx])) {\n                        classes += 'k-today';\n                    }\n                    if (kendo.date.getMilliseconds(date) < kendo.date.getMilliseconds(options.workDayStart) || kendo.date.getMilliseconds(date) >= kendo.date.getMilliseconds(options.workDayEnd) || !view._isWorkDay(dates[idx])) {\n                        classes += ' k-nonwork-hour';\n                    }\n                    content += '<td' + (classes !== '' ? ' class=\"' + classes + '\"' : '') + '>';\n                    tmplDate = kendo.date.getDate(dates[idx]);\n                    kendo.date.setTime(tmplDate, kendo.date.getMilliseconds(date));\n                    content += slotTemplate({\n                        date: tmplDate,\n                        resources: resources(isVerticalGrouped ? rowIdx : groupIdx)\n                    });\n                    content += '</td>';\n                    return content;\n                };\n                for (var rowIdx = 0; rowIdx < rowCount; rowIdx++) {\n                    html += '<tr>';\n                    for (var groupIdx = 0; groupIdx < groupsCount; groupIdx++) {\n                        for (var idx = 0, length = columnCount; idx < length; idx++) {\n                            html += view._forTimeRange(start, end, appendRow);\n                        }\n                    }\n                    html += '</tr>';\n                }\n                return html;\n            },\n            _addTimeSlotsCollections: function (groupCount, datesCount, tableRows, interval, isVerticallyGrouped) {\n                var view = this._view;\n                var rowCount = tableRows.length;\n                if (isVerticallyGrouped) {\n                    rowCount = Math.floor(rowCount / groupCount);\n                }\n                for (var groupIndex = 0; groupIndex < groupCount; groupIndex++) {\n                    var rowMultiplier = 0;\n                    var group = view.groups[groupIndex];\n                    var time;\n                    if (isVerticallyGrouped) {\n                        rowMultiplier = groupIndex;\n                    }\n                    var rowIndex = rowMultiplier * rowCount;\n                    var cellMultiplier = 0;\n                    if (!isVerticallyGrouped) {\n                        cellMultiplier = groupIndex;\n                    }\n                    var cells = tableRows[rowIndex].children;\n                    var cellsPerGroup = cells.length / (!isVerticallyGrouped ? groupCount : 1);\n                    var cellsPerDay = cellsPerGroup / datesCount;\n                    for (var dateIndex = 0; dateIndex < datesCount; dateIndex++) {\n                        var cellOffset = dateIndex * cellsPerDay + cellsPerGroup * cellMultiplier;\n                        time = getMilliseconds(new Date(+view.startTime()));\n                        for (var cellIndex = 0; cellIndex < cellsPerDay; cellIndex++) {\n                            view._addTimeSlotToCollection(group, cells, cellIndex, cellOffset, dateIndex, time, interval);\n                            time += interval;\n                        }\n                    }\n                }\n            },\n            _getVerticalGroupCount: function (groupsCount) {\n                return groupsCount;\n            },\n            _getVerticalRowCount: function (eventGroups, groupIndex, maxRowCount) {\n                var view = this._view;\n                return view._isVerticallyGrouped() ? eventGroups[groupIndex].maxRowCount : maxRowCount;\n            },\n            _renderEvent: function (eventGroup, event, adjustedEvent, group, range, container) {\n                var view = this._view;\n                var element;\n                element = view._createEventElement(adjustedEvent.occurrence, event, range.head || adjustedEvent.head, range.tail || adjustedEvent.tail);\n                element.appendTo(container).css({\n                    top: 0,\n                    height: view.options.eventHeight\n                });\n                var eventObject = {\n                    start: adjustedEvent.occurrence._startTime || adjustedEvent.occurrence.start,\n                    end: adjustedEvent.occurrence._endTime || adjustedEvent.occurrence.end,\n                    element: element,\n                    uid: event.uid,\n                    slotRange: range,\n                    rowIndex: 0,\n                    offsetTop: 0\n                };\n                eventGroup.events[event.uid] = eventObject;\n                view.addContinuousEvent(group, range, element, event.isAllDay);\n                view._arrangeRows(eventObject, range, eventGroup);\n            },\n            _verticalCountForLevel: function (level) {\n                var view = this._view;\n                return view._rowCountForLevel(level);\n            },\n            _horizontalCountForLevel: function (level) {\n                var view = this._view;\n                return view._columnCountForLevel(level);\n            },\n            _updateCurrentVerticalTimeMarker: function (ranges, currentTime) {\n                var view = this._view;\n                var elementHtml = '<div class=\\'' + CURRENT_TIME_MARKER_CLASS + '\\'></div>';\n                var headerWrap = view.datesHeader.find('.' + SCHEDULER_HEADER_WRAP_CLASS);\n                var left = Math.round(ranges[0].innerRect(currentTime, new Date(currentTime.getTime() + 1), false).left);\n                var timesTableMarker = $(elementHtml).prependTo(headerWrap).addClass(CURRENT_TIME_MARKER_ARROW_CLASS + '-down');\n                timesTableMarker.css({\n                    left: view._adjustLeftPosition(left - outerWidth(timesTableMarker) * BORDER_SIZE_COEFF / 2),\n                    top: headerWrap.find('tr:last').prev().position().top\n                });\n                $(elementHtml).prependTo(view.content).css({\n                    left: view._adjustLeftPosition(left),\n                    width: '1px',\n                    height: view.content[0].scrollHeight - 1,\n                    top: 0\n                });\n            },\n            _changeGroup: function () {\n                return undefined;\n            },\n            _prevGroupSlot: function (slot, group, isDay) {\n                var view = this._view;\n                if (view._isVerticallyGrouped()) {\n                    return slot;\n                } else {\n                    var collection = group._collection(0, isDay);\n                    return collection.last();\n                }\n            },\n            _nextGroupSlot: function (slot, group, isDay) {\n                var view = this._view;\n                if (view._isVerticallyGrouped()) {\n                    return slot;\n                } else {\n                    var collection = group._collection(0, isDay);\n                    return collection.first();\n                }\n            },\n            _verticalSlots: function (selection, reverse) {\n                var view = this._view;\n                return view._changeGroup(selection, reverse);\n            },\n            _verticalMethod: function (reverse) {\n                return reverse ? 'leftSlot' : 'rightSlot';\n            },\n            _normalizeVerticalSelection: function () {\n                return undefined;\n            },\n            _horizontalSlots: function (selection, group, method, startSlot, endSlot, multiple, reverse) {\n                var view = this._view;\n                var result = {};\n                result.startSlot = group[method](startSlot);\n                result.endSlot = group[method](endSlot);\n                if (!multiple && view._isHorizontallyGrouped() && (!result.startSlot || !result.endSlot)) {\n                    result.startSlot = result.endSlot = view._changeGroup(selection, reverse);\n                }\n                return result;\n            },\n            _changeVerticalViewPeriod: function () {\n                return false;\n            },\n            _changeHorizontalViewPeriod: function (slots, shift, selection, reverse) {\n                var view = this._view;\n                if ((!slots.startSlot || !slots.endSlot) && !shift && view._changeViewPeriod(selection, reverse, false)) {\n                    return true;\n                }\n                return false;\n            },\n            _updateDirection: function (selection, ranges, shift, reverse) {\n                var view = this._view;\n                view._updateDirection(selection, ranges, shift, reverse, true);\n            },\n            _createMoveHint: function (range, adjustedEvent) {\n                var view = this._view;\n                var startSlot = range.start;\n                var hint = view._createEventElement(adjustedEvent.occurrence, adjustedEvent.occurrence, false, false);\n                hint.addClass('k-event-drag-hint');\n                var rect = range.innerRect(adjustedEvent.occurrence.start, adjustedEvent.occurrence.end, view.options.snap);\n                var width = rect.right - rect.left - 2;\n                if (width < 0) {\n                    width = 0;\n                }\n                var left = view._adjustLeftPosition(rect.left);\n                var css = {\n                    left: left,\n                    top: startSlot.offsetTop,\n                    height: startSlot.offsetHeight - 2,\n                    width: width\n                };\n                hint.css(css);\n                view._moveHint = view._moveHint.add(hint);\n            },\n            _adjustLeftPosition: function (left) {\n                var view = this._view;\n                if (view._isRtl) {\n                    left -= view.content[0].scrollWidth - view.content[0].offsetWidth;\n                }\n                return left;\n            }\n        });\n        var TimelineGroupedByDateView = kendo.Class.extend({\n            init: function (view) {\n                this._view = view;\n            },\n            _getTimeSlotByPosition: function (x, y, groupIndex) {\n                var group = this._view.groups[groupIndex];\n                return group.timeSlotByPosition(x, y, true);\n            },\n            _hideHeaders: function () {\n                var view = this._view;\n                if (!view._isVerticallyGrouped()) {\n                    view.timesHeader.find('table tr').eq(2).hide();\n                    view.datesHeader.find('table tr').eq(2).hide();\n                } else {\n                    view.times.find('.k-last').hide();\n                }\n            },\n            _setColspan: function () {\n            },\n            _createRowsLayout: function (resources, rows, groupHeaderTemplate, columns) {\n                var view = this._view;\n                return view._createDateLayout(columns, null, true);\n            },\n            _createVerticalColumnsLayout: function (resources, rows, groupHeaderTemplate) {\n                var view = this._view;\n                return view._createColumnsLayout(resources, null, groupHeaderTemplate);\n            },\n            _createColumnsLayout: function (resources, columns, groupHeaderTemplate, subColumns) {\n                var view = this._view;\n                return view._createColumnsLayout(resources, columns, groupHeaderTemplate, subColumns, true);\n            },\n            _getRowCount: function (level) {\n                var view = this._view;\n                return view._rowCountForLevel(level);\n            },\n            _getGroupsCount: function () {\n                var view = this._view;\n                return view._groupCount();\n            },\n            _addContent: function (dates, columnCount, groupsCount, rowCount, start, end, slotTemplate, isVerticalGrouped) {\n                var view = this._view;\n                var html = '';\n                var options = view.options;\n                var appendRow = function (date, isMajorTickColumn, isMiddleColumn, isLastSlotColumn, minorTickColumns, groupIdx) {\n                    var content = '';\n                    var classes = '';\n                    var tmplDate;\n                    var workDateIndex = view._isVerticallyGrouped() ? dateIndex : idx;\n                    var resources = function (groupIndex) {\n                        return function () {\n                            return view._resourceBySlot({ groupIndex: groupIndex });\n                        };\n                    };\n                    if (kendo.date.isToday(dates[idx])) {\n                        classes += 'k-today';\n                    }\n                    if (kendo.date.getMilliseconds(date) < kendo.date.getMilliseconds(options.workDayStart) || kendo.date.getMilliseconds(date) >= kendo.date.getMilliseconds(options.workDayEnd) || !view._isWorkDay(dates[workDateIndex])) {\n                        classes += ' k-nonwork-hour';\n                    }\n                    content += '<td' + (classes !== '' ? ' class=\"' + classes + '\"' : '') + '>';\n                    tmplDate = kendo.date.getDate(dates[idx]);\n                    kendo.date.setTime(tmplDate, kendo.date.getMilliseconds(date));\n                    content += slotTemplate({\n                        date: tmplDate,\n                        resources: resources(groupIdx)\n                    });\n                    content += '</td>';\n                    return content;\n                };\n                var tempStart = new Date(start), minorTickCount = view.options.minorTickCount, msMajorInterval = view.options.majorTick * MS_PER_MINUTE, msInterval = msMajorInterval / minorTickCount || 1, dateIndex;\n                for (var rowIdx = 0; rowIdx < rowCount; rowIdx++) {\n                    html += '<tr>';\n                    if (rowIdx % (rowCount / view._dates.length) === 0) {\n                        dateIndex = rowIdx / (rowCount / view._dates.length);\n                        tempStart = new Date(view._dates[dateIndex]);\n                        kendo.date.setTime(tempStart, kendo.date.getMilliseconds(start));\n                    }\n                    for (var idx = 0, length = columnCount; idx < length; idx++) {\n                        html += view._forTimeRange(tempStart, end, appendRow, isVerticalGrouped, groupsCount);\n                        if (isVerticalGrouped) {\n                            setTime(tempStart, msInterval, false);\n                            break;\n                        }\n                    }\n                    html += '</tr>';\n                }\n                return html;\n            },\n            _addTimeSlotsCollections: function (groupCount, datesCount, tableRows, interval, isVerticallyGrouped) {\n                var view = this._view;\n                var rowCount = tableRows.length;\n                if (isVerticallyGrouped) {\n                    rowCount = rowCount / datesCount;\n                }\n                for (var dateIndex = 0; dateIndex < datesCount; dateIndex++) {\n                    var rowMultiplier = 0;\n                    var time;\n                    if (isVerticallyGrouped) {\n                        rowMultiplier = dateIndex;\n                    }\n                    var rowIndex = rowMultiplier * rowCount;\n                    var cellMultiplier = 0;\n                    var cells = tableRows[rowIndex].children;\n                    var cellsPerGroup = isVerticallyGrouped ? rowCount : cells.length / (datesCount * groupCount);\n                    var cellsPerDay = cells.length / datesCount;\n                    var cellOffset;\n                    time = getMilliseconds(new Date(+view.startTime()));\n                    for (var cellIndex = 0; cellIndex < cellsPerGroup; cellIndex++) {\n                        if (!isVerticallyGrouped) {\n                            cellOffset = dateIndex * cellsPerDay + groupCount * cellIndex;\n                            cellMultiplier++;\n                        } else {\n                            cellOffset = 0;\n                            cells = tableRows[cellIndex + cellsPerGroup * dateIndex].children;\n                        }\n                        for (var groupIndex = 0; groupIndex < groupCount; groupIndex++) {\n                            var group = view.groups[groupIndex];\n                            view._addTimeSlotToCollection(group, cells, groupIndex, cellOffset, dateIndex, time, interval);\n                        }\n                        time += interval;\n                    }\n                }\n            },\n            _getVerticalGroupCount: function () {\n                var view = this._view;\n                return view.content.find('tr').length;\n            },\n            _getVerticalRowCount: function (eventGroups, groupIndex, maxRowCount) {\n                return maxRowCount;\n            },\n            _renderEvent: function (eventGroup, event, adjustedEvent, group, range, container, startIndex, endIndex) {\n                var view = this._view;\n                var element;\n                var eventObjects = [];\n                for (var i = range.start.index; i <= range.end.index; i++) {\n                    element = view._createEventElement(adjustedEvent.occurrence, event, i !== endIndex, i !== startIndex);\n                    element.appendTo(container).css({\n                        top: 0,\n                        height: view.options.eventHeight\n                    });\n                    var currentSlot = group._timeSlotCollections[0]._slots[i];\n                    var dateRange = group.timeSlotRanges(currentSlot.start, currentSlot.end, false)[0];\n                    var eventObject = {\n                        start: i === startIndex ? adjustedEvent.occurrence._startTime || adjustedEvent.occurrence.start : currentSlot.start,\n                        end: i === endIndex ? adjustedEvent.occurrence._endTime || adjustedEvent.occurrence.end : currentSlot.end,\n                        element: element,\n                        uid: event.uid,\n                        slotRange: dateRange,\n                        rowIndex: 0,\n                        offsetTop: 0\n                    };\n                    eventGroup.events[event.uid] = eventObject;\n                    eventObjects.push(eventObject);\n                    view.addContinuousEvent(group, dateRange, element, event.isAllDay);\n                    view._arrangeRows(eventObject, dateRange, eventGroup);\n                }\n                eventGroup.events[event.uid] = eventObjects;\n            },\n            _verticalCountForLevel: function (level) {\n                var view = this._view;\n                return view._columnCountForLevel(level);\n            },\n            _horizontalCountForLevel: function (level, columnLevel) {\n                var view = this._view;\n                return view._columnCountForLevel(columnLevel) / view._columnCountForLevel(2);\n            },\n            _updateCurrentVerticalTimeMarker: function (ranges, currentTime) {\n                var view = this._view;\n                var firstTimesCell = view.times.find('tr:first th:first');\n                var lastTimesCell = view.times.find('tr:first th:last');\n                var elementHtml = '<div class=\\'' + CURRENT_TIME_MARKER_CLASS + '\\'></div>';\n                var timesTableMarker = $(elementHtml).prependTo(view.times);\n                var markerTopPosition = Math.round(ranges[0].innerRect(currentTime, new Date(currentTime.getTime() + 1), false).top);\n                var timesTableMarkerCss = {};\n                if (this._isRtl) {\n                    timesTableMarkerCss.right = firstTimesCell.position().left + outerHeight(firstTimesCell) - outerHeight(lastTimesCell);\n                    timesTableMarker.addClass(CURRENT_TIME_MARKER_ARROW_CLASS + '-left');\n                } else {\n                    timesTableMarkerCss.left = lastTimesCell.position().left;\n                    timesTableMarker.addClass(CURRENT_TIME_MARKER_ARROW_CLASS + '-right');\n                }\n                timesTableMarkerCss.top = markerTopPosition - outerWidth(timesTableMarker) * BORDER_SIZE_COEFF / 2;\n                timesTableMarker.css(timesTableMarkerCss);\n                $(elementHtml).prependTo(view.content).css({\n                    top: markerTopPosition,\n                    height: '1px',\n                    right: '1px',\n                    width: view.content[0].scrollWidth,\n                    left: 0\n                });\n            },\n            _changeGroup: function (selection, previous, slot) {\n                var view = this._view;\n                if (!slot) {\n                    selection.groupIndex = previous ? view.groups.length - 1 : 0;\n                }\n            },\n            _prevGroupSlot: function (slot) {\n                return slot;\n            },\n            _nextGroupSlot: function (slot) {\n                return slot;\n            },\n            _changeDate: function (selection, reverse, slot) {\n                var view = this._view;\n                var group = view.groups[selection.groupIndex];\n                var collections, index;\n                if (reverse) {\n                    collections = group._getCollections(false);\n                    index = slot.index - 1;\n                    if (index >= 0) {\n                        return collections[0]._slots[index];\n                    }\n                } else {\n                    collections = group._getCollections(false);\n                    index = slot.index + 1;\n                    if (collections[0] && collections[0]._slots[index]) {\n                        return collections[0]._slots[index];\n                    }\n                }\n            },\n            _verticalSlots: function (selection, reverse, slot) {\n                return this._changeDate(selection, reverse, slot);\n            },\n            _verticalMethod: function (reverse, multiple) {\n                if (multiple) {\n                    return reverse ? 'upSlot' : 'downSlot';\n                } else {\n                    return reverse ? 'leftSlot' : 'rightSlot';\n                }\n            },\n            _normalizeVerticalSelection: function (selection, ranges, reverse, multiple) {\n                var view = this._view;\n                if (!multiple) {\n                    return view._normalizeVerticalSelection(selection, ranges, reverse);\n                }\n                return undefined;\n            },\n            _horizontalSlots: function (selection, group, method, startSlot, endSlot, multiple, reverse) {\n                var view = this._view;\n                var tempSlot = view._changeGroup(selection, reverse);\n                var result = {};\n                if (!tempSlot) {\n                    if (!view._isVerticallyGrouped()) {\n                        result.startSlot = group[method](startSlot);\n                        result.endSlot = group[method](endSlot);\n                    }\n                } else {\n                    result.startSlot = result.endSlot = tempSlot;\n                }\n                return result;\n            },\n            _changeVerticalViewPeriod: function (slots, shift, selection, reverse) {\n                var view = this._view;\n                if ((!slots.startSlot || !slots.endSlot) && !shift && view._changeViewPeriod(selection, reverse, view._isVerticallyGrouped())) {\n                    return true;\n                }\n                return false;\n            },\n            _changeHorizontalViewPeriod: function (slots, shift, selection, reverse) {\n                var view = this._view;\n                if (view._isVerticallyGrouped()) {\n                    return false;\n                }\n                if ((!slots.startSlot || !slots.endSlot) && !shift && view._changeViewPeriod(selection, reverse, false)) {\n                    return true;\n                }\n                return false;\n            },\n            _updateDirection: function (selection, ranges, shift, reverse) {\n                var view = this._view;\n                view._updateDirection(selection, ranges, shift, reverse, !view._isVerticallyGrouped());\n            },\n            _createMoveHint: function (range, adjustedEvent) {\n                var view = this._view;\n                var startSlot = range.start;\n                var startEnd = range.end;\n                for (var slotIdx = startSlot.index; slotIdx <= startEnd.index; slotIdx++) {\n                    var slot = range.collection._slots[slotIdx];\n                    var hint = view._createEventElement(adjustedEvent.occurrence, adjustedEvent.occurrence, false, false);\n                    hint.addClass('k-event-drag-hint');\n                    var css = {\n                        left: slot.offsetLeft + 2,\n                        top: slot.offsetTop,\n                        height: view.options.eventHeight,\n                        width: slot.offsetWidth\n                    };\n                    hint.css(css);\n                    view._moveHint = view._moveHint.add(hint);\n                }\n            },\n            _adjustLeftPosition: function (left) {\n                var view = this._view;\n                if (view._isRtl && !view._isVerticallyGrouped()) {\n                    left -= view.content[0].scrollWidth - view.content[0].offsetWidth;\n                }\n                return left;\n            }\n        });\n        kendo.ui.scheduler.TimelineGroupedView = TimelineGroupedView;\n        kendo.ui.scheduler.TimelineGroupedByDateView = TimelineGroupedByDateView;\n        var TimelineView = SchedulerView.extend({\n            init: function (element, options) {\n                var that = this;\n                SchedulerView.fn.init.call(that, element, options);\n                that._groupedView = that._getGroupedView();\n                that.title = that.options.title || that.options.name;\n                that._workDays = getWorkDays(that.options);\n                that._templates();\n                that._editable();\n                that.calculateDateRange();\n                that._groups();\n                that._currentTime(true);\n            },\n            name: 'timeline',\n            _getGroupedView: function () {\n                if (this._isGroupedByDate()) {\n                    return new kendo.ui.scheduler.TimelineGroupedByDateView(this);\n                } else {\n                    return new kendo.ui.scheduler.TimelineGroupedView(this);\n                }\n            },\n            _getNextEventIndexBySlot: function (slot, sortedEvents, groupIndex) {\n                if (this._isVerticallyGrouped()) {\n                    return kendo.ui.SchedulerView.fn._getNextEventIndexBySlot.call(this, slot, sortedEvents, groupIndex);\n                }\n                var tempIndex = 0;\n                for (var i = 0; i < sortedEvents.length; i++) {\n                    if (slot.startDate() > sortedEvents[i].start.startDate()) {\n                        tempIndex++;\n                        continue;\n                    }\n                    if (slot.startDate().getTime() === sortedEvents[i].start.startDate().getTime() && groupIndex > sortedEvents[i].start.groupIndex) {\n                        tempIndex++;\n                        continue;\n                    }\n                    break;\n                }\n                return tempIndex;\n            },\n            _getSelectedSlot: function (slot, sortedEvents, event, idx, pad, prev) {\n                if (this._isVerticallyGrouped()) {\n                    return kendo.ui.SchedulerView.fn._getSelectedSlot.call(this, slot, sortedEvents, event, idx, pad, prev);\n                }\n                return slot;\n            },\n            _getSortedEvents: function (uniqueAllEvents) {\n                if (this._isVerticallyGrouped()) {\n                    return kendo.ui.SchedulerView.fn._getSortedEvents.call(this, uniqueAllEvents);\n                }\n                return uniqueAllEvents.sort(function (first, second) {\n                    var result = first.start.startDate().getTime() - second.start.startDate().getTime();\n                    if (result === 0) {\n                        if (first.start.isDaySlot && !second.start.isDaySlot) {\n                            result = -1;\n                        }\n                        if (!first.start.isDaySlot && second.start.isDaySlot) {\n                            result = 1;\n                        }\n                    }\n                    if (result === 0) {\n                        result = first.start.groupIndex - second.start.groupIndex;\n                    }\n                    if (result === 0) {\n                        result = $(first.element).index() - $(second.element).index();\n                    }\n                    return result;\n                });\n            },\n            _currentTimeMarkerUpdater: function () {\n                this._updateCurrentTimeMarker(new Date());\n            },\n            _updateCurrentTimeMarker: function (currentTime) {\n                var options = this.options;\n                this.datesHeader.find('.' + CURRENT_TIME_MARKER_CLASS).remove();\n                this.times.find('.' + CURRENT_TIME_MARKER_CLASS).remove();\n                this.content.find('.' + CURRENT_TIME_MARKER_CLASS).remove();\n                if (!this._isInDateSlot({\n                        start: currentTime,\n                        end: currentTime\n                    })) {\n                    return;\n                }\n                if (options.currentTimeMarker.useLocalTimezone === false) {\n                    var timezone = options.dataSource.options.schema.timezone;\n                    if (options.dataSource && timezone) {\n                        var timezoneOffset = kendo.timezone.offset(currentTime, timezone);\n                        currentTime = kendo.timezone.convert(currentTime, currentTime.getTimezoneOffset(), timezoneOffset);\n                    }\n                }\n                var groupsCount = !options.group || options.group.orientation == 'vertical' ? 1 : this.groups.length;\n                for (var groupIndex = 0; groupIndex < groupsCount; groupIndex++) {\n                    var currentGroup = this.groups[groupIndex];\n                    if (!currentGroup) {\n                        return;\n                    }\n                    var utcCurrentTime = kendo.date.toUtcTime(currentTime);\n                    var ranges = currentGroup.timeSlotRanges(utcCurrentTime, utcCurrentTime + 1);\n                    if (ranges.length === 0) {\n                        return;\n                    }\n                    var collection = ranges[0].collection;\n                    var slotElement = collection.slotByStartDate(currentTime);\n                    if (slotElement) {\n                        if (this._isVerticallyGrouped()) {\n                            this._groupedView._updateCurrentVerticalTimeMarker(ranges, currentTime);\n                        } else {\n                            var elementHtml = '<div class=\\'' + CURRENT_TIME_MARKER_CLASS + '\\'></div>';\n                            var headerWrap = this.datesHeader.find('.' + SCHEDULER_HEADER_WRAP_CLASS);\n                            var left = Math.round(ranges[0].innerRect(currentTime, new Date(currentTime.getTime() + 1), false).left);\n                            var timesTableMarker = $(elementHtml).prependTo(headerWrap).addClass(CURRENT_TIME_MARKER_ARROW_CLASS + '-down');\n                            timesTableMarker.css({\n                                left: this._adjustLeftPosition(left - outerWidth(timesTableMarker) * BORDER_SIZE_COEFF / 2),\n                                top: headerWrap.find('tr:last').prev().position().top\n                            });\n                            $(elementHtml).prependTo(this.content).css({\n                                left: this._adjustLeftPosition(left),\n                                width: '1px',\n                                height: this.content[0].scrollHeight - 1,\n                                top: 0\n                            });\n                        }\n                    }\n                }\n            },\n            _adjustLeftPosition: function (left) {\n                return this._groupedView._adjustLeftPosition(left);\n            },\n            _currentTime: function (setUpdateTimer) {\n                var that = this;\n                var markerOptions = that.options.currentTimeMarker;\n                if (markerOptions !== false && markerOptions.updateInterval !== undefined) {\n                    that._currentTimeMarkerUpdater();\n                    if (setUpdateTimer) {\n                        that._currentTimeUpdateTimer = setInterval(proxy(this._currentTimeMarkerUpdater, that), markerOptions.updateInterval);\n                    }\n                }\n            },\n            _editable: function () {\n                if (this.options.editable) {\n                    if (this._isMobile()) {\n                        this._touchEditable();\n                    } else {\n                        this._mouseEditable();\n                    }\n                }\n            },\n            _mouseEditable: function () {\n                var that = this;\n                that.element.on('click' + NS, '.k-event a:has(.k-i-close)', function (e) {\n                    that.trigger('remove', { uid: $(this).closest('.k-event').attr(kendo.attr('uid')) });\n                    e.preventDefault();\n                });\n                if (that.options.editable.create !== false) {\n                    that.element.on('dblclick' + NS, '.k-scheduler-content td', function (e) {\n                        var slot = that._slotByPosition(e.pageX, e.pageY);\n                        if (slot) {\n                            var resourceInfo = that._resourceBySlot(slot);\n                            that.trigger('add', {\n                                eventInfo: extend({\n                                    start: slot.startDate(),\n                                    end: slot.endDate()\n                                }, resourceInfo)\n                            });\n                        }\n                        e.preventDefault();\n                    });\n                }\n                if (that.options.editable.update !== false) {\n                    that.element.on('dblclick' + NS, '.k-event', function (e) {\n                        that.trigger('edit', { uid: $(this).closest('.k-event').attr(kendo.attr('uid')) });\n                        e.preventDefault();\n                    });\n                }\n            },\n            _touchEditable: function () {\n                var that = this;\n                var threshold = 0;\n                if (kendo.support.mobileOS.android) {\n                    threshold = 5;\n                }\n                if (that.options.editable.create !== false) {\n                    that._addUserEvents = new kendo.UserEvents(that.element, {\n                        threshold: threshold,\n                        filter: '.k-scheduler-content td',\n                        tap: function (e) {\n                            var x = e.x.location !== undefined ? e.x.location : e.x;\n                            var y = e.y.location !== undefined ? e.y.location : e.y;\n                            var slot = that._slotByPosition(x, y);\n                            if (slot) {\n                                var resourceInfo = that._resourceBySlot(slot);\n                                that.trigger('add', {\n                                    eventInfo: extend({\n                                        start: slot.startDate(),\n                                        end: slot.endDate()\n                                    }, resourceInfo)\n                                });\n                            }\n                            e.preventDefault();\n                        }\n                    });\n                }\n                if (that.options.editable.update !== false) {\n                    that._editUserEvents = new kendo.UserEvents(that.element, {\n                        threshold: threshold,\n                        filter: '.k-event',\n                        tap: function (e) {\n                            var eventElement = $(e.target).closest('.k-event');\n                            if (!eventElement.hasClass('k-event-active')) {\n                                that.trigger('edit', { uid: eventElement.attr(kendo.attr('uid')) });\n                            }\n                            e.preventDefault();\n                        }\n                    });\n                }\n            },\n            _slotByPosition: function (x, y) {\n                var slot;\n                var content = this.content;\n                var offset = content.offset();\n                var groupIndex;\n                x -= offset.left;\n                y -= offset.top;\n                if (this._isRtl) {\n                    var browser = kendo.support.browser;\n                    if (browser.mozilla) {\n                        x += content[0].scrollWidth - content[0].offsetWidth;\n                        x += content[0].scrollLeft;\n                    } else if (browser.msie) {\n                        x -= content.scrollLeft();\n                        x += content[0].scrollWidth - content[0].offsetWidth;\n                    } else if (browser.webkit) {\n                        x += content[0].scrollLeft;\n                    }\n                } else {\n                    x += content[0].scrollLeft;\n                }\n                y += content[0].scrollTop;\n                x = Math.ceil(x);\n                y = Math.ceil(y);\n                for (groupIndex = 0; groupIndex < this.groups.length; groupIndex++) {\n                    slot = this._groupedView._getTimeSlotByPosition(x, y, groupIndex);\n                    if (slot) {\n                        return slot;\n                    }\n                }\n                return null;\n            },\n            options: {\n                name: 'TimelineView',\n                title: 'Timeline',\n                selectedDateFormat: '{0:D}',\n                selectedShortDateFormat: '{0:d}',\n                date: kendo.date.today(),\n                startTime: kendo.date.today(),\n                endTime: kendo.date.today(),\n                showWorkHours: false,\n                minorTickCount: 2,\n                editable: true,\n                workDayStart: new Date(1980, 1, 1, 8, 0, 0),\n                workDayEnd: new Date(1980, 1, 1, 17, 0, 0),\n                workWeekStart: 1,\n                workWeekEnd: 5,\n                majorTick: 60,\n                eventHeight: 25,\n                eventMinWidth: 0,\n                columnWidth: 100,\n                groupHeaderTemplate: '#=text#',\n                majorTimeHeaderTemplate: '#=kendo.toString(date, \\'t\\')#',\n                slotTemplate: '&nbsp;',\n                eventTemplate: EVENT_TEMPLATE,\n                dateHeaderTemplate: DATA_HEADER_TEMPLATE,\n                footer: { command: 'workDay' },\n                currentTimeMarker: {\n                    updateInterval: 10000,\n                    useLocalTimezone: true\n                },\n                messages: {\n                    defaultRowText: 'All events',\n                    showFullDay: 'Show full day',\n                    showWorkDay: 'Show business hours'\n                }\n            },\n            events: [\n                'remove',\n                'add',\n                'edit'\n            ],\n            _templates: function () {\n                var options = this.options, settings = extend({}, kendo.Template, options.templateSettings);\n                this.eventTemplate = this._eventTmpl(options.eventTemplate, EVENT_WRAPPER_STRING);\n                this.majorTimeHeaderTemplate = kendo.template(options.majorTimeHeaderTemplate, settings);\n                this.dateHeaderTemplate = kendo.template(options.dateHeaderTemplate, settings);\n                this.slotTemplate = kendo.template(options.slotTemplate, settings);\n                this.groupHeaderTemplate = kendo.template(options.groupHeaderTemplate, settings);\n            },\n            _render: function (dates) {\n                var that = this;\n                dates = dates || [];\n                that._dates = dates;\n                that._startDate = dates[0];\n                that._endDate = dates[dates.length - 1 || 0];\n                that._calculateSlotRanges();\n                that.createLayout(that._layout(dates));\n                that._content(dates);\n                that._footer();\n                that._setContentWidth();\n                that.refreshLayout();\n                that.datesHeader.on('click' + NS, '.k-nav-day', function (e) {\n                    var th = $(e.currentTarget).closest('th');\n                    var slot = that._slotByPosition(th.offset().left, that.content.offset().top);\n                    that.trigger('navigate', {\n                        view: 'timeline',\n                        date: slot.startDate()\n                    });\n                });\n                that._groupedView._hideHeaders();\n            },\n            _setContentWidth: function () {\n                var content = this.content;\n                var contentWidth = content.width();\n                var contentTable = this.content.find('table');\n                var columnCount = contentTable.find('tr:first').children().length;\n                var minWidth = 100;\n                var calculatedWidth = columnCount * this.options.columnWidth;\n                if (contentWidth < calculatedWidth) {\n                    minWidth = Math.ceil(calculatedWidth / contentWidth * 100);\n                }\n                contentTable.add(this.datesHeader.find('table')).css('width', minWidth + '%');\n            },\n            _calculateSlotRanges: function () {\n                var dates = this._dates;\n                var slotStartTime = this.startTime();\n                var slotEndTime = this.endTime();\n                if (getMilliseconds(slotEndTime) === getMilliseconds(kendo.date.getDate(slotEndTime))) {\n                    slotEndTime = kendo.date.getDate(slotEndTime);\n                    setTime(slotEndTime, MS_PER_DAY - 1);\n                }\n                slotEndTime = getMilliseconds(slotEndTime);\n                slotStartTime = getMilliseconds(slotStartTime);\n                var slotRanges = [];\n                for (var i = 0; i < dates.length; i++) {\n                    var rangeStart = getDate(dates[i]);\n                    setTime(rangeStart, slotStartTime);\n                    var rangeEnd = getDate(dates[i]);\n                    setTime(rangeEnd, slotEndTime);\n                    slotRanges.push({\n                        start: kendo.date.toUtcTime(rangeStart),\n                        end: kendo.date.toUtcTime(rangeEnd)\n                    });\n                }\n                this._slotRanges = slotRanges;\n            },\n            _forTimeRange: function (min, max, action, verticalByDate, groupsCount) {\n                min = toInvariantTime(min);\n                max = toInvariantTime(max);\n                var that = this, msMin = getMilliseconds(min), msMax = getMilliseconds(max), minorTickCount = that.options.minorTickCount, msMajorInterval = that.options.majorTick * MS_PER_MINUTE, msInterval = msMajorInterval / minorTickCount || 1, start = new Date(+min), startDay = start.getDate(), msStart, idx = 0, length, html = '';\n                length = MS_PER_DAY / msInterval;\n                if (msMin != msMax) {\n                    if (msMin > msMax) {\n                        msMax += MS_PER_DAY;\n                    }\n                    length = (msMax - msMin) / msInterval;\n                }\n                length = verticalByDate ? 1 : Math.round(length);\n                if (groupsCount) {\n                    length = length * groupsCount;\n                }\n                for (; idx < length; idx++) {\n                    var majorTickDivider = idx % (msMajorInterval / msInterval);\n                    var isMajorTickColumn = majorTickDivider === 0;\n                    var isMiddleColumn = majorTickDivider < minorTickCount - 1;\n                    var isLastSlotColumn = majorTickDivider === minorTickCount - 1;\n                    var minorTickColumns = minorTickCount;\n                    if (length % minorTickCount !== 0) {\n                        var isLastMajorSlot = length - (idx + 1) < minorTickCount;\n                        if (isMajorTickColumn && isLastMajorSlot) {\n                            minorTickColumns = length % minorTickCount;\n                        }\n                    }\n                    html += action(start, isMajorTickColumn, isMiddleColumn, isLastSlotColumn, minorTickColumns, idx % groupsCount);\n                    if (!verticalByDate) {\n                        if (groupsCount) {\n                            if (idx % groupsCount === groupsCount - 1) {\n                                setTime(start, msInterval, false);\n                            }\n                        } else {\n                            setTime(start, msInterval, false);\n                        }\n                    }\n                }\n                if (msMax) {\n                    msStart = getMilliseconds(start);\n                    if (startDay < start.getDate()) {\n                        msStart += MS_PER_DAY;\n                    }\n                    if (msStart > msMax) {\n                        start = new Date(+max);\n                    }\n                }\n                return html;\n            },\n            _layout: function (dates) {\n                var timeColumns = [];\n                var columns = [];\n                var that = this;\n                var rows = [{ text: that.options.messages.defaultRowText }];\n                var groupedView = that._groupedView;\n                var minorTickSlots = [];\n                for (var minorTickIndex = 0; minorTickIndex < that.options.minorTickCount; minorTickIndex++) {\n                    minorTickSlots.push({\n                        text: '&#8203;',\n                        className: 'k-last',\n                        minorTicks: true\n                    });\n                }\n                this._forTimeRange(that.startTime(), that.endTime(), function (date, majorTick, middleColumn, lastSlotColumn, minorSlotsCount) {\n                    var template = that.majorTimeHeaderTemplate;\n                    if (majorTick) {\n                        var timeColumn = {\n                            text: template({ date: date }),\n                            className: lastSlotColumn ? 'k-slot-cell' : '',\n                            columns: minorTickSlots.slice(0, minorSlotsCount)\n                        };\n                        groupedView._setColspan(timeColumn);\n                        timeColumns.push(timeColumn);\n                    }\n                });\n                for (var idx = 0; idx < dates.length; idx++) {\n                    columns.push({\n                        text: that.dateHeaderTemplate({ date: dates[idx] }),\n                        className: 'k-slot-cell',\n                        columns: timeColumns.slice(0)\n                    });\n                }\n                var resources = this.groupedResources;\n                if (resources.length) {\n                    if (this._groupOrientation() === 'vertical') {\n                        rows = groupedView._createRowsLayout(resources, null, this.groupHeaderTemplate, columns);\n                        columns = groupedView._createVerticalColumnsLayout(resources, null, this.groupHeaderTemplate, columns);\n                    } else {\n                        columns = groupedView._createColumnsLayout(resources, columns, this.groupHeaderTemplate, columns);\n                    }\n                }\n                return {\n                    columns: columns,\n                    rows: rows\n                };\n            },\n            _footer: function () {\n                var options = this.options;\n                if (options.footer !== false) {\n                    var html = '<div class=\"k-header k-scheduler-footer\">';\n                    var command = options.footer.command;\n                    if (command && command === 'workDay') {\n                        html += '<ul class=\"k-reset k-header\">';\n                        html += '<li class=\"k-state-default k-scheduler-fullday\"><a href=\"#\" class=\"k-link\"><span class=\"k-icon k-i-clock\"></span>';\n                        html += (options.showWorkHours ? options.messages.showFullDay : options.messages.showWorkDay) + '</a></li>';\n                        html += '</ul>';\n                    } else {\n                        html += '&nbsp;';\n                    }\n                    html += '</div>';\n                    this.footer = $(html).appendTo(this.element);\n                    var that = this;\n                    this.footer.on('click' + NS, '.k-scheduler-fullday', function (e) {\n                        e.preventDefault();\n                        that.trigger('navigate', {\n                            view: that.name || options.name,\n                            date: that.startDate(),\n                            isWorkDay: !options.showWorkHours\n                        });\n                    });\n                }\n            },\n            _columnCountForLevel: function (level) {\n                var columnLevel = this.columnLevels[level];\n                return columnLevel ? columnLevel.length : 0;\n            },\n            _rowCountForLevel: function (level) {\n                var rowLevel = this.rowLevels[level];\n                return rowLevel ? rowLevel.length : 0;\n            },\n            _isWorkDay: function (date) {\n                var day = date.getDay();\n                var workDays = this._workDays;\n                for (var i = 0; i < workDays.length; i++) {\n                    if (workDays[i] === day) {\n                        return true;\n                    }\n                }\n                return false;\n            },\n            _content: function (dates) {\n                var that = this;\n                var start = that.startTime();\n                var end = this.endTime();\n                var groupsCount = 1;\n                var rowCount = 1;\n                var columnCount = dates.length;\n                var html = '';\n                var resources = this.groupedResources;\n                var slotTemplate = this.slotTemplate;\n                var isVerticalGrouped = false;\n                if (resources.length) {\n                    isVerticalGrouped = that._groupOrientation() === 'vertical';\n                    if (isVerticalGrouped) {\n                        rowCount = that._groupedView._getRowCount(this.rowLevels.length - 1);\n                        groupsCount = that._groupedView._getGroupsCount();\n                    } else {\n                        groupsCount = that._groupCount();\n                    }\n                }\n                html += '<tbody>';\n                html += that._groupedView._addContent(dates, columnCount, groupsCount, rowCount, start, end, slotTemplate, isVerticalGrouped);\n                html += '</tbody>';\n                this.content.find('table').append(html);\n            },\n            _groups: function () {\n                var groupCount = this._groupCount();\n                var dates = this._dates;\n                var columnCount = dates.length;\n                this.groups = [];\n                for (var idx = 0; idx < groupCount; idx++) {\n                    var view = this._addResourceView(idx);\n                    var start = dates[0];\n                    var end = dates[dates.length - 1 || 0];\n                    view.addTimeSlotCollection(start, kendo.date.addDays(end, 1));\n                }\n                this._timeSlotGroups(groupCount, columnCount);\n            },\n            _isHorizontallyGrouped: function () {\n                return this.groupedResources.length && this._groupOrientation() === 'horizontal';\n            },\n            _timeSlotGroups: function (groupCount, datesCount) {\n                var interval = this._timeSlotInterval();\n                var isVerticallyGrouped = this._isVerticallyGrouped();\n                var tableRows = this.content.find('tr');\n                tableRows.attr('role', 'row');\n                this._groupedView._addTimeSlotsCollections(groupCount, datesCount, tableRows, interval, isVerticallyGrouped);\n            },\n            _addTimeSlotToCollection: function (group, cells, cellIndex, cellOffset, dateIndex, time, interval) {\n                var cell = cells[cellIndex + cellOffset];\n                var collection = group.getTimeSlotCollection(0);\n                var currentDate = this._dates[dateIndex];\n                var currentTime = Date.UTC(currentDate.getFullYear(), currentDate.getMonth(), currentDate.getDate());\n                var start = currentTime + time;\n                var end = start + interval;\n                cell.setAttribute('role', 'gridcell');\n                cell.setAttribute('aria-selected', false);\n                collection.addTimeSlot(cell, start, end, true);\n            },\n            startDate: function () {\n                return this._startDate;\n            },\n            endDate: function () {\n                return this._endDate;\n            },\n            startTime: function () {\n                var options = this.options;\n                return options.showWorkHours ? options.workDayStart : options.startTime;\n            },\n            endTime: function () {\n                var options = this.options;\n                return options.showWorkHours ? options.workDayEnd : options.endTime;\n            },\n            _timeSlotInterval: function () {\n                var options = this.options;\n                return options.majorTick / options.minorTickCount * MS_PER_MINUTE;\n            },\n            nextDate: function () {\n                return kendo.date.nextDay(this.endDate());\n            },\n            previousDate: function () {\n                return kendo.date.previousDay(this.startDate());\n            },\n            calculateDateRange: function () {\n                this._render([this.options.date]);\n            },\n            render: function (events) {\n                this._headerColumnCount = 0;\n                this._groups();\n                this.element.find('.k-event').remove();\n                events = new kendo.data.Query(events).sort([\n                    {\n                        field: 'start',\n                        dir: 'asc'\n                    },\n                    {\n                        field: 'end',\n                        dir: 'desc'\n                    }\n                ]).toArray();\n                var eventsByResource = [];\n                this._eventsByResource(events, this.groupedResources, eventsByResource);\n                var eventGroups = [];\n                var maxRowCount = 0;\n                for (var groupIndex = 0; groupIndex < eventsByResource.length; groupIndex++) {\n                    var eventGroup = {\n                        groupIndex: groupIndex,\n                        maxRowCount: 0,\n                        events: {}\n                    };\n                    eventGroups.push(eventGroup);\n                    this._renderEvents(eventsByResource[groupIndex], groupIndex, eventGroup);\n                    if (maxRowCount < eventGroup.maxRowCount) {\n                        maxRowCount = eventGroup.maxRowCount;\n                    }\n                }\n                this._setRowsHeight(eventGroups, eventsByResource.length, maxRowCount);\n                this._positionEvents(eventGroups, eventsByResource.length);\n                this._currentTime(false);\n                this.trigger('activate');\n            },\n            _positionEvents: function (eventGroups, groupsCount) {\n                for (var groupIndex = 0; groupIndex < groupsCount; groupIndex++) {\n                    var eventsForGroup = eventGroups[groupIndex].events;\n                    for (var eventUid in eventsForGroup) {\n                        var eventObject = eventsForGroup[eventUid];\n                        if ($.isArray(eventObject)) {\n                            for (var eventIndex = 0; eventIndex < eventObject.length; eventIndex++) {\n                                this._positionEvent(eventObject[eventIndex]);\n                            }\n                        } else {\n                            this._positionEvent(eventObject);\n                        }\n                    }\n                }\n            },\n            _setRowsHeight: function (eventGroups, groupsCount, maxRowCount) {\n                var eventHeight = this.options.eventHeight + 2;\n                var eventBottomOffset = this._getBottomRowOffset();\n                var groupedView = this._groupedView;\n                var verticalGroupCount = groupedView._getVerticalGroupCount(groupsCount);\n                groupsCount = this._isVerticallyGrouped() ? verticalGroupCount : 1;\n                for (var groupIndex = 0; groupIndex < groupsCount; groupIndex++) {\n                    var rowsCount = groupedView._getVerticalRowCount(eventGroups, groupIndex, maxRowCount);\n                    rowsCount = rowsCount ? rowsCount : 1;\n                    var rowHeight = (eventHeight + 2) * rowsCount + eventBottomOffset;\n                    var timesRow = $(this.times.find('tr')[groupIndex]);\n                    var row = $(this.content.find('tr')[groupIndex]);\n                    timesRow.height(rowHeight);\n                    row.height(rowHeight);\n                }\n                this._setContentWidth();\n                this.refreshLayout();\n                this._refreshSlots();\n            },\n            _getBottomRowOffset: function () {\n                var eventBottomOffset = this.options.eventHeight * 0.5;\n                var isMobile = this._isMobile();\n                var minOffset;\n                var maxOffset;\n                if (isMobile) {\n                    minOffset = 30;\n                    maxOffset = 60;\n                } else {\n                    minOffset = 15;\n                    maxOffset = 30;\n                }\n                if (eventBottomOffset > maxOffset) {\n                    eventBottomOffset = maxOffset;\n                } else if (eventBottomOffset < minOffset) {\n                    eventBottomOffset = minOffset;\n                }\n                return eventBottomOffset;\n            },\n            _positionEvent: function (eventObject) {\n                var eventHeight = this.options.eventHeight + 2;\n                var rect = eventObject.slotRange.innerRect(eventObject.start, eventObject.end, false);\n                var left = this._adjustLeftPosition(rect.left);\n                var width = rect.right - rect.left - 2;\n                if (width < 0) {\n                    width = 0;\n                }\n                if (width < this.options.eventMinWidth) {\n                    var slotsCollection = eventObject.slotRange.collection;\n                    var lastSlot = slotsCollection._slots[slotsCollection._slots.length - 1];\n                    var offsetRight = lastSlot.offsetLeft + lastSlot.offsetWidth;\n                    width = this.options.eventMinWidth;\n                    if (offsetRight < left + width) {\n                        width = offsetRight - rect.left - 2;\n                    }\n                }\n                eventObject.element.css({\n                    top: eventObject.slotRange.start.offsetTop + eventObject.rowIndex * (eventHeight + 2) + 'px',\n                    left: left,\n                    width: width\n                });\n            },\n            _refreshSlots: function () {\n                for (var groupIndex = 0; groupIndex < this.groups.length; groupIndex++) {\n                    this.groups[groupIndex].refresh();\n                }\n            },\n            _eventsByResource: function (events, resources, result) {\n                var resource = resources[0];\n                if (resource) {\n                    var view = resource.dataSource.view();\n                    for (var itemIdx = 0; itemIdx < view.length; itemIdx++) {\n                        var value = this._resourceValue(resource, view[itemIdx]);\n                        var eventsFilteredByResource = new kendo.data.Query(events).filter({\n                            field: resource.field,\n                            operator: SchedulerView.groupEqFilter(value)\n                        }).toArray();\n                        if (resources.length > 1) {\n                            this._eventsByResource(eventsFilteredByResource, resources.slice(1), result);\n                        } else {\n                            result.push(eventsFilteredByResource);\n                        }\n                    }\n                } else {\n                    result.push(events);\n                }\n            },\n            _isInDateSlot: function (event) {\n                var startTime = event.start;\n                var endTime = event.end;\n                var rangeStart = getDate(this._startDate);\n                var rangeEnd = kendo.date.addDays(getDate(this._endDate), 1);\n                if (startTime < rangeEnd && rangeStart <= endTime) {\n                    return true;\n                }\n                return false;\n            },\n            _isInTimeSlot: function (event) {\n                var startTime = event._startTime || kendo.date.toUtcTime(event.start);\n                var endTime = event._endTime || kendo.date.toUtcTime(event.end);\n                var slotRanges = this._slotRanges;\n                if (startTime === endTime) {\n                    endTime = endTime + 1;\n                }\n                for (var slotIndex = 0; slotIndex < slotRanges.length; slotIndex++) {\n                    if (startTime < slotRanges[slotIndex].end && slotRanges[slotIndex].start < endTime) {\n                        return true;\n                    }\n                }\n                return false;\n            },\n            _adjustEvent: function (event) {\n                var start = event.start;\n                var end = event.end;\n                var eventStartTime = event._time('start');\n                var eventEndTime = event._time('end');\n                var startTime = getMilliseconds(this.startTime());\n                var endTime = getMilliseconds(this.endTime());\n                var adjustedStartDate = null;\n                var adjustedEndDate = null;\n                var occurrence;\n                var head = false;\n                var tail = false;\n                if (event.isAllDay) {\n                    adjustedStartDate = getDate(start);\n                    if (startTime > eventStartTime) {\n                        setTime(adjustedStartDate, startTime);\n                        tail = true;\n                    }\n                    adjustedEndDate = getDate(end);\n                    if (endTime === getMilliseconds(getDate(this.endTime()))) {\n                        adjustedEndDate = kendo.date.addDays(adjustedEndDate, 1);\n                    } else {\n                        setTime(adjustedEndDate, endTime);\n                        head = true;\n                    }\n                } else {\n                    endTime = endTime === 0 ? MS_PER_DAY : endTime;\n                    if (startTime > eventStartTime) {\n                        adjustedStartDate = getDate(start);\n                        setTime(adjustedStartDate, startTime);\n                        tail = true;\n                    } else if (endTime < eventStartTime) {\n                        adjustedStartDate = getDate(start);\n                        adjustedStartDate = kendo.date.addDays(adjustedStartDate, 1);\n                        setTime(adjustedStartDate, startTime);\n                        tail = true;\n                    }\n                    if (endTime < eventEndTime) {\n                        adjustedEndDate = getDate(end);\n                        setTime(adjustedEndDate, endTime);\n                        head = true;\n                    } else if (startTime > eventEndTime) {\n                        adjustedEndDate = getDate(end);\n                        adjustedEndDate = kendo.date.addDays(adjustedEndDate, -1);\n                        setTime(adjustedEndDate, endTime);\n                        head = true;\n                    }\n                }\n                occurrence = event.clone({\n                    start: adjustedStartDate ? adjustedStartDate : start,\n                    end: adjustedEndDate ? adjustedEndDate : end,\n                    _startTime: adjustedStartDate ? kendo.date.toUtcTime(adjustedStartDate) : event._startTime,\n                    _endTime: adjustedEndDate ? kendo.date.toUtcTime(adjustedEndDate) : event._endTime,\n                    isAllDay: false\n                });\n                return {\n                    occurrence: occurrence,\n                    head: head,\n                    tail: tail\n                };\n            },\n            _renderEvents: function (events, groupIndex, eventGroup) {\n                var event;\n                var idx;\n                var length;\n                for (idx = 0, length = events.length; idx < length; idx++) {\n                    event = events[idx];\n                    if (this._isInDateSlot(event)) {\n                        var isMultiDayEvent = event.isAllDay || event.end.getTime() - event.start.getTime() >= MS_PER_DAY;\n                        var container = this.content;\n                        if (isMultiDayEvent || this._isInTimeSlot(event)) {\n                            var adjustedEvent = this._adjustEvent(event);\n                            var group = this.groups[groupIndex];\n                            if (!group._continuousEvents) {\n                                group._continuousEvents = [];\n                            }\n                            var ranges = group.slotRanges(adjustedEvent.occurrence, false);\n                            var range = ranges[0];\n                            var startIndex = range.start.index;\n                            var endIndex = range.end.index;\n                            if (this._isInTimeSlot(adjustedEvent.occurrence)) {\n                                this._groupedView._renderEvent(eventGroup, event, adjustedEvent, group, range, container, startIndex, endIndex);\n                            }\n                        }\n                    }\n                }\n            },\n            addContinuousEvent: function (group, range, element, isAllDay) {\n                var events = group._continuousEvents;\n                events.push({\n                    element: element,\n                    isAllDay: isAllDay,\n                    uid: element.attr(kendo.attr('uid')),\n                    start: range.start,\n                    end: range.end\n                });\n            },\n            _createEventElement: function (occurrence, event, head, tail) {\n                var template = this.eventTemplate;\n                var editable = this.options.editable;\n                var isMobile = this._isMobile();\n                var showDelete = editable && editable.destroy !== false && !isMobile;\n                var resizable = editable && editable.resize !== false;\n                var eventStartTime = event._time('start');\n                var eventEndTime = event._time('end');\n                var eventStartDate = event.start;\n                var eventEndDate = event.end;\n                var resources = this.eventResources(event);\n                if (event._startTime && eventStartTime !== kendo.date.getMilliseconds(event.start)) {\n                    eventStartDate = new Date(eventStartTime);\n                    eventStartDate = kendo.timezone.apply(eventStartDate, 'Etc/UTC');\n                }\n                if (event._endTime && eventEndTime !== kendo.date.getMilliseconds(event.end)) {\n                    eventEndDate = new Date(eventEndTime);\n                    eventEndDate = kendo.timezone.apply(eventEndDate, 'Etc/UTC');\n                }\n                var data = extend({}, {\n                    ns: kendo.ns,\n                    resizable: resizable,\n                    showDelete: showDelete,\n                    head: head,\n                    tail: tail,\n                    singleDay: this._dates.length == 1,\n                    resources: resources,\n                    inverseColor: resources && resources[0] ? this._shouldInverseResourceColor(resources[0]) : false,\n                    messages: this.options.messages\n                }, event, {\n                    start: eventStartDate,\n                    end: eventEndDate\n                });\n                var element = $(template(data));\n                this.angular('compile', function () {\n                    return {\n                        elements: element,\n                        data: [{ dataItem: data }]\n                    };\n                });\n                return element;\n            },\n            _arrangeRows: function (eventObject, slotRange, eventGroup) {\n                var startIndex = slotRange.start.index;\n                var endIndex = slotRange.end.index;\n                var rect = eventObject.slotRange.innerRect(eventObject.start, eventObject.end, false);\n                var rectRight = rect.right + this.options.eventMinWidth;\n                var events = collidingEvents(slotRange.events(), rect.left, rectRight);\n                slotRange.addEvent({\n                    slotIndex: startIndex,\n                    start: startIndex,\n                    end: endIndex,\n                    rectLeft: rect.left,\n                    rectRight: rectRight,\n                    element: eventObject.element,\n                    uid: eventObject.uid\n                });\n                events.push({\n                    start: startIndex,\n                    end: endIndex,\n                    uid: eventObject.uid\n                });\n                var rows = SchedulerView.createRows(events);\n                if (eventGroup.maxRowCount < rows.length) {\n                    eventGroup.maxRowCount = rows.length;\n                }\n                for (var idx = 0, length = rows.length; idx < length; idx++) {\n                    var rowEvents = rows[idx].events;\n                    for (var j = 0, eventLength = rowEvents.length; j < eventLength; j++) {\n                        eventGroup.events[rowEvents[j].uid].rowIndex = idx;\n                    }\n                }\n            },\n            _groupCount: function () {\n                var resources = this.groupedResources;\n                var groupedView = this._groupedView;\n                if (resources.length) {\n                    if (this._groupOrientation() === 'vertical') {\n                        return groupedView._verticalCountForLevel(resources.length - 1);\n                    } else {\n                        return groupedView._horizontalCountForLevel(resources.length - 1, this.columnLevels.length - 1);\n                    }\n                }\n                return 1;\n            },\n            _updateEventForSelection: function (event) {\n                var adjustedEvent = this._adjustEvent(event.clone());\n                return adjustedEvent.occurrence;\n            },\n            _eventOptionsForMove: function (event) {\n                if (event.isAllDay) {\n                    return { isAllDay: false };\n                }\n                return {};\n            },\n            _updateEventForResize: function (event) {\n                if (event.isAllDay) {\n                    event.set('isAllDay', false);\n                }\n            },\n            _updateMoveHint: function (event, groupIndex, distance) {\n                var group = this.groups[groupIndex];\n                var clonedEvent = event.clone({\n                    start: event.start,\n                    end: event.end\n                });\n                var eventDuraton = clonedEvent.duration();\n                clonedEvent.start = new Date(clonedEvent.start.getTime() + distance);\n                clonedEvent.end = new Date(+clonedEvent.start + eventDuraton);\n                var adjustedEvent = this._adjustEvent(clonedEvent);\n                var ranges = group.slotRanges(adjustedEvent.occurrence, false);\n                this._removeMoveHint();\n                for (var rangeIndex = 0; rangeIndex < ranges.length; rangeIndex++) {\n                    this._groupedView._createMoveHint(ranges[rangeIndex], adjustedEvent);\n                }\n                var content = this.content;\n                this._moveHint.appendTo(content);\n            },\n            _updateResizeHint: function (event, groupIndex, startTime, endTime) {\n                var group = this.groups[groupIndex];\n                var ranges = group.ranges(startTime, endTime, false, false);\n                this._removeResizeHint();\n                for (var rangeIndex = 0; rangeIndex < ranges.length; rangeIndex++) {\n                    var range = ranges[rangeIndex];\n                    var start = range.startSlot();\n                    var startRect = range.innerRect(startTime, endTime, false);\n                    startRect.top = start.offsetTop;\n                    var width = startRect.right - startRect.left;\n                    var height = range.endSlot().offsetTop + start.offsetHeight - startRect.top;\n                    var left = this._adjustLeftPosition(startRect.left);\n                    var hint = SchedulerView.fn._createResizeHint.call(this, left, startRect.top, width, height);\n                    this._resizeHint = this._resizeHint.add(hint);\n                }\n                var format = 't';\n                var container = this.content;\n                this._resizeHint.appendTo(container);\n                this._resizeHint.find('.k-label-top,.k-label-bottom').text('');\n                this._resizeHint.first().addClass('k-first').find('.k-label-top').text(kendo.toString(kendo.timezone.toLocalDate(startTime), format));\n                this._resizeHint.last().addClass('k-last').find('.k-label-bottom').text(kendo.toString(kendo.timezone.toLocalDate(endTime), format));\n            },\n            selectionByElement: function (cell) {\n                var offset = cell.offset();\n                return this._slotByPosition(offset.left, offset.top);\n            },\n            _updateDirection: function (selection, ranges, multiple, reverse, vertical) {\n                var startSlot = ranges[0].start;\n                var endSlot = ranges[ranges.length - 1].end;\n                if (multiple && !vertical) {\n                    if (startSlot.index === endSlot.index && startSlot.collectionIndex === endSlot.collectionIndex) {\n                        selection.backward = reverse;\n                    }\n                }\n            },\n            _changeGroup: function (selection, previous) {\n                var method = previous ? 'prevGroupSlot' : 'nextGroupSlot';\n                var slot = this[method](selection.start, selection.groupIndex, false);\n                if (slot) {\n                    selection.groupIndex += previous ? -1 : 1;\n                }\n                this._groupedView._changeGroup(selection, previous, slot);\n                return slot;\n            },\n            prevGroupSlot: function (date, groupIndex, isDay) {\n                var group = this.groups[groupIndex];\n                var slot = group.ranges(date, date, isDay, false)[0].start;\n                if (groupIndex <= 0) {\n                    return;\n                }\n                return this._groupedView._prevGroupSlot(slot, group, isDay);\n            },\n            nextGroupSlot: function (date, groupIndex, isDay) {\n                var group = this.groups[groupIndex];\n                var slot = group.ranges(date, date, isDay, false)[0].start;\n                if (groupIndex >= this.groups.length - 1) {\n                    return;\n                }\n                return this._groupedView._nextGroupSlot(slot, group, isDay);\n            },\n            _verticalSlots: function (selection, ranges, multiple, reverse) {\n                var groupedView = this._groupedView;\n                var method = groupedView._verticalMethod(reverse, multiple);\n                var startSlot = ranges[0].start;\n                var endSlot = ranges[ranges.length - 1].end;\n                var group = this.groups[selection.groupIndex];\n                var slot = groupedView._normalizeVerticalSelection(selection, ranges, reverse, multiple);\n                if (slot) {\n                    startSlot = endSlot = slot;\n                }\n                startSlot = group[method](startSlot);\n                endSlot = group[method](endSlot);\n                if (!multiple && this._isVerticallyGrouped() && (!startSlot || !endSlot)) {\n                    startSlot = endSlot = groupedView._verticalSlots(selection, reverse, slot);\n                }\n                return {\n                    startSlot: startSlot,\n                    endSlot: endSlot\n                };\n            },\n            _horizontalSlots: function (selection, ranges, multiple, reverse) {\n                var method = reverse ? 'upSlot' : 'downSlot';\n                var startSlot = ranges[0].start;\n                var endSlot = ranges[ranges.length - 1].end;\n                var group = this.groups[selection.groupIndex];\n                var result = {};\n                if (!multiple) {\n                    result = this._groupedView._horizontalSlots(selection, group, method, startSlot, endSlot, multiple, reverse);\n                } else {\n                    result.startSlot = group[method](startSlot);\n                    result.endSlot = group[method](endSlot);\n                    if (!multiple && this._isHorizontallyGrouped() && (!startSlot || !endSlot)) {\n                        result.startSlot = result.endSlot = this._changeGroup(selection, reverse);\n                    }\n                }\n                return result;\n            },\n            _changeViewPeriod: function (selection, reverse) {\n                var date = reverse ? this.previousDate() : this.nextDate();\n                var start = selection.start;\n                var end = selection.end;\n                selection.start = new Date(date);\n                selection.end = new Date(date);\n                if (this._isHorizontallyGrouped()) {\n                    selection.groupIndex = reverse ? this.groups.length - 1 : 0;\n                }\n                var duration = end - start;\n                if (reverse) {\n                    end = getMilliseconds(this.endTime());\n                    end = end === 0 ? MS_PER_DAY : end;\n                    setTime(selection.start, end - duration);\n                    setTime(selection.end, end);\n                } else {\n                    start = getMilliseconds(this.startTime());\n                    setTime(selection.start, start);\n                    setTime(selection.end, start + duration);\n                }\n                selection.events = [];\n                return true;\n            },\n            move: function (selection, key, shift) {\n                var handled = false;\n                var group = this.groups[selection.groupIndex];\n                var keys = kendo.keys;\n                var groupedView = this._groupedView;\n                var ranges = group.ranges(selection.start, selection.end, false, false);\n                var startSlot, endSlot, reverse, slots;\n                if (key === keys.DOWN || key === keys.UP) {\n                    handled = true;\n                    reverse = key === keys.UP;\n                    groupedView._updateDirection(selection, ranges, shift, reverse);\n                    slots = this._verticalSlots(selection, ranges, shift, reverse);\n                    if (groupedView._changeVerticalViewPeriod(slots, shift, selection, reverse)) {\n                        return handled;\n                    }\n                } else if (key === keys.LEFT || key === keys.RIGHT) {\n                    handled = true;\n                    reverse = key === keys.LEFT;\n                    this._updateDirection(selection, ranges, shift, reverse, false);\n                    slots = this._horizontalSlots(selection, ranges, shift, reverse);\n                    if (groupedView._changeHorizontalViewPeriod(slots, shift, selection, reverse)) {\n                        return handled;\n                    }\n                }\n                if (handled) {\n                    startSlot = slots.startSlot;\n                    endSlot = slots.endSlot;\n                    if (shift) {\n                        var backward = selection.backward;\n                        if (backward && startSlot) {\n                            selection.start = startSlot.startDate();\n                        } else if (!backward && endSlot) {\n                            selection.end = endSlot.endDate();\n                        }\n                    } else if (startSlot && endSlot) {\n                        selection.start = startSlot.startDate();\n                        selection.end = endSlot.endDate();\n                    }\n                    selection.events = [];\n                }\n                return handled;\n            },\n            destroy: function () {\n                var that = this;\n                if (that.element) {\n                    that.element.off(NS);\n                }\n                if (that.footer) {\n                    that.footer.remove();\n                }\n                if (that._currentTimeUpdateTimer) {\n                    clearInterval(that._currentTimeUpdateTimer);\n                }\n                SchedulerView.fn.destroy.call(this);\n                if (this._isMobile() && that.options.editable) {\n                    if (that.options.editable.create !== false) {\n                        that._addUserEvents.destroy();\n                    }\n                    if (that.options.editable.update !== false) {\n                        that._editUserEvents.destroy();\n                    }\n                }\n            }\n        });\n        extend(true, ui, {\n            TimelineView: TimelineView,\n            TimelineWeekView: TimelineView.extend({\n                options: {\n                    name: 'TimelineWeekView',\n                    title: 'Timeline Week',\n                    selectedDateFormat: '{0:D} - {1:D}',\n                    selectedShortDateFormat: '{0:d} - {1:d}',\n                    majorTick: 120\n                },\n                name: 'timelineWeek',\n                calculateDateRange: function () {\n                    var selectedDate = this.options.date, start = kendo.date.dayOfWeek(selectedDate, this.calendarInfo().firstDay, -1), idx, length, dates = [];\n                    for (idx = 0, length = 7; idx < length; idx++) {\n                        dates.push(start);\n                        start = kendo.date.nextDay(start);\n                    }\n                    this._render(dates);\n                }\n            }),\n            TimelineWorkWeekView: TimelineView.extend({\n                options: {\n                    name: 'TimelineWorkWeekView',\n                    title: 'Timeline Work Week',\n                    selectedDateFormat: '{0:D} - {1:D}',\n                    selectedShortDateFormat: '{0:d} - {1:d}',\n                    majorTick: 120\n                },\n                name: 'timelineWorkWeek',\n                nextDate: function () {\n                    var weekStart = kendo.date.dayOfWeek(kendo.date.nextDay(this.endDate()), this.calendarInfo().firstDay, 1);\n                    return kendo.date.addDays(weekStart, this._workDays[0]);\n                },\n                previousDate: function () {\n                    var weekStart = kendo.date.dayOfWeek(this.startDate(), this.calendarInfo().firstDay, -1);\n                    var workDays = this._workDays;\n                    return kendo.date.addDays(weekStart, workDays[workDays.length - 1] - 7);\n                },\n                calculateDateRange: function () {\n                    var selectedDate = this.options.date, start = kendo.date.dayOfWeek(selectedDate, this.options.workWeekStart, -1), end = kendo.date.dayOfWeek(start, this.options.workWeekEnd, 1), dates = [];\n                    while (start <= end) {\n                        dates.push(start);\n                        start = kendo.date.nextDay(start);\n                    }\n                    this._render(dates);\n                }\n            }),\n            TimelineMonthView: TimelineView.extend({\n                options: {\n                    name: 'TimelineMonthView',\n                    title: 'Timeline Month',\n                    selectedDateFormat: '{0:D} - {1:D}',\n                    selectedShortDateFormat: '{0:d} - {1:d}',\n                    workDayStart: new Date(1980, 1, 1, 0, 0, 0),\n                    workDayEnd: new Date(1980, 1, 1, 23, 59, 59),\n                    footer: false,\n                    majorTick: 1440,\n                    minorTickCount: 1\n                },\n                name: 'timelineMonth',\n                calculateDateRange: function () {\n                    var selectedDate = this.options.date, start = kendo.date.firstDayOfMonth(selectedDate), end = kendo.date.lastDayOfMonth(selectedDate), idx, length, dates = [];\n                    for (idx = 0, length = end.getDate(); idx < length; idx++) {\n                        dates.push(start);\n                        start = kendo.date.nextDay(start);\n                    }\n                    this._render(dates);\n                }\n            })\n        });\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.scheduler', [\n        'kendo.dropdownlist',\n        'kendo.editable',\n        'kendo.multiselect',\n        'kendo.window',\n        'kendo.datetimepicker',\n        'kendo.scheduler.recurrence',\n        'kendo.scheduler.view',\n        'kendo.scheduler.dayview',\n        'kendo.scheduler.agendaview',\n        'kendo.scheduler.monthview',\n        'kendo.scheduler.timelineview',\n        'kendo.mobile.actionsheet',\n        'kendo.mobile.pane',\n        'kendo.pdf'\n    ], f);\n}(function () {\n    var __meta__ = {\n        id: 'scheduler',\n        name: 'Scheduler',\n        category: 'web',\n        description: 'The Scheduler is an event calendar.',\n        depends: [\n            'dropdownlist',\n            'editable',\n            'multiselect',\n            'window',\n            'datepicker',\n            'datetimepicker',\n            'scheduler.recurrence',\n            'scheduler.view'\n        ],\n        features: [\n            {\n                id: 'scheduler-dayview',\n                name: 'Scheduler Day View',\n                description: 'Scheduler Day View',\n                depends: ['scheduler.dayview']\n            },\n            {\n                id: 'scheduler-agendaview',\n                name: 'Scheduler Agenda View',\n                description: 'Scheduler Agenda View',\n                depends: ['scheduler.agendaview']\n            },\n            {\n                id: 'scheduler-monthview',\n                name: 'Scheduler Month View',\n                description: 'Scheduler Month View',\n                depends: ['scheduler.monthview']\n            },\n            {\n                id: 'scheduler-timelineview',\n                name: 'Scheduler Timeline View',\n                description: 'Scheduler Timeline View',\n                depends: ['scheduler.timelineview']\n            },\n            {\n                id: 'scheduler-mobile',\n                name: 'Scheduler adaptive rendering',\n                description: 'Support for adaptive rendering',\n                depends: [\n                    'mobile.actionsheet',\n                    'mobile.pane'\n                ]\n            },\n            {\n                id: 'scheduler-pdf-export',\n                name: 'PDF export',\n                description: 'Export the scheduler events as PDF',\n                depends: [\n                    'pdf',\n                    'drawing'\n                ]\n            },\n            {\n                id: 'scheduler-timezones',\n                name: 'Timezones',\n                description: 'Allow selecting timezones different than Etc/UTC',\n                depends: ['timezones']\n            }\n        ]\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, date = kendo.date, input_support = kendo.support.input, MS_PER_DAY = date.MS_PER_DAY, getDate = date.getDate, getMilliseconds = kendo.date.getMilliseconds, recurrence = kendo.recurrence, keys = kendo.keys, ui = kendo.ui, Widget = ui.Widget, DataBoundWidget = ui.DataBoundWidget, STRING = 'string', Popup = ui.Popup, Calendar = ui.Calendar, DataSource = kendo.data.DataSource, isPlainObject = $.isPlainObject, extend = $.extend, proxy = $.proxy, toString = Object.prototype.toString, isArray = $.isArray, NS = '.kendoScheduler', CLICK = 'click', MOUSEDOWN = 'mousedown', CHANGE = 'change', CANCEL = 'cancel', REMOVE = 'remove', SAVE = 'save', ADD = 'add', EDIT = 'edit', valueStartEndBoundRegex = /(?:value:start|value:end)(?:,|$)/, TODAY = getDate(new Date()), EXCEPTION_SEPARATOR = ',', OLD_EXCEPTION_SEPARATOR_REGEXP = /\\;/g, RECURRENCE_EXCEPTION = 'recurrenceException', DELETECONFIRM = 'Are you sure you want to delete this event?', DELETERECURRING = 'Do you want to delete only this event occurrence or the whole series?', EDITRECURRING = 'Do you want to edit only this event occurrence or the whole series?', DELETERECURRINGCONFIRM = 'Are you sure you want to delete this event occurrence?', DELETESERIESCONFIRM = 'Are you sure you want to delete the whole series?', COMMANDBUTTONTMPL = '<a class=\"k-button #=className#\" #=attr# href=\"\\\\#\">#=text#</a>', VIEWBUTTONTEMPLATE = kendo.template('<li class=\"k-current-view\" data-#=ns#name=\"#=view#\"><a role=\"button\" href=\"\\\\#\" class=\"k-link\">${views[view].title}</a></li>'), TOOLBARTEMPLATE = kendo.template('<div class=\"k-floatwrap k-header k-scheduler-toolbar\">' + '# if (pdf) { #' + '<ul class=\"k-reset k-scheduler-tools\">' + '<li><a role=\"button\" href=\"\\\\#\" class=\"k-button k-pdf\"><span class=\"k-icon k-i-file-pdf\"></span>${messages.pdf}</a></li>' + '</ul>' + '# } #' + '<ul class=\"k-reset k-scheduler-navigation\">' + '<li class=\"k-state-default k-header k-nav-today\"><a role=\"button\" href=\"\\\\#\" class=\"k-link\" title=\"${messages.today}\">${messages.today}</a></li>' + '<li class=\"k-state-default k-header k-nav-prev\"><a role=\"button\" href=\"\\\\#\" class=\"k-link\" title=\"${messages.previous}\" aria-label=\"${messages.previous}\"><span class=\"k-icon k-i-arrow-60-left\"></span></a></li>' + '<li class=\"k-state-default k-header k-nav-next\"><a role=\"button\" href=\"\\\\#\" class=\"k-link\" title=\"${messages.next}\" aria-label=\"${messages.next}\"><span class=\"k-icon k-i-arrow-60-right\"></span></a></li>' + '<li class=\"k-state-default k-nav-current\">' + '<a role=\"button\" href=\"\\\\#\" class=\"k-link\">' + '<span class=\"k-icon k-i-calendar\"></span>' + '<span class=\"k-sm-date-format\" data-#=ns#bind=\"text: formattedShortDate\"></span>' + '<span class=\"k-lg-date-format\" data-#=ns#bind=\"text: formattedDate\"></span>' + '</a>' + '</li>' + '</ul>' + '#if(viewsCount === 1){#' + '<a role=\"button\" data-#=ns#name=\"#=view#\" href=\"\\\\#\" class=\"k-link k-scheduler-refresh\">' + '<span class=\"k-icon k-i-reload\"></span>' + '</a>' + '#}else{#' + '<ul class=\"k-reset k-header k-scheduler-views\">' + '#for(var view in views){#' + '<li class=\"k-state-default k-view-#= view.toLowerCase() #\" data-#=ns#name=\"#=view#\"><a role=\"button\" href=\"\\\\#\" class=\"k-link\">${views[view].title}</a></li>' + '#}#' + '</ul>' + '#}#' + '</div>'), MOBILETOOLBARTEMPLATE = kendo.template('<div class=\"k-floatwrap k-header k-scheduler-toolbar\">' + '<ul class=\"k-reset k-header k-scheduler-navigation\">' + '<li class=\"k-state-default k-nav-today\"><a role=\"button\" href=\"\\\\#\" class=\"k-link\">${messages.today}</a></li>' + '</ul>' + '#if(viewsCount === 1){#' + '<a role=\"button\" data-#=ns#name=\"#=view#\" href=\"\\\\#\" class=\"k-link k-scheduler-refresh\">' + '<span class=\"k-icon k-i-reload\"></span>' + '</a>' + '#}else{#' + '<ul class=\"k-reset k-header k-scheduler-views\">' + '#for(var view in views){#' + '<li class=\"k-state-default k-view-#= view.toLowerCase() #\" data-#=ns#name=\"#=view#\"><a role=\"button\" href=\"\\\\#\" class=\"k-link\">${views[view].title}</a></li>' + '#}#' + '</ul>' + '#}#' + '</div>' + '<div class=\"k-floatwrap k-header k-scheduler-toolbar\">' + '<ul class=\"k-reset k-header k-scheduler-navigation\">' + '<li class=\"k-state-default k-nav-prev\"><a role=\"button\" href=\"\\\\#\" class=\"k-link\"><span class=\"k-icon k-i-arrow-60-left\"></span></a></li>' + '<li class=\"k-state-default k-nav-current\">' + '<span class=\"k-sm-date-format\" data-#=ns#bind=\"text: formattedShortDate\"></span>' + '<span class=\"k-lg-date-format\" data-#=ns#bind=\"text: formattedDate\"></span>' + '</li>' + '<li class=\"k-state-default k-nav-next\"><a role=\"button\" href=\"\\\\#\" class=\"k-link\"><span class=\"k-icon k-i-arrow-60-right\"></span></a></li>' + '</ul>' + '</div>'), MOBILEDATERANGEEDITOR = function (container, options) {\n                var attr = {\n                    name: options.field,\n                    title: options.title\n                };\n                var datepicker_role = !input_support.date ? kendo.attr('role') + '=\"datepicker\" ' : '';\n                var datetimepicker_role = kendo.attr('role') + '=\"datetimepicker\" ';\n                var isAllDay = options.model.isAllDay;\n                var dateTimeValidate = kendo.attr('validate') + '=\\'' + !isAllDay + '\\'';\n                var dateValidate = kendo.attr('validate') + '=\\'' + isAllDay + '\\'';\n                appendTimezoneAttr(attr, options);\n                appendDateCompareValidator(attr, options);\n                $('<input type=\"datetime-local\" required ' + kendo.attr('type') + '=\"date\" ' + datetimepicker_role + kendo.attr('bind') + '=\"value:' + options.field + ',invisible:isAllDay\" ' + dateTimeValidate + '/>').attr(attr).appendTo(container);\n                $('<input type=\"date\" required ' + kendo.attr('type') + '=\"date\" ' + datepicker_role + kendo.attr('bind') + '=\"value:' + options.field + ',visible:isAllDay\" ' + dateValidate + '/>').attr(attr).appendTo(container);\n                $('<span ' + kendo.attr('for') + '=\"' + options.field + '\" class=\"k-invalid-msg\"/>').hide().appendTo(container);\n            }, DATERANGEEDITOR = function (container, options) {\n                var attr = {\n                        name: options.field,\n                        title: options.title\n                    }, isAllDay = options.model.isAllDay, dateTimeValidate = kendo.attr('validate') + '=\\'' + !isAllDay + '\\' ', dateValidate = kendo.attr('validate') + '=\\'' + isAllDay + '\\' ';\n                appendTimezoneAttr(attr, options);\n                appendDateCompareValidator(attr, options);\n                $('<input type=\"text\" required ' + kendo.attr('type') + '=\"date\"' + ' ' + kendo.attr('role') + '=\"datetimepicker\" ' + kendo.attr('bind') + '=\"value:' + options.field + ',invisible:isAllDay\" ' + dateTimeValidate + '/>').attr(attr).appendTo(container);\n                $('<input type=\"text\" required ' + kendo.attr('type') + '=\"date\"' + ' ' + kendo.attr('role') + '=\"datepicker\" ' + kendo.attr('bind') + '=\"value:' + options.field + ',visible:isAllDay\" ' + dateValidate + '/>').attr(attr).appendTo(container);\n                $('<span ' + kendo.attr('bind') + '=\"text: ' + options.field + 'Timezone\"></span>').appendTo(container);\n                if (options.field === 'end') {\n                    $('<span ' + kendo.attr('bind') + '=\"text: startTimezone, invisible: endTimezone\"></span>').appendTo(container);\n                }\n                $('<span ' + kendo.attr('for') + '=\"' + options.field + '\" class=\"k-invalid-msg\"/>').hide().appendTo(container);\n            }, RECURRENCEEDITOR = function (container, options) {\n                $('<div ' + kendo.attr('bind') + '=\"value:' + options.field + '\" />').attr({ name: options.field }).appendTo(container).kendoRecurrenceEditor({\n                    start: options.model.start,\n                    timezone: options.timezone,\n                    messages: options.messages\n                });\n            }, MOBILERECURRENCEEDITOR = function (container, options) {\n                $('<div ' + kendo.attr('bind') + '=\"value:' + options.field + '\" />').attr({ name: options.field }).appendTo(container).kendoMobileRecurrenceEditor({\n                    start: options.model.start,\n                    timezone: options.timezone,\n                    messages: options.messages,\n                    pane: options.pane,\n                    value: options.model[options.field]\n                });\n            }, MOBILETIMEZONEPOPUP = function (container, options) {\n                var text = timezoneButtonText(options.model, options.messages.noTimezone);\n                $('<a href=\"#\" class=\"k-button k-timezone-button\" data-bind=\"invisible:isAllDay\">' + text + '</a>').click(options.click).appendTo(container);\n            }, TIMEZONEPOPUP = function (container, options) {\n                $('<a href=\"#\" class=\"k-button\" data-bind=\"invisible:isAllDay\">' + options.messages.timezoneEditorButton + '</a>').click(options.click).appendTo(container);\n            }, MOBILETIMEZONEEDITOR = function (container, options) {\n                $('<div ' + kendo.attr('bind') + '=\"value:' + options.field + '\" />').attr({ name: options.field }).toggle(options.visible).appendTo(container).kendoMobileTimezoneEditor({ optionLabel: options.noTimezone });\n            }, TIMEZONEEDITOR = function (container, options) {\n                var visible = options.visible || options.visible === undefined;\n                $('<div ' + kendo.attr('bind') + '=\"value:' + options.field + '\" />').attr({ name: options.field }).toggle(visible).appendTo(container).kendoTimezoneEditor({\n                    optionLabel: options.noTimezone,\n                    title: options.title\n                });\n            };\n        function timezoneButtonText(model, message) {\n            message = message || '';\n            if (model.startTimezone) {\n                message = model.startTimezone;\n                if (model.endTimezone) {\n                    message += ' | ' + model.endTimezone;\n                }\n            }\n            return message;\n        }\n        function appendTimezoneAttr(attrs, options) {\n            var timezone = options.timezone;\n            if (timezone) {\n                attrs[kendo.attr('timezone')] = timezone;\n            }\n        }\n        function appendDateCompareValidator(attrs, options) {\n            var validationRules = options.model.fields[options.field].validation;\n            if (validationRules) {\n                var dateCompareRule = validationRules.dateCompare;\n                if (dateCompareRule && isPlainObject(dateCompareRule) && dateCompareRule.message) {\n                    attrs[kendo.attr('dateCompare-msg')] = dateCompareRule.message;\n                }\n            }\n        }\n        function wrapDataAccess(originalFunction, timezone) {\n            return function (data) {\n                data = originalFunction(data);\n                convertData(data, 'apply', timezone);\n                return data || [];\n            };\n        }\n        function wrapDataSerialization(originalFunction, timezone) {\n            return function (data) {\n                if (data) {\n                    if (toString.call(data) !== '[object Array]' && !(data instanceof kendo.data.ObservableArray)) {\n                        data = [data];\n                    }\n                }\n                convertData(data, 'remove', timezone, true);\n                data = originalFunction(data);\n                return data || [];\n            };\n        }\n        function convertData(data, method, timezone, removeUid) {\n            var event, idx, length;\n            data = data || [];\n            for (idx = 0, length = data.length; idx < length; idx++) {\n                event = data[idx];\n                if (removeUid) {\n                    if (event.startTimezone || event.endTimezone) {\n                        if (timezone) {\n                            event.start = kendo.timezone.convert(event.start, event.startTimezone || event.endTimezone, timezone);\n                            event.end = kendo.timezone.convert(event.end, event.endTimezone || event.startTimezone, timezone);\n                            event.start = kendo.timezone[method](event.start, timezone);\n                            event.end = kendo.timezone[method](event.end, timezone);\n                        } else {\n                            event.start = kendo.timezone[method](event.start, event.startTimezone || event.endTimezone);\n                            event.end = kendo.timezone[method](event.end, event.endTimezone || event.startTimezone);\n                        }\n                    } else if (timezone) {\n                        event.start = kendo.timezone[method](event.start, timezone);\n                        event.end = kendo.timezone[method](event.end, timezone);\n                    }\n                } else {\n                    if (event.startTimezone || event.endTimezone) {\n                        event.start = kendo.timezone[method](event.start, event.startTimezone || event.endTimezone);\n                        event.end = kendo.timezone[method](event.end, event.endTimezone || event.startTimezone);\n                        if (timezone) {\n                            event.start = kendo.timezone.convert(event.start, event.startTimezone || event.endTimezone, timezone);\n                            event.end = kendo.timezone.convert(event.end, event.endTimezone || event.startTimezone, timezone);\n                        }\n                    } else if (timezone) {\n                        event.start = kendo.timezone[method](event.start, timezone);\n                        event.end = kendo.timezone[method](event.end, timezone);\n                    }\n                }\n                if (removeUid) {\n                    delete event.uid;\n                }\n            }\n            return data;\n        }\n        function getOccurrenceByUid(data, uid) {\n            var length = data.length, idx = 0, event;\n            for (; idx < length; idx++) {\n                event = data[idx];\n                if (event.uid === uid) {\n                    return event;\n                }\n            }\n        }\n        var SchedulerDataReader = kendo.Class.extend({\n            init: function (schema, reader) {\n                var timezone = schema.timezone;\n                this.reader = reader;\n                if (reader.model) {\n                    this.model = reader.model;\n                }\n                this.timezone = timezone;\n                this.data = wrapDataAccess($.proxy(this.data, this), timezone);\n                this.serialize = wrapDataSerialization($.proxy(this.serialize, this), timezone);\n            },\n            errors: function (data) {\n                return this.reader.errors(data);\n            },\n            parse: function (data) {\n                return this.reader.parse(data);\n            },\n            data: function (data) {\n                return this.reader.data(data);\n            },\n            total: function (data) {\n                return this.reader.total(data);\n            },\n            groups: function (data) {\n                return this.reader.groups(data);\n            },\n            aggregates: function (data) {\n                return this.reader.aggregates(data);\n            },\n            serialize: function (data) {\n                return this.reader.serialize(data);\n            }\n        });\n        function applyZone(date, fromZone, toZone) {\n            if (toZone) {\n                date = kendo.timezone.convert(date, fromZone, toZone);\n            } else {\n                date = kendo.timezone.remove(date, fromZone);\n            }\n            return date;\n        }\n        function dateCompareValidator(input) {\n            if (input.filter('[name=end]').length) {\n                var container = input.closest('.k-scheduler-edit-form');\n                var startInput = container.find('[name=start]:visible');\n                var endInput = container.find('[name=end]:visible');\n                if (endInput[0] && startInput[0]) {\n                    var start, end;\n                    var startPicker = kendo.widgetInstance(startInput, kendo.ui);\n                    var endPicker = kendo.widgetInstance(endInput, kendo.ui);\n                    var editable = container.data('kendoEditable');\n                    var model = editable ? editable.options.model : null;\n                    if (startPicker && endPicker) {\n                        start = startPicker.value();\n                        end = endPicker.value();\n                    } else {\n                        start = kendo.parseDate(startInput.val());\n                        end = kendo.parseDate(endInput.val());\n                    }\n                    if (start && end) {\n                        if (model) {\n                            var timezone = startInput.attr(kendo.attr('timezone'));\n                            var startTimezone = model.startTimezone;\n                            var endTimezone = model.endTimezone;\n                            startTimezone = startTimezone || endTimezone;\n                            endTimezone = endTimezone || startTimezone;\n                            if (startTimezone) {\n                                start = applyZone(start, startTimezone, timezone);\n                                end = applyZone(end, endTimezone, timezone);\n                            }\n                        }\n                        return start <= end;\n                    }\n                }\n            }\n            return true;\n        }\n        var SchedulerEvent = kendo.data.Model.define({\n            init: function (value) {\n                var that = this;\n                kendo.data.Model.fn.init.call(that, value);\n                that._defaultId = that.defaults[that.idField];\n            },\n            _time: function (field) {\n                var date = this[field];\n                var fieldTime = '_' + field + 'Time';\n                if (this[fieldTime]) {\n                    return this[fieldTime] - kendo.date.toUtcTime(kendo.date.getDate(date));\n                }\n                return getMilliseconds(date);\n            },\n            _date: function (field) {\n                var fieldTime = '_' + field + 'Time';\n                if (this[fieldTime]) {\n                    return this[fieldTime] - this._time(field);\n                }\n                return kendo.date.getDate(this[field]);\n            },\n            clone: function (options, updateUid) {\n                var uid = this.uid, event = new this.constructor($.extend({}, this.toJSON(), options));\n                if (!updateUid) {\n                    event.uid = uid;\n                }\n                return event;\n            },\n            duration: function () {\n                var end = this.end;\n                var start = this.start;\n                var offset = (end.getTimezoneOffset() - start.getTimezoneOffset()) * kendo.date.MS_PER_MINUTE;\n                return end - start - offset;\n            },\n            expand: function (start, end, zone) {\n                return recurrence ? recurrence.expand(this, start, end, zone) : [this];\n            },\n            update: function (eventInfo) {\n                for (var field in eventInfo) {\n                    this.set(field, eventInfo[field]);\n                }\n                if (this._startTime) {\n                    this.set('_startTime', kendo.date.toUtcTime(this.start));\n                }\n                if (this._endTime) {\n                    this.set('_endTime', kendo.date.toUtcTime(this.end));\n                }\n            },\n            isMultiDay: function () {\n                return this.isAllDay || this.duration() >= kendo.date.MS_PER_DAY;\n            },\n            isException: function () {\n                return !this.isNew() && this.recurrenceId;\n            },\n            isOccurrence: function () {\n                return this.isNew() && this.recurrenceId;\n            },\n            isRecurring: function () {\n                return !!(this.recurrenceRule || this.recurrenceId);\n            },\n            isRecurrenceHead: function () {\n                return !!(this.id && this.recurrenceRule);\n            },\n            toOccurrence: function (options) {\n                options = $.extend(options, {\n                    recurrenceException: null,\n                    recurrenceRule: null,\n                    recurrenceId: this.id || this.recurrenceId\n                });\n                options[this.idField] = this.defaults[this.idField];\n                return this.clone(options, true);\n            },\n            toJSON: function () {\n                var obj = kendo.data.Model.fn.toJSON.call(this);\n                obj.uid = this.uid;\n                delete obj._startTime;\n                delete obj._endTime;\n                return obj;\n            },\n            shouldSerialize: function (field) {\n                return kendo.data.Model.fn.shouldSerialize.call(this, field) && field !== '_defaultId';\n            },\n            set: function (key, value) {\n                var isAllDay = this.isAllDay || false;\n                kendo.data.Model.fn.set.call(this, key, value);\n                if (key == 'isAllDay' && value != isAllDay) {\n                    var start = kendo.date.getDate(this.start);\n                    var end = new Date(this.end);\n                    var milliseconds = kendo.date.getMilliseconds(end);\n                    if (milliseconds === 0 && value) {\n                        milliseconds = MS_PER_DAY;\n                    }\n                    this.set('start', start);\n                    if (value === true) {\n                        kendo.date.setTime(end, -milliseconds);\n                        if (end < start) {\n                            end = start;\n                        }\n                    } else {\n                        kendo.date.setTime(end, MS_PER_DAY - milliseconds);\n                    }\n                    this.set('end', end);\n                }\n            },\n            id: 'id',\n            fields: {\n                id: { type: 'number' },\n                title: {\n                    defaultValue: '',\n                    type: 'string'\n                },\n                start: {\n                    type: 'date',\n                    validation: { required: true }\n                },\n                startTimezone: { type: 'string' },\n                end: {\n                    type: 'date',\n                    validation: {\n                        required: true,\n                        dateCompare: { value: dateCompareValidator }\n                    }\n                },\n                endTimezone: { type: 'string' },\n                recurrenceRule: {\n                    defaultValue: '',\n                    type: 'string'\n                },\n                recurrenceException: {\n                    defaultValue: '',\n                    type: 'string'\n                },\n                isAllDay: {\n                    type: 'boolean',\n                    defaultValue: false\n                },\n                description: { type: 'string' }\n            }\n        });\n        var SchedulerDataSource = DataSource.extend({\n            init: function (options) {\n                DataSource.fn.init.call(this, extend(true, {}, {\n                    schema: {\n                        modelBase: SchedulerEvent,\n                        model: SchedulerEvent\n                    }\n                }, options));\n                this.reader = new SchedulerDataReader(this.options.schema, this.reader);\n            },\n            expand: function (start, end) {\n                var data = this.view(), filter = {};\n                if (start && end) {\n                    end = new Date(end.getTime() + MS_PER_DAY - 1);\n                    filter = {\n                        logic: 'or',\n                        filters: [\n                            {\n                                logic: 'and',\n                                filters: [\n                                    {\n                                        field: 'start',\n                                        operator: 'gte',\n                                        value: start\n                                    },\n                                    {\n                                        field: 'end',\n                                        operator: 'gte',\n                                        value: start\n                                    },\n                                    {\n                                        field: 'start',\n                                        operator: 'lte',\n                                        value: end\n                                    }\n                                ]\n                            },\n                            {\n                                logic: 'and',\n                                filters: [\n                                    {\n                                        field: 'start',\n                                        operator: 'lte',\n                                        value: new Date(start.getTime() + MS_PER_DAY - 1)\n                                    },\n                                    {\n                                        field: 'end',\n                                        operator: 'gte',\n                                        value: start\n                                    }\n                                ]\n                            }\n                        ]\n                    };\n                    data = new kendo.data.Query(expandAll(data, start, end, this.reader.timezone)).filter(filter).toArray();\n                }\n                return data;\n            },\n            cancelChanges: function (model) {\n                if (model && model.isOccurrence()) {\n                    this._removeExceptionDate(model);\n                }\n                DataSource.fn.cancelChanges.call(this, model);\n            },\n            insert: function (index, model) {\n                if (!model) {\n                    return;\n                }\n                if (!(model instanceof SchedulerEvent)) {\n                    var eventInfo = model;\n                    model = this._createNewModel();\n                    model.accept(eventInfo);\n                }\n                if (!this._pushCreated && model.isRecurrenceHead() || model.recurrenceId) {\n                    model = model.recurrenceId ? model : model.toOccurrence();\n                    this._addExceptionDate(model);\n                }\n                return DataSource.fn.insert.call(this, index, model);\n            },\n            pushCreate: function (items) {\n                this._pushCreated = true;\n                DataSource.fn.pushCreate.call(this, items);\n                this._pushCreated = false;\n            },\n            remove: function (model) {\n                if (model.isRecurrenceHead()) {\n                    this._removeExceptions(model);\n                } else if (model.isRecurring()) {\n                    this._addExceptionDate(model);\n                }\n                return DataSource.fn.remove.call(this, model);\n            },\n            _removeExceptions: function (model) {\n                var data = this.data().slice(0), item = data.shift(), id = model.id;\n                while (item) {\n                    if (item.recurrenceId === id) {\n                        DataSource.fn.remove.call(this, item);\n                    }\n                    item = data.shift();\n                }\n                model.set(RECURRENCE_EXCEPTION, '');\n            },\n            _removeExceptionDate: function (model) {\n                if (model.recurrenceId) {\n                    var head = this.get(model.recurrenceId);\n                    if (head) {\n                        var start = model.start;\n                        var replaceRegExp = new RegExp('(\\\\' + EXCEPTION_SEPARATOR + '?)' + recurrence.toExceptionString(start, this.reader.timezone));\n                        var recurrenceException = (head.recurrenceException || '').replace(OLD_EXCEPTION_SEPARATOR_REGEXP, EXCEPTION_SEPARATOR).replace(/\\,$/, '');\n                        head.set(RECURRENCE_EXCEPTION, recurrenceException.replace(replaceRegExp, ''));\n                    }\n                }\n            },\n            _addExceptionDate: function (model) {\n                var start = model.start;\n                var zone = this.reader.timezone;\n                var head = this.get(model.recurrenceId);\n                var recurrenceException = (head.recurrenceException || '').replace(OLD_EXCEPTION_SEPARATOR_REGEXP, EXCEPTION_SEPARATOR).replace(/\\,$/, '');\n                if (!recurrence.isException(recurrenceException, start, zone)) {\n                    var newException = recurrence.toExceptionString(start, zone);\n                    head.set(RECURRENCE_EXCEPTION, recurrenceException + (recurrenceException && newException ? EXCEPTION_SEPARATOR : '') + newException);\n                }\n            }\n        });\n        function expandAll(events, start, end, zone) {\n            var length = events.length, data = [], idx = 0;\n            for (; idx < length; idx++) {\n                data = data.concat(events[idx].expand(start, end, zone));\n            }\n            return data;\n        }\n        SchedulerDataSource.create = function (options) {\n            if (isArray(options) || options instanceof kendo.data.ObservableArray) {\n                options = { data: options };\n            }\n            var dataSource = options || {}, data = dataSource.data;\n            dataSource.data = data;\n            if (!(dataSource instanceof SchedulerDataSource) && dataSource instanceof kendo.data.DataSource) {\n                throw new Error('Incorrect DataSource type. Only SchedulerDataSource instances are supported');\n            }\n            return dataSource instanceof SchedulerDataSource ? dataSource : new SchedulerDataSource(dataSource);\n        };\n        extend(true, kendo.data, {\n            SchedulerDataSource: SchedulerDataSource,\n            SchedulerDataReader: SchedulerDataReader,\n            SchedulerEvent: SchedulerEvent\n        });\n        var defaultCommands = {\n            update: {\n                text: 'Save',\n                className: 'k-primary k-scheduler-update'\n            },\n            canceledit: {\n                text: 'Cancel',\n                className: 'k-scheduler-cancel'\n            },\n            destroy: {\n                text: 'Delete',\n                imageClass: 'k-i-close',\n                className: 'k-primary k-scheduler-delete',\n                iconClass: 'k-icon'\n            }\n        };\n        function trimOptions(options) {\n            delete options.name;\n            delete options.prefix;\n            delete options.remove;\n            delete options.edit;\n            delete options.add;\n            delete options.navigate;\n            return options;\n        }\n        function createValidationAttributes(model, field) {\n            var modelField = (model.fields || model)[field];\n            var specialRules = [\n                'url',\n                'email',\n                'number',\n                'date',\n                'boolean'\n            ];\n            var validation = modelField ? modelField.validation : {};\n            var datatype = kendo.attr('type');\n            var inArray = $.inArray;\n            var ruleName;\n            var rule;\n            var attr = {};\n            for (ruleName in validation) {\n                rule = validation[ruleName];\n                if (inArray(ruleName, specialRules) >= 0) {\n                    attr[datatype] = ruleName;\n                } else if (!kendo.isFunction(rule)) {\n                    attr[ruleName] = isPlainObject(rule) ? rule.value || ruleName : rule;\n                }\n                attr[kendo.attr(ruleName + '-msg')] = rule.message;\n            }\n            return attr;\n        }\n        function dropDownResourceEditor(resource, model) {\n            var attr = createValidationAttributes(model, resource.field);\n            return function (container) {\n                $(kendo.format('<select data-{0}bind=\"value:{1}\" title=\"' + model.title + '\">', kendo.ns, resource.field)).appendTo(container).attr(attr).kendoDropDownList({\n                    dataTextField: resource.dataTextField,\n                    dataValueField: resource.dataValueField,\n                    dataSource: resource.dataSource,\n                    valuePrimitive: resource.valuePrimitive,\n                    optionLabel: 'None',\n                    template: kendo.format('<span class=\"k-scheduler-mark\" style=\"background-color:#= data.{0}?{0}:\"none\" #\"></span>#={1}#', resource.dataColorField, resource.dataTextField)\n                });\n            };\n        }\n        function descriptionEditor(options) {\n            var attr = createValidationAttributes(options.model, options.field);\n            return function (container, model) {\n                $('<textarea name=\"description\" class=\"k-textbox\" title=\"' + model.title + '\"/>').attr(attr).appendTo(container);\n            };\n        }\n        function multiSelectResourceEditor(resource, model) {\n            var attr = createValidationAttributes(model, resource.field);\n            return function (container) {\n                $(kendo.format('<select data-{0}bind=\"value:{1}\">', kendo.ns, resource.field)).appendTo(container).attr(attr).kendoMultiSelect({\n                    dataTextField: resource.dataTextField,\n                    dataValueField: resource.dataValueField,\n                    dataSource: resource.dataSource,\n                    valuePrimitive: resource.valuePrimitive,\n                    itemTemplate: kendo.format('<span class=\"k-scheduler-mark\" style=\"background-color:#= data.{0}?{0}:\"none\" #\"></span>#={1}#', resource.dataColorField, resource.dataTextField),\n                    tagTemplate: kendo.format('<span class=\"k-scheduler-mark\" style=\"background-color:#= data.{0}?{0}:\"none\" #\"></span>#={1}#', resource.dataColorField, resource.dataTextField)\n                });\n            };\n        }\n        function multiSelectResourceEditorMobile(resource, model) {\n            var attr = createValidationAttributes(model, resource.field);\n            return function (container) {\n                var options = '';\n                var view = resource.dataSource.view();\n                for (var idx = 0, length = view.length; idx < length; idx++) {\n                    options += kendo.format('<option value=\"{0}\">{1}</option>', kendo.getter(resource.dataValueField)(view[idx]), kendo.getter(resource.dataTextField)(view[idx]));\n                }\n                $(kendo.format('<select data-{0}bind=\"value:{1}\" multiple=\"multiple\" data-{0}value-primitive=\"{3}\">{2}</select>', kendo.ns, resource.field, options, resource.valuePrimitive)).appendTo(container).attr(attr);\n            };\n        }\n        function moveEventRange(event, distance) {\n            var duration = event.end.getTime() - event.start.getTime();\n            var start = new Date(event.start.getTime());\n            kendo.date.setTime(start, distance);\n            var end = new Date(start.getTime());\n            kendo.date.setTime(end, duration, true);\n            return {\n                start: start,\n                end: end\n            };\n        }\n        var editors = {\n            mobile: {\n                dateRange: MOBILEDATERANGEEDITOR,\n                timezonePopUp: MOBILETIMEZONEPOPUP,\n                timezone: MOBILETIMEZONEEDITOR,\n                recurrence: MOBILERECURRENCEEDITOR,\n                description: descriptionEditor,\n                multipleResources: multiSelectResourceEditorMobile,\n                resources: dropDownResourceEditor\n            },\n            desktop: {\n                dateRange: DATERANGEEDITOR,\n                timezonePopUp: TIMEZONEPOPUP,\n                timezone: TIMEZONEEDITOR,\n                recurrence: RECURRENCEEDITOR,\n                description: descriptionEditor,\n                multipleResources: multiSelectResourceEditor,\n                resources: dropDownResourceEditor\n            }\n        };\n        var Editor = kendo.Observable.extend({\n            init: function (element, options) {\n                kendo.Observable.fn.init.call(this);\n                this.element = element;\n                this.options = extend(true, {}, this.options, options);\n                this.createButton = this.options.createButton;\n                this.toggleDateValidationHandler = proxy(this._toggleDateValidation, this);\n            },\n            _toggleDateValidation: function (e) {\n                if (e.field == 'isAllDay') {\n                    var container = this.container, isAllDay = this.editable.options.model.isAllDay, bindAttribute = kendo.attr('bind'), element, isDateTimeInput, shouldValidate;\n                    container.find('[' + bindAttribute + '*=end],[' + bindAttribute + '*=start]').each(function () {\n                        element = $(this);\n                        if (valueStartEndBoundRegex.test(element.attr(bindAttribute))) {\n                            isDateTimeInput = element.is('[' + kendo.attr('role') + '=datetimepicker],[type*=datetime]');\n                            shouldValidate = isAllDay !== isDateTimeInput;\n                            element.attr(kendo.attr('validate'), shouldValidate);\n                        }\n                    });\n                }\n            },\n            fields: function (editors, model) {\n                var that = this;\n                var messages = that.options.messages;\n                var timezone = that.options.timezone;\n                var click = function (e) {\n                    e.preventDefault();\n                    that._initTimezoneEditor(model, this);\n                };\n                var fields = [\n                    {\n                        field: 'title',\n                        title: messages.editor.title\n                    },\n                    {\n                        field: 'start',\n                        title: messages.editor.start,\n                        editor: editors.dateRange,\n                        timezone: timezone\n                    },\n                    {\n                        field: 'end',\n                        title: messages.editor.end,\n                        editor: editors.dateRange,\n                        timezone: timezone\n                    },\n                    {\n                        field: 'isAllDay',\n                        title: messages.editor.allDayEvent\n                    }\n                ];\n                if (kendo.timezone.windows_zones) {\n                    fields.push({\n                        field: 'timezone',\n                        title: messages.editor.timezone,\n                        editor: editors.timezonePopUp,\n                        click: click,\n                        messages: messages.editor,\n                        model: model\n                    });\n                    fields.push({\n                        field: 'startTimezone',\n                        title: messages.editor.startTimezone,\n                        editor: editors.timezone,\n                        noTimezone: messages.editor.noTimezone\n                    });\n                    fields.push({\n                        field: 'endTimezone',\n                        title: messages.editor.endTimezone,\n                        editor: editors.timezone,\n                        noTimezone: messages.editor.noTimezone\n                    });\n                }\n                if (!model.recurrenceId) {\n                    fields.push({\n                        field: 'recurrenceRule',\n                        title: messages.editor.repeat,\n                        editor: editors.recurrence,\n                        timezone: timezone,\n                        messages: messages.recurrenceEditor,\n                        pane: this.pane\n                    });\n                }\n                if ('description' in model) {\n                    fields.push({\n                        field: 'description',\n                        title: messages.editor.description,\n                        editor: editors.description({\n                            model: model,\n                            field: 'description'\n                        })\n                    });\n                }\n                for (var resourceIndex = 0; resourceIndex < this.options.resources.length; resourceIndex++) {\n                    var resource = this.options.resources[resourceIndex];\n                    fields.push({\n                        field: resource.field,\n                        title: resource.title,\n                        editor: resource.multiple ? editors.multipleResources(resource, model) : editors.resources(resource, model)\n                    });\n                }\n                return fields;\n            },\n            end: function () {\n                return this.editable.end();\n            },\n            _buildEditTemplate: function (model, fields, editableFields) {\n                var messages = this.options.messages;\n                var settings = extend({}, kendo.Template, this.options.templateSettings);\n                var paramName = settings.paramName;\n                var template = this.options.editable.template;\n                var html = '';\n                if (template) {\n                    if (typeof template === STRING) {\n                        template = window.unescape(template);\n                    }\n                    html += kendo.template(template, settings)(model);\n                } else {\n                    for (var idx = 0, length = fields.length; idx < length; idx++) {\n                        var field = fields[idx];\n                        if (field.field === 'startTimezone') {\n                            html += '<div class=\"k-popup-edit-form k-scheduler-edit-form k-scheduler-timezones\" style=\"display:none\">';\n                            html += '<div class=\"k-edit-form-container\">';\n                            html += '<div class=\"k-edit-label\"></div>';\n                            html += '<div class=\"k-edit-field\"><label class=\"k-check\"><input class=\"k-timezone-toggle\" type=\"checkbox\" />' + messages.editor.separateTimezones + '</label></div>';\n                        }\n                        html += '<div class=\"k-edit-label\"><label for=\"' + field.field + '\">' + (field.title || field.field || '') + '</label></div>';\n                        if (!model.editable || model.editable(field.field)) {\n                            editableFields.push(field);\n                            html += '<div ' + kendo.attr('container-for') + '=\"' + field.field + '\" class=\"k-edit-field\"></div>';\n                        } else {\n                            var tmpl = '#:';\n                            if (field.field) {\n                                field = kendo.expr(field.field, paramName);\n                                tmpl += field + '==null?\\'\\':' + field;\n                            } else {\n                                tmpl += '\\'\\'';\n                            }\n                            tmpl += '#';\n                            tmpl = kendo.template(tmpl, settings);\n                            html += '<div class=\"k-edit-field\">' + tmpl(model) + '</div>';\n                        }\n                        if (field.field === 'endTimezone') {\n                            html += this._createEndTimezoneButton();\n                        }\n                    }\n                }\n                return html;\n            },\n            _createEndTimezoneButton: function () {\n                return '</div></div>';\n            },\n            _revertTimezones: function (model) {\n                model.set('startTimezone', this._startTimezone);\n                model.set('endTimezone', this._endTimezone);\n                delete this._startTimezone;\n                delete this._endTimezone;\n            }\n        });\n        var MobileEditor = Editor.extend({\n            init: function () {\n                Editor.fn.init.apply(this, arguments);\n                this.pane = kendo.mobile.ui.Pane.wrap(this.element);\n                this.pane.element.parent().css('height', this.options.height);\n                this.view = this.pane.view();\n                this._actionSheetButtonTemplate = kendo.template('<li><a #=attr# class=\"k-button #=className#\" href=\"\\\\#\">#:text#</a></li>');\n                this._actionSheetPopupOptions = $(document.documentElement).hasClass('km-root') ? { modal: false } : {\n                    align: 'bottom center',\n                    position: 'bottom center',\n                    effect: 'slideIn:up'\n                };\n            },\n            options: {\n                animations: {\n                    left: 'slide',\n                    right: 'slide:right'\n                }\n            },\n            destroy: function () {\n                this.close();\n                this.unbind();\n                this.pane.destroy();\n            },\n            _initTimezoneEditor: function (model) {\n                var that = this;\n                var pane = that.pane;\n                var messages = that.options.messages;\n                var timezoneView = that.timezoneView;\n                var container = that.container.find('.k-scheduler-timezones');\n                var checkbox = container.find('.k-timezone-toggle');\n                var endTimezoneRow = container.find('.k-edit-label:last').add(container.find('.k-edit-field:last'));\n                var startTimezoneChange = function (e) {\n                    if (e.field === 'startTimezone') {\n                        var value = model.startTimezone;\n                        checkbox.prop('disabled', !value);\n                        if (!value) {\n                            endTimezoneRow.hide();\n                            model.set('endTimezone', '');\n                            checkbox.prop('checked', false);\n                        }\n                    }\n                };\n                that._startTimezone = model.startTimezone || '';\n                that._endTimezone = model.endTimezone || '';\n                if (!timezoneView) {\n                    var html = '<div data-role=\"view\" class=\"k-popup-edit-form k-scheduler-edit-form k-mobile-list\">' + '<div data-role=\"header\" class=\"k-header\"><a href=\"#\" class=\"k-button k-scheduler-cancel\">' + messages.cancel + '</a>' + messages.editor.timezoneTitle + '<a href=\"#\" class=\"k-button k-scheduler-update\">' + messages.save + '</a></div></div>';\n                    this.timezoneView = timezoneView = pane.append(html);\n                    timezoneView.contentElement().append(container.show());\n                    timezoneView.element.on(CLICK + NS, '.k-scheduler-cancel, .k-scheduler-update', function (e) {\n                        e.preventDefault();\n                        e.stopPropagation();\n                        if ($(this).hasClass('k-scheduler-cancel')) {\n                            that._revertTimezones(model);\n                        }\n                        model.unbind('change', startTimezoneChange);\n                        var editView = pane.element.find('#edit').data('kendoMobileView');\n                        var text = timezoneButtonText(model, messages.editor.noTimezone);\n                        editView.contentElement().find('.k-timezone-button').text(text);\n                        pane.navigate(editView, that.options.animations.right);\n                    });\n                    checkbox.click(function () {\n                        endTimezoneRow.toggle(checkbox.prop('checked'));\n                        model.set('endTimezone', '');\n                    });\n                    model.bind('change', startTimezoneChange);\n                }\n                checkbox.prop('checked', model.endTimezone).prop('disabled', !model.startTimezone);\n                if (model.endTimezone) {\n                    endTimezoneRow.show();\n                } else {\n                    endTimezoneRow.hide();\n                }\n                pane.navigate(timezoneView, that.options.animations.left);\n            },\n            _createActionSheetButton: function (options) {\n                options.template = this._actionSheetButtonTemplate;\n                return this.createButton(options);\n            },\n            showDialog: function (options) {\n                var type = '';\n                var html = '<ul><li class=\"km-actionsheet-title\">' + options.title + '</li>';\n                var target = this.element.find('.k-event[' + kendo.attr('uid') + '=\\'' + options.model.uid + '\\']');\n                if (this.container) {\n                    target = this.container.find('.k-scheduler-delete');\n                    if (target[0]) {\n                        type = 'phone';\n                    }\n                }\n                for (var buttonIndex = 0; buttonIndex < options.buttons.length; buttonIndex++) {\n                    html += this._createActionSheetButton(options.buttons[buttonIndex]);\n                }\n                html += '</ul>';\n                var actionSheet = $(html).appendTo(this.pane.view().element).kendoMobileActionSheet({\n                    type: type,\n                    cancel: this.options.messages.cancel,\n                    cancelTemplate: '<li class=\"km-actionsheet-cancel\"><a class=\"k-button\" href=\"\\\\#\">#:cancel#</a></li>',\n                    close: function () {\n                        this.destroy();\n                    },\n                    command: function (e) {\n                        var buttonIndex = actionSheet.element.find('li:not(.km-actionsheet-cancel) > .k-button').index($(e.currentTarget));\n                        if (buttonIndex > -1) {\n                            actionSheet.close();\n                            options.buttons[buttonIndex].click();\n                        }\n                    },\n                    popup: this._actionSheetPopupOptions\n                }).data('kendoMobileActionSheet');\n                actionSheet.open(target);\n            },\n            editEvent: function (model) {\n                var pane = this.pane;\n                var html = '';\n                var messages = this.options.messages;\n                var updateText = messages.save;\n                var removeText = messages.destroy;\n                var cancelText = messages.cancel;\n                var titleText = messages.editor.editorTitle;\n                html += '<div data-role=\"view\" class=\"k-popup-edit-form k-scheduler-edit-form k-mobile-list\" id=\"edit\" ' + kendo.attr('uid') + '=\"' + model.uid + '\">' + '<div data-role=\"header\" class=\"k-header\"><a href=\"#\" class=\"k-button k-scheduler-cancel\">' + cancelText + '</a>' + titleText + '<a href=\"#\" class=\"k-button k-scheduler-update\">' + updateText + '</a></div>';\n                var fields = this.fields(editors.mobile, model);\n                var that = this;\n                var editableFields = [];\n                html += this._buildEditTemplate(model, fields, editableFields);\n                if (!model.isNew() && this.options.editable && this.options.editable.destroy !== false) {\n                    html += '<div class=\"k-edit-buttons\"><a href=\"#\" class=\"k-scheduler-delete k-button\">' + removeText + '</a></div>';\n                }\n                html += '</div>';\n                var view = pane.append(html);\n                var container = this.container = view.element;\n                this.editable = container.kendoEditable({\n                    fields: editableFields,\n                    model: model,\n                    clearContainer: false,\n                    target: that.options.target,\n                    validateOnBlur: true\n                }).data('kendoEditable');\n                container.find('input[type=checkbox],input[type=radio]').parent('.k-edit-field').addClass('k-check').prev('.k-edit-label').addClass('k-check').click(function () {\n                    $(this).next().children('input').click();\n                });\n                if (!this.trigger('edit', {\n                        container: container,\n                        model: model\n                    })) {\n                    container.on(CLICK + NS, 'a.k-scheduler-edit, a.k-scheduler-cancel, a.k-scheduler-update, a.k-scheduler-delete', function (e) {\n                        e.preventDefault();\n                        e.stopPropagation();\n                        var button = $(this);\n                        if (!button.hasClass('k-scheduler-edit')) {\n                            var name = 'cancel';\n                            if (button.hasClass('k-scheduler-update')) {\n                                name = 'save';\n                            } else if (button.hasClass('k-scheduler-delete')) {\n                                name = 'remove';\n                            }\n                            that.trigger(name, {\n                                container: container,\n                                model: model\n                            });\n                        } else {\n                            pane.navigate('#edit', that.options.animations.right);\n                        }\n                    });\n                    pane.navigate(view, that.options.animations.left);\n                    model.bind('change', that.toggleDateValidationHandler);\n                } else {\n                    this.trigger('cancel', {\n                        container: container,\n                        model: model\n                    });\n                }\n                return this.editable;\n            },\n            _views: function () {\n                return this.pane.element.find(kendo.roleSelector('view')).not(this.view.element);\n            },\n            close: function () {\n                if (this.container) {\n                    this.pane.navigate('', this.options.animations.right);\n                    var views = this._views();\n                    var view;\n                    for (var idx = 0, length = views.length; idx < length; idx++) {\n                        view = views.eq(idx).data('kendoMobileView');\n                        if (view) {\n                            view.purge();\n                        }\n                    }\n                    views.remove();\n                    this.container = null;\n                    if (this.editable) {\n                        this.editable.options.model.unbind('change', this.toggleDateValidationHandler);\n                        this.editable.destroy();\n                        this.editable = null;\n                    }\n                    this.timezoneView = null;\n                }\n            }\n        });\n        var PopupEditor = Editor.extend({\n            destroy: function () {\n                this.close();\n                this.unbind();\n            },\n            editEvent: function (model) {\n                var that = this;\n                var editable = that.options.editable;\n                var html = '<div ' + kendo.attr('uid') + '=\"' + model.uid + '\" class=\"k-popup-edit-form k-scheduler-edit-form\"><div class=\"k-edit-form-container\">';\n                var messages = that.options.messages;\n                var updateText = messages.save;\n                var cancelText = messages.cancel;\n                var deleteText = messages.destroy;\n                var fields = this.fields(editors.desktop, model);\n                var editableFields = [];\n                html += this._buildEditTemplate(model, fields, editableFields);\n                var attr;\n                var options = isPlainObject(editable) ? editable.window : {};\n                html += '<div class=\"k-edit-buttons k-state-default\">';\n                html += this.createButton({\n                    name: 'update',\n                    text: updateText,\n                    attr: attr\n                }) + this.createButton({\n                    name: 'canceledit',\n                    text: cancelText,\n                    attr: attr\n                });\n                if (!model.isNew() && editable.destroy !== false) {\n                    html += this.createButton({\n                        name: 'delete',\n                        text: deleteText,\n                        attr: attr\n                    });\n                }\n                html += '</div></div></div>';\n                var container = this.container = $(html).appendTo(that.element).eq(0).kendoWindow(extend({\n                    modal: true,\n                    resizable: false,\n                    draggable: true,\n                    title: messages.editor.editorTitle,\n                    visible: false,\n                    close: function (e) {\n                        if (e.userTriggered) {\n                            if (that.trigger(CANCEL, {\n                                    container: container,\n                                    model: model\n                                })) {\n                                e.preventDefault();\n                            }\n                        }\n                    }\n                }, options));\n                that.editable = container.kendoEditable({\n                    fields: editableFields,\n                    model: model,\n                    clearContainer: false,\n                    validateOnBlur: true,\n                    target: that.options.target\n                }).data('kendoEditable');\n                if (!that.trigger(EDIT, {\n                        container: container,\n                        model: model\n                    })) {\n                    container.data('kendoWindow').center().open();\n                    container.on(CLICK + NS, 'a.k-scheduler-cancel', function (e) {\n                        e.preventDefault();\n                        e.stopPropagation();\n                        that.trigger(CANCEL, {\n                            container: container,\n                            model: model\n                        });\n                    });\n                    container.on(CLICK + NS, 'a.k-scheduler-update', function (e) {\n                        e.preventDefault();\n                        e.stopPropagation();\n                        that.trigger('save', {\n                            container: container,\n                            model: model\n                        });\n                    });\n                    container.on(CLICK + NS, 'a.k-scheduler-delete', function (e) {\n                        e.preventDefault();\n                        e.stopPropagation();\n                        that.trigger(REMOVE, {\n                            container: container,\n                            model: model\n                        });\n                    });\n                    kendo.cycleForm(container);\n                    model.bind('change', that.toggleDateValidationHandler);\n                } else {\n                    that.trigger(CANCEL, {\n                        container: container,\n                        model: model\n                    });\n                }\n                return that.editable;\n            },\n            close: function () {\n                var that = this;\n                var destroy = function () {\n                    if (that.editable) {\n                        that.editable.options.model.unbind('change', that.toggleDateValidationHandler);\n                        that.editable.destroy();\n                        that.editable = null;\n                        that.container = null;\n                    }\n                    if (that.popup) {\n                        that.popup.destroy();\n                        that.popup = null;\n                    }\n                };\n                if (that.editable) {\n                    if (that._timezonePopup && that._timezonePopup.data('kendoWindow')) {\n                        that._timezonePopup.data('kendoWindow').destroy();\n                        that._timezonePopup = null;\n                    }\n                    if (that.container.is(':visible')) {\n                        that.container.data('kendoWindow').bind('deactivate', destroy).close();\n                    } else {\n                        destroy();\n                    }\n                } else {\n                    destroy();\n                }\n            },\n            _createEndTimezoneButton: function () {\n                var messages = this.options.messages;\n                var html = '';\n                html += '<div class=\"k-edit-buttons k-state-default\">';\n                html += this.createButton({\n                    name: 'savetimezone',\n                    text: messages.save\n                }) + this.createButton({\n                    name: 'canceltimezone',\n                    text: messages.cancel\n                });\n                html += '</div></div></div>';\n                return html;\n            },\n            showDialog: function (options) {\n                var html = kendo.format('<div class=\\'k-popup-edit-form\\'><div class=\\'k-edit-form-container\\'><p class=\\'k-popup-message\\'>{0}</p>', options.text);\n                html += '<div class=\"k-edit-buttons k-state-default\">';\n                for (var buttonIndex = 0; buttonIndex < options.buttons.length; buttonIndex++) {\n                    html += this.createButton(options.buttons[buttonIndex]);\n                }\n                html += '</div></div></div>';\n                var wrapper = this.element;\n                if (this.popup) {\n                    this.popup.destroy();\n                }\n                var popup = this.popup = $(html).appendTo(wrapper).eq(0).on('click', '.k-button', function (e) {\n                    e.preventDefault();\n                    popup.close();\n                    var buttonIndex = $(e.currentTarget).index();\n                    options.buttons[buttonIndex].click();\n                }).kendoWindow({\n                    modal: true,\n                    resizable: false,\n                    draggable: false,\n                    title: options.title,\n                    visible: false,\n                    close: function () {\n                        this.destroy();\n                        wrapper.focus();\n                    }\n                }).getKendoWindow();\n                popup.center().open();\n            },\n            _initTimezoneEditor: function (model, activator) {\n                var that = this;\n                var container = that.container.find('.k-scheduler-timezones');\n                var checkbox = container.find('.k-timezone-toggle');\n                var endTimezoneRow = container.find('.k-edit-label:last').add(container.find('.k-edit-field:last'));\n                var saveButton = container.find('.k-scheduler-savetimezone');\n                var cancelButton = container.find('.k-scheduler-canceltimezone');\n                var timezonePopup = that._timezonePopup;\n                var startTimezoneChange = function (e) {\n                    if (e.field === 'startTimezone') {\n                        var value = model.startTimezone;\n                        checkbox.prop('disabled', !value);\n                        if (!value) {\n                            endTimezoneRow.hide();\n                            model.set('endTimezone', '');\n                            checkbox.prop('checked', false);\n                        }\n                    }\n                };\n                var wnd;\n                that._startTimezone = model.startTimezone;\n                that._endTimezone = model.endTimezone;\n                if (!timezonePopup) {\n                    that._timezonePopup = timezonePopup = container.kendoWindow({\n                        modal: true,\n                        resizable: false,\n                        draggable: true,\n                        title: that.options.messages.editor.timezoneEditorTitle,\n                        visible: false,\n                        close: function (e) {\n                            model.unbind('change', startTimezoneChange);\n                            if (e.userTriggered) {\n                                that._revertTimezones(model);\n                            }\n                            if (activator) {\n                                activator.focus();\n                            }\n                        }\n                    });\n                    checkbox.click(function () {\n                        endTimezoneRow.toggle(checkbox.prop('checked'));\n                        model.set('endTimezone', '');\n                    });\n                    saveButton.click(function (e) {\n                        e.preventDefault();\n                        wnd.close();\n                    });\n                    cancelButton.click(function (e) {\n                        e.preventDefault();\n                        that._revertTimezones(model);\n                        wnd.close();\n                    });\n                    model.bind('change', startTimezoneChange);\n                }\n                checkbox.prop('checked', model.endTimezone).prop('disabled', !model.startTimezone);\n                if (model.endTimezone) {\n                    endTimezoneRow.show();\n                } else {\n                    endTimezoneRow.hide();\n                }\n                wnd = timezonePopup.data('kendoWindow');\n                wnd.center().open();\n            }\n        });\n        var Scheduler = DataBoundWidget.extend({\n            init: function (element, options) {\n                var that = this;\n                Widget.fn.init.call(that, element, options);\n                if (!that.options.views || !that.options.views.length) {\n                    that.options.views = [\n                        'day',\n                        'week'\n                    ];\n                }\n                that.resources = [];\n                that._initModel();\n                that._wrapper();\n                that._views();\n                that._toolbar();\n                that._dataSource();\n                that._resources();\n                that._resizeHandler = function () {\n                    that.resize();\n                };\n                that.wrapper.on('mousedown' + NS + ' selectstart' + NS, function (e) {\n                    if (!$(e.target).is(':kendoFocusable')) {\n                        e.preventDefault();\n                    }\n                });\n                if (that.options.editable && that.options.editable.resize !== false) {\n                    that._resizable();\n                }\n                that._movable();\n                that._bindResize();\n                if (that.options.messages && that.options.messages.recurrence) {\n                    recurrence.options = that.options.messages.recurrence;\n                }\n                that._selectable();\n                that._ariaId = kendo.guid();\n                that._createEditor();\n            },\n            _bindResize: function () {\n                $(window).on('resize' + NS, this._resizeHandler);\n            },\n            _unbindResize: function () {\n                $(window).off('resize' + NS, this._resizeHandler);\n            },\n            dataItems: function () {\n                var that = this;\n                var items = that.items();\n                var events = that._data;\n                var eventsUids = $.map(items, function (item) {\n                    return $(item).attr('data-uid');\n                });\n                var i;\n                var key;\n                var dict = {};\n                var eventsUidsLength = eventsUids.length;\n                for (i = 0; i < eventsUidsLength; i++) {\n                    dict[eventsUids[i]] = null;\n                }\n                var eventsCount = events.length;\n                for (i = 0; i < eventsCount; i++) {\n                    var event = events[i];\n                    if (dict[event.uid] !== undefined) {\n                        dict[event.uid] = event;\n                    }\n                }\n                var sortedData = [];\n                for (key in dict) {\n                    sortedData.push(dict[key]);\n                }\n                return sortedData;\n            },\n            _isMobile: function () {\n                var options = this.options;\n                return options.mobile === true && kendo.support.mobileOS || options.mobile === 'phone' || options.mobile === 'tablet';\n            },\n            _isMobilePhoneView: function () {\n                var options = this.options;\n                return options.mobile === true && kendo.support.mobileOS && !kendo.support.mobileOS.tablet || options.mobile === 'phone';\n            },\n            _groupsByResource: function (resources, groupIndex, groupsArray, parentFieldValue, parentField) {\n                if (!groupsArray) {\n                    groupsArray = [];\n                }\n                var resource = resources[0];\n                if (resource) {\n                    var group;\n                    var data = resource.dataSource.view();\n                    var prevIndex = 0;\n                    for (var dataIndex = 0; dataIndex < data.length; dataIndex++) {\n                        var fieldValue = kendo.getter(resource.dataValueField)(data[dataIndex]);\n                        var currentGroupIndex = groupIndex + prevIndex + dataIndex;\n                        group = this._groupsByResource(resources.slice(1), currentGroupIndex, groupsArray, fieldValue, resource.field);\n                        group[resource.field] = fieldValue;\n                        prevIndex = group.groupIndex;\n                        if (parentField && parentFieldValue) {\n                            group[parentField] = parentFieldValue;\n                        }\n                        if (resources.length === 1) {\n                            group.groupIndex = groupIndex + dataIndex;\n                            groupsArray.push(group);\n                        }\n                    }\n                    return group;\n                } else {\n                    return {};\n                }\n            },\n            data: function () {\n                return this._data;\n            },\n            select: function (options) {\n                var that = this;\n                var view = that.view();\n                var selection = that._selection;\n                var groups = view.groups;\n                var selectedGroups;\n                if (options === undefined) {\n                    var selectedEvents;\n                    var slots = view._selectedSlots;\n                    if (!selection) {\n                        return [];\n                    }\n                    if (selection && selection.events) {\n                        selectedEvents = that._selectedEvents();\n                    }\n                    return {\n                        start: selection.start,\n                        end: selection.end,\n                        events: selectedEvents,\n                        slots: slots,\n                        resources: view._resourceBySlot(selection)\n                    };\n                }\n                if (!options) {\n                    that._selection = null;\n                    that._old = null;\n                    view.clearSelection();\n                    return;\n                }\n                if ($.isArray(options)) {\n                    options = { events: options.splice(0) };\n                }\n                if (options.resources) {\n                    var fieldName;\n                    var filters = [];\n                    var groupsByResource = [];\n                    if (view.groupedResources) {\n                        that._groupsByResource(view.groupedResources, 0, groupsByResource);\n                    }\n                    for (fieldName in options.resources) {\n                        filters.push({\n                            field: fieldName,\n                            operator: 'eq',\n                            value: options.resources[fieldName]\n                        });\n                    }\n                    selectedGroups = new kendo.data.Query(groupsByResource).filter(filters).toArray();\n                }\n                if (options.events && options.events.length) {\n                    that._selectEvents(options.events, selectedGroups);\n                    that._select();\n                    return;\n                }\n                if (groups && (options.start && options.end)) {\n                    var rangeStart = getDate(view._startDate);\n                    var rangeEnd = kendo.date.addDays(getDate(view._endDate), 1);\n                    var group;\n                    var ranges;\n                    if (options.start < rangeEnd && rangeStart <= options.end) {\n                        if (selectedGroups && selectedGroups.length) {\n                            group = groups[selectedGroups[0].groupIndex];\n                        } else {\n                            group = groups[0];\n                        }\n                        ranges = group.ranges(options.start, options.end, options.isAllDay, false);\n                        if (ranges.length) {\n                            that._selection = {\n                                start: kendo.timezone.toLocalDate(ranges[0].start.start),\n                                end: kendo.timezone.toLocalDate(ranges[ranges.length - 1].end.end),\n                                groupIndex: ranges[0].start.groupIndex,\n                                index: ranges[0].start.index,\n                                isAllDay: ranges[0].start.isDaySlot,\n                                events: []\n                            };\n                            that._select();\n                        }\n                    }\n                }\n            },\n            _selectEvents: function (eventsUids, selectedGroups) {\n                var that = this;\n                var idx;\n                var view = that.view();\n                var groups = view.groups;\n                var eventsLength = eventsUids.length;\n                var isGrouped = selectedGroups && selectedGroups.length;\n                for (idx = 0; idx < eventsLength; idx++) {\n                    if (groups && isGrouped) {\n                        var currentGroup = groups[selectedGroups[0].groupIndex];\n                        var events = [];\n                        var timeSlotCollectionCount = currentGroup.timeSlotCollectionCount();\n                        var daySlotCollectionCount = currentGroup.daySlotCollectionCount();\n                        for (var collIdx = 0; collIdx < timeSlotCollectionCount; collIdx++) {\n                            events = events.concat(currentGroup.getTimeSlotCollection(collIdx).events());\n                        }\n                        for (var dayCollIdx = 0; dayCollIdx < daySlotCollectionCount; dayCollIdx++) {\n                            events = events.concat(currentGroup.getDaySlotCollection(dayCollIdx).events());\n                        }\n                        events = new kendo.data.Query(events).filter({\n                            field: 'element[0].getAttribute(\\'data-uid\\')',\n                            operator: 'eq',\n                            value: eventsUids[idx]\n                        }).toArray();\n                        if (events[0]) {\n                            that._createSelection(events[0].element);\n                        }\n                    } else {\n                        var element = view.element.find(kendo.format('.k-event[data-uid={0}], .k-task[data-uid={0}]', eventsUids[idx]));\n                        if (element.length) {\n                            that._createSelection(element[0]);\n                        }\n                    }\n                }\n            },\n            _selectable: function () {\n                var that = this, wrapper = that.wrapper, selectEvent = kendo.support.mobileOS ? 'touchend' : 'mousedown';\n                if (!that.options.selectable) {\n                    return;\n                }\n                that._tabindex();\n                wrapper.on(selectEvent + NS, '.k-scheduler-header-all-day td, .k-scheduler-content td, .k-event', function (e) {\n                    var which = e.which;\n                    var button = e.button;\n                    var browser = kendo.support.browser;\n                    var isRight = which && which === 3 || button && button == 2;\n                    if (kendo.support.mobileOS && e.isDefaultPrevented()) {\n                        return;\n                    }\n                    if (!isRight) {\n                        that._createSelection(e.currentTarget);\n                    }\n                    wrapper.focus();\n                    if (browser.msie && browser.version < 9) {\n                        setTimeout(function () {\n                            wrapper.focus();\n                        });\n                    }\n                });\n                var mouseMoveHandler = $.proxy(that._mouseMove, that);\n                wrapper.on('mousedown' + NS, '.k-scheduler-header-all-day td, .k-scheduler-content td', function (e) {\n                    var which = e.which;\n                    var button = e.button;\n                    var isRight = which && which === 3 || button && button == 2;\n                    if (!isRight) {\n                        wrapper.on('mousemove' + NS, '.k-scheduler-header-all-day td, .k-scheduler-content td', mouseMoveHandler);\n                    }\n                });\n                wrapper.on('mouseup' + NS + ' mouseleave' + NS, function () {\n                    wrapper.off('mousemove' + NS, '.k-scheduler-header-all-day td, .k-scheduler-content td', mouseMoveHandler);\n                });\n                wrapper.on('focus' + NS, function () {\n                    if (!that._selection) {\n                        that._selectFirstSlot();\n                    }\n                    that._select();\n                });\n                wrapper.on('focusout' + NS, function () {\n                    that._ctrlKey = that._shiftKey = false;\n                });\n                wrapper.on('keydown' + NS, proxy(that._keydown, that));\n                wrapper.on('keyup' + NS, function (e) {\n                    that._ctrlKey = e.ctrlKey;\n                    that._shiftKey = e.shiftKey;\n                });\n            },\n            _selectFirstSlot: function () {\n                this._createSelection(this.wrapper.find('.k-scheduler-content').find('td:first'));\n            },\n            _select: function () {\n                var that = this;\n                var view = that.view();\n                var wrapper = that.wrapper;\n                var current = view.current();\n                var selection = that._selection;\n                if (!selection) {\n                    return;\n                }\n                if (current) {\n                    current.removeAttribute('id');\n                    current.removeAttribute('aria-label');\n                    wrapper.removeAttr('aria-activedescendant');\n                }\n                view.select(selection);\n                current = view.current();\n                if (current && that._old !== current) {\n                    var currentUid = $(current).data('uid');\n                    if (that._old && currentUid && currentUid === $(that._old).data('uid')) {\n                        return;\n                    }\n                    var labelFormat;\n                    var data = selection;\n                    var events = that._selectedEvents();\n                    var slots = view._selectedSlots;\n                    if (events[0]) {\n                        data = events[0] || selection;\n                        labelFormat = kendo.format(that.options.messages.ariaEventLabel, data.title, data.start, data.start);\n                    } else {\n                        labelFormat = kendo.format(that.options.messages.ariaSlotLabel, data.start, data.end);\n                    }\n                    current.setAttribute('id', that._ariaId);\n                    current.setAttribute('aria-label', labelFormat);\n                    wrapper.attr('aria-activedescendant', that._ariaId);\n                    that._old = current;\n                    that.trigger('change', {\n                        start: selection.start,\n                        end: selection.end,\n                        events: events,\n                        slots: slots,\n                        resources: view._resourceBySlot(selection)\n                    });\n                }\n            },\n            _selectedEvents: function () {\n                var uids = this._selection.events;\n                var length = uids.length;\n                var idx = 0;\n                var event;\n                var events = [];\n                for (; idx < length; idx++) {\n                    event = this.occurrenceByUid(uids[idx]);\n                    if (event) {\n                        events.push(event);\n                    }\n                }\n                return events;\n            },\n            _mouseMove: function (e) {\n                var that = this;\n                clearTimeout(that._moveTimer);\n                that._moveTimer = setTimeout(function () {\n                    var view = that.view();\n                    var selection = that._selection;\n                    if (selection) {\n                        var slot = view.selectionByElement($(e.currentTarget));\n                        if (slot && selection.groupIndex === slot.groupIndex) {\n                            var startDate = slot.startDate();\n                            var endDate = slot.endDate();\n                            if (startDate >= selection.end) {\n                                selection.backward = false;\n                            } else if (endDate <= selection.start) {\n                                selection.backward = true;\n                            }\n                            if (selection.backward) {\n                                selection.start = startDate;\n                            } else {\n                                selection.end = endDate;\n                            }\n                            that._select();\n                        }\n                    }\n                }, 5);\n            },\n            _viewByIndex: function (index) {\n                var view, views = this.views;\n                for (view in views) {\n                    if (!index) {\n                        return view;\n                    }\n                    index--;\n                }\n            },\n            _keydown: function (e) {\n                var that = this, key = e.keyCode, view = that.view(), editable = view.options.editable, selection = that._selection, shiftKey = e.shiftKey;\n                that._ctrlKey = e.ctrlKey;\n                that._shiftKey = e.shiftKey;\n                if (!selection) {\n                    that._selectFirstSlot();\n                    that._select();\n                    return;\n                }\n                if (key === keys.TAB) {\n                    if (view.moveToEvent(selection, shiftKey)) {\n                        that._select();\n                        e.preventDefault();\n                    }\n                } else if (editable && key === keys.ENTER) {\n                    if (selection.events.length) {\n                        if (editable.update !== false) {\n                            that.editEvent(selection.events[0]);\n                        }\n                    } else if (editable.create !== false) {\n                        if (selection.isAllDay) {\n                            selection = $.extend({}, selection, { end: kendo.date.addDays(selection.end, -1) });\n                        }\n                        that.addEvent(extend({}, selection, view._resourceBySlot(selection)));\n                    }\n                } else if (key === keys.DELETE && editable !== false && editable.destroy !== false) {\n                    that.removeEvent(selection.events[0]);\n                } else if (key >= 49 && key <= 57) {\n                    that.view(that._viewByIndex(key - 49));\n                } else if (view.move(selection, key, shiftKey)) {\n                    if (view.inRange(selection)) {\n                        that._select();\n                    } else {\n                        that.date(selection.start);\n                    }\n                    e.preventDefault();\n                }\n                that._adjustSelectedDate();\n            },\n            _createSelection: function (item) {\n                var uid, slot, selection;\n                if (!this._selection || !this._ctrlKey && !this._shiftKey) {\n                    this._selection = {\n                        events: [],\n                        groupIndex: 0\n                    };\n                }\n                item = $(item);\n                selection = this._selection;\n                if (item.is('.k-event')) {\n                    uid = item.attr(kendo.attr('uid'));\n                }\n                slot = this.view().selectionByElement(item);\n                if (slot) {\n                    selection.groupIndex = slot.groupIndex || 0;\n                }\n                if (uid) {\n                    slot = getOccurrenceByUid(this._data, uid);\n                }\n                if (slot && slot.uid) {\n                    uid = [slot.uid];\n                }\n                this._updateSelection(slot, uid);\n                this._adjustSelectedDate();\n            },\n            _updateSelection: function (dataItem, events, groupIndex) {\n                var selection = this._selection;\n                if (dataItem && selection) {\n                    var view = this.view();\n                    if (dataItem.uid) {\n                        dataItem = view._updateEventForSelection(dataItem);\n                    }\n                    if (this._shiftKey && selection.start && selection.end) {\n                        var backward = dataItem.end < selection.end;\n                        selection.end = dataItem.endDate ? dataItem.endDate() : dataItem.end;\n                        if (backward && view._timeSlotInterval) {\n                            kendo.date.setTime(selection.end, -view._timeSlotInterval());\n                        }\n                    } else {\n                        selection.start = dataItem.startDate ? dataItem.startDate() : dataItem.start;\n                        selection.end = dataItem.endDate ? dataItem.endDate() : dataItem.end;\n                    }\n                    if ('isDaySlot' in dataItem) {\n                        selection.isAllDay = dataItem.isDaySlot;\n                    } else {\n                        selection.isAllDay = dataItem.isAllDay;\n                    }\n                    if (groupIndex !== null && groupIndex !== undefined) {\n                        selection.groupIndex = groupIndex;\n                    }\n                    selection.index = dataItem.index;\n                    if (this._ctrlKey) {\n                        selection.events = selection.events.concat(events || []);\n                    } else {\n                        selection.events = events || [];\n                    }\n                }\n            },\n            options: {\n                name: 'Scheduler',\n                date: TODAY,\n                editable: true,\n                autoBind: true,\n                snap: true,\n                mobile: false,\n                timezone: '',\n                allDaySlot: true,\n                min: new Date(1900, 0, 1),\n                max: new Date(2099, 11, 31),\n                toolbar: null,\n                footer: {},\n                messages: {\n                    today: 'Today',\n                    pdf: 'Export to PDF',\n                    save: 'Save',\n                    cancel: 'Cancel',\n                    destroy: 'Delete',\n                    deleteWindowTitle: 'Delete event',\n                    next: 'Next',\n                    previous: 'Previous',\n                    ariaSlotLabel: 'Selected from {0:t} to {1:t}',\n                    ariaEventLabel: '{0} on {1:D} at {2:t}',\n                    views: {\n                        day: 'Day',\n                        week: 'Week',\n                        workWeek: 'Work Week',\n                        agenda: 'Agenda',\n                        month: 'Month',\n                        timeline: 'Timeline',\n                        timelineWeek: 'Timeline Week',\n                        timelineWorkWeek: 'Timeline Work Week',\n                        timelineMonth: 'Timeline Month'\n                    },\n                    recurrenceMessages: {\n                        deleteWindowTitle: 'Delete Recurring Item',\n                        deleteWindowOccurrence: 'Delete current occurrence',\n                        deleteWindowSeries: 'Delete the series',\n                        editWindowTitle: 'Edit Recurring Item',\n                        editWindowOccurrence: 'Edit current occurrence',\n                        editWindowSeries: 'Edit the series'\n                    },\n                    editable: { confirmation: DELETECONFIRM },\n                    editor: {\n                        title: 'Title',\n                        start: 'Start',\n                        end: 'End',\n                        allDayEvent: 'All day event',\n                        description: 'Description',\n                        repeat: 'Repeat',\n                        timezone: 'Timezone',\n                        startTimezone: 'Start timezone',\n                        endTimezone: 'End timezone',\n                        separateTimezones: 'Use separate start and end time zones',\n                        timezoneEditorTitle: 'Timezones',\n                        timezoneEditorButton: 'Time zone',\n                        timezoneTitle: 'Time zones',\n                        noTimezone: 'No timezone',\n                        editorTitle: 'Event'\n                    }\n                },\n                height: null,\n                width: null,\n                resources: [],\n                group: {\n                    resources: [],\n                    orientation: 'horizontal'\n                },\n                views: [],\n                selectable: false\n            },\n            events: [\n                REMOVE,\n                EDIT,\n                CANCEL,\n                SAVE,\n                'add',\n                'dataBinding',\n                'dataBound',\n                'moveStart',\n                'move',\n                'moveEnd',\n                'resizeStart',\n                'resize',\n                'resizeEnd',\n                'navigate',\n                'change'\n            ],\n            destroy: function () {\n                var that = this, element;\n                Widget.fn.destroy.call(that);\n                if (that.dataSource) {\n                    that.dataSource.unbind(CHANGE, that._refreshHandler);\n                    that.dataSource.unbind('progress', that._progressHandler);\n                    that.dataSource.unbind('error', that._errorHandler);\n                }\n                if (that.calendar) {\n                    that.calendar.destroy();\n                    that.popup.destroy();\n                }\n                if (that.view()) {\n                    that.view().destroy();\n                }\n                if (that._editor) {\n                    that._editor.destroy();\n                }\n                if (this._moveDraggable) {\n                    this._moveDraggable.destroy();\n                }\n                if (this._resizeDraggable) {\n                    this._resizeDraggable.destroy();\n                }\n                element = that.element.add(that.wrapper).add(that.toolbar).add(that.popup);\n                element.off(NS);\n                clearTimeout(that._moveTimer);\n                that._model = null;\n                that.toolbar = null;\n                that.element = null;\n                $(window).off('resize' + NS, that._resizeHandler);\n                kendo.destroy(that.wrapper);\n            },\n            setDataSource: function (dataSource) {\n                this.options.dataSource = dataSource;\n                this._dataSource();\n                if (this.options.autoBind) {\n                    dataSource.fetch();\n                }\n            },\n            items: function () {\n                var content = this.wrapper.find('.k-scheduler-content');\n                var view = this.view();\n                if (view && view.options.name === 'agenda') {\n                    return content.find('.k-task');\n                } else {\n                    return content.find('.k-event').add(this.wrapper.find('.k-scheduler-header-wrap').find('.k-scheduler-header-all-day').siblings());\n                }\n            },\n            _movable: function () {\n                var startSlot;\n                var endSlot;\n                var startTime;\n                var endTime;\n                var event;\n                var clonedEvent;\n                var that = this;\n                var originSlot;\n                var distance = 0;\n                var isMobile = that._isMobile();\n                var movable = that.options.editable && that.options.editable.move !== false;\n                var resizable = that.options.editable && that.options.editable.resize !== false;\n                if (movable || resizable && isMobile) {\n                    if (isMobile && kendo.support.mobileOS.android) {\n                        distance = 5;\n                    }\n                    that._moveDraggable = new kendo.ui.Draggable(that.element, {\n                        distance: distance,\n                        filter: '.k-event',\n                        ignore: '.k-resize-handle',\n                        holdToDrag: isMobile,\n                        autoScroll: true\n                    });\n                    if (movable) {\n                        that._moveDraggable.bind('dragstart', function (e) {\n                            var view = that.view();\n                            var eventElement = e.currentTarget;\n                            if (!view.options.editable || view.options.editable.move === false) {\n                                e.preventDefault();\n                                return;\n                            }\n                            if (isMobile && !eventElement.hasClass('k-event-active')) {\n                                that.element.find('.k-event-active').removeClass('k-event-active');\n                                e.preventDefault();\n                                return;\n                            }\n                            event = that.occurrenceByUid(eventElement.attr(kendo.attr('uid')));\n                            clonedEvent = event.clone();\n                            clonedEvent.update(view._eventOptionsForMove(clonedEvent));\n                            startSlot = view._slotByPosition(e.x.startLocation, e.y.startLocation);\n                            startTime = startSlot.startOffset(e.x.startLocation, e.y.startLocation, that.options.snap);\n                            endSlot = startSlot;\n                            originSlot = startSlot;\n                            if (!startSlot || that.trigger('moveStart', { event: event })) {\n                                e.preventDefault();\n                            }\n                        }).bind('drag', function (e) {\n                            var view = that.view();\n                            var slot = view._slotByPosition(e.x.location, e.y.location);\n                            var distance;\n                            var range;\n                            if (!slot) {\n                                return;\n                            }\n                            endTime = slot.startOffset(e.x.location, e.y.location, that.options.snap);\n                            if (slot.isDaySlot !== startSlot.isDaySlot) {\n                                startSlot = view._slotByPosition(e.x.location, e.y.location);\n                                startTime = startSlot.startOffset(e.x.location, e.y.location, that.options.snap);\n                                distance = endTime - startTime;\n                                clonedEvent.isAllDay = slot.isDaySlot;\n                                clonedEvent.start = kendo.timezone.toLocalDate(startTime);\n                                clonedEvent.end = kendo.timezone.toLocalDate(endTime);\n                                view._updateMoveHint(clonedEvent, slot.groupIndex, distance);\n                                range = {\n                                    start: clonedEvent.start,\n                                    end: clonedEvent.end\n                                };\n                            } else {\n                                distance = endTime - startTime;\n                                view._updateMoveHint(clonedEvent, slot.groupIndex, distance);\n                                range = moveEventRange(clonedEvent, distance);\n                            }\n                            if (!that.trigger('move', {\n                                    event: event,\n                                    slot: {\n                                        element: slot.element,\n                                        start: slot.startDate(),\n                                        end: slot.endDate(),\n                                        isDaySlot: slot.isDaySlot\n                                    },\n                                    resources: view._resourceBySlot(slot),\n                                    start: range.start,\n                                    end: range.end\n                                })) {\n                                endSlot = slot;\n                            } else {\n                                view._updateMoveHint(clonedEvent, slot.groupIndex, distance);\n                            }\n                        }).bind('dragend', function (e) {\n                            that.view()._removeMoveHint();\n                            var distance = endTime - startTime;\n                            var range = moveEventRange(clonedEvent, distance);\n                            var start = range.start;\n                            var end = range.end;\n                            var endResources = that.view()._resourceBySlot(endSlot);\n                            var startResources = that.view()._resourceBySlot(startSlot);\n                            var prevented = that.trigger('moveEnd', {\n                                event: event,\n                                slot: {\n                                    element: endSlot.element,\n                                    start: endSlot.startDate(),\n                                    end: endSlot.endDate()\n                                },\n                                start: start,\n                                end: end,\n                                resources: endResources\n                            });\n                            if (!prevented && (event.start.getTime() !== start.getTime() || event.end.getTime() !== end.getTime() || originSlot.isDaySlot !== endSlot.isDaySlot || kendo.stringify(endResources) !== kendo.stringify(startResources))) {\n                                var updatedEventOptions = that.view()._eventOptionsForMove(event);\n                                var eventOptions;\n                                if (originSlot.isDaySlot !== endSlot.isDaySlot) {\n                                    if (endSlot.isDaySlot) {\n                                        eventOptions = $.extend({\n                                            start: endSlot.startDate(),\n                                            end: endSlot.startDate(),\n                                            isAllDay: endSlot.isDaySlot\n                                        }, updatedEventOptions, endResources);\n                                    } else {\n                                        eventOptions = $.extend({\n                                            isAllDay: endSlot.isDaySlot,\n                                            start: start,\n                                            end: end\n                                        }, updatedEventOptions, endResources);\n                                    }\n                                } else {\n                                    eventOptions = $.extend({\n                                        isAllDay: event.isAllDay,\n                                        start: start,\n                                        end: end\n                                    }, updatedEventOptions, endResources);\n                                }\n                                that._updateEvent(null, event, eventOptions, endSlot.groupIndex);\n                            }\n                            e.currentTarget.removeClass('k-event-active');\n                            this.cancelHold();\n                        }).bind('dragcancel', function () {\n                            that.view()._removeMoveHint();\n                            this.cancelHold();\n                        });\n                    }\n                    if (isMobile) {\n                        that._moveDraggable.bind('hold', function (e) {\n                            if (that.element.find('.k-scheduler-monthview').length) {\n                                e.preventDefault();\n                            }\n                            that.element.find('.k-event-active').removeClass('k-event-active');\n                            e.currentTarget.addClass('k-event-active');\n                        });\n                        if (!kendo.support.mobileOS.android) {\n                            that._moveDraggable.userEvents.bind('press', function (e) {\n                                e.preventDefault();\n                            });\n                        }\n                    }\n                }\n            },\n            _resizable: function () {\n                var startTime;\n                var endTime;\n                var event;\n                var clonedEvent;\n                var slot;\n                var that = this;\n                var distance = 0;\n                function direction(handle) {\n                    var directions = {\n                        'k-resize-e': 'east',\n                        'k-resize-w': 'west',\n                        'k-resize-n': 'north',\n                        'k-resize-s': 'south'\n                    };\n                    for (var key in directions) {\n                        if (handle.hasClass(key)) {\n                            return directions[key];\n                        }\n                    }\n                }\n                if (that._isMobile() && kendo.support.mobileOS.android) {\n                    distance = 5;\n                }\n                that._resizeDraggable = new kendo.ui.Draggable(that.element, {\n                    distance: distance,\n                    filter: '.k-resize-handle',\n                    autoScroll: true,\n                    dragstart: function (e) {\n                        var dragHandle = $(e.currentTarget);\n                        var eventElement = dragHandle.closest('.k-event');\n                        var uid = eventElement.attr(kendo.attr('uid'));\n                        var view = that.view();\n                        event = that.occurrenceByUid(uid);\n                        clonedEvent = event.clone();\n                        view._updateEventForResize(clonedEvent);\n                        slot = view._slotByPosition(e.x.startLocation, e.y.startLocation);\n                        if (that.trigger('resizeStart', { event: event })) {\n                            e.preventDefault();\n                        }\n                        startTime = kendo.date.toUtcTime(clonedEvent.start);\n                        endTime = kendo.date.toUtcTime(clonedEvent.end);\n                    },\n                    drag: function (e) {\n                        if (!slot) {\n                            return;\n                        }\n                        var dragHandle = $(e.currentTarget);\n                        var dir = direction(dragHandle);\n                        var view = that.view();\n                        var currentSlot = view._slotByPosition(e.x.location, e.y.location);\n                        if (!currentSlot || slot.groupIndex != currentSlot.groupIndex) {\n                            return;\n                        }\n                        slot = currentSlot;\n                        var originalStart = startTime;\n                        var originalEnd = endTime;\n                        if (dir == 'south') {\n                            if (!slot.isDaySlot && slot.end - kendo.date.toUtcTime(clonedEvent.start) >= view._timeSlotInterval()) {\n                                if (clonedEvent.isAllDay) {\n                                    endTime = slot.startOffset(e.x.location, e.y.location, that.options.snap);\n                                } else {\n                                    endTime = slot.endOffset(e.x.location, e.y.location, that.options.snap);\n                                }\n                            }\n                        } else if (dir == 'north') {\n                            if (!slot.isDaySlot && kendo.date.toUtcTime(clonedEvent.end) - slot.start >= view._timeSlotInterval()) {\n                                startTime = slot.startOffset(e.x.location, e.y.location, that.options.snap);\n                            }\n                        } else if (dir == 'east') {\n                            if (slot.isDaySlot && kendo.date.toUtcTime(kendo.date.getDate(slot.endDate())) >= kendo.date.toUtcTime(kendo.date.getDate(clonedEvent.start))) {\n                                if (clonedEvent.isAllDay) {\n                                    endTime = slot.startOffset(e.x.location, e.y.location, that.options.snap);\n                                } else {\n                                    endTime = slot.endOffset(e.x.location, e.y.location, that.options.snap);\n                                }\n                            } else if (!slot.isDaySlot && slot.end - kendo.date.toUtcTime(clonedEvent.start) >= view._timeSlotInterval()) {\n                                endTime = slot.endOffset(e.x.location, e.y.location, that.options.snap);\n                            }\n                        } else if (dir == 'west') {\n                            if (slot.isDaySlot && kendo.date.toUtcTime(kendo.date.getDate(clonedEvent.end)) >= kendo.date.toUtcTime(kendo.date.getDate(slot.startDate()))) {\n                                startTime = slot.startOffset(e.x.location, e.y.location, that.options.snap);\n                            } else if (!slot.isDaySlot && kendo.date.toUtcTime(clonedEvent.end) - slot.start >= view._timeSlotInterval()) {\n                                startTime = slot.startOffset(e.x.location, e.y.location, that.options.snap);\n                            }\n                        }\n                        if (!that.trigger('resize', {\n                                event: event,\n                                slot: {\n                                    element: slot.element,\n                                    start: slot.startDate(),\n                                    end: slot.endDate()\n                                },\n                                start: kendo.timezone.toLocalDate(startTime),\n                                end: kendo.timezone.toLocalDate(endTime),\n                                resources: view._resourceBySlot(slot)\n                            })) {\n                            view._updateResizeHint(clonedEvent, slot.groupIndex, startTime, endTime);\n                        } else {\n                            startTime = originalStart;\n                            endTime = originalEnd;\n                        }\n                    },\n                    dragend: function (e) {\n                        var dragHandle = $(e.currentTarget);\n                        var start = new Date(clonedEvent.start.getTime());\n                        var end = new Date(clonedEvent.end.getTime());\n                        var dir = direction(dragHandle);\n                        that.view()._removeResizeHint();\n                        if (dir == 'south') {\n                            end = kendo.timezone.toLocalDate(endTime);\n                        } else if (dir == 'north') {\n                            start = kendo.timezone.toLocalDate(startTime);\n                        } else if (dir == 'east') {\n                            if (slot.isDaySlot) {\n                                end = kendo.date.getDate(kendo.timezone.toLocalDate(endTime));\n                            } else {\n                                end = kendo.timezone.toLocalDate(endTime);\n                            }\n                        } else if (dir == 'west') {\n                            if (slot.isDaySlot) {\n                                start = new Date(kendo.timezone.toLocalDate(startTime));\n                                start.setHours(0);\n                                start.setMinutes(0);\n                            } else {\n                                start = kendo.timezone.toLocalDate(startTime);\n                            }\n                        }\n                        var prevented = that.trigger('resizeEnd', {\n                            event: event,\n                            slot: {\n                                element: slot.element,\n                                start: slot.startDate(),\n                                end: slot.endDate()\n                            },\n                            start: start,\n                            end: end,\n                            resources: that.view()._resourceBySlot(slot)\n                        });\n                        if (!prevented && end.getTime() >= start.getTime()) {\n                            if (clonedEvent.start.getTime() != start.getTime() || clonedEvent.end.getTime() != end.getTime()) {\n                                that.view()._updateEventForResize(event);\n                                that._updateEvent(dir, event, {\n                                    start: start,\n                                    end: end\n                                });\n                            }\n                        }\n                        slot = null;\n                        event = null;\n                    },\n                    dragcancel: function () {\n                        that.view()._removeResizeHint();\n                        slot = null;\n                        event = null;\n                    }\n                });\n            },\n            _updateEvent: function (dir, event, eventInfo, groupIndex) {\n                var that = this;\n                var updateEvent = function (event, callback) {\n                    try {\n                        that._preventRefresh = true;\n                        event.update(eventInfo);\n                        that._convertDates(event);\n                    } finally {\n                        that._preventRefresh = false;\n                    }\n                    if (!that.trigger(SAVE, { event: event })) {\n                        if (callback) {\n                            callback();\n                        }\n                        that._updateSelection(event, [event.uid], groupIndex);\n                        that.dataSource.sync();\n                    }\n                };\n                var recurrenceHead = function (event) {\n                    if (event.recurrenceRule) {\n                        return that.dataSource.getByUid(event.uid);\n                    } else {\n                        return that.dataSource.get(event.recurrenceId);\n                    }\n                };\n                var updateSeries = function () {\n                    var head = recurrenceHead(event);\n                    if (dir == 'south' || dir == 'north') {\n                        if (eventInfo.start) {\n                            var start = kendo.date.getDate(head.start);\n                            kendo.date.setTime(start, getMilliseconds(eventInfo.start));\n                            eventInfo.start = start;\n                        }\n                        if (eventInfo.end) {\n                            var end = kendo.date.getDate(head.end);\n                            kendo.date.setTime(end, getMilliseconds(eventInfo.end));\n                            eventInfo.end = end;\n                        }\n                    }\n                    that.dataSource._removeExceptions(head);\n                    updateEvent(head);\n                };\n                var updateOccurrence = function () {\n                    var head = recurrenceHead(event);\n                    var callback = function () {\n                        that._convertDates(head);\n                    };\n                    var exception = head.toOccurrence({\n                        start: event.start,\n                        end: event.end\n                    });\n                    updateEvent(that.dataSource.add(exception), callback);\n                };\n                if (event.recurrenceRule || event.isOccurrence()) {\n                    var recurrenceMessages = that.options.messages.recurrenceMessages;\n                    that._showRecurringDialog(event, updateOccurrence, updateSeries, {\n                        title: recurrenceMessages.editWindowTitle,\n                        text: recurrenceMessages.editRecurring ? recurrenceMessages.editRecurring : EDITRECURRING,\n                        occurrenceText: recurrenceMessages.editWindowOccurrence,\n                        seriesText: recurrenceMessages.editWindowSeries\n                    });\n                } else {\n                    updateEvent(that.dataSource.getByUid(event.uid));\n                }\n            },\n            _modelForContainer: function (container) {\n                container = $(container).closest('[' + kendo.attr('uid') + ']');\n                return this.dataSource.getByUid(container.attr(kendo.attr('uid')));\n            },\n            showDialog: function (options) {\n                this._editor.showDialog(options);\n            },\n            focus: function () {\n                this.wrapper.focus();\n            },\n            _confirmation: function (callback, model) {\n                var editable = this.options.editable;\n                if (editable === true || editable.confirmation !== false) {\n                    var messages = this.options.messages;\n                    var title = messages.deleteWindowTitle;\n                    var text = typeof editable.confirmation === STRING ? editable.confirmation : messages.editable.confirmation;\n                    if (this._isEditorOpened() && model.isRecurring()) {\n                        var recurrenceMessages = this.options.messages.recurrenceMessages;\n                        title = recurrenceMessages.deleteWindowTitle;\n                        if (model.isException()) {\n                            text = recurrenceMessages.deleteRecurringConfirmation ? recurrenceMessages.deleteRecurringConfirmation : DELETERECURRINGCONFIRM;\n                        } else {\n                            text = recurrenceMessages.deleteSeriesConfirmation ? recurrenceMessages.deleteSeriesConfirmation : DELETESERIESCONFIRM;\n                        }\n                    }\n                    var buttons = [{\n                            name: 'destroy',\n                            text: messages.destroy,\n                            click: function () {\n                                callback();\n                            }\n                        }];\n                    if (!(this._isMobile() && kendo.mobile.ui.Pane)) {\n                        buttons.push({\n                            name: 'canceledit',\n                            text: messages.cancel,\n                            click: function () {\n                                callback(true);\n                            }\n                        });\n                    }\n                    this._unbindResize();\n                    this.showDialog({\n                        model: model,\n                        text: text,\n                        title: title,\n                        buttons: buttons\n                    });\n                    this._bindResize();\n                } else {\n                    callback();\n                }\n            },\n            addEvent: function (eventInfo) {\n                var editable = this._editor.editable;\n                var dataSource = this.dataSource;\n                var event;\n                eventInfo = eventInfo || {};\n                var prevented = this.trigger('add', { event: eventInfo });\n                if (!prevented && (editable && editable.end() || !editable)) {\n                    this.cancelEvent();\n                    if (eventInfo && eventInfo.toJSON) {\n                        eventInfo = eventInfo.toJSON();\n                    }\n                    event = dataSource.add(eventInfo);\n                    if (event) {\n                        this.cancelEvent();\n                        this._editEvent(event);\n                    }\n                }\n            },\n            saveEvent: function () {\n                var editor = this._editor;\n                if (!editor) {\n                    return;\n                }\n                var editable = editor.editable;\n                var container = editor.container;\n                var model = this._modelForContainer(container);\n                if (container && editable && editable.end() && !this.trigger(SAVE, {\n                        container: container,\n                        event: model\n                    })) {\n                    if (model.isRecurrenceHead()) {\n                        this.dataSource._removeExceptions(model);\n                    }\n                    if (!model.dirty && !model.isOccurrence()) {\n                        this._convertDates(model, 'remove');\n                    }\n                    this.dataSource.sync();\n                }\n            },\n            cancelEvent: function () {\n                var editor = this._editor;\n                var container = editor.container;\n                var model;\n                if (container) {\n                    model = this._modelForContainer(container);\n                    if (model && model.isOccurrence()) {\n                        this._convertDates(model, 'remove');\n                        this._convertDates(this.dataSource.get(model.recurrenceId), 'remove');\n                    }\n                    this.dataSource.cancelChanges(model);\n                    editor.close();\n                }\n            },\n            editEvent: function (uid) {\n                var model = typeof uid == 'string' ? this.occurrenceByUid(uid) : uid;\n                if (!model) {\n                    return;\n                }\n                this.cancelEvent();\n                if (model.isRecurring()) {\n                    this._editRecurringDialog(model);\n                } else {\n                    this._editEvent(model);\n                }\n            },\n            _editEvent: function (model) {\n                this._unbindResize();\n                this._createPopupEditor(model);\n                this._bindResize();\n            },\n            _editRecurringDialog: function (model) {\n                var that = this;\n                var editOccurrence = function () {\n                    if (model.isException()) {\n                        that._editEvent(model);\n                    } else {\n                        that.addEvent(model);\n                    }\n                };\n                var editSeries = function () {\n                    if (model.recurrenceId) {\n                        model = that.dataSource.get(model.recurrenceId);\n                    }\n                    that._editEvent(model);\n                };\n                var recurrenceMessages = that.options.messages.recurrenceMessages;\n                that._showRecurringDialog(model, editOccurrence, editSeries, {\n                    title: recurrenceMessages.editWindowTitle,\n                    text: recurrenceMessages.editRecurring ? recurrenceMessages.editRecurring : EDITRECURRING,\n                    occurrenceText: recurrenceMessages.editWindowOccurrence,\n                    seriesText: recurrenceMessages.editWindowSeries\n                });\n            },\n            _showRecurringDialog: function (model, editOccurrence, editSeries, messages) {\n                var that = this;\n                var editable = that.options.editable;\n                var editRecurringMode = isPlainObject(editable) ? editable.editRecurringMode : 'dialog';\n                if (editRecurringMode === 'series') {\n                    editSeries();\n                } else if (editRecurringMode === 'occurrence') {\n                    editOccurrence();\n                } else {\n                    this._unbindResize();\n                    that.showDialog({\n                        model: model,\n                        title: messages.title,\n                        text: messages.text,\n                        buttons: [\n                            {\n                                text: messages.occurrenceText,\n                                click: editOccurrence\n                            },\n                            {\n                                text: messages.seriesText,\n                                click: editSeries\n                            }\n                        ]\n                    });\n                    this._bindResize();\n                }\n            },\n            _createButton: function (command) {\n                var template = command.template || COMMANDBUTTONTMPL, commandName = typeof command === STRING ? command : command.name || command.text, options = {\n                        className: 'k-scheduler-' + (commandName || '').replace(/\\s/g, ''),\n                        text: commandName,\n                        attr: ''\n                    };\n                if (!commandName && !(isPlainObject(command) && command.template)) {\n                    throw new Error('Custom commands should have name specified');\n                }\n                if (isPlainObject(command)) {\n                    if (command.className) {\n                        command.className += ' ' + options.className;\n                    }\n                    if (commandName === 'edit' && isPlainObject(command.text)) {\n                        command = extend(true, {}, command);\n                        command.text = command.text.edit;\n                    }\n                    options = extend(true, options, defaultCommands[commandName], command);\n                } else {\n                    options = extend(true, options, defaultCommands[commandName]);\n                }\n                return kendo.template(template)(options);\n            },\n            _convertDates: function (model, method) {\n                var timezone = this.dataSource.reader.timezone;\n                var startTimezone = model.startTimezone;\n                var endTimezone = model.endTimezone;\n                var start = model.start;\n                var end = model.start;\n                method = method || 'apply';\n                startTimezone = startTimezone || endTimezone;\n                endTimezone = endTimezone || startTimezone;\n                if (startTimezone) {\n                    if (timezone) {\n                        if (method === 'apply') {\n                            start = kendo.timezone.convert(model.start, timezone, startTimezone);\n                            end = kendo.timezone.convert(model.end, timezone, endTimezone);\n                        } else {\n                            start = kendo.timezone.convert(model.start, startTimezone, timezone);\n                            end = kendo.timezone.convert(model.end, endTimezone, timezone);\n                        }\n                    } else {\n                        start = kendo.timezone[method](model.start, startTimezone);\n                        end = kendo.timezone[method](model.end, endTimezone);\n                    }\n                    model._set('start', start);\n                    model._set('end', end);\n                }\n            },\n            _createEditor: function () {\n                var that = this;\n                var editor;\n                if (this._isMobile() && kendo.mobile.ui.Pane) {\n                    editor = that._editor = new MobileEditor(this.wrapper, extend({}, this.options, {\n                        target: this,\n                        timezone: that.dataSource.reader.timezone,\n                        resources: that.resources,\n                        createButton: proxy(this._createButton, this)\n                    }));\n                } else {\n                    editor = that._editor = new PopupEditor(this.wrapper, extend({}, this.options, {\n                        target: this,\n                        createButton: proxy(this._createButton, this),\n                        timezone: that.dataSource.reader.timezone,\n                        resources: that.resources\n                    }));\n                }\n                editor.bind('cancel', function (e) {\n                    if (that.trigger('cancel', {\n                            container: e.container,\n                            event: e.model\n                        })) {\n                        e.preventDefault();\n                        return;\n                    }\n                    that.cancelEvent();\n                    that.focus();\n                });\n                editor.bind('edit', function (e) {\n                    if (that.trigger(EDIT, {\n                            container: e.container,\n                            event: e.model\n                        })) {\n                        e.preventDefault();\n                    }\n                });\n                editor.bind('save', function () {\n                    that.saveEvent();\n                });\n                editor.bind('remove', function (e) {\n                    that.removeEvent(e.model);\n                });\n            },\n            _createPopupEditor: function (model) {\n                var editor = this._editor;\n                if (!model.isNew() || model.isOccurrence()) {\n                    if (model.isOccurrence()) {\n                        this._convertDates(model.recurrenceId ? this.dataSource.get(model.recurrenceId) : model);\n                    }\n                    this._convertDates(model);\n                }\n                this.editable = editor.editEvent(model);\n            },\n            removeEvent: function (uid) {\n                var that = this, model = typeof uid == 'string' ? that.occurrenceByUid(uid) : uid;\n                if (!model) {\n                    return;\n                }\n                if (model.isRecurring()) {\n                    that._deleteRecurringDialog(model);\n                } else {\n                    that._confirmation(function (cancel) {\n                        if (!cancel) {\n                            that._removeEvent(model);\n                        }\n                    }, model);\n                }\n            },\n            occurrenceByUid: function (uid) {\n                var occurrence = this.dataSource.getByUid(uid);\n                if (!occurrence) {\n                    occurrence = getOccurrenceByUid(this._data, uid);\n                }\n                return occurrence;\n            },\n            occurrencesInRange: function (start, end) {\n                return new kendo.data.Query(this._data).filter({\n                    logic: 'or',\n                    filters: [\n                        {\n                            logic: 'and',\n                            filters: [\n                                {\n                                    field: 'start',\n                                    operator: 'gte',\n                                    value: start\n                                },\n                                {\n                                    field: 'end',\n                                    operator: 'gte',\n                                    value: start\n                                },\n                                {\n                                    field: 'start',\n                                    operator: 'lt',\n                                    value: end\n                                }\n                            ]\n                        },\n                        {\n                            logic: 'and',\n                            filters: [\n                                {\n                                    field: 'start',\n                                    operator: 'lte',\n                                    value: start\n                                },\n                                {\n                                    field: 'end',\n                                    operator: 'gt',\n                                    value: start\n                                }\n                            ]\n                        }\n                    ]\n                }).toArray();\n            },\n            _removeEvent: function (model) {\n                if (!this.trigger(REMOVE, { event: model })) {\n                    if (this.dataSource.remove(model)) {\n                        this.dataSource.sync();\n                    }\n                }\n            },\n            _deleteRecurringDialog: function (model) {\n                var that = this;\n                var currentModel = model;\n                var editable = that.options.editable;\n                var deleteOccurrence;\n                var deleteSeries;\n                var deleteOccurrenceConfirmation;\n                var deleteSeriesConfirmation;\n                var editRecurringMode = isPlainObject(editable) ? editable.editRecurringMode : 'dialog';\n                deleteOccurrence = function () {\n                    var occurrence = currentModel.recurrenceId ? currentModel : currentModel.toOccurrence();\n                    var head = that.dataSource.get(occurrence.recurrenceId);\n                    that._convertDates(head);\n                    that._removeEvent(occurrence);\n                };\n                deleteSeries = function () {\n                    if (currentModel.recurrenceId) {\n                        currentModel = that.dataSource.get(currentModel.recurrenceId);\n                    }\n                    that._removeEvent(currentModel);\n                };\n                if (editRecurringMode != 'dialog' || that._isEditorOpened()) {\n                    deleteOccurrenceConfirmation = function () {\n                        that._confirmation(function (cancel) {\n                            if (!cancel) {\n                                deleteOccurrence();\n                            }\n                        }, currentModel);\n                    };\n                    deleteSeriesConfirmation = function () {\n                        that._confirmation(function (cancel) {\n                            if (!cancel) {\n                                deleteSeries();\n                            }\n                        }, currentModel);\n                    };\n                }\n                var seriesCallback = deleteSeriesConfirmation || deleteSeries;\n                var occurrenceCallback = deleteOccurrenceConfirmation || deleteOccurrence;\n                if (that._isEditorOpened()) {\n                    if (model.isException()) {\n                        occurrenceCallback();\n                    } else {\n                        seriesCallback();\n                    }\n                } else {\n                    var recurrenceMessages = that.options.messages.recurrenceMessages;\n                    that._showRecurringDialog(model, occurrenceCallback, seriesCallback, {\n                        title: recurrenceMessages.deleteWindowTitle,\n                        text: recurrenceMessages.deleteRecurring ? recurrenceMessages.deleteRecurring : DELETERECURRING,\n                        occurrenceText: recurrenceMessages.deleteWindowOccurrence,\n                        seriesText: recurrenceMessages.deleteWindowSeries\n                    });\n                }\n            },\n            _isEditorOpened: function () {\n                return !!this._editor.container;\n            },\n            _unbindView: function (view) {\n                var that = this;\n                that.angular('cleanup', function () {\n                    return { elements: that.items() };\n                });\n                view.destroy();\n            },\n            _bindView: function (view) {\n                var that = this;\n                if (that.options.editable) {\n                    if (that._viewRemoveHandler) {\n                        view.unbind(REMOVE, that._viewRemoveHandler);\n                    }\n                    that._viewRemoveHandler = function (e) {\n                        that.removeEvent(e.uid);\n                    };\n                    view.bind(REMOVE, that._viewRemoveHandler);\n                    if (that._viewAddHandler) {\n                        view.unbind(ADD, that._viewAddHandler);\n                    }\n                    that._viewAddHandler = function (e) {\n                        that.addEvent(e.eventInfo);\n                    };\n                    view.bind(ADD, this._viewAddHandler);\n                    if (that._viewEditHandler) {\n                        view.unbind(EDIT, that._viewEditHandler);\n                    }\n                    that._viewEditHandler = function (e) {\n                        that.editEvent(e.uid);\n                    };\n                    view.bind(EDIT, this._viewEditHandler);\n                }\n                if (that._viewNavigateHandler) {\n                    view.unbind('navigate', that._viewNavigateHandler);\n                }\n                that._viewNavigateHandler = function (e) {\n                    if (e.view) {\n                        var switchWorkDay = 'isWorkDay' in e;\n                        var action = switchWorkDay ? 'changeWorkDay' : 'changeView';\n                        if (!that.trigger('navigate', {\n                                view: e.view,\n                                isWorkDay: e.isWorkDay,\n                                action: action,\n                                date: e.date\n                            })) {\n                            if (switchWorkDay) {\n                                that._workDayMode = e.isWorkDay;\n                            }\n                            that._selectView(e.view);\n                            that.date(e.date);\n                        }\n                    }\n                };\n                view.bind('navigate', that._viewNavigateHandler);\n                if (that._viewActivateHandler) {\n                    view.unbind('activate', that._viewActivateHandler);\n                }\n                that._viewActivateHandler = function () {\n                    var view = this;\n                    if (that._selection) {\n                        view.constrainSelection(that._selection);\n                        that._select();\n                        that._adjustSelectedDate();\n                    }\n                };\n                view.bind('activate', that._viewActivateHandler);\n            },\n            _selectView: function (name) {\n                var that = this;\n                if (name && that.views[name]) {\n                    if (that._selectedView) {\n                        that._unbindView(that._selectedView);\n                    }\n                    that._selectedView = that._renderView(name);\n                    that._selectedViewName = name;\n                    if (that._viewsCount > 1) {\n                        var viewButton = VIEWBUTTONTEMPLATE({\n                            views: that.views,\n                            view: name,\n                            ns: kendo.ns\n                        });\n                        var firstButton = that.toolbar.find('.k-scheduler-views li:first-child');\n                        if (firstButton.is('.k-current-view')) {\n                            firstButton.replaceWith(viewButton);\n                        } else {\n                            that.toolbar.find('.k-scheduler-views').prepend(viewButton);\n                        }\n                        var viewButtons = that.toolbar.find('.k-scheduler-views li').removeClass('k-state-selected');\n                        viewButtons.end().find('.k-view-' + name.replace(/\\./g, '\\\\.').toLowerCase()).addClass('k-state-selected');\n                    }\n                }\n            },\n            view: function (name) {\n                var that = this;\n                if (name) {\n                    that._selectView(name);\n                    that.rebind();\n                    return;\n                }\n                return that._selectedView;\n            },\n            viewName: function () {\n                return this.view().name;\n            },\n            _renderView: function (name) {\n                var view = this._initializeView(name);\n                this._bindView(view);\n                this._model.set('formattedDate', view.dateForTitle());\n                this._model.set('formattedShortDate', view.shortDateForTitle());\n                return view;\n            },\n            resize: function (force) {\n                var size = this.getSize();\n                var currentSize = this._size;\n                var view = this.view();\n                if (!view || !view.groups) {\n                    return;\n                }\n                if (force || !currentSize || size.width !== currentSize.width || size.height !== currentSize.height) {\n                    this.refresh({ action: 'resize' });\n                    this._size = size;\n                }\n            },\n            _adjustSelectedDate: function () {\n                var date = this._model.selectedDate, selection = this._selection, start = selection.start;\n                if (start && !kendo.date.isInDateRange(date, getDate(start), getDate(selection.end))) {\n                    date.setFullYear(start.getFullYear(), start.getMonth(), start.getDate());\n                }\n            },\n            _initializeView: function (name) {\n                var view = this.views[name];\n                if (view) {\n                    var isSettings = isPlainObject(view), type = view.type;\n                    if (typeof type === STRING) {\n                        type = kendo.getter(view.type)(window);\n                    }\n                    if (type) {\n                        view = new type(this.wrapper, trimOptions(extend(true, {}, this.options, isSettings ? view : {}, {\n                            resources: this.resources,\n                            date: this.date(),\n                            showWorkHours: this._workDayMode\n                        })));\n                    } else {\n                        throw new Error('There is no such view');\n                    }\n                }\n                return view;\n            },\n            _views: function () {\n                var views = this.options.views;\n                var view;\n                var defaultView;\n                var selected;\n                var isSettings;\n                var name;\n                var type;\n                var idx;\n                var length;\n                this.views = {};\n                this._viewsCount = 0;\n                for (idx = 0, length = views.length; idx < length; idx++) {\n                    var hasType = false;\n                    view = views[idx];\n                    isSettings = isPlainObject(view);\n                    if (isSettings) {\n                        type = name = view.type ? view.type : view;\n                        if (typeof type !== STRING) {\n                            name = view.name || view.title;\n                            hasType = true;\n                        }\n                    } else {\n                        type = name = view;\n                    }\n                    defaultView = defaultViews[name];\n                    if (defaultView && !hasType) {\n                        view.type = defaultView.type;\n                        defaultView.title = this.options.messages.views[name];\n                        if (defaultView.type === 'day') {\n                            defaultView.messages = { allDay: this.options.messages.allDay };\n                        } else if (defaultView.type === 'agenda') {\n                            defaultView.messages = {\n                                event: this.options.messages.event,\n                                date: this.options.messages.date,\n                                time: this.options.messages.time\n                            };\n                        }\n                    }\n                    view = extend({ title: name }, defaultView, isSettings ? view : {});\n                    if (name) {\n                        this.views[name] = view;\n                        this._viewsCount++;\n                        if (!selected || view.selected) {\n                            selected = name;\n                        }\n                    }\n                }\n                if (selected) {\n                    this._selectedViewName = selected;\n                }\n            },\n            rebind: function () {\n                this.dataSource.fetch();\n            },\n            _dataSource: function () {\n                var that = this, options = that.options, dataSource = options.dataSource;\n                dataSource = isArray(dataSource) ? { data: dataSource } : dataSource;\n                if (options.timezone && !(dataSource instanceof SchedulerDataSource)) {\n                    dataSource = extend(true, dataSource, { schema: { timezone: options.timezone } });\n                } else if (dataSource instanceof SchedulerDataSource) {\n                    options.timezone = dataSource.options.schema ? dataSource.options.schema.timezone : '';\n                }\n                if (that.dataSource && that._refreshHandler) {\n                    that.dataSource.unbind(CHANGE, that._refreshHandler).unbind('progress', that._progressHandler).unbind('error', that._errorHandler);\n                } else {\n                    that._refreshHandler = proxy(that.refresh, that);\n                    that._progressHandler = proxy(that._requestStart, that);\n                    that._errorHandler = proxy(that._error, that);\n                }\n                that.dataSource = kendo.data.SchedulerDataSource.create(dataSource).bind(CHANGE, that._refreshHandler).bind('progress', that._progressHandler).bind('error', that._errorHandler);\n                that.options.dataSource = that.dataSource;\n            },\n            _error: function () {\n                this._progress(false);\n            },\n            _requestStart: function () {\n                this._progress(true);\n            },\n            _progress: function (toggle) {\n                var element = this.element.find('.k-scheduler-content');\n                kendo.ui.progress(element, toggle);\n            },\n            _resources: function () {\n                var that = this;\n                var resources = that.options.resources;\n                for (var idx = 0; idx < resources.length; idx++) {\n                    var resource = resources[idx];\n                    var field = resource.field;\n                    var dataSource = resource.dataSource;\n                    if (!field || !dataSource) {\n                        throw new Error('The \"field\" and \"dataSource\" options of the scheduler resource are mandatory.');\n                    }\n                    that.resources.push({\n                        field: field,\n                        name: resource.name || field,\n                        title: resource.title || field,\n                        dataTextField: resource.dataTextField || 'text',\n                        dataValueField: resource.dataValueField || 'value',\n                        dataColorField: resource.dataColorField || 'color',\n                        valuePrimitive: resource.valuePrimitive != null ? resource.valuePrimitive : true,\n                        multiple: resource.multiple || false,\n                        dataSource: kendo.data.DataSource.create(dataSource)\n                    });\n                }\n                var promises = $.map(that.resources, function (resource) {\n                    return resource.dataSource.fetch();\n                });\n                $.when.apply(null, promises).then(function () {\n                    if (that.options.autoBind) {\n                        that.view(that._selectedViewName);\n                    } else {\n                        that._selectView(that._selectedViewName);\n                    }\n                });\n            },\n            _initModel: function () {\n                var that = this;\n                that._model = kendo.observable({\n                    selectedDate: new Date(this.options.date),\n                    formattedDate: '',\n                    formattedShortDate: ''\n                });\n                that._model.bind('change', function (e) {\n                    if (e.field === 'selectedDate') {\n                        that.view(that._selectedViewName);\n                    }\n                });\n            },\n            _wrapper: function () {\n                var that = this;\n                var options = that.options;\n                var height = options.height;\n                var width = options.width;\n                that.wrapper = that.element.addClass('k-widget k-scheduler k-floatwrap').attr('role', 'grid').attr('aria-multiselectable', true);\n                if (that._isMobile()) {\n                    that.wrapper.addClass('k-scheduler-mobile');\n                }\n                if (that._isMobilePhoneView()) {\n                    that.wrapper.addClass('k-scheduler-phone');\n                }\n                if (height) {\n                    that.wrapper.height(height);\n                }\n                if (width) {\n                    that.wrapper.width(width);\n                }\n            },\n            date: function (value) {\n                if (value != null && getDate(value) >= getDate(this.options.min) && getDate(value) <= getDate(this.options.max)) {\n                    this._model.set('selectedDate', value);\n                }\n                return getDate(this._model.get('selectedDate'));\n            },\n            _toolbar: function () {\n                var that = this;\n                var options = that.options;\n                var commands = [];\n                if (options.toolbar) {\n                    commands = $.isArray(options.toolbar) ? options.toolbar : [options.toolbar];\n                }\n                var template = this._isMobilePhoneView() ? MOBILETOOLBARTEMPLATE : TOOLBARTEMPLATE;\n                var toolbar = $(template({\n                    messages: options.messages,\n                    pdf: $.grep(commands, function (item) {\n                        return item == 'pdf' || item.name == 'pdf';\n                    }).length > 0,\n                    ns: kendo.ns,\n                    views: that.views,\n                    viewsCount: that._viewsCount\n                }));\n                that.wrapper.append(toolbar);\n                that.toolbar = toolbar;\n                kendo.bind(that.toolbar, that._model);\n                toolbar.on(CLICK + NS, '.k-pdf', function (e) {\n                    e.preventDefault();\n                    that.saveAsPDF();\n                });\n                toolbar.on(CLICK + NS, '.k-scheduler-navigation li', function (e) {\n                    var li = $(this);\n                    var date = new Date(that.date());\n                    var action = '';\n                    e.preventDefault();\n                    if (li.hasClass('k-nav-today')) {\n                        action = 'today';\n                        date = new Date();\n                    } else if (li.hasClass('k-nav-next')) {\n                        action = 'next';\n                        date = that.view().nextDate();\n                    } else if (li.hasClass('k-nav-prev')) {\n                        action = 'previous';\n                        date = that.view().previousDate();\n                    } else if (li.hasClass('k-nav-current') && !that._isMobilePhoneView()) {\n                        that._showCalendar();\n                        return;\n                    }\n                    if (!that.trigger('navigate', {\n                            view: that._selectedViewName,\n                            action: action,\n                            date: date\n                        })) {\n                        that.date(date);\n                    }\n                });\n                toolbar.on(CLICK + NS, '.k-scheduler-views li:not(.k-current-view), .k-scheduler-refresh', function (e) {\n                    e.preventDefault();\n                    var name = $(this).attr(kendo.attr('name'));\n                    if (!that.trigger('navigate', {\n                            view: name,\n                            action: 'changeView',\n                            date: that.date()\n                        })) {\n                        that.view(name);\n                        that.element.find('.k-state-expanded').removeClass('k-state-expanded');\n                    }\n                });\n                toolbar.on(CLICK + NS, '.k-scheduler-views li.k-current-view', function (e) {\n                    e.preventDefault();\n                    that.element.find('.k-scheduler-views').toggleClass('k-state-expanded');\n                    $(document).on(MOUSEDOWN + NS, function (e) {\n                        if ($(e.target).closest('.k-scheduler-views').length === 0) {\n                            that.element.find('.k-state-expanded').removeClass('k-state-expanded');\n                            $(document).off(CLICK + NS);\n                        }\n                    });\n                });\n                toolbar.find('li').hover(function () {\n                    $(this).addClass('k-state-hover');\n                }, function () {\n                    $(this).removeClass('k-state-hover');\n                });\n            },\n            _showCalendar: function () {\n                var that = this, target = that.toolbar.find('.k-nav-current'), html = $('<div class=\"k-calendar-container\"><div class=\"k-scheduler-calendar\"/></div>');\n                if (!that.popup) {\n                    that.popup = new Popup(html, {\n                        anchor: target,\n                        open: function () {\n                            if (!that.calendar) {\n                                that.calendar = new Calendar(this.element.find('.k-scheduler-calendar'), {\n                                    change: function () {\n                                        var date = this.value();\n                                        if (!that.trigger('navigate', {\n                                                view: that._selectedViewName,\n                                                action: 'changeDate',\n                                                date: date\n                                            })) {\n                                            that.date(date);\n                                            that.popup.close();\n                                        }\n                                    },\n                                    min: that.options.min,\n                                    max: that.options.max\n                                });\n                            }\n                            that.calendar.value(that.date());\n                        },\n                        copyAnchorStyles: false\n                    });\n                }\n                that.popup.open();\n            },\n            refresh: function (e) {\n                var that = this;\n                var view = this.view();\n                this._progress(false);\n                this.angular('cleanup', function () {\n                    return { elements: that.items() };\n                });\n                e = e || {};\n                if (!view) {\n                    return;\n                }\n                if (e && e.action === 'itemchange' && (this._editor.editable || this._preventRefresh)) {\n                    return;\n                }\n                if (this.trigger('dataBinding', {\n                        action: e.action || 'rebind',\n                        index: e.index,\n                        items: e.items\n                    })) {\n                    return;\n                }\n                if (!(e && e.action === 'resize') && this._editor) {\n                    this._editor.close();\n                }\n                this._data = this.dataSource.expand(view.startDate(), view.endDate());\n                view.refreshLayout();\n                view.render(this._data);\n                this.trigger('dataBound');\n            },\n            slotByPosition: function (x, y) {\n                var view = this.view();\n                if (!view._slotByPosition) {\n                    return null;\n                }\n                var slot = view._slotByPosition(x, y);\n                if (!slot) {\n                    return null;\n                }\n                return {\n                    startDate: slot.startDate(),\n                    endDate: slot.endDate(),\n                    groupIndex: slot.groupIndex,\n                    element: slot.element,\n                    isDaySlot: slot.isDaySlot\n                };\n            },\n            slotByElement: function (element) {\n                var offset = $(element).offset();\n                return this.slotByPosition(offset.left, offset.top);\n            },\n            resourcesBySlot: function (slot) {\n                return this.view()._resourceBySlot(slot);\n            }\n        });\n        var defaultViews = {\n            day: { type: 'kendo.ui.DayView' },\n            week: { type: 'kendo.ui.WeekView' },\n            workWeek: { type: 'kendo.ui.WorkWeekView' },\n            agenda: { type: 'kendo.ui.AgendaView' },\n            month: { type: 'kendo.ui.MonthView' },\n            timeline: { type: 'kendo.ui.TimelineView' },\n            timelineWeek: { type: 'kendo.ui.TimelineWeekView' },\n            timelineWorkWeek: { type: 'kendo.ui.TimelineWorkWeekView' },\n            timelineMonth: { type: 'kendo.ui.TimelineMonthView' }\n        };\n        ui.plugin(Scheduler);\n        if (kendo.PDFMixin) {\n            kendo.PDFMixin.extend(Scheduler.prototype);\n            var SCHEDULER_EXPORT = 'k-scheduler-pdf-export';\n            Scheduler.fn._drawPDF = function (progress) {\n                var wrapper = this.wrapper;\n                var styles = wrapper[0].style.cssText;\n                wrapper.css({\n                    width: wrapper.width(),\n                    height: wrapper.height()\n                });\n                wrapper.addClass(SCHEDULER_EXPORT);\n                var scheduler = this;\n                var promise = new $.Deferred();\n                var table = wrapper.find('.k-scheduler-content').find('table').css('table-layout', 'auto');\n                setTimeout(function () {\n                    table.css('table-layout', 'fixed');\n                    scheduler.resize(true);\n                    scheduler._drawPDFShadow({}, { avoidLinks: scheduler.options.pdf.avoidLinks }).done(function (group) {\n                        var args = {\n                            page: group,\n                            pageNumber: 1,\n                            progress: 1,\n                            totalPages: 1\n                        };\n                        progress.notify(args);\n                        promise.resolve(args.page);\n                    }).fail(function (err) {\n                        promise.reject(err);\n                    }).always(function () {\n                        wrapper[0].style.cssText = styles;\n                        wrapper.removeClass(SCHEDULER_EXPORT);\n                        scheduler.resize(true);\n                        scheduler.resize(true);\n                    });\n                });\n                return promise;\n            };\n        }\n        var TimezoneEditor = Widget.extend({\n            init: function (element, options) {\n                var that = this, zones = kendo.timezone.windows_zones;\n                if (!zones || !kendo.timezone.zones_titles) {\n                    throw new Error('kendo.timezones.min.js is not included.');\n                }\n                Widget.fn.init.call(that, element, options);\n                that.wrapper = that.element;\n                that._zonesQuery = new kendo.data.Query(zones);\n                that._zoneTitleId = kendo.guid();\n                that._zoneTitlePicker();\n                that._zonePicker();\n                that._zoneTitle.bind('cascade', function () {\n                    if (!this.value()) {\n                        that._zone.wrapper.hide();\n                    }\n                });\n                that._zone.bind('cascade', function () {\n                    that._value = this.value();\n                    that.trigger('change');\n                });\n                that.value(that.options.value);\n            },\n            options: {\n                name: 'TimezoneEditor',\n                value: '',\n                optionLabel: 'No timezone'\n            },\n            events: ['change'],\n            _zoneTitlePicker: function () {\n                var that = this, zoneTitle = $('<input id=\"' + that._zoneTitleId + '\" aria-label=\"' + that.options.title + '\"/>').appendTo(that.wrapper);\n                that._zoneTitle = new kendo.ui.DropDownList(zoneTitle, {\n                    dataSource: kendo.timezone.zones_titles,\n                    dataValueField: 'other_zone',\n                    dataTextField: 'name',\n                    optionLabel: that.options.optionLabel\n                });\n            },\n            _zonePicker: function () {\n                var that = this, zone = $('<input aria-label=\"' + that.options.title + '\"/>').appendTo(this.wrapper);\n                that._zone = new kendo.ui.DropDownList(zone, {\n                    dataValueField: 'zone',\n                    dataTextField: 'territory',\n                    dataSource: that._zonesQuery.data,\n                    cascadeFrom: that._zoneTitleId,\n                    dataBound: function () {\n                        that._value = this.value();\n                        this.wrapper.toggle(this.dataSource.view().length > 1);\n                    }\n                });\n                that._zone.wrapper.hide();\n            },\n            destroy: function () {\n                Widget.fn.destroy.call(this);\n                kendo.destroy(this.wrapper);\n            },\n            value: function (value) {\n                var that = this, zone;\n                if (value === undefined) {\n                    return that._value;\n                }\n                zone = that._zonesQuery.filter({\n                    field: 'zone',\n                    operator: 'eq',\n                    value: value\n                }).data[0];\n                if (zone) {\n                    that._zoneTitle.value(zone.other_zone);\n                    that._zone.value(zone.zone);\n                } else {\n                    that._zoneTitle.select(0);\n                }\n            }\n        });\n        ui.plugin(TimezoneEditor);\n        var ZONETITLEOPTIONTEMPLATE = kendo.template('<option value=\"#=other_zone#\">#=name#</option>');\n        var ZONEOPTIONTEMPLATE = kendo.template('<option value=\"#=zone#\">#=territory#</option>');\n        var MobileTimezoneEditor = Widget.extend({\n            init: function (element, options) {\n                var that = this, zones = kendo.timezone.windows_zones;\n                if (!zones || !kendo.timezone.zones_titles) {\n                    throw new Error('kendo.timezones.min.js is not included.');\n                }\n                Widget.fn.init.call(that, element, options);\n                that.wrapper = that.element;\n                that._zonesQuery = new kendo.data.Query(zones);\n                that._zoneTitlePicker();\n                that._zonePicker();\n                that.value(that.options.value);\n            },\n            options: {\n                name: 'MobileTimezoneEditor',\n                optionLabel: 'No timezone',\n                value: ''\n            },\n            events: ['change'],\n            _bindZones: function (value) {\n                var data = value ? this._filter(value) : [];\n                this._zone.html(this._options(data, ZONEOPTIONTEMPLATE));\n            },\n            _filter: function (value) {\n                return this._zonesQuery.filter({\n                    field: 'other_zone',\n                    operator: 'eq',\n                    value: value\n                }).data;\n            },\n            _options: function (data, template, optionLabel) {\n                var idx = 0;\n                var html = '';\n                var length = data.length;\n                if (optionLabel) {\n                    html += template({\n                        other_zone: '',\n                        name: optionLabel\n                    });\n                }\n                for (; idx < length; idx++) {\n                    html += template(data[idx]);\n                }\n                return html;\n            },\n            _zoneTitlePicker: function () {\n                var that = this;\n                var options = that._options(kendo.timezone.zones_titles, ZONETITLEOPTIONTEMPLATE, that.options.optionLabel);\n                that._zoneTitle = $('<select>' + options + '</select>').appendTo(that.wrapper).change(function () {\n                    var value = this.value;\n                    var zone = that._zone;\n                    that._bindZones(value);\n                    if (value && zone[0].children.length > 1) {\n                        zone.show();\n                    } else {\n                        zone.hide();\n                    }\n                    that._value = zone[0].value;\n                    that.trigger('change');\n                });\n            },\n            _zonePicker: function () {\n                var that = this;\n                that._zone = $('<select style=\"display:none\"></select>').appendTo(this.wrapper).change(function () {\n                    that._value = this.value;\n                    that.trigger('change');\n                });\n                that._bindZones(that._zoneTitle.val());\n                that._value = that._zone[0].value;\n            },\n            destroy: function () {\n                Widget.fn.destroy.call(this);\n                kendo.destroy(this.wrapper);\n            },\n            value: function (value) {\n                var that = this;\n                var zonePicker = that._zone;\n                var other_zone = '';\n                var zone_value = '';\n                var zone;\n                if (value === undefined) {\n                    return that._value;\n                }\n                zone = that._zonesQuery.filter({\n                    field: 'zone',\n                    operator: 'eq',\n                    value: value\n                }).data[0];\n                if (zone) {\n                    zone_value = zone.zone;\n                    other_zone = zone.other_zone;\n                }\n                that._zoneTitle.val(other_zone);\n                that._bindZones(other_zone);\n                zonePicker.val(zone_value);\n                zone_value = zonePicker[0].value;\n                if (zone_value && zonePicker[0].children.length > 1) {\n                    zonePicker.show();\n                } else {\n                    zonePicker.hide();\n                }\n                that._value = zone_value;\n            }\n        });\n        ui.plugin(MobileTimezoneEditor);\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.touch', [\n        'kendo.core',\n        'kendo.userevents'\n    ], f);\n}(function () {\n    var __meta__ = {\n        id: 'touch',\n        name: 'Touch',\n        category: 'mobile',\n        description: 'The kendo Touch widget provides a cross-platform compatible API for handling user-initiated touch events, multi-touch gestures and event sequences (drag, swipe, etc.). ',\n        depends: [\n            'core',\n            'userevents'\n        ]\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, Widget = kendo.ui.Widget, proxy = $.proxy, abs = Math.abs, MAX_DOUBLE_TAP_DISTANCE = 20;\n        var Touch = Widget.extend({\n            init: function (element, options) {\n                var that = this;\n                Widget.fn.init.call(that, element, options);\n                options = that.options;\n                element = that.element;\n                that.wrapper = element;\n                function eventProxy(name) {\n                    return function (e) {\n                        that._triggerTouch(name, e);\n                    };\n                }\n                function gestureEventProxy(name) {\n                    return function (e) {\n                        that.trigger(name, {\n                            touches: e.touches,\n                            distance: e.distance,\n                            center: e.center,\n                            event: e.event\n                        });\n                    };\n                }\n                that.events = new kendo.UserEvents(element, {\n                    filter: options.filter,\n                    surface: options.surface,\n                    minHold: options.minHold,\n                    multiTouch: options.multiTouch,\n                    allowSelection: true,\n                    fastTap: options.fastTap,\n                    press: eventProxy('touchstart'),\n                    hold: eventProxy('hold'),\n                    tap: proxy(that, '_tap'),\n                    gesturestart: gestureEventProxy('gesturestart'),\n                    gesturechange: gestureEventProxy('gesturechange'),\n                    gestureend: gestureEventProxy('gestureend')\n                });\n                if (options.enableSwipe) {\n                    that.events.bind('start', proxy(that, '_swipestart'));\n                    that.events.bind('move', proxy(that, '_swipemove'));\n                } else {\n                    that.events.bind('start', proxy(that, '_dragstart'));\n                    that.events.bind('move', eventProxy('drag'));\n                    that.events.bind('end', eventProxy('dragend'));\n                }\n                kendo.notify(that);\n            },\n            events: [\n                'touchstart',\n                'dragstart',\n                'drag',\n                'dragend',\n                'tap',\n                'doubletap',\n                'hold',\n                'swipe',\n                'gesturestart',\n                'gesturechange',\n                'gestureend'\n            ],\n            options: {\n                name: 'Touch',\n                surface: null,\n                global: false,\n                fastTap: false,\n                filter: null,\n                multiTouch: false,\n                enableSwipe: false,\n                minXDelta: 30,\n                maxYDelta: 20,\n                maxDuration: 1000,\n                minHold: 800,\n                doubleTapTimeout: 800\n            },\n            cancel: function () {\n                this.events.cancel();\n            },\n            destroy: function () {\n                this.events.destroy();\n            },\n            _triggerTouch: function (type, e) {\n                if (this.trigger(type, {\n                        touch: e.touch,\n                        event: e.event\n                    })) {\n                    e.preventDefault();\n                }\n            },\n            _tap: function (e) {\n                var that = this, lastTap = that.lastTap, touch = e.touch;\n                if (lastTap && touch.endTime - lastTap.endTime < that.options.doubleTapTimeout && kendo.touchDelta(touch, lastTap).distance < MAX_DOUBLE_TAP_DISTANCE) {\n                    that._triggerTouch('doubletap', e);\n                    that.lastTap = null;\n                } else {\n                    that._triggerTouch('tap', e);\n                    that.lastTap = touch;\n                }\n            },\n            _dragstart: function (e) {\n                this._triggerTouch('dragstart', e);\n            },\n            _swipestart: function (e) {\n                if (abs(e.x.velocity) * 2 >= abs(e.y.velocity)) {\n                    e.sender.capture();\n                }\n            },\n            _swipemove: function (e) {\n                var that = this, options = that.options, touch = e.touch, duration = e.event.timeStamp - touch.startTime, direction = touch.x.initialDelta > 0 ? 'right' : 'left';\n                if (abs(touch.x.initialDelta) >= options.minXDelta && abs(touch.y.initialDelta) < options.maxYDelta && duration < options.maxDuration) {\n                    that.trigger('swipe', {\n                        direction: direction,\n                        touch: e.touch\n                    });\n                    touch.cancel();\n                }\n            }\n        });\n        kendo.ui.plugin(Touch);\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.gantt.list', [\n        'kendo.dom',\n        'kendo.touch',\n        'kendo.draganddrop',\n        'kendo.columnsorter',\n        'kendo.datetimepicker',\n        'kendo.editable'\n    ], f);\n}(function () {\n    var __meta__ = {\n        id: 'gantt.list',\n        name: 'Gantt List',\n        category: 'web',\n        description: 'The Gantt List',\n        depends: [\n            'dom',\n            'touch',\n            'draganddrop',\n            'columnsorter',\n            'datetimepicker',\n            'editable'\n        ],\n        hidden: true\n    };\n    (function ($) {\n        var kendo = window.kendo;\n        var kendoDom = kendo.dom;\n        var kendoDomElement = kendoDom.element;\n        var kendoTextElement = kendoDom.text;\n        var browser = kendo.support.browser;\n        var mobileOS = kendo.support.mobileOS;\n        var ui = kendo.ui;\n        var Widget = ui.Widget;\n        var extend = $.extend;\n        var outerWidth = kendo._outerWidth;\n        var outerHeight = kendo._outerHeight;\n        var map = $.map;\n        var isFunction = $.isFunction;\n        var oldIE = browser.msie && browser.version < 9;\n        var keys = kendo.keys;\n        var titleFromField = {\n            'title': 'Title',\n            'start': 'Start Time',\n            'end': 'End Time',\n            'percentComplete': '% Done',\n            'parentId': 'Predecessor ID',\n            'id': 'ID',\n            'orderId': 'Order ID'\n        };\n        var STRING = 'string';\n        var NS = '.kendoGanttList';\n        var CLICK = 'click';\n        var DOT = '.';\n        var SIZE_CALCULATION_TEMPLATE = '<table style=\\'visibility: hidden;\\'>' + '<tbody>' + '<tr style=\\'height:{0}\\'>' + '<td>&nbsp;</td>' + '</tr>' + '</tbody>' + '</table>';\n        var listStyles = {\n            wrapper: 'k-treelist k-grid k-widget',\n            header: 'k-header',\n            alt: 'k-alt',\n            rtl: 'k-rtl',\n            editCell: 'k-edit-cell',\n            group: 'k-treelist-group',\n            gridHeader: 'k-grid-header',\n            gridHeaderWrap: 'k-grid-header-wrap',\n            gridContent: 'k-grid-content',\n            gridContentWrap: 'k-grid-content',\n            selected: 'k-state-selected',\n            icon: 'k-icon',\n            iconCollapse: 'k-i-collapse',\n            iconExpand: 'k-i-expand',\n            iconHidden: 'k-i-none',\n            iconPlaceHolder: 'k-icon k-i-none',\n            input: 'k-input',\n            link: 'k-link',\n            resizeHandle: 'k-resize-handle',\n            resizeHandleInner: 'k-resize-handle-inner',\n            dropPositions: 'k-i-insert-up k-i-insert-down k-i-plus k-i-insert-middle',\n            dropTop: 'k-i-insert-up',\n            dropBottom: 'k-i-insert-down',\n            dropAdd: 'k-i-plus',\n            dropMiddle: 'k-i-insert-middle',\n            dropDenied: 'k-i-cancel',\n            dragStatus: 'k-drag-status',\n            dragClue: 'k-drag-clue',\n            dragClueText: 'k-clue-text'\n        };\n        function createPlaceholders(options) {\n            var spans = [];\n            var className = options.className;\n            for (var i = 0, level = options.level; i < level; i++) {\n                spans.push(kendoDomElement('span', { className: className }));\n            }\n            return spans;\n        }\n        function blurActiveElement() {\n            var activeElement = kendo._activeElement();\n            if (activeElement && activeElement.nodeName.toLowerCase() !== 'body') {\n                $(activeElement).blur();\n            }\n        }\n        var GanttList = ui.GanttList = Widget.extend({\n            init: function (element, options) {\n                Widget.fn.init.call(this, element, options);\n                if (this.options.columns.length === 0) {\n                    this.options.columns.push('title');\n                }\n                this.dataSource = this.options.dataSource;\n                this._columns();\n                this._layout();\n                this._domTrees();\n                this._header();\n                this._sortable();\n                this._editable();\n                this._selectable();\n                this._draggable();\n                this._resizable();\n                this._attachEvents();\n                this._adjustHeight();\n                this.bind('render', function () {\n                    var headerCols;\n                    var tableCols;\n                    if (this.options.resizable) {\n                        headerCols = this.header.find('col');\n                        tableCols = this.content.find('col');\n                        this.header.find('th').not(':last').each(function (index) {\n                            var width = outerWidth($(this));\n                            headerCols.eq(index).width(width);\n                            tableCols.eq(index).width(width);\n                        });\n                        headerCols.last().css('width', 'auto');\n                        tableCols.last().css('width', 'auto');\n                    }\n                }, true);\n            },\n            _adjustHeight: function () {\n                if (this.content) {\n                    this.content.height(this.element.height() - outerHeight(this.header.parent()));\n                }\n            },\n            destroy: function () {\n                Widget.fn.destroy.call(this);\n                if (this._reorderDraggable) {\n                    this._reorderDraggable.destroy();\n                }\n                if (this._tableDropArea) {\n                    this._tableDropArea.destroy();\n                }\n                if (this._contentDropArea) {\n                    this._contentDropArea.destroy();\n                }\n                if (this._columnResizable) {\n                    this._columnResizable.destroy();\n                }\n                if (this.touch) {\n                    this.touch.destroy();\n                }\n                if (this.timer) {\n                    clearTimeout(this.timer);\n                }\n                this.content.off(NS);\n                this.header.find('thead').off(NS);\n                this.header.find(DOT + GanttList.link).off(NS);\n                this.header = null;\n                this.content = null;\n                this.levels = null;\n                kendo.destroy(this.element);\n            },\n            options: {\n                name: 'GanttList',\n                selectable: true,\n                editable: true,\n                resizable: false\n            },\n            _attachEvents: function () {\n                var that = this;\n                var listStyles = GanttList.styles;\n                that.content.on(CLICK + NS, 'td > span.' + listStyles.icon + ':not(.' + listStyles.iconHidden + ')', function (e) {\n                    var element = $(this);\n                    var model = that._modelFromElement(element);\n                    model.set('expanded', !model.get('expanded'));\n                    e.stopPropagation();\n                });\n            },\n            _domTrees: function () {\n                this.headerTree = new kendoDom.Tree(this.header[0]);\n                this.contentTree = new kendoDom.Tree(this.content[0]);\n            },\n            _columns: function () {\n                var columns = this.options.columns;\n                var model = function () {\n                    this.field = '';\n                    this.title = '';\n                    this.editable = false;\n                    this.sortable = false;\n                };\n                this.columns = map(columns, function (column) {\n                    column = typeof column === STRING ? {\n                        field: column,\n                        title: titleFromField[column]\n                    } : column;\n                    return extend(new model(), column);\n                });\n            },\n            _layout: function () {\n                var that = this;\n                var options = this.options;\n                var element = this.element;\n                var listStyles = GanttList.styles;\n                var calculateRowHeight = function () {\n                    var rowHeight = typeof options.rowHeight === STRING ? options.rowHeight : options.rowHeight + 'px';\n                    var table = $(kendo.format(SIZE_CALCULATION_TEMPLATE, rowHeight));\n                    var height;\n                    that.content.append(table);\n                    height = outerHeight(table.find('tr'));\n                    table.remove();\n                    return height;\n                };\n                element.addClass(listStyles.wrapper).append('<div class=\\'' + listStyles.gridHeader + '\\'><div class=\\'' + listStyles.gridHeaderWrap + '\\'></div></div>').append('<div class=\\'' + listStyles.gridContentWrap + '\\'></div>');\n                this.header = element.find(DOT + listStyles.gridHeaderWrap);\n                this.content = element.find(DOT + listStyles.gridContent);\n                if (options.rowHeight) {\n                    this._rowHeight = calculateRowHeight();\n                }\n            },\n            _header: function () {\n                var domTree = this.headerTree;\n                var colgroup;\n                var thead;\n                var table;\n                colgroup = kendoDomElement('colgroup', null, this._cols());\n                thead = kendoDomElement('thead', { 'role': 'rowgroup' }, [kendoDomElement('tr', { 'role': 'row' }, this._ths())]);\n                table = kendoDomElement('table', {\n                    'style': { 'minWidth': this.options.listWidth + 'px' },\n                    'role': 'grid'\n                }, [\n                    colgroup,\n                    thead\n                ]);\n                domTree.render([table]);\n            },\n            _render: function (tasks) {\n                var colgroup;\n                var tbody;\n                var table;\n                var tableAttr = {\n                    'style': { 'minWidth': this.options.listWidth + 'px' },\n                    'tabIndex': 0,\n                    'role': 'treegrid'\n                };\n                if (this._rowHeight) {\n                    tableAttr.style.height = tasks.length * this._rowHeight + 'px';\n                }\n                this.levels = [{\n                        field: null,\n                        value: 0\n                    }];\n                colgroup = kendoDomElement('colgroup', null, this._cols());\n                tbody = kendoDomElement('tbody', { 'role': 'rowgroup' }, this._trs(tasks));\n                table = kendoDomElement('table', tableAttr, [\n                    colgroup,\n                    tbody\n                ]);\n                this.contentTree.render([table]);\n                this.trigger('render');\n            },\n            _ths: function () {\n                var columns = this.columns;\n                var column;\n                var attr;\n                var ths = [];\n                for (var i = 0, length = columns.length; i < length; i++) {\n                    column = columns[i];\n                    attr = {\n                        'data-field': column.field,\n                        'data-title': column.title,\n                        className: GanttList.styles.header,\n                        'role': 'columnheader'\n                    };\n                    ths.push(kendoDomElement('th', attr, [kendoTextElement(column.title)]));\n                }\n                if (this.options.resizable) {\n                    ths.push(kendoDomElement('th', {\n                        className: GanttList.styles.header,\n                        'role': 'columnheader'\n                    }));\n                }\n                return ths;\n            },\n            _cols: function () {\n                var columns = this.columns;\n                var column;\n                var style;\n                var width;\n                var cols = [];\n                for (var i = 0, length = columns.length; i < length; i++) {\n                    column = columns[i];\n                    width = column.width;\n                    if (width && parseInt(width, 10) !== 0) {\n                        style = { style: { width: typeof width === STRING ? width : width + 'px' } };\n                    } else {\n                        style = null;\n                    }\n                    cols.push(kendoDomElement('col', style, []));\n                }\n                if (this.options.resizable) {\n                    cols.push(kendoDomElement('col', { style: { width: '1px' } }));\n                }\n                return cols;\n            },\n            _trs: function (tasks) {\n                var task;\n                var rows = [];\n                var attr;\n                var className = [];\n                var level;\n                var listStyles = GanttList.styles;\n                for (var i = 0, length = tasks.length; i < length; i++) {\n                    task = tasks[i];\n                    level = this._levels({\n                        idx: task.parentId,\n                        id: task.id,\n                        summary: task.summary\n                    });\n                    attr = {\n                        'data-uid': task.uid,\n                        'data-level': level,\n                        'role': 'row'\n                    };\n                    if (task.summary) {\n                        attr['aria-expanded'] = task.expanded;\n                    }\n                    if (i % 2 !== 0) {\n                        className.push(listStyles.alt);\n                    }\n                    if (task.summary) {\n                        className.push(listStyles.group);\n                    }\n                    if (className.length) {\n                        attr.className = className.join(' ');\n                    }\n                    rows.push(this._tds({\n                        task: task,\n                        attr: attr,\n                        level: level\n                    }));\n                    className = [];\n                }\n                return rows;\n            },\n            _tds: function (options) {\n                var children = [];\n                var columns = this.columns;\n                var column;\n                for (var i = 0, l = columns.length; i < l; i++) {\n                    column = columns[i];\n                    children.push(this._td({\n                        task: options.task,\n                        column: column,\n                        level: options.level\n                    }));\n                }\n                if (this.options.resizable) {\n                    children.push(kendoDomElement('td', { 'role': 'gridcell' }));\n                }\n                return kendoDomElement('tr', options.attr, children);\n            },\n            _td: function (options) {\n                var children = [];\n                var resourcesField = this.options.resourcesField;\n                var listStyles = GanttList.styles;\n                var task = options.task;\n                var column = options.column;\n                var value = task.get(column.field);\n                var formatedValue;\n                var label;\n                if (column.field == resourcesField) {\n                    value = value || [];\n                    formatedValue = [];\n                    for (var i = 0; i < value.length; i++) {\n                        formatedValue.push(kendo.format('{0} [{1}]', value[i].get('name'), value[i].get('formatedValue')));\n                    }\n                    formatedValue = formatedValue.join(', ');\n                } else {\n                    formatedValue = column.format ? kendo.format(column.format, value) : value;\n                }\n                if (column.field === 'title') {\n                    children = createPlaceholders({\n                        level: options.level,\n                        className: listStyles.iconPlaceHolder\n                    });\n                    children.push(kendoDomElement('span', { className: listStyles.icon + ' ' + (task.summary ? task.expanded ? listStyles.iconCollapse : listStyles.iconExpand : listStyles.iconHidden) }));\n                    label = kendo.format('{0}, {1:P0}', formatedValue, task.percentComplete);\n                }\n                children.push(kendoDomElement('span', { 'aria-label': label }, [kendoTextElement(formatedValue)]));\n                return kendoDomElement('td', { 'role': 'gridcell' }, children);\n            },\n            _levels: function (options) {\n                var levels = this.levels;\n                var level;\n                var summary = options.summary;\n                var idx = options.idx;\n                var id = options.id;\n                for (var i = 0, length = levels.length; i < length; i++) {\n                    level = levels[i];\n                    if (level.field == idx) {\n                        if (summary) {\n                            levels.push({\n                                field: id,\n                                value: level.value + 1\n                            });\n                        }\n                        return level.value;\n                    }\n                }\n            },\n            _sortable: function () {\n                var that = this;\n                var resourcesField = this.options.resourcesField;\n                var columns = this.columns;\n                var column;\n                var sortableInstance;\n                var cells = this.header.find('th[' + kendo.attr('field') + ']');\n                var cell;\n                var changeHandler = function (e) {\n                    if (that.dataSource.total() === 0 || that.editable && that.editable.trigger('validate')) {\n                        e.preventDefault();\n                    }\n                };\n                for (var idx = 0, length = cells.length; idx < length; idx++) {\n                    column = columns[idx];\n                    if (column.sortable && column.field !== resourcesField) {\n                        cell = cells.eq(idx);\n                        sortableInstance = cell.data('kendoColumnSorter');\n                        if (sortableInstance) {\n                            sortableInstance.destroy();\n                        }\n                        cell.attr('data-' + kendo.ns + 'field', column.field).kendoColumnSorter({\n                            dataSource: this.dataSource,\n                            change: changeHandler\n                        });\n                    }\n                }\n                cells = null;\n            },\n            _selectable: function () {\n                var that = this;\n                var selectable = this.options.selectable;\n                if (selectable) {\n                    this.content.on(CLICK + NS, 'tr', function (e) {\n                        var element = $(this);\n                        if (that.editable) {\n                            that.editable.trigger('validate');\n                        }\n                        if (!e.ctrlKey) {\n                            that.select(element);\n                        } else {\n                            that.clearSelection();\n                        }\n                    });\n                }\n            },\n            select: function (value) {\n                var element = this.content.find(value);\n                var selectedClassName = GanttList.styles.selected;\n                if (element.length) {\n                    element.siblings(DOT + selectedClassName).removeClass(selectedClassName).attr('aria-selected', false).end().addClass(selectedClassName).attr('aria-selected', true);\n                    this.trigger('change');\n                    return;\n                }\n                return this.content.find(DOT + selectedClassName);\n            },\n            clearSelection: function () {\n                var selected = this.select();\n                if (selected.length) {\n                    selected.removeClass(GanttList.styles.selected);\n                    this.trigger('change');\n                }\n            },\n            _setDataSource: function (dataSource) {\n                this.dataSource = dataSource;\n                this._sortable();\n            },\n            _editable: function () {\n                var that = this;\n                var editable = this.options.editable;\n                var listStyles = GanttList.styles;\n                var iconSelector = 'span.' + listStyles.icon + ':not(' + listStyles.iconHidden + ')';\n                var finishEdit = function () {\n                    var editable = that.editable;\n                    if (editable) {\n                        if (editable.end()) {\n                            that._closeCell();\n                        } else {\n                            editable.trigger('validate');\n                        }\n                    }\n                };\n                var mousedown = function (e) {\n                    var currentTarget = $(e.currentTarget);\n                    if (!currentTarget.hasClass(listStyles.editCell)) {\n                        blurActiveElement();\n                    }\n                };\n                if (!editable || editable.update === false) {\n                    return;\n                }\n                this._startEditHandler = function (e) {\n                    var td = e.currentTarget ? $(e.currentTarget) : e;\n                    var column = that._columnFromElement(td);\n                    if (that.editable) {\n                        return;\n                    }\n                    if (column && column.editable) {\n                        that._editCell({\n                            cell: td,\n                            column: column\n                        });\n                    }\n                };\n                that.content.on('focusin' + NS, function () {\n                    clearTimeout(that.timer);\n                    that.timer = null;\n                }).on('focusout' + NS, function () {\n                    that.timer = setTimeout(finishEdit, 1);\n                }).on('keydown' + NS, function (e) {\n                    if (e.keyCode === keys.ENTER) {\n                        e.preventDefault();\n                    }\n                }).on('keyup' + NS, function (e) {\n                    var key = e.keyCode;\n                    var cell;\n                    var model;\n                    switch (key) {\n                    case keys.ENTER:\n                        blurActiveElement();\n                        finishEdit();\n                        break;\n                    case keys.ESC:\n                        if (that.editable) {\n                            cell = that._editableContainer;\n                            model = that._modelFromElement(cell);\n                            if (!that.trigger('cancel', {\n                                    model: model,\n                                    cell: cell\n                                })) {\n                                that._closeCell(true);\n                            }\n                        }\n                        break;\n                    }\n                });\n                if (!mobileOS) {\n                    that.content.on('mousedown' + NS, 'td', function (e) {\n                        mousedown(e);\n                    }).on('dblclick' + NS, 'td', function (e) {\n                        if (!$(e.target).is(iconSelector)) {\n                            that._startEditHandler(e);\n                        }\n                    });\n                } else {\n                    that.touch = that.content.kendoTouch({\n                        filter: 'td',\n                        touchstart: function (e) {\n                            mousedown(e.touch);\n                        },\n                        doubletap: function (e) {\n                            if (!$(e.touch.initialTouch).is(iconSelector)) {\n                                that._startEditHandler(e.touch);\n                            }\n                        }\n                    }).data('kendoTouch');\n                }\n            },\n            _editCell: function (options) {\n                var resourcesField = this.options.resourcesField;\n                var listStyles = GanttList.styles;\n                var cell = options.cell;\n                var column = options.column;\n                var model = this._modelFromElement(cell);\n                var modelCopy = this.dataSource._createNewModel(model.toJSON());\n                var field = modelCopy.fields[column.field] || modelCopy[column.field];\n                var validation = field.validation;\n                var DATATYPE = kendo.attr('type');\n                var BINDING = kendo.attr('bind');\n                var FORMAT = kendo.attr('format');\n                var attr = {\n                    'name': column.field,\n                    'required': field.validation ? field.validation.required === true : false\n                };\n                var editor;\n                if (column.field === resourcesField) {\n                    column.editor(cell, modelCopy);\n                    return;\n                }\n                this._editableContent = cell.children().detach();\n                this._editableContainer = cell;\n                cell.data('modelCopy', modelCopy);\n                if ((field.type === 'date' || $.type(field) === 'date') && (!column.format || /H|m|s|F|g|u/.test(column.format))) {\n                    attr[BINDING] = 'value:' + column.field;\n                    attr[DATATYPE] = 'date';\n                    if (column.format) {\n                        attr[FORMAT] = kendo._extractFormat(column.format);\n                    }\n                    editor = function (container, options) {\n                        $('<input type=\"text\"/>').attr(attr).appendTo(container).kendoDateTimePicker({ format: options.format });\n                    };\n                }\n                this.editable = cell.addClass(listStyles.editCell).kendoEditable({\n                    fields: {\n                        field: column.field,\n                        format: column.format,\n                        editor: column.editor || editor\n                    },\n                    model: modelCopy,\n                    clearContainer: false\n                }).data('kendoEditable');\n                if (validation && validation.dateCompare && isFunction(validation.dateCompare) && validation.message) {\n                    $('<span ' + kendo.attr('for') + '=\"' + column.field + '\" class=\"k-invalid-msg\"/>').hide().appendTo(cell);\n                    cell.find('[name=' + column.field + ']').attr(kendo.attr('dateCompare-msg'), validation.message);\n                }\n                this.editable.bind('validate', function (e) {\n                    var focusable = this.element.find(':kendoFocusable:first').focus();\n                    if (oldIE) {\n                        focusable.focus();\n                    }\n                    e.preventDefault();\n                });\n                if (this.trigger('edit', {\n                        model: model,\n                        cell: cell\n                    })) {\n                    this._closeCell(true);\n                }\n            },\n            _closeCell: function (cancelUpdate) {\n                var listStyles = GanttList.styles;\n                var cell = this._editableContainer;\n                var model = this._modelFromElement(cell);\n                var column = this._columnFromElement(cell);\n                var field = column.field;\n                var copy = cell.data('modelCopy');\n                var taskInfo = {};\n                taskInfo[field] = copy.get(field);\n                cell.empty().removeData('modelCopy').removeClass(listStyles.editCell).append(this._editableContent);\n                this.editable.unbind();\n                this.editable.destroy();\n                this.editable = null;\n                this._editableContainer = null;\n                this._editableContent = null;\n                if (!cancelUpdate) {\n                    if (field === 'start') {\n                        taskInfo.end = new Date(taskInfo.start.getTime() + model.duration());\n                    }\n                    this.trigger('update', {\n                        task: model,\n                        updateInfo: taskInfo\n                    });\n                }\n            },\n            _draggable: function () {\n                var that = this;\n                var draggedTask = null;\n                var dropAllowed = true;\n                var dropTarget;\n                var listStyles = GanttList.styles;\n                var isRtl = kendo.support.isRtl(this.element);\n                var selector = 'tr[' + kendo.attr('level') + ' = 0]:last';\n                var action = {};\n                var editable = this.options.editable;\n                var clear = function () {\n                    draggedTask = null;\n                    dropTarget = null;\n                    dropAllowed = true;\n                    action = {};\n                };\n                var allowDrop = function (task) {\n                    var parent = task;\n                    while (parent) {\n                        if (draggedTask.get('id') === parent.get('id')) {\n                            dropAllowed = false;\n                            break;\n                        }\n                        parent = that.dataSource.taskParent(parent);\n                    }\n                };\n                var defineLimits = function () {\n                    var height = $(dropTarget).height();\n                    var offsetTop = kendo.getOffset(dropTarget).top;\n                    extend(dropTarget, {\n                        beforeLimit: offsetTop + height * 0.25,\n                        afterLimit: offsetTop + height * 0.75\n                    });\n                };\n                var defineAction = function (coordinate) {\n                    if (!dropTarget) {\n                        return;\n                    }\n                    var location = coordinate.location;\n                    var className = listStyles.dropAdd;\n                    var command = 'add';\n                    var level = parseInt(dropTarget.attr(kendo.attr('level')), 10);\n                    var sibling;\n                    if (location <= dropTarget.beforeLimit) {\n                        sibling = dropTarget.prev();\n                        className = listStyles.dropTop;\n                        command = 'insert-before';\n                    } else if (location >= dropTarget.afterLimit) {\n                        sibling = dropTarget.next();\n                        className = listStyles.dropBottom;\n                        command = 'insert-after';\n                    }\n                    if (sibling && parseInt(sibling.attr(kendo.attr('level')), 10) === level) {\n                        className = listStyles.dropMiddle;\n                    }\n                    action.className = className;\n                    action.command = command;\n                };\n                var status = function () {\n                    return that._reorderDraggable.hint.children(DOT + listStyles.dragStatus).removeClass(listStyles.dropPositions);\n                };\n                if (!editable || editable.reorder === false || editable.update === false) {\n                    return;\n                }\n                this._reorderDraggable = this.content.kendoDraggable({\n                    distance: 10,\n                    holdToDrag: mobileOS,\n                    group: 'listGroup',\n                    filter: 'tr[data-uid]',\n                    ignore: DOT + listStyles.input,\n                    hint: function (target) {\n                        return $('<div class=\"' + listStyles.header + ' ' + listStyles.dragClue + '\"/>').css({\n                            width: 300,\n                            paddingLeft: target.css('paddingLeft'),\n                            paddingRight: target.css('paddingRight'),\n                            lineHeight: target.height() + 'px',\n                            paddingTop: target.css('paddingTop'),\n                            paddingBottom: target.css('paddingBottom')\n                        }).append('<span class=\"' + listStyles.icon + ' ' + listStyles.dragStatus + '\" /><span class=\"' + listStyles.dragClueText + '\"/>');\n                    },\n                    cursorOffset: {\n                        top: -20,\n                        left: 0\n                    },\n                    container: this.content,\n                    'dragstart': function (e) {\n                        var editable = that.editable;\n                        if (editable && editable.reorder !== false && editable.trigger('validate')) {\n                            e.preventDefault();\n                            return;\n                        }\n                        draggedTask = that._modelFromElement(e.currentTarget);\n                        this.hint.children(DOT + listStyles.dragClueText).text(draggedTask.get('title'));\n                        if (isRtl) {\n                            this.hint.addClass(listStyles.rtl);\n                        }\n                    },\n                    'drag': function (e) {\n                        if (dropAllowed) {\n                            defineAction(e.y);\n                            status().addClass(action.className);\n                        }\n                    },\n                    'dragend': function () {\n                        clear();\n                    },\n                    'dragcancel': function () {\n                        clear();\n                    }\n                }).data('kendoDraggable');\n                this._tableDropArea = this.content.kendoDropTargetArea({\n                    distance: 0,\n                    group: 'listGroup',\n                    filter: 'tr[data-uid]',\n                    'dragenter': function (e) {\n                        dropTarget = e.dropTarget;\n                        allowDrop(that._modelFromElement(dropTarget));\n                        defineLimits();\n                        status().toggleClass(listStyles.dropDenied, !dropAllowed);\n                    },\n                    'dragleave': function () {\n                        dropAllowed = true;\n                        status();\n                    },\n                    'drop': function () {\n                        var target = that._modelFromElement(dropTarget);\n                        var orderId = target.orderId;\n                        var taskInfo = { parentId: target.parentId };\n                        if (dropAllowed) {\n                            switch (action.command) {\n                            case 'add':\n                                taskInfo.parentId = target.id;\n                                break;\n                            case 'insert-before':\n                                if (target.parentId === draggedTask.parentId && target.orderId > draggedTask.orderId) {\n                                    taskInfo.orderId = orderId - 1;\n                                } else {\n                                    taskInfo.orderId = orderId;\n                                }\n                                break;\n                            case 'insert-after':\n                                if (target.parentId === draggedTask.parentId && target.orderId > draggedTask.orderId) {\n                                    taskInfo.orderId = orderId;\n                                } else {\n                                    taskInfo.orderId = orderId + 1;\n                                }\n                                break;\n                            }\n                            that.trigger('update', {\n                                task: draggedTask,\n                                updateInfo: taskInfo\n                            });\n                        }\n                    }\n                }).data('kendoDropTargetArea');\n                this._contentDropArea = this.element.kendoDropTargetArea({\n                    distance: 0,\n                    group: 'listGroup',\n                    filter: DOT + listStyles.gridContent,\n                    'drop': function () {\n                        var target = that._modelFromElement(that.content.find(selector));\n                        var orderId = target.orderId;\n                        var taskInfo = {\n                            parentId: null,\n                            orderId: draggedTask.parentId !== null ? orderId + 1 : orderId\n                        };\n                        that.trigger('update', {\n                            task: draggedTask,\n                            updateInfo: taskInfo\n                        });\n                    }\n                }).data('kendoDropTargetArea');\n            },\n            _resizable: function () {\n                var that = this;\n                var listStyles = GanttList.styles;\n                var positionResizeHandle = function (e) {\n                    var th = $(e.currentTarget);\n                    var resizeHandle = that.resizeHandle;\n                    var position = th.position();\n                    var left = position.left;\n                    var cellWidth = outerWidth(th);\n                    var container = th.closest('div');\n                    var clientX = e.clientX + $(window).scrollLeft();\n                    var indicatorWidth = that.options.columnResizeHandleWidth;\n                    left += container.scrollLeft();\n                    if (!resizeHandle) {\n                        resizeHandle = that.resizeHandle = $('<div class=\"' + listStyles.resizeHandle + '\"><div class=\"' + listStyles.resizeHandleInner + '\" /></div>');\n                    }\n                    var cellOffset = th.offset().left + cellWidth;\n                    var show = clientX > cellOffset - indicatorWidth && clientX < cellOffset + indicatorWidth;\n                    if (!show) {\n                        resizeHandle.hide();\n                        return;\n                    }\n                    container.append(resizeHandle);\n                    resizeHandle.show().css({\n                        top: position.top,\n                        left: left + cellWidth - indicatorWidth - 1,\n                        height: outerHeight(th),\n                        width: indicatorWidth * 3\n                    }).data('th', th);\n                };\n                if (!this.options.resizable) {\n                    return;\n                }\n                if (this._columnResizable) {\n                    this._columnResizable.destroy();\n                }\n                this.header.find('thead').on('mousemove' + NS, 'th', positionResizeHandle);\n                this._columnResizable = this.header.kendoResizable({\n                    handle: DOT + listStyles.resizeHandle,\n                    start: function (e) {\n                        var th = $(e.currentTarget).data('th');\n                        var colSelector = 'col:eq(' + th.index() + ')';\n                        var header = that.header.find('table');\n                        var contentTable = that.content.find('table');\n                        that.element.addClass('k-grid-column-resizing');\n                        this.col = contentTable.children('colgroup').find(colSelector).add(header.find(colSelector));\n                        this.th = th;\n                        this.startLocation = e.x.location;\n                        this.columnWidth = outerWidth(th);\n                        this.table = header.add(contentTable);\n                        this.totalWidth = this.table.width() - outerWidth(header.find('th:last'));\n                    },\n                    resize: function (e) {\n                        var minColumnWidth = 11;\n                        var delta = e.x.location - this.startLocation;\n                        if (this.columnWidth + delta < minColumnWidth) {\n                            delta = minColumnWidth - this.columnWidth;\n                        }\n                        this.table.css({ 'minWidth': this.totalWidth + delta });\n                        this.col.width(this.columnWidth + delta);\n                    },\n                    resizeend: function () {\n                        that.element.removeClass('k-grid-column-resizing');\n                        var oldWidth = Math.floor(this.columnWidth);\n                        var newWidth = Math.floor(outerWidth(this.th));\n                        var column = that.columns[this.th.index()];\n                        that.trigger('columnResize', {\n                            column: column,\n                            oldWidth: oldWidth,\n                            newWidth: newWidth\n                        });\n                        this.table = this.col = this.th = null;\n                    }\n                }).data('kendoResizable');\n            },\n            _modelFromElement: function (element) {\n                var row = element.closest('tr');\n                var model = this.dataSource.getByUid(row.attr(kendo.attr('uid')));\n                return model;\n            },\n            _columnFromElement: function (element) {\n                var td = element.closest('td');\n                var tr = td.parent();\n                var idx = tr.children().index(td);\n                return this.columns[idx];\n            }\n        });\n        extend(true, ui.GanttList, { styles: listStyles });\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.gantt.timeline', [\n        'kendo.dom',\n        'kendo.touch',\n        'kendo.draganddrop'\n    ], f);\n}(function () {\n    var __meta__ = {\n        id: 'gantt.timeline',\n        name: 'Gantt Timeline',\n        category: 'web',\n        description: 'The Gantt Timeline',\n        depends: [\n            'dom',\n            'touch',\n            'draganddrop'\n        ],\n        hidden: true\n    };\n    (function ($) {\n        var Widget = kendo.ui.Widget;\n        var kendoDomElement = kendo.dom.element;\n        var kendoTextElement = kendo.dom.text;\n        var kendoHtmlElement = kendo.dom.html;\n        var isPlainObject = $.isPlainObject;\n        var outerWidth = kendo._outerWidth;\n        var outerHeight = kendo._outerHeight;\n        var extend = $.extend;\n        var proxy = $.proxy;\n        var browser = kendo.support.browser;\n        var isRtl = false;\n        var keys = kendo.keys;\n        var Query = kendo.data.Query;\n        var STRING = 'string';\n        var NS = '.kendoGanttTimeline';\n        var CLICK = 'click';\n        var DBLCLICK = 'dblclick';\n        var MOUSEMOVE = 'mousemove';\n        var MOUSEENTER = 'mouseenter';\n        var MOUSELEAVE = 'mouseleave';\n        var KEYDOWN = 'keydown';\n        var DOT = '.';\n        var TIME_HEADER_TEMPLATE = kendo.template('#=kendo.toString(start, \\'t\\')#');\n        var DAY_HEADER_TEMPLATE = kendo.template('#=kendo.toString(start, \\'ddd M/dd\\')#');\n        var WEEK_HEADER_TEMPLATE = kendo.template('#=kendo.toString(start, \\'ddd M/dd\\')# - #=kendo.toString(kendo.date.addDays(end, -1), \\'ddd M/dd\\')#');\n        var MONTH_HEADER_TEMPLATE = kendo.template('#=kendo.toString(start, \\'MMM\\')#');\n        var YEAR_HEADER_TEMPLATE = kendo.template('#=kendo.toString(start, \\'yyyy\\')#');\n        var RESIZE_HINT = kendo.template('<div class=\"#=styles.marquee#\">' + '<div class=\"#=styles.marqueeColor#\"></div>' + '</div>');\n        var RESIZE_TOOLTIP_TEMPLATE = kendo.template('<div style=\"z-index: 100002;\" class=\"#=styles.tooltipWrapper#\">' + '<div class=\"#=styles.tooltipContent#\">' + '<div>#=messages.start#: #=kendo.toString(start, format)#</div>' + '<div>#=messages.end#: #=kendo.toString(end, format)#</div>' + '</div>' + '</div>');\n        var PERCENT_RESIZE_TOOLTIP_TEMPLATE = kendo.template('<div style=\"z-index: 100002;\" class=\"#=styles.tooltipWrapper#\" >' + '<div class=\"#=styles.tooltipContent#\">#=text#%</div>' + '<div class=\"#=styles.tooltipCallout#\" style=\"left:13px;\"></div>' + '</div>');\n        var TASK_TOOLTIP_TEMPLATE = kendo.template('<div class=\"#=kendo.htmlEncode(styles.taskDetails)#\">' + '<strong>#=kendo.htmlEncode(task.title)#</strong>' + '<div class=\"#=styles.taskDetailsPercent#\">#=kendo.toString(task.percentComplete, \"p0\")#</div>' + '<ul class=\"#=styles.reset#\">' + '<li>#=messages.start#: #=kendo.toString(task.start, \"h:mm tt ddd, MMM d\")#</li>' + '<li>#=messages.end#: #=kendo.toString(task.end, \"h:mm tt ddd, MMM d\")#</li>' + '</ul>' + '</div>');\n        var SIZE_CALCULATION_TEMPLATE = '<table style=\\'visibility: hidden;\\'>' + '<tbody>' + '<tr style=\\'height:{0}\\'>' + '<td>&nbsp;</td>' + '</tr>' + '</tbody>' + '</table>';\n        var defaultViews = {\n            day: { type: 'kendo.ui.GanttDayView' },\n            week: { type: 'kendo.ui.GanttWeekView' },\n            month: { type: 'kendo.ui.GanttMonthView' },\n            year: { type: 'kendo.ui.GanttYearView' }\n        };\n        function trimOptions(options) {\n            delete options.name;\n            delete options.prefix;\n            delete options.views;\n            return options;\n        }\n        function getWorkDays(options) {\n            var workDays = [];\n            var dayIndex = options.workWeekStart;\n            workDays.push(dayIndex);\n            while (options.workWeekEnd != dayIndex) {\n                if (dayIndex > 6) {\n                    dayIndex -= 7;\n                } else {\n                    dayIndex++;\n                }\n                workDays.push(dayIndex);\n            }\n            return workDays;\n        }\n        function blurActiveElement() {\n            var activeElement = kendo._activeElement();\n            if (activeElement && activeElement.nodeName.toLowerCase() !== 'body') {\n                $(activeElement).blur();\n            }\n        }\n        var viewStyles = {\n            alt: 'k-alt',\n            reset: 'k-reset',\n            nonWorking: 'k-nonwork-hour',\n            header: 'k-header',\n            gridHeader: 'k-grid-header',\n            gridHeaderWrap: 'k-grid-header-wrap',\n            gridContent: 'k-grid-content',\n            tasksWrapper: 'k-gantt-tables',\n            rowsTable: 'k-gantt-rows',\n            columnsTable: 'k-gantt-columns',\n            tasksTable: 'k-gantt-tasks',\n            dependenciesWrapper: 'k-gantt-dependencies',\n            resource: 'k-resource',\n            resourceAlt: 'k-resource k-alt',\n            task: 'k-task',\n            taskSingle: 'k-task-single',\n            taskMilestone: 'k-task-milestone',\n            taskSummary: 'k-task-summary',\n            taskWrap: 'k-task-wrap',\n            taskMilestoneWrap: 'k-milestone-wrap',\n            resourcesWrap: 'k-resources-wrap',\n            taskDot: 'k-task-dot',\n            taskDotStart: 'k-task-start',\n            taskDotEnd: 'k-task-end',\n            taskDragHandle: 'k-task-draghandle',\n            taskContent: 'k-task-content',\n            taskTemplate: 'k-task-template',\n            taskActions: 'k-task-actions',\n            taskDelete: 'k-task-delete',\n            taskComplete: 'k-task-complete',\n            taskDetails: 'k-task-details',\n            taskDetailsPercent: 'k-task-pct',\n            link: 'k-link',\n            icon: 'k-icon',\n            iconDelete: 'k-i-close',\n            taskResizeHandle: 'k-resize-handle',\n            taskResizeHandleWest: 'k-resize-w',\n            taskResizeHandleEast: 'k-resize-e',\n            taskSummaryProgress: 'k-task-summary-progress',\n            taskSummaryComplete: 'k-task-summary-complete',\n            line: 'k-line',\n            lineHorizontal: 'k-line-h',\n            lineVertical: 'k-line-v',\n            arrowWest: 'k-arrow-w',\n            arrowEast: 'k-arrow-e',\n            dragHint: 'k-drag-hint',\n            dependencyHint: 'k-dependency-hint',\n            tooltipWrapper: 'k-widget k-tooltip k-popup k-group k-reset',\n            tooltipContent: 'k-tooltip-content',\n            tooltipCallout: 'k-callout k-callout-s',\n            callout: 'k-callout',\n            marquee: 'k-marquee k-gantt-marquee',\n            marqueeColor: 'k-marquee-color'\n        };\n        var GanttView = kendo.ui.GanttView = Widget.extend({\n            init: function (element, options) {\n                Widget.fn.init.call(this, element, options);\n                this.title = this.options.title || this.options.name;\n                this.header = this.element.find(DOT + GanttView.styles.gridHeader);\n                this.content = this.element.find(DOT + GanttView.styles.gridContent);\n                this.contentWidth = this.content.width();\n                this._workDays = getWorkDays(this.options);\n                this._headerTree = options.headerTree;\n                this._taskTree = options.taskTree;\n                this._taskTemplate = options.taskTemplate ? kendo.template(options.taskTemplate, extend({}, kendo.Template, options.templateSettings)) : null;\n                this._dependencyTree = options.dependencyTree;\n                this._taskCoordinates = {};\n                this._currentTime();\n            },\n            destroy: function () {\n                Widget.fn.destroy.call(this);\n                clearTimeout(this._tooltipTimeout);\n                this.headerRow = null;\n                this.header = null;\n                this.content = null;\n                this._dragHint = null;\n                this._resizeHint = null;\n                this._resizeTooltip = null;\n                this._taskTooltip = null;\n                this._percentCompleteResizeTooltip = null;\n                this._headerTree = null;\n                this._taskTree = null;\n                this._dependencyTree = null;\n            },\n            options: {\n                showWorkHours: false,\n                showWorkDays: false,\n                workDayStart: new Date(1980, 1, 1, 8, 0, 0),\n                workDayEnd: new Date(1980, 1, 1, 17, 0, 0),\n                workWeekStart: 1,\n                workWeekEnd: 5,\n                hourSpan: 1,\n                slotSize: 100,\n                currentTimeMarker: { updateInterval: 10000 }\n            },\n            renderLayout: function () {\n                this._slots = this._createSlots();\n                this._tableWidth = this._calculateTableWidth();\n                this.createLayout(this._layout());\n                this._slotDimensions();\n                this._adjustHeight();\n                this.content.find(DOT + GanttView.styles.dependenciesWrapper).width(this._tableWidth);\n            },\n            _adjustHeight: function () {\n                if (this.content) {\n                    this.content.height(this.element.height() - outerHeight(this.header));\n                }\n            },\n            createLayout: function (rows) {\n                var headers = this._headers(rows);\n                var colgroup = this._colgroup();\n                var tree = this._headerTree;\n                var header = kendoDomElement('thead', null, headers);\n                var table = kendoDomElement('table', { style: { width: this._tableWidth + 'px' } }, [\n                    colgroup,\n                    header\n                ]);\n                tree.render([table]);\n                this.headerRow = this.header.find('table:first tr').last();\n            },\n            _slotDimensions: function () {\n                var headers = this.headerRow[0].children;\n                var slots = this._timeSlots();\n                var slot;\n                var header;\n                for (var i = 0, length = headers.length; i < length; i++) {\n                    header = headers[i];\n                    slot = slots[i];\n                    slot.offsetLeft = header.offsetLeft;\n                    slot.offsetWidth = header.offsetWidth;\n                }\n            },\n            render: function (tasks) {\n                var taskCount = tasks.length;\n                var styles = GanttView.styles;\n                var contentTable;\n                var rowsTable = this._rowsTable(taskCount);\n                var columnsTable = this._columnsTable(taskCount);\n                var tasksTable = this._tasksTable(tasks);\n                var currentTimeMarker = this.options.currentTimeMarker;\n                var calculatedSize = this.options.calculatedSize;\n                var totalHeight;\n                this._taskTree.render([\n                    rowsTable,\n                    columnsTable,\n                    tasksTable\n                ]);\n                contentTable = this.content.find(DOT + styles.rowsTable);\n                if (calculatedSize) {\n                    totalHeight = calculatedSize.row * tasks.length;\n                    this.content.find(DOT + styles.tasksTable).height(totalHeight);\n                    contentTable.height(totalHeight);\n                }\n                this._contentHeight = contentTable.height();\n                this._rowHeight = calculatedSize ? calculatedSize.row : this._contentHeight / contentTable.find('tr').length;\n                this.content.find(DOT + styles.columnsTable).height(this._contentHeight);\n                if (currentTimeMarker !== false && currentTimeMarker.updateInterval !== undefined) {\n                    this._renderCurrentTime();\n                }\n            },\n            _rowsTable: function (rowCount) {\n                var rows = [];\n                var row;\n                var styles = GanttView.styles;\n                var attributes = [\n                    null,\n                    { className: styles.alt }\n                ];\n                for (var i = 0; i < rowCount; i++) {\n                    row = kendoDomElement('tr', attributes[i % 2], [kendoDomElement('td', null, [kendoTextElement('\\xA0')])]);\n                    rows.push(row);\n                }\n                return this._createTable(1, rows, { className: styles.rowsTable });\n            },\n            _columnsTable: function () {\n                var cells = [];\n                var row;\n                var styles = GanttView.styles;\n                var slots = this._timeSlots();\n                var slotsCount = slots.length;\n                var slot;\n                var slotSpan;\n                var totalSpan = 0;\n                var attributes;\n                for (var i = 0; i < slotsCount; i++) {\n                    slot = slots[i];\n                    attributes = {};\n                    slotSpan = slot.span;\n                    totalSpan += slotSpan;\n                    if (slotSpan !== 1) {\n                        attributes.colspan = slotSpan;\n                    }\n                    if (slot.isNonWorking) {\n                        attributes.className = styles.nonWorking;\n                    }\n                    cells.push(kendoDomElement('td', attributes, [kendoTextElement('\\xA0')]));\n                }\n                row = kendoDomElement('tr', null, cells);\n                return this._createTable(totalSpan, [row], { className: styles.columnsTable });\n            },\n            _tasksTable: function (tasks) {\n                var rows = [];\n                var row;\n                var cell;\n                var position;\n                var task;\n                var styles = GanttView.styles;\n                var coordinates = this._taskCoordinates = {};\n                var size = this._calculateMilestoneWidth();\n                var milestoneWidth = Math.round(size.width);\n                var resourcesField = this.options.resourcesField;\n                var className = [\n                    styles.resource,\n                    styles.resourceAlt\n                ];\n                var calculatedSize = this.options.calculatedSize;\n                var resourcesPosition;\n                var resourcesMargin = this._calculateResourcesMargin();\n                var taskBorderWidth = this._calculateTaskBorderWidth();\n                var resourceStyle;\n                var addCoordinates = function (rowIndex) {\n                    var taskLeft;\n                    var taskRight;\n                    taskLeft = position.left;\n                    taskRight = taskLeft + position.width;\n                    if (task.isMilestone()) {\n                        taskLeft -= milestoneWidth / 2;\n                        taskRight = taskLeft + milestoneWidth;\n                    }\n                    coordinates[task.id] = {\n                        start: taskLeft,\n                        end: taskRight,\n                        rowIndex: rowIndex\n                    };\n                };\n                for (var i = 0, l = tasks.length; i < l; i++) {\n                    task = tasks[i];\n                    position = this._taskPosition(task);\n                    position.borderWidth = taskBorderWidth;\n                    row = kendoDomElement('tr', null);\n                    cell = kendoDomElement('td');\n                    if (task.start <= this.end && task.end >= this.start) {\n                        cell.children.push(this._renderTask(tasks[i], position));\n                        if (task[resourcesField] && task[resourcesField].length) {\n                            if (isRtl) {\n                                resourcesPosition = this._tableWidth - position.left;\n                            } else {\n                                resourcesPosition = Math.max(position.width || size.clientWidth, 0) + position.left;\n                            }\n                            resourceStyle = { width: this._tableWidth - (resourcesPosition + resourcesMargin) + 'px' };\n                            resourceStyle[isRtl ? 'right' : 'left'] = resourcesPosition + 'px';\n                            if (calculatedSize) {\n                                resourceStyle.height = calculatedSize.cell + 'px';\n                            }\n                            cell.children.push(kendoDomElement('div', {\n                                className: styles.resourcesWrap,\n                                style: resourceStyle\n                            }, this._renderResources(task[resourcesField], className[i % 2])));\n                        }\n                        addCoordinates(i);\n                    }\n                    row.children.push(cell);\n                    rows.push(row);\n                }\n                return this._createTable(1, rows, { className: GanttView.styles.tasksTable });\n            },\n            _createTable: function (colspan, rows, styles) {\n                var cols = [];\n                var colgroup;\n                var tbody;\n                for (var i = 0; i < colspan; i++) {\n                    cols.push(kendoDomElement('col'));\n                }\n                colgroup = kendoDomElement('colgroup', null, cols);\n                tbody = kendoDomElement('tbody', null, rows);\n                if (!styles.style) {\n                    styles.style = {};\n                }\n                styles.style.width = this._tableWidth + 'px';\n                return kendoDomElement('table', styles, [\n                    colgroup,\n                    tbody\n                ]);\n            },\n            _calculateTableWidth: function () {\n                var slots = this._timeSlots();\n                var maxSpan = 0;\n                var totalSpan = 0;\n                var currentSpan;\n                var tableWidth;\n                for (var i = 0, length = slots.length; i < length; i++) {\n                    currentSpan = slots[i].span;\n                    totalSpan += currentSpan;\n                    if (currentSpan > maxSpan) {\n                        maxSpan = currentSpan;\n                    }\n                }\n                tableWidth = Math.round(totalSpan * this.options.slotSize / maxSpan);\n                return tableWidth;\n            },\n            _calculateMilestoneWidth: function () {\n                var size;\n                var className = GanttView.styles.task + ' ' + GanttView.styles.taskMilestone;\n                var milestone = $('<div class=\\'' + className + '\\' style=\\'visibility: hidden; position: absolute\\'>');\n                var boundingClientRect;\n                this.content.append(milestone);\n                boundingClientRect = milestone[0].getBoundingClientRect();\n                size = {\n                    'width': boundingClientRect.right - boundingClientRect.left,\n                    'clientWidth': milestone[0].clientWidth\n                };\n                milestone.remove();\n                return size;\n            },\n            _calculateResourcesMargin: function () {\n                var margin;\n                var wrapper = $('<div class=\\'' + GanttView.styles.resourcesWrap + '\\' style=\\'visibility: hidden; position: absolute\\'>');\n                this.content.append(wrapper);\n                margin = parseInt(wrapper.css(isRtl ? 'margin-right' : 'margin-left'), 10);\n                wrapper.remove();\n                return margin;\n            },\n            _calculateTaskBorderWidth: function () {\n                var width;\n                var className = GanttView.styles.task + ' ' + GanttView.styles.taskSingle;\n                var task = $('<div class=\\'' + className + '\\' style=\\'visibility: hidden; position: absolute\\'>');\n                var computedStyle;\n                this.content.append(task);\n                computedStyle = kendo.getComputedStyles(task[0], ['border-left-width']);\n                width = parseFloat(computedStyle['border-left-width'], 10);\n                task.remove();\n                return width;\n            },\n            _renderTask: function (task, position) {\n                var taskWrapper;\n                var taskElement;\n                var editable = this.options.editable;\n                var progressHandleOffset;\n                var taskLeft = position.left;\n                var styles = GanttView.styles;\n                var wrapClassName = styles.taskWrap;\n                var calculatedSize = this.options.calculatedSize;\n                var dragHandleStyle = {};\n                var taskWrapAttr = {\n                    className: wrapClassName,\n                    style: { left: taskLeft + 'px' }\n                };\n                if (calculatedSize) {\n                    taskWrapAttr.style.height = calculatedSize.cell + 'px';\n                }\n                if (task.summary) {\n                    taskElement = this._renderSummary(task, position);\n                } else if (task.isMilestone()) {\n                    taskElement = this._renderMilestone(task, position);\n                    taskWrapAttr.className += ' ' + styles.taskMilestoneWrap;\n                } else {\n                    taskElement = this._renderSingleTask(task, position);\n                }\n                taskWrapper = kendoDomElement('div', taskWrapAttr, [taskElement]);\n                if (editable && editable.dependencyCreate !== false) {\n                    taskWrapper.children.push(kendoDomElement('div', { className: styles.taskDot + ' ' + styles.taskDotStart }));\n                    taskWrapper.children.push(kendoDomElement('div', { className: styles.taskDot + ' ' + styles.taskDotEnd }));\n                }\n                if (!task.summary && !task.isMilestone() && editable && editable.dragPercentComplete !== false && editable.update !== false && this._taskTemplate === null) {\n                    progressHandleOffset = Math.round(position.width * task.percentComplete);\n                    dragHandleStyle[isRtl ? 'right' : 'left'] = progressHandleOffset + 'px';\n                    taskWrapper.children.push(kendoDomElement('div', {\n                        className: styles.taskDragHandle,\n                        style: dragHandleStyle\n                    }));\n                }\n                return taskWrapper;\n            },\n            _renderSingleTask: function (task, position) {\n                var styles = GanttView.styles;\n                var progressWidth = Math.round(position.width * task.percentComplete);\n                var taskChildren = [];\n                var taskContent;\n                var editable = this.options.editable;\n                if (this._taskTemplate !== null) {\n                    taskContent = kendoHtmlElement(this._taskTemplate(task));\n                } else {\n                    taskContent = kendoTextElement(task.title);\n                    taskChildren.push(kendoDomElement('div', {\n                        className: styles.taskComplete,\n                        style: { width: progressWidth + 'px' }\n                    }));\n                }\n                var content = kendoDomElement('div', { className: styles.taskContent }, [kendoDomElement('div', { className: styles.taskTemplate }, [taskContent])]);\n                taskChildren.push(content);\n                if (editable) {\n                    if (editable.destroy !== false) {\n                        content.children.push(kendoDomElement('span', { className: styles.taskActions }, [kendoDomElement('a', {\n                                className: styles.link + ' ' + styles.taskDelete,\n                                href: '#',\n                                'aria-label': 'Delete'\n                            }, [kendoDomElement('span', { className: styles.icon + ' ' + styles.iconDelete })])]));\n                    }\n                    if (editable.resize !== false && editable.update !== false) {\n                        content.children.push(kendoDomElement('span', { className: styles.taskResizeHandle + ' ' + styles.taskResizeHandleWest }));\n                        content.children.push(kendoDomElement('span', { className: styles.taskResizeHandle + ' ' + styles.taskResizeHandleEast }));\n                    }\n                }\n                var element = kendoDomElement('div', {\n                    className: styles.task + ' ' + styles.taskSingle,\n                    'data-uid': task.uid,\n                    style: { width: Math.max(position.width - position.borderWidth * 2, 0) + 'px' }\n                }, taskChildren);\n                return element;\n            },\n            _renderMilestone: function (task) {\n                var styles = GanttView.styles;\n                var element = kendoDomElement('div', {\n                    className: styles.task + ' ' + styles.taskMilestone,\n                    'data-uid': task.uid\n                });\n                return element;\n            },\n            _renderSummary: function (task, position) {\n                var styles = GanttView.styles;\n                var progressWidth = Math.round(position.width * task.percentComplete);\n                var element = kendoDomElement('div', {\n                    className: styles.task + ' ' + styles.taskSummary,\n                    'data-uid': task.uid,\n                    style: { width: position.width + 'px' }\n                }, [kendoDomElement('div', {\n                        className: styles.taskSummaryProgress,\n                        style: { width: progressWidth + 'px' }\n                    }, [kendoDomElement('div', {\n                            className: styles.taskSummaryComplete,\n                            style: { width: position.width + 'px' }\n                        })])]);\n                return element;\n            },\n            _renderResources: function (resources, className) {\n                var children = [];\n                var resource;\n                for (var i = 0, length = resources.length; i < length; i++) {\n                    resource = resources[i];\n                    children.push(kendoDomElement('span', {\n                        className: className,\n                        style: { 'color': resource.get('color') }\n                    }, [kendoTextElement(resource.get('name'))]));\n                }\n                if (isRtl) {\n                    children.reverse();\n                }\n                return children;\n            },\n            _taskPosition: function (task) {\n                var round = Math.round;\n                var startLeft = round(this._offset(isRtl ? task.end : task.start));\n                var endLeft = round(this._offset(isRtl ? task.start : task.end));\n                return {\n                    left: startLeft,\n                    width: endLeft - startLeft\n                };\n            },\n            _offset: function (date) {\n                var slots = this._timeSlots();\n                var slot;\n                var startOffset;\n                var slotDuration;\n                var slotOffset = 0;\n                var startIndex;\n                if (!slots.length) {\n                    return 0;\n                }\n                startIndex = this._slotIndex('start', date);\n                slot = slots[startIndex];\n                if (slot.end < date) {\n                    slotOffset = slot.offsetWidth;\n                } else if (slot.start <= date) {\n                    startOffset = date - slot.start;\n                    slotDuration = slot.end - slot.start;\n                    slotOffset = startOffset / slotDuration * slot.offsetWidth;\n                }\n                if (isRtl) {\n                    slotOffset = slot.offsetWidth + 1 - slotOffset;\n                }\n                return slot.offsetLeft + slotOffset;\n            },\n            _slotIndex: function (field, value, reverse) {\n                var slots = this._timeSlots();\n                var startIdx = 0;\n                var endIdx = slots.length - 1;\n                var middle;\n                if (reverse) {\n                    slots = [].slice.call(slots).reverse();\n                }\n                do {\n                    middle = Math.ceil((endIdx + startIdx) / 2);\n                    if (slots[middle][field] < value) {\n                        startIdx = middle;\n                    } else {\n                        if (middle === endIdx) {\n                            middle--;\n                        }\n                        endIdx = middle;\n                    }\n                } while (startIdx !== endIdx);\n                if (reverse) {\n                    startIdx = slots.length - 1 - startIdx;\n                }\n                return startIdx;\n            },\n            _timeByPosition: function (x, snap, snapToEnd) {\n                var slot = this._slotByPosition(x);\n                if (snap) {\n                    return snapToEnd ? slot.end : slot.start;\n                }\n                var offsetLeft = x - $(DOT + GanttView.styles.tasksTable).offset().left;\n                var duration = slot.end - slot.start;\n                var slotOffset = offsetLeft - slot.offsetLeft;\n                if (isRtl) {\n                    slotOffset = slot.offsetWidth - slotOffset;\n                }\n                return new Date(slot.start.getTime() + duration * (slotOffset / slot.offsetWidth));\n            },\n            _slotByPosition: function (x) {\n                var offsetLeft = x - $(DOT + GanttView.styles.tasksTable).offset().left;\n                var slotIndex = this._slotIndex('offsetLeft', offsetLeft, isRtl);\n                return this._timeSlots()[slotIndex];\n            },\n            _renderDependencies: function (dependencies) {\n                var elements = [];\n                var tree = this._dependencyTree;\n                for (var i = 0, l = dependencies.length; i < l; i++) {\n                    elements.push.apply(elements, this._renderDependency(dependencies[i]));\n                }\n                tree.render(elements);\n            },\n            _renderDependency: function (dependency) {\n                var predecessor = this._taskCoordinates[dependency.predecessorId];\n                var successor = this._taskCoordinates[dependency.successorId];\n                var elements;\n                var method;\n                if (!predecessor || !successor) {\n                    return [];\n                }\n                method = '_render' + [\n                    'FF',\n                    'FS',\n                    'SF',\n                    'SS'\n                ][isRtl ? 3 - dependency.type : dependency.type];\n                elements = this[method](predecessor, successor);\n                for (var i = 0, length = elements.length; i < length; i++) {\n                    elements[i].attr['data-uid'] = dependency.uid;\n                }\n                return elements;\n            },\n            _renderFF: function (from, to) {\n                var lines = this._dependencyFF(from, to, false);\n                lines[lines.length - 1].children[0] = this._arrow(true);\n                return lines;\n            },\n            _renderSS: function (from, to) {\n                var lines = this._dependencyFF(to, from, true);\n                lines[0].children[0] = this._arrow(false);\n                return lines.reverse();\n            },\n            _renderFS: function (from, to) {\n                var lines = this._dependencyFS(from, to, false);\n                lines[lines.length - 1].children[0] = this._arrow(false);\n                return lines;\n            },\n            _renderSF: function (from, to) {\n                var lines = this._dependencyFS(to, from, true);\n                lines[0].children[0] = this._arrow(true);\n                return lines.reverse();\n            },\n            _dependencyFF: function (from, to, reverse) {\n                var that = this;\n                var lines = [];\n                var left = 0;\n                var top = 0;\n                var width = 0;\n                var height = 0;\n                var dir = reverse ? 'start' : 'end';\n                var delta;\n                var overlap = 2;\n                var arrowOverlap = 1;\n                var rowHeight = this._rowHeight;\n                var minLineWidth = 10;\n                var fromTop = from.rowIndex * rowHeight + Math.floor(rowHeight / 2) - 1;\n                var toTop = to.rowIndex * rowHeight + Math.floor(rowHeight / 2) - 1;\n                var styles = GanttView.styles;\n                var addHorizontal = function () {\n                    lines.push(that._line(styles.line + ' ' + styles.lineHorizontal, {\n                        left: left + 'px',\n                        top: top + 'px',\n                        width: width + 'px'\n                    }));\n                };\n                var addVertical = function () {\n                    lines.push(that._line(styles.line + ' ' + styles.lineVertical, {\n                        left: left + 'px',\n                        top: top + 'px',\n                        height: height + 'px'\n                    }));\n                };\n                left = from[dir];\n                top = fromTop;\n                width = minLineWidth;\n                delta = to[dir] - from[dir];\n                if (delta > 0 !== reverse) {\n                    width = Math.abs(delta) + minLineWidth;\n                }\n                if (reverse) {\n                    left -= width;\n                    width -= arrowOverlap;\n                    addHorizontal();\n                } else {\n                    addHorizontal();\n                    left += width - overlap;\n                }\n                if (toTop < top) {\n                    height = top - toTop;\n                    height += overlap;\n                    top = toTop;\n                    addVertical();\n                } else {\n                    height = toTop - top;\n                    height += overlap;\n                    addVertical();\n                    top += height - overlap;\n                }\n                width = Math.abs(left - to[dir]);\n                if (!reverse) {\n                    width -= arrowOverlap;\n                    left -= width;\n                }\n                addHorizontal();\n                return lines;\n            },\n            _dependencyFS: function (from, to, reverse) {\n                var that = this;\n                var lines = [];\n                var left = 0;\n                var top = 0;\n                var width = 0;\n                var height = 0;\n                var rowHeight = this._rowHeight;\n                var minLineHeight = Math.floor(rowHeight / 2);\n                var minLineWidth = 10;\n                var minDistance = 2 * minLineWidth;\n                var delta = to.start - from.end;\n                var overlap = 2;\n                var arrowOverlap = 1;\n                var fromTop = from.rowIndex * rowHeight + Math.floor(rowHeight / 2) - 1;\n                var toTop = to.rowIndex * rowHeight + Math.floor(rowHeight / 2) - 1;\n                var styles = GanttView.styles;\n                var addHorizontal = function () {\n                    lines.push(that._line(styles.line + ' ' + styles.lineHorizontal, {\n                        left: left + 'px',\n                        top: top + 'px',\n                        width: width + 'px'\n                    }));\n                };\n                var addVertical = function () {\n                    lines.push(that._line(styles.line + ' ' + styles.lineVertical, {\n                        left: left + 'px',\n                        top: top + 'px',\n                        height: height + 'px'\n                    }));\n                };\n                left = from.end;\n                top = fromTop;\n                width = minLineWidth;\n                if (reverse) {\n                    left += arrowOverlap;\n                    if (delta > minDistance) {\n                        width = delta - (minLineWidth - overlap);\n                    }\n                    width -= arrowOverlap;\n                }\n                addHorizontal();\n                left += width - overlap;\n                if (delta <= minDistance) {\n                    height = reverse ? Math.abs(toTop - fromTop) - minLineHeight : minLineHeight;\n                    if (toTop < fromTop) {\n                        top -= height;\n                        height += overlap;\n                        addVertical();\n                    } else {\n                        addVertical();\n                        top += height;\n                    }\n                    width = from.end - to.start + minDistance;\n                    if (width < minLineWidth) {\n                        width = minLineWidth;\n                    }\n                    left -= width - overlap;\n                    addHorizontal();\n                }\n                if (toTop < fromTop) {\n                    height = top - toTop;\n                    top = toTop;\n                    height += overlap;\n                    addVertical();\n                } else {\n                    height = toTop - top;\n                    addVertical();\n                    top += height;\n                }\n                width = to.start - left;\n                if (!reverse) {\n                    width -= arrowOverlap;\n                }\n                addHorizontal();\n                return lines;\n            },\n            _line: function (className, styles) {\n                return kendoDomElement('div', {\n                    className: className,\n                    style: styles\n                });\n            },\n            _arrow: function (direction) {\n                return kendoDomElement('span', { className: direction ? GanttView.styles.arrowWest : GanttView.styles.arrowEast });\n            },\n            _colgroup: function () {\n                var slots = this._timeSlots();\n                var count = slots.length;\n                var cols = [];\n                for (var i = 0; i < count; i++) {\n                    for (var j = 0, length = slots[i].span; j < length; j++) {\n                        cols.push(kendoDomElement('col'));\n                    }\n                }\n                return kendoDomElement('colgroup', null, cols);\n            },\n            _createDragHint: function (element) {\n                this._dragHint = element.clone().addClass(GanttView.styles.dragHint).css('cursor', 'move');\n                element.parent().append(this._dragHint);\n            },\n            _updateDragHint: function (start) {\n                var left = this._offset(start);\n                this._dragHint.css({ 'left': left });\n            },\n            _removeDragHint: function () {\n                this._dragHint.remove();\n                this._dragHint = null;\n            },\n            _createResizeHint: function (task) {\n                var styles = GanttView.styles;\n                var taskTop = this._taskCoordinates[task.id].rowIndex * this._rowHeight;\n                var tooltipHeight;\n                var tooltipTop;\n                var options = this.options;\n                var messages = options.messages;\n                this._resizeHint = $(RESIZE_HINT({ styles: styles })).css({\n                    'top': 0,\n                    'height': this._contentHeight\n                });\n                this.content.append(this._resizeHint);\n                this._resizeTooltip = $(RESIZE_TOOLTIP_TEMPLATE({\n                    styles: styles,\n                    start: task.start,\n                    end: task.end,\n                    messages: messages.views,\n                    format: options.resizeTooltipFormat\n                })).css({\n                    'top': 0,\n                    'left': 0\n                });\n                this.content.append(this._resizeTooltip);\n                this._resizeTooltipWidth = outerWidth(this._resizeTooltip);\n                tooltipHeight = outerHeight(this._resizeTooltip);\n                tooltipTop = taskTop - tooltipHeight;\n                if (tooltipTop < 0) {\n                    tooltipTop = taskTop + this._rowHeight;\n                }\n                this._resizeTooltipTop = tooltipTop;\n            },\n            _updateResizeHint: function (start, end, resizeStart) {\n                var left = this._offset(isRtl ? end : start);\n                var right = this._offset(isRtl ? start : end);\n                var width = right - left;\n                var tooltipLeft = resizeStart !== isRtl ? left : right;\n                var tablesWidth = this._tableWidth - kendo.support.scrollbar();\n                var tooltipWidth = this._resizeTooltipWidth;\n                var options = this.options;\n                var messages = options.messages;\n                var tableOffset = $(DOT + GanttView.styles.tasksTable).offset().left - $(DOT + GanttView.styles.tasksWrapper).offset().left;\n                if (isRtl) {\n                    left += tableOffset;\n                }\n                this._resizeHint.css({\n                    'left': left,\n                    'width': width\n                });\n                if (this._resizeTooltip) {\n                    this._resizeTooltip.remove();\n                }\n                tooltipLeft -= Math.round(tooltipWidth / 2);\n                if (tooltipLeft < 0) {\n                    tooltipLeft = 0;\n                } else if (tooltipLeft + tooltipWidth > tablesWidth) {\n                    tooltipLeft = tablesWidth - tooltipWidth;\n                }\n                if (isRtl) {\n                    tooltipLeft += tableOffset;\n                }\n                this._resizeTooltip = $(RESIZE_TOOLTIP_TEMPLATE({\n                    styles: GanttView.styles,\n                    start: start,\n                    end: end,\n                    messages: messages.views,\n                    format: options.resizeTooltipFormat\n                })).css({\n                    'top': this._resizeTooltipTop,\n                    'left': tooltipLeft,\n                    'min-width': tooltipWidth\n                }).appendTo(this.content);\n            },\n            _removeResizeHint: function () {\n                this._resizeHint.remove();\n                this._resizeHint = null;\n                this._resizeTooltip.remove();\n                this._resizeTooltip = null;\n            },\n            _updatePercentCompleteTooltip: function (top, left, text) {\n                this._removePercentCompleteTooltip();\n                var tooltip = this._percentCompleteResizeTooltip = $(PERCENT_RESIZE_TOOLTIP_TEMPLATE({\n                    styles: GanttView.styles,\n                    text: text\n                })).appendTo(this.element);\n                var tooltipMiddle = Math.round(outerWidth(tooltip) / 2);\n                var arrow = tooltip.find(DOT + GanttView.styles.callout);\n                var arrowHeight = Math.round(outerWidth(arrow) / 2);\n                tooltip.css({\n                    'top': top - (outerHeight(tooltip) + arrowHeight),\n                    'left': left - tooltipMiddle\n                });\n                arrow.css('left', tooltipMiddle - arrowHeight);\n            },\n            _removePercentCompleteTooltip: function () {\n                if (this._percentCompleteResizeTooltip) {\n                    this._percentCompleteResizeTooltip.remove();\n                }\n                this._percentCompleteResizeTooltip = null;\n            },\n            _updateDependencyDragHint: function (from, to, useVML) {\n                this._removeDependencyDragHint();\n                if (useVML) {\n                    this._creteVmlDependencyDragHint(from, to);\n                } else {\n                    this._creteDependencyDragHint(from, to);\n                }\n            },\n            _creteDependencyDragHint: function (from, to) {\n                var styles = GanttView.styles;\n                var deltaX = to.x - from.x;\n                var deltaY = to.y - from.y;\n                var width = Math.sqrt(deltaX * deltaX + deltaY * deltaY);\n                var angle = Math.atan(deltaY / deltaX);\n                if (deltaX < 0) {\n                    angle += Math.PI;\n                }\n                $('<div class=\\'' + styles.line + ' ' + styles.lineHorizontal + ' ' + styles.dependencyHint + '\\'></div>').css({\n                    'top': from.y,\n                    'left': from.x,\n                    'width': width,\n                    'transform-origin': '0% 0',\n                    '-ms-transform-origin': '0% 0',\n                    '-webkit-transform-origin': '0% 0',\n                    'transform': 'rotate(' + angle + 'rad)',\n                    '-ms-transform': 'rotate(' + angle + 'rad)',\n                    '-webkit-transform': 'rotate(' + angle + 'rad)'\n                }).appendTo(this.content);\n            },\n            _creteVmlDependencyDragHint: function (from, to) {\n                var hint = $('<kvml:line class=\\'' + GanttView.styles.dependencyHint + '\\' style=\\'position:absolute; top: 0px; left: 0px;\\' strokecolor=\\'black\\' strokeweight=\\'2px\\' from=\\'' + from.x + 'px,' + from.y + 'px\\' to=\\'' + to.x + 'px,' + to.y + 'px\\'' + '></kvml:line>').appendTo(this.content);\n                hint[0].outerHTML = hint[0].outerHTML;\n            },\n            _removeDependencyDragHint: function () {\n                this.content.find(DOT + GanttView.styles.dependencyHint).remove();\n            },\n            _createTaskTooltip: function (task, element, mouseLeft) {\n                var styles = GanttView.styles;\n                var options = this.options;\n                var content = this.content;\n                var contentOffset = content.offset();\n                var contentWidth = content.width();\n                var contentScrollLeft = kendo.scrollLeft(content);\n                var row = $(element).parents('tr').first();\n                var rowOffset = row.offset();\n                var template = options.tooltip && options.tooltip.template ? kendo.template(options.tooltip.template) : TASK_TOOLTIP_TEMPLATE;\n                var left = isRtl ? mouseLeft - (contentOffset.left + contentScrollLeft + kendo.support.scrollbar()) : mouseLeft - (contentOffset.left - contentScrollLeft);\n                var top = rowOffset.top + outerHeight(row) - contentOffset.top + content.scrollTop();\n                var tooltip = this._taskTooltip = $('<div style=\"z-index: 100002;\" class=\"' + styles.tooltipWrapper + '\" >' + '<div class=\"' + styles.taskContent + '\"></div></div>');\n                var tooltipWidth;\n                tooltip.css({\n                    'left': left,\n                    'top': top\n                }).appendTo(content).find(DOT + styles.taskContent).append(template({\n                    styles: styles,\n                    task: task,\n                    messages: options.messages.views\n                }));\n                if (outerHeight(tooltip) < rowOffset.top - contentOffset.top) {\n                    tooltip.css('top', rowOffset.top - contentOffset.top - outerHeight(tooltip) + content.scrollTop());\n                }\n                tooltipWidth = outerWidth(tooltip);\n                if (tooltipWidth + left - contentScrollLeft > contentWidth) {\n                    left -= tooltipWidth;\n                    if (left < contentScrollLeft) {\n                        left = contentScrollLeft + contentWidth - (tooltipWidth + 17);\n                    }\n                    tooltip.css('left', left);\n                }\n            },\n            _removeTaskTooltip: function () {\n                if (this._taskTooltip) {\n                    this._taskTooltip.remove();\n                }\n                this._taskTooltip = null;\n            },\n            _scrollTo: function (element) {\n                var elementLeft = element.offset().left;\n                var elementWidth = element.width();\n                var elementRight = elementLeft + elementWidth;\n                var row = element.closest('tr');\n                var rowTop = row.offset().top;\n                var rowHeight = row.height();\n                var rowBottom = rowTop + rowHeight;\n                var content = this.content;\n                var contentOffset = content.offset();\n                var contentTop = contentOffset.top;\n                var contentHeight = content.height();\n                var contentBottom = contentTop + contentHeight;\n                var contentLeft = contentOffset.left;\n                var contentWidth = content.width();\n                var contentRight = contentLeft + contentWidth;\n                var scrollbarWidth = kendo.support.scrollbar();\n                if (rowTop < contentTop) {\n                    content.scrollTop(content.scrollTop() + (rowTop - contentTop));\n                } else if (rowBottom > contentBottom) {\n                    content.scrollTop(content.scrollTop() + (rowBottom + scrollbarWidth - contentBottom));\n                }\n                if (elementLeft < contentLeft && elementWidth > contentWidth && elementRight < contentRight || elementRight > contentRight && elementWidth < contentWidth) {\n                    content.scrollLeft(content.scrollLeft() + (elementRight + scrollbarWidth - contentRight));\n                } else if (elementRight > contentRight && elementWidth > contentWidth && elementLeft > contentLeft || elementLeft < contentLeft && elementWidth < contentWidth) {\n                    content.scrollLeft(content.scrollLeft() + (elementLeft - contentLeft));\n                }\n            },\n            _scrollToDate: function (date) {\n                var viewStart = this.start;\n                var viewEnd = this.end;\n                var offset;\n                if (date >= viewStart && date < viewEnd) {\n                    offset = this._offset(date);\n                    if (kendo.support.isRtl(this.element)) {\n                        offset = this._tableWidth - offset;\n                    }\n                    kendo.scrollLeft(this.content, offset);\n                }\n            },\n            _timeSlots: function () {\n                if (!this._slots || !this._slots.length) {\n                    return [];\n                }\n                return this._slots[this._slots.length - 1];\n            },\n            _headers: function (columnLevels) {\n                var rows = [];\n                var level;\n                var headers;\n                var column;\n                var headerText;\n                var styles = GanttView.styles;\n                for (var levelIndex = 0, levelCount = columnLevels.length; levelIndex < levelCount; levelIndex++) {\n                    level = columnLevels[levelIndex];\n                    headers = [];\n                    for (var columnIndex = 0, columnCount = level.length; columnIndex < columnCount; columnIndex++) {\n                        column = level[columnIndex];\n                        headerText = kendoHtmlElement(column.text);\n                        headers.push(kendoDomElement('th', {\n                            colspan: column.span,\n                            className: styles.header + (column.isNonWorking ? ' ' + styles.nonWorking : '')\n                        }, [headerText]));\n                    }\n                    rows.push(kendoDomElement('tr', null, headers));\n                }\n                return rows;\n            },\n            _hours: function (start, end) {\n                var slotEnd;\n                var slots = [];\n                var options = this.options;\n                var workDayStart = options.workDayStart.getHours();\n                var workDayEnd = options.workDayEnd.getHours();\n                var isWorkHour;\n                var hours;\n                var hourSpan = options.hourSpan;\n                start = new Date(start);\n                end = new Date(end);\n                while (start < end) {\n                    slotEnd = new Date(start);\n                    hours = slotEnd.getHours();\n                    isWorkHour = hours >= workDayStart && hours < workDayEnd;\n                    slotEnd.setHours(slotEnd.getHours() + hourSpan);\n                    if (hours == slotEnd.getHours()) {\n                        slotEnd.setHours(slotEnd.getHours() + 2 * hourSpan);\n                    }\n                    if (!options.showWorkHours || isWorkHour) {\n                        slots.push({\n                            start: start,\n                            end: slotEnd,\n                            isNonWorking: !isWorkHour,\n                            span: 1\n                        });\n                    }\n                    start = slotEnd;\n                }\n                return slots;\n            },\n            _days: function (start, end) {\n                var slotEnd;\n                var slots = [];\n                var isWorkDay;\n                start = new Date(start);\n                end = new Date(end);\n                while (start < end) {\n                    slotEnd = end < kendo.date.nextDay(start) ? end : kendo.date.nextDay(start);\n                    isWorkDay = this._isWorkDay(start);\n                    if (!this.options.showWorkDays || isWorkDay) {\n                        slots.push({\n                            start: start,\n                            end: slotEnd,\n                            isNonWorking: !isWorkDay,\n                            span: 1\n                        });\n                    }\n                    start = slotEnd;\n                }\n                return slots;\n            },\n            _weeks: function (start, end) {\n                var slotEnd;\n                var slots = [];\n                var firstDay = this.calendarInfo().firstDay;\n                var daySlots;\n                var span;\n                start = new Date(start);\n                end = new Date(end);\n                while (start < end) {\n                    slotEnd = kendo.date.dayOfWeek(kendo.date.addDays(start, 1), firstDay, 1);\n                    if (slotEnd > end) {\n                        slotEnd = end;\n                    }\n                    daySlots = this._days(start, slotEnd);\n                    span = daySlots.length;\n                    if (span > 0) {\n                        slots.push({\n                            start: daySlots[0].start,\n                            end: daySlots[span - 1].end,\n                            span: span\n                        });\n                    }\n                    start = slotEnd;\n                }\n                return slots;\n            },\n            _months: function (start, end) {\n                var slotEnd;\n                var endMonth;\n                var slots = [];\n                var daySlots;\n                var span;\n                start = new Date(start);\n                end = new Date(end);\n                while (start < end) {\n                    slotEnd = new Date(start);\n                    endMonth = kendo.date.firstDayOfMonth(new Date(slotEnd.setMonth(slotEnd.getMonth() + 1)));\n                    slotEnd = end < endMonth ? end : endMonth;\n                    daySlots = this._days(start, slotEnd);\n                    span = daySlots.length;\n                    if (span > 0) {\n                        slots.push({\n                            start: daySlots[0].start,\n                            end: daySlots[span - 1].end,\n                            span: span\n                        });\n                    }\n                    start = slotEnd;\n                }\n                return slots;\n            },\n            _years: function (start, end) {\n                var slotEnd;\n                var monthSpan;\n                var endMonth;\n                var slots = [];\n                start = new Date(start);\n                end = new Date(end);\n                while (start < end) {\n                    slotEnd = new Date(start);\n                    slotEnd = kendo.date.firstDayOfMonth(new Date(slotEnd.setMonth(12)));\n                    if (slotEnd >= end) {\n                        slotEnd = end;\n                    }\n                    endMonth = slotEnd.getMonth() || 12;\n                    monthSpan = endMonth - start.getMonth();\n                    slots.push({\n                        start: start,\n                        end: slotEnd,\n                        span: monthSpan\n                    });\n                    start = slotEnd;\n                }\n                return slots;\n            },\n            _slotHeaders: function (slots, template) {\n                var columns = [];\n                var slot;\n                for (var i = 0, l = slots.length; i < l; i++) {\n                    slot = slots[i];\n                    columns.push({\n                        text: template(slot),\n                        isNonWorking: !!slot.isNonWorking,\n                        span: slot.span\n                    });\n                }\n                return columns;\n            },\n            _isWorkDay: function (date) {\n                var day = date.getDay();\n                var workDays = this._workDays;\n                for (var i = 0, l = workDays.length; i < l; i++) {\n                    if (workDays[i] === day) {\n                        return true;\n                    }\n                }\n                return false;\n            },\n            calendarInfo: function () {\n                return kendo.getCulture().calendars.standard;\n            },\n            _renderCurrentTime: function () {\n                var currentTime = this._getCurrentTime();\n                var timeOffset = this._offset(currentTime);\n                var element = $('<div class=\\'k-current-time\\'></div>');\n                var viewStyles = GanttView.styles;\n                var tablesWrap = $(DOT + viewStyles.tasksWrapper);\n                var tasksTable = $(DOT + viewStyles.tasksTable);\n                var slot;\n                if (!this.content || !this._timeSlots().length) {\n                    return;\n                }\n                this.content.find('.k-current-time').remove();\n                slot = this._timeSlots()[this._slotIndex('start', currentTime)];\n                if (currentTime < slot.start || currentTime > slot.end) {\n                    return;\n                }\n                if (tablesWrap.length && tasksTable.length) {\n                    timeOffset += tasksTable.offset().left - tablesWrap.offset().left;\n                }\n                element.css({\n                    left: timeOffset + 'px',\n                    top: '0px',\n                    width: '1px',\n                    height: this._contentHeight + 'px'\n                }).appendTo(this.content);\n            },\n            _getCurrentTime: function () {\n                return new Date();\n            },\n            _currentTime: function () {\n                var markerOptions = this.options.currentTimeMarker;\n                if (markerOptions !== false && markerOptions.updateInterval !== undefined) {\n                    this._renderCurrentTime();\n                    this._currentTimeUpdateTimer = setInterval(proxy(this._renderCurrentTime, this), markerOptions.updateInterval);\n                }\n            }\n        });\n        extend(true, GanttView, { styles: viewStyles });\n        kendo.ui.GanttDayView = GanttView.extend({\n            name: 'day',\n            options: {\n                timeHeaderTemplate: TIME_HEADER_TEMPLATE,\n                dayHeaderTemplate: DAY_HEADER_TEMPLATE,\n                resizeTooltipFormat: 'h:mm tt ddd, MMM d'\n            },\n            range: function (range) {\n                var optionsRange = this.options.range;\n                this.start = kendo.date.getDate(range.start);\n                this.end = kendo.date.getDate(range.end);\n                if (kendo.date.getMilliseconds(range.end) > 0 || this.end.getTime() === this.start.getTime()) {\n                    this.end = kendo.date.addDays(this.end, 1);\n                }\n                if (optionsRange && optionsRange.start) {\n                    this.start = kendo.date.getDate(optionsRange.start);\n                    this.start.setHours(optionsRange.start.getHours());\n                }\n                if (optionsRange && optionsRange.end) {\n                    this.end = kendo.date.getDate(optionsRange.end);\n                    this.end.setHours(optionsRange.end.getHours());\n                }\n            },\n            _createSlots: function () {\n                var daySlots;\n                var daySlot;\n                var hourSlots;\n                var hours;\n                var slots = [];\n                daySlots = this._days(this.start, this.end);\n                hourSlots = [];\n                for (var i = 0, l = daySlots.length; i < l; i++) {\n                    daySlot = daySlots[i];\n                    hours = this._hours(daySlot.start, daySlot.end);\n                    daySlot.span = hours.length;\n                    hourSlots.push.apply(hourSlots, hours);\n                }\n                slots.push(daySlots);\n                slots.push(hourSlots);\n                return slots;\n            },\n            _layout: function () {\n                var rows = [];\n                var options = this.options;\n                rows.push(this._slotHeaders(this._slots[0], kendo.template(options.dayHeaderTemplate)));\n                rows.push(this._slotHeaders(this._slots[1], kendo.template(options.timeHeaderTemplate)));\n                return rows;\n            }\n        });\n        kendo.ui.GanttWeekView = GanttView.extend({\n            name: 'week',\n            options: {\n                dayHeaderTemplate: DAY_HEADER_TEMPLATE,\n                weekHeaderTemplate: WEEK_HEADER_TEMPLATE,\n                resizeTooltipFormat: 'h:mm tt ddd, MMM d'\n            },\n            range: function (range) {\n                var optionsRange = this.options.range;\n                var calendarInfo = this.calendarInfo();\n                var firstDay = calendarInfo.firstDay;\n                var rangeEnd = range.end;\n                var endDay;\n                if (firstDay === rangeEnd.getDay()) {\n                    rangeEnd.setDate(rangeEnd.getDate() + 7);\n                }\n                this.start = kendo.date.getDate(kendo.date.dayOfWeek(range.start, firstDay, -1));\n                this.end = kendo.date.getDate(kendo.date.dayOfWeek(rangeEnd, firstDay, 1));\n                if (optionsRange && optionsRange.start) {\n                    this.start = kendo.date.getDate(optionsRange.start);\n                }\n                if (optionsRange && optionsRange.end) {\n                    endDay = new Date(optionsRange.end);\n                    if (kendo.date.getDate(endDay) < optionsRange.end) {\n                        this.end = kendo.date.getDate(new Date(endDay.setDate(endDay.getDate() + 1)));\n                    } else {\n                        this.end = kendo.date.getDate(endDay);\n                    }\n                }\n            },\n            _createSlots: function () {\n                var slots = [];\n                slots.push(this._weeks(this.start, this.end));\n                slots.push(this._days(this.start, this.end));\n                return slots;\n            },\n            _layout: function () {\n                var rows = [];\n                var options = this.options;\n                rows.push(this._slotHeaders(this._slots[0], kendo.template(options.weekHeaderTemplate)));\n                rows.push(this._slotHeaders(this._slots[1], kendo.template(options.dayHeaderTemplate)));\n                return rows;\n            }\n        });\n        kendo.ui.GanttMonthView = GanttView.extend({\n            name: 'month',\n            options: {\n                weekHeaderTemplate: WEEK_HEADER_TEMPLATE,\n                monthHeaderTemplate: MONTH_HEADER_TEMPLATE,\n                resizeTooltipFormat: 'dddd, MMM d, yyyy'\n            },\n            range: function (range) {\n                var optionsRange = this.options.range;\n                var endDay;\n                this.start = kendo.date.firstDayOfMonth(range.start);\n                this.end = kendo.date.addDays(kendo.date.getDate(kendo.date.lastDayOfMonth(range.end)), 1);\n                if (optionsRange && optionsRange.start) {\n                    this.start = kendo.date.getDate(optionsRange.start);\n                }\n                if (optionsRange && optionsRange.end) {\n                    endDay = new Date(optionsRange.end);\n                    if (kendo.date.getDate(endDay) < optionsRange.end) {\n                        this.end = kendo.date.getDate(new Date(endDay.setDate(endDay.getDate() + 1)));\n                    } else {\n                        this.end = kendo.date.getDate(endDay);\n                    }\n                }\n            },\n            _createSlots: function () {\n                var slots = [];\n                slots.push(this._months(this.start, this.end));\n                slots.push(this._weeks(this.start, this.end));\n                return slots;\n            },\n            _layout: function () {\n                var rows = [];\n                var options = this.options;\n                rows.push(this._slotHeaders(this._slots[0], kendo.template(options.monthHeaderTemplate)));\n                rows.push(this._slotHeaders(this._slots[1], kendo.template(options.weekHeaderTemplate)));\n                return rows;\n            }\n        });\n        kendo.ui.GanttYearView = GanttView.extend({\n            name: 'year',\n            options: {\n                yearHeaderTemplate: YEAR_HEADER_TEMPLATE,\n                monthHeaderTemplate: MONTH_HEADER_TEMPLATE,\n                resizeTooltipFormat: 'dddd, MMM d, yyyy'\n            },\n            range: function (range) {\n                var optionsRange = this.options.range;\n                var firstDayOfMonth;\n                this.start = kendo.date.firstDayOfMonth(new Date(range.start.setMonth(0)));\n                this.end = kendo.date.firstDayOfMonth(new Date(range.end.setMonth(12)));\n                if (optionsRange && optionsRange.start) {\n                    this.start = kendo.date.firstDayOfMonth(optionsRange.start);\n                }\n                if (optionsRange && optionsRange.end) {\n                    firstDayOfMonth = kendo.date.firstDayOfMonth(optionsRange.end);\n                    this.end = kendo.date.getDate(new Date(firstDayOfMonth.setMonth(firstDayOfMonth.getMonth() + 1)));\n                }\n            },\n            _createSlots: function () {\n                var slots = [];\n                var monthSlots = this._months(this.start, this.end);\n                $(monthSlots).each(function (index, slot) {\n                    slot.span = 1;\n                });\n                slots.push(this._years(this.start, this.end));\n                slots.push(monthSlots);\n                return slots;\n            },\n            _layout: function () {\n                var rows = [];\n                var options = this.options;\n                rows.push(this._slotHeaders(this._slots[0], kendo.template(options.yearHeaderTemplate)));\n                rows.push(this._slotHeaders(this._slots[1], kendo.template(options.monthHeaderTemplate)));\n                return rows;\n            }\n        });\n        var timelineStyles = {\n            wrapper: 'k-timeline k-grid k-widget',\n            gridHeader: 'k-grid-header',\n            gridHeaderWrap: 'k-grid-header-wrap',\n            gridContent: 'k-grid-content',\n            gridContentWrap: 'k-grid-content',\n            tasksWrapper: 'k-gantt-tables',\n            dependenciesWrapper: 'k-gantt-dependencies',\n            task: 'k-task',\n            line: 'k-line',\n            taskResizeHandle: 'k-resize-handle',\n            taskResizeHandleWest: 'k-resize-w',\n            taskDragHandle: 'k-task-draghandle',\n            taskComplete: 'k-task-complete',\n            taskDelete: 'k-task-delete',\n            taskWrapActive: 'k-task-wrap-active',\n            taskWrap: 'k-task-wrap',\n            taskDot: 'k-task-dot',\n            taskDotStart: 'k-task-start',\n            taskDotEnd: 'k-task-end',\n            hovered: 'k-state-hover',\n            selected: 'k-state-selected',\n            origin: 'k-origin'\n        };\n        var GanttTimeline = kendo.ui.GanttTimeline = Widget.extend({\n            init: function (element, options) {\n                Widget.fn.init.call(this, element, options);\n                if (!this.options.views || !this.options.views.length) {\n                    this.options.views = [\n                        'day',\n                        'week',\n                        'month'\n                    ];\n                }\n                isRtl = kendo.support.isRtl(element);\n                this._wrapper();\n                this._domTrees();\n                this._views();\n                this._selectable();\n                this._draggable();\n                this._resizable();\n                this._percentResizeDraggable();\n                this._createDependencyDraggable();\n                this._attachEvents();\n                this._tooltip();\n            },\n            options: {\n                name: 'GanttTimeline',\n                messages: {\n                    views: {\n                        day: 'Day',\n                        week: 'Week',\n                        month: 'Month',\n                        year: 'Year',\n                        start: 'Start',\n                        end: 'End'\n                    }\n                },\n                snap: true,\n                selectable: true,\n                editable: true\n            },\n            destroy: function () {\n                Widget.fn.destroy.call(this);\n                clearTimeout(this._tooltipTimeout);\n                if (this._currentTimeUpdateTimer) {\n                    clearInterval(this._currentTimeUpdateTimer);\n                }\n                this._unbindView(this._selectedView);\n                if (this._moveDraggable) {\n                    this._moveDraggable.destroy();\n                }\n                if (this._resizeDraggable) {\n                    this._resizeDraggable.destroy();\n                }\n                if (this._percentDraggable) {\n                    this._percentDraggable.destroy();\n                }\n                if (this._dependencyDraggable) {\n                    this._dependencyDraggable.destroy();\n                }\n                if (this.touch) {\n                    this.touch.destroy();\n                }\n                this._headerTree = null;\n                this._taskTree = null;\n                this._dependencyTree = null;\n                this.wrapper.off(NS);\n                kendo.destroy(this.wrapper);\n            },\n            _wrapper: function () {\n                var styles = GanttTimeline.styles;\n                var that = this;\n                var options = this.options;\n                var calculateSize = function () {\n                    var rowHeight = typeof options.rowHeight === STRING ? options.rowHeight : options.rowHeight + 'px';\n                    var table = $(kendo.format(SIZE_CALCULATION_TEMPLATE, rowHeight));\n                    var calculatedRowHeight;\n                    var calculatedCellHeight;\n                    var content = that.wrapper.find(DOT + styles.tasksWrapper);\n                    content.append(table);\n                    calculatedRowHeight = outerHeight(table.find('tr'));\n                    calculatedCellHeight = table.find('td').height();\n                    table.remove();\n                    return {\n                        'row': calculatedRowHeight,\n                        'cell': calculatedCellHeight\n                    };\n                };\n                this.wrapper = this.element.addClass(styles.wrapper).append('<div class=\\'' + styles.gridHeader + '\\'><div class=\\'' + styles.gridHeaderWrap + '\\'></div></div>').append('<div class=\\'' + styles.gridContentWrap + '\\'><div class=\\'' + styles.tasksWrapper + '\\'></div><div class=\\'' + styles.dependenciesWrapper + '\\'></div></div>');\n                if (options.rowHeight) {\n                    this._calculatedSize = calculateSize();\n                }\n            },\n            _domTrees: function () {\n                var styles = GanttTimeline.styles;\n                var tree = kendo.dom.Tree;\n                var wrapper = this.wrapper;\n                this._headerTree = new tree(wrapper.find(DOT + styles.gridHeaderWrap)[0]);\n                this._taskTree = new tree(wrapper.find(DOT + styles.tasksWrapper)[0]);\n                this._dependencyTree = new tree(wrapper.find(DOT + styles.dependenciesWrapper)[0]);\n            },\n            _views: function () {\n                var views = this.options.views;\n                var view;\n                var isSettings;\n                var name;\n                var defaultView;\n                var selected;\n                this.views = {};\n                for (var i = 0, l = views.length; i < l; i++) {\n                    view = views[i];\n                    isSettings = isPlainObject(view);\n                    if (isSettings && view.selectable === false) {\n                        continue;\n                    }\n                    name = isSettings ? typeof view.type !== 'string' ? view.title : view.type : view;\n                    defaultView = defaultViews[name];\n                    if (defaultView) {\n                        if (isSettings) {\n                            view.type = defaultView.type;\n                        }\n                        defaultView.title = this.options.messages.views[name];\n                    }\n                    view = extend({ title: name }, defaultView, isSettings ? view : {});\n                    if (name) {\n                        this.views[name] = view;\n                        if (!selected || view.selected) {\n                            selected = name;\n                        }\n                    }\n                }\n                if (selected) {\n                    this._selectedViewName = selected;\n                }\n            },\n            view: function (name) {\n                if (name) {\n                    this._selectView(name);\n                    this.trigger('navigate', {\n                        view: name,\n                        action: 'changeView'\n                    });\n                }\n                return this._selectedView;\n            },\n            _selectView: function (name) {\n                if (name && this.views[name]) {\n                    if (this._selectedView) {\n                        this._unbindView(this._selectedView);\n                    }\n                    this._selectedView = this._initializeView(name);\n                    this._selectedViewName = name;\n                }\n            },\n            _viewByIndex: function (index) {\n                var view;\n                var views = this.views;\n                for (view in views) {\n                    if (!index) {\n                        return view;\n                    }\n                    index--;\n                }\n            },\n            _initializeView: function (name) {\n                var view = this.views[name];\n                if (view) {\n                    var type = view.type;\n                    if (typeof type === 'string') {\n                        type = kendo.getter(view.type)(window);\n                    }\n                    if (type) {\n                        var newRange = {};\n                        extend(newRange, this.options.range, view.range);\n                        var newDate = view.date || this.options.date;\n                        view = new type(this.wrapper, trimOptions(extend(true, {\n                            headerTree: this._headerTree,\n                            taskTree: this._taskTree,\n                            dependencyTree: this._dependencyTree,\n                            calculatedSize: this._calculatedSize\n                        }, view, this.options, {\n                            date: newDate,\n                            range: newRange\n                        })));\n                    } else {\n                        throw new Error('There is no such view');\n                    }\n                }\n                return view;\n            },\n            _unbindView: function (view) {\n                if (view) {\n                    view.destroy();\n                }\n            },\n            _range: function (tasks) {\n                var startOrder = {\n                    field: 'start',\n                    dir: 'asc'\n                };\n                var endOrder = {\n                    field: 'end',\n                    dir: 'desc'\n                };\n                if (!tasks || !tasks.length) {\n                    return {\n                        start: new Date(),\n                        end: new Date()\n                    };\n                }\n                var start = new Query(tasks).sort(startOrder).toArray()[0].start || new Date();\n                var end = new Query(tasks).sort(endOrder).toArray()[0].end || new Date();\n                return {\n                    start: new Date(start),\n                    end: new Date(end)\n                };\n            },\n            _render: function (tasks) {\n                var view = this.view();\n                var range = this._range(tasks);\n                var date = view.options.date;\n                this._tasks = tasks;\n                view.range(range);\n                view.renderLayout();\n                view.render(tasks);\n                if (date) {\n                    view._scrollToDate(date);\n                }\n            },\n            _renderDependencies: function (dependencies) {\n                this.view()._renderDependencies(dependencies);\n            },\n            _taskByUid: function (uid) {\n                var tasks = this._tasks;\n                var length = tasks.length;\n                var task;\n                for (var i = 0; i < length; i++) {\n                    task = tasks[i];\n                    if (task.uid === uid) {\n                        return task;\n                    }\n                }\n            },\n            _draggable: function () {\n                var that = this;\n                var element;\n                var task;\n                var currentStart;\n                var startOffset;\n                var snap = this.options.snap;\n                var styles = GanttTimeline.styles;\n                var editable = this.options.editable;\n                var cleanUp = function () {\n                    that.view()._removeDragHint();\n                    if (element) {\n                        element.css('opacity', 1);\n                    }\n                    element = null;\n                    task = null;\n                    that.dragInProgress = false;\n                };\n                if (!editable || editable.move === false || editable.update === false) {\n                    return;\n                }\n                this._moveDraggable = new kendo.ui.Draggable(this.wrapper, {\n                    distance: 0,\n                    filter: DOT + styles.task,\n                    holdToDrag: kendo.support.mobileOS,\n                    ignore: DOT + styles.taskResizeHandle\n                });\n                this._moveDraggable.bind('dragstart', function (e) {\n                    var view = that.view();\n                    element = e.currentTarget.parent();\n                    task = that._taskByUid(e.currentTarget.attr('data-uid'));\n                    if (that.trigger('moveStart', { task: task })) {\n                        e.preventDefault();\n                        return;\n                    }\n                    currentStart = task.start;\n                    startOffset = view._timeByPosition(e.x.location, snap) - currentStart;\n                    view._createDragHint(element);\n                    element.css('opacity', 0.5);\n                    clearTimeout(that._tooltipTimeout);\n                    that.dragInProgress = true;\n                }).bind('drag', kendo.throttle(function (e) {\n                    if (!that.dragInProgress) {\n                        return;\n                    }\n                    var view = that.view();\n                    var date = new Date(view._timeByPosition(e.x.location, snap) - startOffset);\n                    var updateHintDate = date;\n                    if (!that.trigger('move', {\n                            task: task,\n                            start: date\n                        })) {\n                        currentStart = date;\n                        if (isRtl) {\n                            updateHintDate = new Date(currentStart.getTime() + task.duration());\n                        }\n                        view._updateDragHint(updateHintDate);\n                    }\n                }, 15)).bind('dragend', function () {\n                    that.trigger('moveEnd', {\n                        task: task,\n                        start: currentStart\n                    });\n                    cleanUp();\n                }).bind('dragcancel', function () {\n                    cleanUp();\n                }).userEvents.bind('select', function () {\n                    blurActiveElement();\n                });\n            },\n            _resizable: function () {\n                var that = this;\n                var element;\n                var task;\n                var currentStart;\n                var currentEnd;\n                var resizeStart;\n                var snap = this.options.snap;\n                var styles = GanttTimeline.styles;\n                var editable = this.options.editable;\n                var cleanUp = function () {\n                    that.view()._removeResizeHint();\n                    element = null;\n                    task = null;\n                    that.dragInProgress = false;\n                };\n                if (!editable || editable.resize === false || editable.update === false) {\n                    return;\n                }\n                this._resizeDraggable = new kendo.ui.Draggable(this.wrapper, {\n                    distance: 0,\n                    filter: DOT + styles.taskResizeHandle,\n                    holdToDrag: false\n                });\n                this._resizeDraggable.bind('dragstart', function (e) {\n                    resizeStart = e.currentTarget.hasClass(styles.taskResizeHandleWest);\n                    if (isRtl) {\n                        resizeStart = !resizeStart;\n                    }\n                    element = e.currentTarget.closest(DOT + styles.task);\n                    task = that._taskByUid(element.attr('data-uid'));\n                    if (that.trigger('resizeStart', { task: task })) {\n                        e.preventDefault();\n                        return;\n                    }\n                    currentStart = task.start;\n                    currentEnd = task.end;\n                    that.view()._createResizeHint(task);\n                    clearTimeout(that._tooltipTimeout);\n                    that.dragInProgress = true;\n                }).bind('drag', kendo.throttle(function (e) {\n                    if (!that.dragInProgress) {\n                        return;\n                    }\n                    var view = that.view();\n                    var date = view._timeByPosition(e.x.location, snap, !resizeStart);\n                    if (resizeStart) {\n                        if (date < currentEnd) {\n                            currentStart = date;\n                        } else {\n                            currentStart = currentEnd;\n                        }\n                    } else {\n                        if (date > currentStart) {\n                            currentEnd = date;\n                        } else {\n                            currentEnd = currentStart;\n                        }\n                    }\n                    if (!that.trigger('resize', {\n                            task: task,\n                            start: currentStart,\n                            end: currentEnd\n                        })) {\n                        view._updateResizeHint(currentStart, currentEnd, resizeStart);\n                    }\n                }, 15)).bind('dragend', function () {\n                    that.trigger('resizeEnd', {\n                        task: task,\n                        resizeStart: resizeStart,\n                        start: currentStart,\n                        end: currentEnd\n                    });\n                    cleanUp();\n                }).bind('dragcancel', function () {\n                    cleanUp();\n                }).userEvents.bind('select', function () {\n                    blurActiveElement();\n                });\n            },\n            _percentResizeDraggable: function () {\n                var that = this;\n                var task;\n                var taskElement;\n                var taskElementOffset;\n                var timelineOffset;\n                var originalPercentWidth;\n                var maxPercentWidth;\n                var currentPercentComplete;\n                var tooltipTop;\n                var tooltipLeft;\n                var styles = GanttTimeline.styles;\n                var delta;\n                var editable = this.options.editable;\n                var cleanUp = function () {\n                    that.view()._removePercentCompleteTooltip();\n                    taskElement = null;\n                    task = null;\n                    that.dragInProgress = false;\n                };\n                var updateElement = function (width) {\n                    taskElement.find(DOT + styles.taskComplete).width(width).end().siblings(DOT + styles.taskDragHandle).css(isRtl ? 'right' : 'left', width);\n                };\n                if (!editable || editable.dragPercentComplete === false || editable.update === false) {\n                    return;\n                }\n                this._percentDraggable = new kendo.ui.Draggable(this.wrapper, {\n                    distance: 0,\n                    filter: DOT + styles.taskDragHandle,\n                    holdToDrag: false\n                });\n                this._percentDraggable.bind('dragstart', function (e) {\n                    if (that.trigger('percentResizeStart')) {\n                        e.preventDefault();\n                        return;\n                    }\n                    taskElement = e.currentTarget.siblings(DOT + styles.task);\n                    task = that._taskByUid(taskElement.attr('data-uid'));\n                    currentPercentComplete = task.percentComplete;\n                    taskElementOffset = taskElement.offset();\n                    timelineOffset = this.element.offset();\n                    originalPercentWidth = taskElement.find(DOT + styles.taskComplete).width();\n                    maxPercentWidth = outerWidth(taskElement);\n                    clearTimeout(that._tooltipTimeout);\n                    that.dragInProgress = true;\n                }).bind('drag', kendo.throttle(function (e) {\n                    if (!that.dragInProgress) {\n                        return;\n                    }\n                    delta = isRtl ? -e.x.initialDelta : e.x.initialDelta;\n                    var currentWidth = Math.max(0, Math.min(maxPercentWidth, originalPercentWidth + delta));\n                    currentPercentComplete = Math.round(currentWidth / maxPercentWidth * 100);\n                    updateElement(currentWidth);\n                    tooltipTop = taskElementOffset.top - timelineOffset.top;\n                    tooltipLeft = taskElementOffset.left + currentWidth - timelineOffset.left;\n                    if (isRtl) {\n                        tooltipLeft += maxPercentWidth - 2 * currentWidth;\n                    }\n                    that.view()._updatePercentCompleteTooltip(tooltipTop, tooltipLeft, currentPercentComplete);\n                }, 15)).bind('dragend', function () {\n                    that.trigger('percentResizeEnd', {\n                        task: task,\n                        percentComplete: currentPercentComplete / 100\n                    });\n                    cleanUp();\n                }).bind('dragcancel', function () {\n                    updateElement(originalPercentWidth);\n                    cleanUp();\n                }).userEvents.bind('select', function () {\n                    blurActiveElement();\n                });\n            },\n            _createDependencyDraggable: function () {\n                var that = this;\n                var originalHandle;\n                var hoveredHandle = $();\n                var hoveredTask = $();\n                var startX;\n                var startY;\n                var useVML = browser.msie && browser.version < 9;\n                var styles = GanttTimeline.styles;\n                var editable = this.options.editable;\n                var cleanUp = function () {\n                    originalHandle.css('display', '').removeClass(styles.hovered);\n                    originalHandle.parent().removeClass(styles.origin);\n                    originalHandle = null;\n                    toggleHandles(false);\n                    hoveredTask = $();\n                    hoveredHandle = $();\n                    that.view()._removeDependencyDragHint();\n                    that.dragInProgress = false;\n                };\n                var toggleHandles = function (value) {\n                    if (!hoveredTask.hasClass(styles.origin)) {\n                        hoveredTask.find(DOT + styles.taskDot).css('display', value ? 'block' : '');\n                        hoveredHandle.toggleClass(styles.hovered, value);\n                    }\n                };\n                if (!editable || editable.dependencyCreate === false) {\n                    return;\n                }\n                if (useVML && document.namespaces) {\n                    document.namespaces.add('kvml', 'urn:schemas-microsoft-com:vml', '#default#VML');\n                }\n                this._dependencyDraggable = new kendo.ui.Draggable(this.wrapper, {\n                    distance: 0,\n                    filter: DOT + styles.taskDot,\n                    holdToDrag: false\n                });\n                this._dependencyDraggable.bind('dragstart', function (e) {\n                    if (that.trigger('dependencyDragStart')) {\n                        e.preventDefault();\n                        return;\n                    }\n                    originalHandle = e.currentTarget.css('display', 'block').addClass(styles.hovered);\n                    originalHandle.parent().addClass(styles.origin);\n                    var elementOffset = originalHandle.offset();\n                    var tablesOffset = that.wrapper.find(DOT + styles.tasksWrapper).offset();\n                    startX = Math.round(elementOffset.left - tablesOffset.left + outerHeight(originalHandle) / 2);\n                    startY = Math.round(elementOffset.top - tablesOffset.top + outerWidth(originalHandle) / 2);\n                    clearTimeout(that._tooltipTimeout);\n                    that.dragInProgress = true;\n                }).bind('drag', kendo.throttle(function (e) {\n                    if (!that.dragInProgress) {\n                        return;\n                    }\n                    that.view()._removeDependencyDragHint();\n                    var target = $(kendo.elementUnderCursor(e));\n                    var tablesOffset = that.wrapper.find(DOT + styles.tasksWrapper).offset();\n                    var currentX = e.x.location - tablesOffset.left;\n                    var currentY = e.y.location - tablesOffset.top;\n                    that.view()._updateDependencyDragHint({\n                        x: startX,\n                        y: startY\n                    }, {\n                        x: currentX,\n                        y: currentY\n                    }, useVML);\n                    toggleHandles(false);\n                    hoveredHandle = target.hasClass(styles.taskDot) ? target : $();\n                    hoveredTask = target.closest(DOT + styles.taskWrap);\n                    toggleHandles(true);\n                }, 15)).bind('dragend', function () {\n                    if (hoveredHandle.length) {\n                        var fromStart = originalHandle.hasClass(styles.taskDotStart);\n                        var toStart = hoveredHandle.hasClass(styles.taskDotStart);\n                        var type = fromStart ? toStart ? 3 : 2 : toStart ? 1 : 0;\n                        var predecessor = that._taskByUid(originalHandle.siblings(DOT + styles.task).attr('data-uid'));\n                        var successor = that._taskByUid(hoveredHandle.siblings(DOT + styles.task).attr('data-uid'));\n                        if (predecessor !== successor) {\n                            that.trigger('dependencyDragEnd', {\n                                type: type,\n                                predecessor: predecessor,\n                                successor: successor\n                            });\n                        }\n                    }\n                    cleanUp();\n                }).bind('dragcancel', function () {\n                    cleanUp();\n                }).userEvents.bind('select', function () {\n                    blurActiveElement();\n                });\n            },\n            _selectable: function () {\n                var that = this;\n                var styles = GanttTimeline.styles;\n                if (this.options.selectable) {\n                    this.wrapper.on(CLICK + NS, DOT + styles.task, function (e) {\n                        e.stopPropagation();\n                        if (!e.ctrlKey) {\n                            that.trigger('select', { uid: $(this).attr('data-uid') });\n                        } else {\n                            that.trigger('clear');\n                        }\n                    }).on(CLICK + NS, DOT + styles.taskWrap, function (e) {\n                        e.stopPropagation();\n                        $(this).css('z-index', '0');\n                        var target = $(document.elementFromPoint(e.clientX, e.clientY));\n                        if (target.hasClass(styles.line)) {\n                            target.click();\n                        }\n                        $(this).css('z-index', '');\n                    }).on(CLICK + NS, DOT + styles.tasksWrapper, function () {\n                        if (that.selectDependency().length > 0) {\n                            that.clearSelection();\n                        } else {\n                            that.trigger('clear');\n                        }\n                    }).on(CLICK + NS, DOT + styles.line, function (e) {\n                        e.stopPropagation();\n                        that.selectDependency(this);\n                    });\n                }\n            },\n            select: function (value) {\n                var element = this.wrapper.find(value);\n                var styles = GanttTimeline.styles;\n                if (element.length) {\n                    this.clearSelection();\n                    element.addClass(styles.selected);\n                    if (kendo.support.mobileOS) {\n                        element.parent().addClass(styles.taskWrapActive);\n                    }\n                    return;\n                }\n                return this.wrapper.find(DOT + styles.task + DOT + styles.selected);\n            },\n            selectDependency: function (value) {\n                var element = this.wrapper.find(value);\n                var uid;\n                var styles = GanttTimeline.styles;\n                if (element.length) {\n                    this.clearSelection();\n                    this.trigger('clear');\n                    uid = $(element).attr('data-uid');\n                    this.wrapper.find(DOT + styles.line + '[data-uid=\\'' + uid + '\\']').addClass(styles.selected);\n                    return;\n                }\n                return this.wrapper.find(DOT + styles.line + DOT + styles.selected);\n            },\n            clearSelection: function () {\n                var styles = GanttTimeline.styles;\n                this.wrapper.find(DOT + styles.selected).removeClass(styles.selected);\n                if (kendo.support.mobileOS) {\n                    this.wrapper.find(DOT + styles.taskWrapActive).removeClass(styles.taskWrapActive);\n                }\n            },\n            _attachEvents: function () {\n                var that = this;\n                var styles = GanttTimeline.styles;\n                var editable = this.options.editable;\n                if (editable) {\n                    this._tabindex();\n                    this.wrapper.on(CLICK + NS, DOT + styles.taskDelete, function (e) {\n                        that.trigger('removeTask', { uid: $(this).closest(DOT + styles.task).attr('data-uid') });\n                        e.stopPropagation();\n                        e.preventDefault();\n                    }).on(KEYDOWN + NS, function (e) {\n                        var selectedDependency;\n                        var editable = that.options.editable;\n                        if (e.keyCode === keys.DELETE && editable && editable.dependencyDestroy !== false) {\n                            selectedDependency = that.selectDependency();\n                            if (selectedDependency.length) {\n                                that.trigger('removeDependency', { uid: selectedDependency.attr('data-uid') });\n                                that.clearSelection();\n                            }\n                        }\n                    });\n                    if (!kendo.support.mobileOS) {\n                        this.wrapper.on(DBLCLICK + NS, DOT + styles.task, function (e) {\n                            if (that.options.editable.update !== false) {\n                                that.trigger('editTask', { uid: $(this).attr('data-uid') });\n                                e.stopPropagation();\n                                e.preventDefault();\n                            }\n                        });\n                    } else {\n                        this.touch = this.wrapper.kendoTouch({\n                            filter: DOT + styles.task,\n                            doubletap: function (e) {\n                                if (that.options.editable.update !== false) {\n                                    that.trigger('editTask', { uid: $(e.touch.currentTarget).attr('data-uid') });\n                                }\n                            }\n                        }).data('kendoTouch');\n                    }\n                }\n            },\n            _tooltip: function () {\n                var that = this;\n                var tooltipOptions = this.options.tooltip;\n                var styles = GanttTimeline.styles;\n                var currentMousePosition;\n                var mouseMoveHandler = function (e) {\n                    currentMousePosition = e.clientX;\n                };\n                if (tooltipOptions && tooltipOptions.visible === false) {\n                    return;\n                }\n                if (!kendo.support.mobileOS) {\n                    this.wrapper.on(MOUSEENTER + NS, DOT + styles.task, function () {\n                        var element = this;\n                        var task = that._taskByUid($(this).attr('data-uid'));\n                        if (that.dragInProgress) {\n                            return;\n                        }\n                        that._tooltipTimeout = setTimeout(function () {\n                            that.view()._createTaskTooltip(task, element, currentMousePosition);\n                        }, 800);\n                        $(this).on(MOUSEMOVE, mouseMoveHandler);\n                    }).on(MOUSELEAVE + NS, DOT + styles.task, function () {\n                        clearTimeout(that._tooltipTimeout);\n                        that.view()._removeTaskTooltip();\n                        $(this).off(MOUSEMOVE, mouseMoveHandler);\n                    });\n                } else {\n                    this.wrapper.on(CLICK + NS, DOT + styles.taskDelete, function (e) {\n                        e.stopPropagation();\n                        that.view()._removeTaskTooltip();\n                    }).on(MOUSELEAVE + NS, DOT + styles.task, function (e) {\n                        var parents = $(e.relatedTarget).parents(DOT + styles.taskWrap, DOT + styles.task);\n                        if (parents.length === 0) {\n                            that.view()._removeTaskTooltip();\n                        }\n                    });\n                    if (this.touch) {\n                        this.touch.bind('tap', function (e) {\n                            var element = e.touch.target;\n                            var task = that._taskByUid($(element).attr('data-uid'));\n                            var currentPosition = e.touch.x.client;\n                            if (that.view()._taskTooltip) {\n                                that.view()._removeTaskTooltip();\n                            }\n                            that.view()._createTaskTooltip(task, element, currentPosition);\n                        }).bind('doubletap', function () {\n                            that.view()._removeTaskTooltip();\n                        });\n                    }\n                }\n            }\n        });\n        extend(true, GanttTimeline, { styles: timelineStyles });\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.gantt', [\n        'kendo.data',\n        'kendo.popup',\n        'kendo.window',\n        'kendo.resizable',\n        'kendo.gantt.list',\n        'kendo.gantt.timeline',\n        'kendo.grid',\n        'kendo.pdf'\n    ], f);\n}(function () {\n    var __meta__ = {\n        id: 'gantt',\n        name: 'Gantt',\n        category: 'web',\n        description: 'The Gantt component.',\n        depends: [\n            'data',\n            'popup',\n            'resizable',\n            'window',\n            'gantt.list',\n            'gantt.timeline',\n            'grid'\n        ]\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo;\n        var supportsMedia = 'matchMedia' in window;\n        var browser = kendo.support.browser;\n        var mobileOS = kendo.support.mobileOS;\n        var Observable = kendo.Observable;\n        var Widget = kendo.ui.Widget;\n        var DataSource = kendo.data.DataSource;\n        var ObservableObject = kendo.data.ObservableObject;\n        var ObservableArray = kendo.data.ObservableArray;\n        var Query = kendo.data.Query;\n        var isArray = $.isArray;\n        var inArray = $.inArray;\n        var isFunction = kendo.isFunction;\n        var proxy = $.proxy;\n        var extend = $.extend;\n        var isPlainObject = $.isPlainObject;\n        var map = $.map;\n        var outerWidth = kendo._outerWidth;\n        var outerHeight = kendo._outerHeight;\n        var keys = kendo.keys;\n        var defaultIndicatorWidth = 3;\n        var NS = '.kendoGantt';\n        var PERCENTAGE_FORMAT = 'p0';\n        var TABINDEX = 'tabIndex';\n        var CLICK = 'click';\n        var WIDTH = 'width';\n        var STRING = 'string';\n        var DIRECTIONS = {\n            'down': {\n                origin: 'bottom left',\n                position: 'top left'\n            },\n            'up': {\n                origin: 'top left',\n                position: 'bottom left'\n            }\n        };\n        var ARIA_DESCENDANT = 'aria-activedescendant';\n        var ARIA_LABEL = 'aria-label';\n        var ACTIVE_CELL = 'gantt_active_cell';\n        var ACTIVE_OPTION = 'action-option-focused';\n        var DOT = '.';\n        var TASK_DELETE_CONFIRM = 'Are you sure you want to delete this task?';\n        var DEPENDENCY_DELETE_CONFIRM = 'Are you sure you want to delete this dependency?';\n        var TOGGLE_BUTTON_TEMPLATE = kendo.template('<button class=\"#=styles.buttonToggle#\" type=\"button\" ' + ARIA_LABEL + '=\"Toggle\"><span class=\"#=styles.iconToggle#\"></span></button>');\n        var BUTTON_TEMPLATE = '<button class=\"#=styles.button# #=className#\" type=\"button\" ' + '#if (action) {#' + 'data-action=\"#=action#\"' + '#}#' + '><span class=\"#=iconClass#\"></span><span>#=text#</span></button>';\n        var COMMAND_BUTTON_TEMPLATE = '<a class=\"#=className#\" #=attr# href=\"\\\\#\">#=text#</a>';\n        var VIEWBUTTONTEMPLATE = kendo.template('<li class=\"#=styles.currentView# #=styles.viewButtonDefault#\"><a href=\"\\\\#\" class=\"#=styles.link#\">&nbps;</a></li>');\n        var HEADER_VIEWS_TEMPLATE = kendo.template('<ul class=\"#=styles.viewsWrapper#\">' + '#for(var view in views){#' + '<li class=\"#=styles.viewButtonDefault# #=styles.viewButton#-#= view.toLowerCase() #\" data-#=ns#name=\"#=view#\"><a href=\"\\\\#\" class=\"#=styles.link#\">#=views[view].title#</a></li>' + '#}#' + '</ul>');\n        var TASK_DROPDOWN_TEMPLATE = kendo.template('<div class=\"#=styles.popupWrapper#\">' + '<ul class=\"#=styles.popupList#\" role=\"listbox\">' + '#for(var i = 0, l = actions.length; i < l; i++){#' + '<li class=\"#=styles.item#\" data-action=\"#=actions[i].data#\" role=\"option\">#=actions[i].text#</span>' + '#}#' + '</ul>' + '</div>');\n        var DATERANGEEDITOR = function (container, options) {\n            var attr = {\n                name: options.field,\n                title: options.title\n            };\n            var validationRules = options.model.fields[options.field].validation;\n            if (validationRules && isPlainObject(validationRules) && validationRules.message) {\n                attr[kendo.attr('dateCompare-msg')] = validationRules.message;\n            }\n            $('<input type=\"text\" required ' + kendo.attr('type') + '=\"date\" ' + kendo.attr('role') + '=\"datetimepicker\" ' + kendo.attr('bind') + '=\"value:' + options.field + '\" ' + kendo.attr('validate') + '=\\'true\\' />').attr(attr).appendTo(container);\n            $('<span ' + kendo.attr('for') + '=\"' + options.field + '\" class=\"k-invalid-msg\"/>').hide().appendTo(container);\n        };\n        var RESOURCESEDITOR = function (container, options) {\n            $('<a href=\"#\" class=\"' + options.styles.button + '\">' + options.messages.assignButton + '</a>').click(options.click).appendTo(container);\n        };\n        var ganttStyles = {\n            wrapper: 'k-widget k-gantt',\n            rowHeight: 'k-gantt-rowheight',\n            listWrapper: 'k-gantt-layout k-gantt-treelist',\n            list: 'k-gantt-treelist',\n            timelineWrapper: 'k-gantt-layout k-gantt-timeline',\n            timeline: 'k-gantt-timeline',\n            splitBarWrapper: 'k-splitbar k-state-default k-splitbar-horizontal k-splitbar-draggable-horizontal k-gantt-layout',\n            splitBar: 'k-splitbar',\n            splitBarHover: 'k-splitbar-horizontal-hover',\n            popupWrapper: 'k-list-container',\n            popupList: 'k-list k-reset',\n            resizeHandle: 'k-resize-handle',\n            icon: 'k-icon',\n            item: 'k-item',\n            line: 'k-line',\n            buttonDelete: 'k-gantt-delete',\n            buttonCancel: 'k-gantt-cancel',\n            buttonSave: 'k-gantt-update',\n            buttonToggle: 'k-gantt-toggle',\n            primary: 'k-primary',\n            hovered: 'k-state-hover',\n            selected: 'k-state-selected',\n            focused: 'k-state-focused',\n            gridHeader: 'k-grid-header',\n            gridHeaderWrap: 'k-grid-header-wrap',\n            gridContent: 'k-grid-content',\n            popup: {\n                form: 'k-popup-edit-form',\n                editForm: 'k-gantt-edit-form',\n                formContainer: 'k-edit-form-container',\n                resourcesFormContainer: 'k-resources-form-container',\n                message: 'k-popup-message',\n                buttonsContainer: 'k-edit-buttons k-state-default',\n                button: 'k-button',\n                editField: 'k-edit-field',\n                editLabel: 'k-edit-label',\n                resourcesField: 'k-gantt-resources'\n            },\n            toolbar: {\n                headerWrapper: 'k-floatwrap k-header k-gantt-toolbar',\n                footerWrapper: 'k-floatwrap k-header k-gantt-toolbar',\n                toolbar: 'k-gantt-toolbar',\n                expanded: 'k-state-expanded',\n                views: 'k-gantt-views',\n                viewsWrapper: 'k-reset k-header k-gantt-views',\n                actions: 'k-gantt-actions',\n                button: 'k-button k-button-icontext',\n                buttonToggle: 'k-button k-button-icon k-gantt-toggle',\n                iconPlus: 'k-icon k-i-plus',\n                iconPdf: 'k-icon k-i-file-pdf',\n                iconToggle: 'k-icon k-i-layout-1-by-4',\n                viewButtonDefault: 'k-state-default',\n                viewButton: 'k-view',\n                currentView: 'k-current-view',\n                link: 'k-link',\n                pdfButton: 'k-gantt-pdf',\n                appendButton: 'k-gantt-create'\n            }\n        };\n        function selector(uid) {\n            return '[' + kendo.attr('uid') + (uid ? '=\\'' + uid + '\\']' : ']');\n        }\n        function trimOptions(options) {\n            delete options.name;\n            delete options.prefix;\n            delete options.remove;\n            delete options.edit;\n            delete options.add;\n            delete options.navigate;\n            return options;\n        }\n        function dateCompareValidator(input) {\n            if (input.filter('[name=end], [name=start]').length) {\n                var field = input.attr('name');\n                var picker = kendo.widgetInstance(input, kendo.ui);\n                var dates = {};\n                var container = input;\n                var editable;\n                var model;\n                while (container !== window && !editable) {\n                    container = container.parent();\n                    editable = container.data('kendoEditable');\n                }\n                model = editable ? editable.options.model : null;\n                if (!model) {\n                    return true;\n                }\n                dates.start = model.start;\n                dates.end = model.end;\n                dates[field] = picker ? picker.value() : kendo.parseDate(input.value());\n                return dates.start <= dates.end;\n            }\n            return true;\n        }\n        function focusTable(table, direct) {\n            var wrapper = table.parents('[' + kendo.attr('role') + '=\"gantt\"]');\n            var scrollPositions = [];\n            var parents = scrollableParents(wrapper);\n            table.attr(TABINDEX, 0);\n            if (direct) {\n                parents.each(function (index, parent) {\n                    scrollPositions[index] = $(parent).scrollTop();\n                });\n            }\n            try {\n                table[0].setActive();\n            } catch (e) {\n                table[0].focus();\n            }\n            if (direct) {\n                parents.each(function (index, parent) {\n                    $(parent).scrollTop(scrollPositions[index]);\n                });\n            }\n        }\n        function scrollableParents(element) {\n            return $(element).parentsUntil('body').filter(function (index, element) {\n                var computedStyle = kendo.getComputedStyles(element, ['overflow']);\n                return computedStyle.overflow != 'visible';\n            }).add(window);\n        }\n        var defaultCommands;\n        var TaskDropDown = Observable.extend({\n            init: function (element, options) {\n                Observable.fn.init.call(this);\n                this.element = element;\n                this.options = extend(true, {}, this.options, options);\n                this._popup();\n            },\n            options: {\n                direction: 'down',\n                navigatable: false\n            },\n            _current: function (method) {\n                var ganttStyles = Gantt.styles;\n                var current = this.list.find(DOT + ganttStyles.focused);\n                var sibling = current[method]();\n                if (sibling.length) {\n                    current.removeClass(ganttStyles.focused).removeAttr('id');\n                    sibling.addClass(ganttStyles.focused).attr('id', ACTIVE_OPTION);\n                    this.list.find('ul').removeAttr(ARIA_DESCENDANT).attr(ARIA_DESCENDANT, ACTIVE_OPTION);\n                }\n            },\n            _popup: function () {\n                var that = this;\n                var ganttStyles = Gantt.styles;\n                var itemSelector = 'li' + DOT + ganttStyles.item;\n                var appendButtonSelector = DOT + ganttStyles.toolbar.appendButton;\n                var actions = this.options.messages.actions;\n                var navigatable = this.options.navigatable;\n                this.list = $(TASK_DROPDOWN_TEMPLATE({\n                    styles: ganttStyles,\n                    actions: [\n                        {\n                            data: 'add',\n                            text: actions.addChild\n                        },\n                        {\n                            data: 'insert-before',\n                            text: actions.insertBefore\n                        },\n                        {\n                            data: 'insert-after',\n                            text: actions.insertAfter\n                        }\n                    ]\n                }));\n                this.element.append(this.list);\n                this.popup = new kendo.ui.Popup(this.list, extend({\n                    anchor: this.element.find(appendButtonSelector),\n                    open: function () {\n                        that._adjustListWidth();\n                    },\n                    animation: this.options.animation\n                }, DIRECTIONS[this.options.direction]));\n                this.element.on(CLICK + NS, appendButtonSelector, function (e) {\n                    var target = $(this);\n                    var action = target.attr(kendo.attr('action'));\n                    e.preventDefault();\n                    if (action) {\n                        that.trigger('command', { type: action });\n                    } else {\n                        that.popup.open();\n                        if (navigatable) {\n                            that.list.find('li:first').addClass(ganttStyles.focused).attr('id', ACTIVE_OPTION).end().find('ul').attr({\n                                TABINDEX: 0,\n                                'aria-activedescendant': ACTIVE_OPTION\n                            }).focus();\n                        }\n                    }\n                });\n                this.list.find(itemSelector).hover(function () {\n                    $(this).addClass(ganttStyles.hovered);\n                }, function () {\n                    $(this).removeClass(ganttStyles.hovered);\n                }).end().on(CLICK + NS, itemSelector, function () {\n                    that.trigger('command', { type: $(this).attr(kendo.attr('action')) });\n                    that.popup.close();\n                });\n                if (navigatable) {\n                    this.popup.bind('close', function () {\n                        that.list.find(itemSelector).removeClass(ganttStyles.focused).end().find('ul').attr(TABINDEX, 0);\n                        that.element.parents('[' + kendo.attr('role') + '=\"gantt\"]').find(DOT + ganttStyles.gridContent + ' > table:first').focus();\n                    });\n                    this.list.find('ul').on('keydown' + NS, function (e) {\n                        var key = e.keyCode;\n                        switch (key) {\n                        case keys.UP:\n                            e.preventDefault();\n                            that._current('prev');\n                            break;\n                        case keys.DOWN:\n                            e.preventDefault();\n                            that._current('next');\n                            break;\n                        case keys.ENTER:\n                            that.list.find(DOT + ganttStyles.focused).click();\n                            break;\n                        case keys.ESC:\n                            e.preventDefault();\n                            that.popup.close();\n                            break;\n                        }\n                    });\n                }\n            },\n            _adjustListWidth: function () {\n                var list = this.list;\n                var ganttStyles = Gantt.styles;\n                var width = list[0].style.width;\n                var wrapper = this.element.find(DOT + ganttStyles.toolbar.appendButton);\n                var listOuterWidth = outerWidth(list);\n                var computedStyle;\n                var computedWidth;\n                if (!list.data(WIDTH) && width) {\n                    return;\n                }\n                computedStyle = window.getComputedStyle ? window.getComputedStyle(wrapper[0], null) : 0;\n                computedWidth = computedStyle ? parseFloat(computedStyle.width) : outerWidth(wrapper);\n                if (computedStyle && (browser.mozilla || browser.msie)) {\n                    computedWidth += parseFloat(computedStyle.paddingLeft) + parseFloat(computedStyle.paddingRight) + parseFloat(computedStyle.borderLeftWidth) + parseFloat(computedStyle.borderRightWidth);\n                }\n                if (list.css('box-sizing') !== 'border-box') {\n                    width = computedWidth - (outerWidth(list) - list.width());\n                } else {\n                    width = computedWidth;\n                }\n                if (listOuterWidth > width) {\n                    width = listOuterWidth;\n                }\n                list.css({\n                    fontFamily: wrapper.css('font-family'),\n                    width: width\n                }).data(WIDTH, width);\n            },\n            destroy: function () {\n                clearTimeout(this._focusTimeout);\n                this.popup.destroy();\n                this.element.off(NS);\n                this.list.off(NS);\n                this.unbind();\n            }\n        });\n        var createDataSource = function (type, name) {\n            return function (options) {\n                options = isArray(options) ? { data: options } : options;\n                var dataSource = options || {};\n                var data = dataSource.data;\n                dataSource.data = data;\n                if (!(dataSource instanceof type) && dataSource instanceof DataSource) {\n                    throw new Error('Incorrect DataSource type. Only ' + name + ' instances are supported');\n                }\n                return dataSource instanceof type ? dataSource : new type(dataSource);\n            };\n        };\n        var GanttDependency = kendo.data.Model.define({\n            id: 'id',\n            fields: {\n                id: { type: 'number' },\n                predecessorId: { type: 'number' },\n                successorId: { type: 'number' },\n                type: { type: 'number' }\n            }\n        });\n        var GanttDependencyDataSource = DataSource.extend({\n            init: function (options) {\n                DataSource.fn.init.call(this, extend(true, {}, {\n                    schema: {\n                        modelBase: GanttDependency,\n                        model: GanttDependency\n                    }\n                }, options));\n            },\n            successors: function (id) {\n                return this._dependencies('predecessorId', id);\n            },\n            predecessors: function (id) {\n                return this._dependencies('successorId', id);\n            },\n            dependencies: function (id) {\n                var predecessors = this.predecessors(id);\n                var successors = this.successors(id);\n                predecessors.push.apply(predecessors, successors);\n                return predecessors;\n            },\n            _dependencies: function (field, id) {\n                var data = this.view();\n                var filter = {\n                    field: field,\n                    operator: 'eq',\n                    value: id\n                };\n                data = new Query(data).filter(filter).toArray();\n                return data;\n            }\n        });\n        GanttDependencyDataSource.create = createDataSource(GanttDependencyDataSource, 'GanttDependencyDataSource');\n        var GanttTask = kendo.data.Model.define({\n            duration: function () {\n                var end = this.end;\n                var start = this.start;\n                return end - start;\n            },\n            isMilestone: function () {\n                return this.duration() === 0;\n            },\n            _offset: function (value) {\n                var field = [\n                    'start',\n                    'end'\n                ];\n                var newValue;\n                for (var i = 0; i < field.length; i++) {\n                    newValue = new Date(this.get(field[i]).getTime() + value);\n                    this.set(field[i], newValue);\n                }\n            },\n            id: 'id',\n            fields: {\n                id: { type: 'number' },\n                parentId: {\n                    type: 'number',\n                    defaultValue: null,\n                    validation: { required: true }\n                },\n                orderId: {\n                    type: 'number',\n                    validation: { required: true }\n                },\n                title: {\n                    type: 'string',\n                    defaultValue: 'New task'\n                },\n                start: {\n                    type: 'date',\n                    validation: { required: true }\n                },\n                end: {\n                    type: 'date',\n                    validation: {\n                        required: true,\n                        dateCompare: dateCompareValidator,\n                        message: 'End date should be after or equal to the start date'\n                    }\n                },\n                percentComplete: {\n                    type: 'number',\n                    validation: {\n                        required: true,\n                        min: 0,\n                        max: 1,\n                        step: 0.01\n                    }\n                },\n                summary: { type: 'boolean' },\n                expanded: {\n                    type: 'boolean',\n                    defaultValue: true\n                }\n            }\n        });\n        var GanttDataSource = DataSource.extend({\n            init: function (options) {\n                DataSource.fn.init.call(this, extend(true, {}, {\n                    schema: {\n                        modelBase: GanttTask,\n                        model: GanttTask\n                    }\n                }, options));\n            },\n            remove: function (task) {\n                var parentId = task.get('parentId');\n                var children = this.taskAllChildren(task);\n                this._removeItems(children);\n                task = DataSource.fn.remove.call(this, task);\n                this._childRemoved(parentId, task.get('orderId'));\n                return task;\n            },\n            add: function (task) {\n                if (!task) {\n                    return;\n                }\n                task = this._toGanttTask(task);\n                return this.insert(this.taskSiblings(task).length, task);\n            },\n            insert: function (index, task) {\n                if (!task) {\n                    return;\n                }\n                task = this._toGanttTask(task);\n                task.set('orderId', index);\n                task = DataSource.fn.insert.call(this, index, task);\n                this._reorderSiblings(task, this.taskSiblings(task).length - 1);\n                this._resolveSummaryFields(this.taskParent(task));\n                return task;\n            },\n            taskChildren: function (task) {\n                var data = this.view();\n                var filter = {\n                    field: 'parentId',\n                    operator: 'eq',\n                    value: null\n                };\n                var order = this._sort && this._sort.length ? this._sort : {\n                    field: 'orderId',\n                    dir: 'asc'\n                };\n                var taskId;\n                if (!!task) {\n                    taskId = task.get('id');\n                    if (taskId === undefined || taskId === null || taskId === '') {\n                        return [];\n                    }\n                    filter.value = taskId;\n                }\n                data = new Query(data).filter(filter).sort(order).toArray();\n                return data;\n            },\n            taskAllChildren: function (task) {\n                var data = [];\n                var that = this;\n                var callback = function (task) {\n                    var tasks = that.taskChildren(task);\n                    data.push.apply(data, tasks);\n                    map(tasks, callback);\n                };\n                if (!!task) {\n                    callback(task);\n                } else {\n                    data = this.view();\n                }\n                return data;\n            },\n            taskSiblings: function (task) {\n                if (!task) {\n                    return null;\n                }\n                var parent = this.taskParent(task);\n                return this.taskChildren(parent);\n            },\n            taskParent: function (task) {\n                if (!task || task.get('parentId') === null) {\n                    return null;\n                }\n                return this.get(task.parentId);\n            },\n            taskLevel: function (task) {\n                var level = 0;\n                var parent = this.taskParent(task);\n                while (parent !== null) {\n                    level += 1;\n                    parent = this.taskParent(parent);\n                }\n                return level;\n            },\n            taskTree: function (task) {\n                var data = [];\n                var current;\n                var tasks = this.taskChildren(task);\n                for (var i = 0, l = tasks.length; i < l; i++) {\n                    current = tasks[i];\n                    data.push(current);\n                    if (current.get('expanded')) {\n                        var children = this.taskTree(current);\n                        data.push.apply(data, children);\n                    }\n                }\n                return data;\n            },\n            update: function (task, taskInfo) {\n                var that = this;\n                var oldValue;\n                var offsetChildren = function (parentTask, offset) {\n                    var children = that.taskAllChildren(parentTask);\n                    for (var i = 0, l = children.length; i < l; i++) {\n                        children[i]._offset(offset);\n                    }\n                };\n                var modelChangeHandler = function (e) {\n                    var field = e.field;\n                    var model = e.sender;\n                    switch (field) {\n                    case 'start':\n                        that._resolveSummaryStart(that.taskParent(model));\n                        offsetChildren(model, model.get(field).getTime() - oldValue.getTime());\n                        break;\n                    case 'end':\n                        that._resolveSummaryEnd(that.taskParent(model));\n                        break;\n                    case 'percentComplete':\n                        that._resolveSummaryPercentComplete(that.taskParent(model));\n                        break;\n                    case 'orderId':\n                        that._reorderSiblings(model, oldValue);\n                        break;\n                    }\n                };\n                if (taskInfo.parentId !== undefined) {\n                    oldValue = task.get('parentId');\n                    if (oldValue !== taskInfo.parentId) {\n                        task.set('parentId', taskInfo.parentId);\n                        that._childRemoved(oldValue, task.get('orderId'));\n                        task.set('orderId', that.taskSiblings(task).length - 1);\n                        that._resolveSummaryFields(that.taskParent(task));\n                    }\n                    delete taskInfo.parentId;\n                }\n                task.bind('change', modelChangeHandler);\n                for (var field in taskInfo) {\n                    oldValue = task.get(field);\n                    task.set(field, taskInfo[field]);\n                }\n                task.unbind('change', modelChangeHandler);\n            },\n            _resolveSummaryFields: function (summary) {\n                if (!summary) {\n                    return;\n                }\n                this._updateSummary(summary);\n                if (!this.taskChildren(summary).length) {\n                    return;\n                }\n                this._resolveSummaryStart(summary);\n                this._resolveSummaryEnd(summary);\n                this._resolveSummaryPercentComplete(summary);\n            },\n            _resolveSummaryStart: function (summary) {\n                var that = this;\n                var getSummaryStart = function (parentTask) {\n                    var children = that.taskChildren(parentTask);\n                    var min = children[0].start.getTime();\n                    var currentMin;\n                    for (var i = 1, l = children.length; i < l; i++) {\n                        currentMin = children[i].start.getTime();\n                        if (currentMin < min) {\n                            min = currentMin;\n                        }\n                    }\n                    return new Date(min);\n                };\n                this._updateSummaryRecursive(summary, 'start', getSummaryStart);\n            },\n            _resolveSummaryEnd: function (summary) {\n                var that = this;\n                var getSummaryEnd = function (parentTask) {\n                    var children = that.taskChildren(parentTask);\n                    var max = children[0].end.getTime();\n                    var currentMax;\n                    for (var i = 1, l = children.length; i < l; i++) {\n                        currentMax = children[i].end.getTime();\n                        if (currentMax > max) {\n                            max = currentMax;\n                        }\n                    }\n                    return new Date(max);\n                };\n                this._updateSummaryRecursive(summary, 'end', getSummaryEnd);\n            },\n            _resolveSummaryPercentComplete: function (summary) {\n                var that = this;\n                var getSummaryPercentComplete = function (parentTask) {\n                    var children = that.taskChildren(parentTask);\n                    var percentComplete = new Query(children).aggregate([{\n                            field: 'percentComplete',\n                            aggregate: 'average'\n                        }]);\n                    return percentComplete.percentComplete.average;\n                };\n                this._updateSummaryRecursive(summary, 'percentComplete', getSummaryPercentComplete);\n            },\n            _updateSummaryRecursive: function (summary, field, callback) {\n                if (!summary) {\n                    return;\n                }\n                var value = callback(summary);\n                summary.set(field, value);\n                var parent = this.taskParent(summary);\n                if (parent) {\n                    this._updateSummaryRecursive(parent, field, callback);\n                }\n            },\n            _childRemoved: function (parentId, index) {\n                var parent = parentId === null ? null : this.get(parentId);\n                var children = this.taskChildren(parent);\n                for (var i = index, l = children.length; i < l; i++) {\n                    children[i].set('orderId', i);\n                }\n                this._resolveSummaryFields(parent);\n            },\n            _reorderSiblings: function (task, oldOrderId) {\n                var orderId = task.get('orderId');\n                var direction = orderId > oldOrderId;\n                var startIndex = direction ? oldOrderId : orderId;\n                var endIndex = direction ? orderId : oldOrderId;\n                var newIndex = direction ? startIndex : startIndex + 1;\n                var siblings = this.taskSiblings(task);\n                endIndex = Math.min(endIndex, siblings.length - 1);\n                for (var i = startIndex; i <= endIndex; i++) {\n                    if (siblings[i] === task) {\n                        continue;\n                    }\n                    siblings[i].set('orderId', newIndex);\n                    newIndex += 1;\n                }\n            },\n            _updateSummary: function (task) {\n                if (task !== null) {\n                    var childCount = this.taskChildren(task).length;\n                    task.set('summary', childCount > 0);\n                }\n            },\n            _toGanttTask: function (task) {\n                if (!(task instanceof GanttTask)) {\n                    var taskInfo = task;\n                    task = this._createNewModel();\n                    task.accept(taskInfo);\n                }\n                return task;\n            }\n        });\n        GanttDataSource.create = createDataSource(GanttDataSource, 'GanttDataSource');\n        extend(true, kendo.data, {\n            GanttDataSource: GanttDataSource,\n            GanttTask: GanttTask,\n            GanttDependencyDataSource: GanttDependencyDataSource,\n            GanttDependency: GanttDependency\n        });\n        var editors = {\n            desktop: {\n                dateRange: DATERANGEEDITOR,\n                resources: RESOURCESEDITOR\n            }\n        };\n        var Editor = kendo.Observable.extend({\n            init: function (element, options) {\n                kendo.Observable.fn.init.call(this);\n                this.element = element;\n                this.options = extend(true, {}, this.options, options);\n                this.createButton = this.options.createButton;\n            },\n            fields: function (editors, model) {\n                var that = this;\n                var options = this.options;\n                var messages = options.messages.editor;\n                var resources = options.resources;\n                var fields;\n                var click = function (e) {\n                    e.preventDefault();\n                    resources.editor(that.container.find(DOT + Gantt.styles.popup.resourcesField), model);\n                };\n                if (options.editable.template) {\n                    fields = $.map(model.fields, function (value, key) {\n                        return { field: key };\n                    });\n                } else {\n                    fields = [\n                        {\n                            field: 'title',\n                            title: messages.title\n                        },\n                        {\n                            field: 'start',\n                            title: messages.start,\n                            editor: editors.dateRange\n                        },\n                        {\n                            field: 'end',\n                            title: messages.end,\n                            editor: editors.dateRange\n                        },\n                        {\n                            field: 'percentComplete',\n                            title: messages.percentComplete,\n                            format: PERCENTAGE_FORMAT\n                        }\n                    ];\n                    if (model.get(resources.field)) {\n                        fields.push({\n                            field: resources.field,\n                            title: messages.resources,\n                            messages: messages,\n                            editor: editors.resources,\n                            click: click,\n                            styles: Gantt.styles.popup\n                        });\n                    }\n                }\n                return fields;\n            },\n            _buildEditTemplate: function (model, fields, editableFields) {\n                var resources = this.options.resources;\n                var template = this.options.editable.template;\n                var settings = extend({}, kendo.Template, this.options.templateSettings);\n                var paramName = settings.paramName;\n                var popupStyles = Gantt.styles.popup;\n                var html = '';\n                if (template) {\n                    if (typeof template === STRING) {\n                        template = window.unescape(template);\n                    }\n                    html += kendo.template(template, settings)(model);\n                } else {\n                    for (var i = 0, length = fields.length; i < length; i++) {\n                        var field = fields[i];\n                        html += '<div class=\"' + popupStyles.editLabel + '\"><label for=\"' + field.field + '\">' + (field.title || field.field || '') + '</label></div>';\n                        if (field.field === resources.field) {\n                            html += '<div class=\"' + popupStyles.resourcesField + '\" style=\"display:none\"></div>';\n                        }\n                        if (!model.editable || model.editable(field.field)) {\n                            editableFields.push(field);\n                            html += '<div ' + kendo.attr('container-for') + '=\"' + field.field + '\" class=\"' + popupStyles.editField + '\"></div>';\n                        } else {\n                            var tmpl = '#:';\n                            if (field.field) {\n                                field = kendo.expr(field.field, paramName);\n                                tmpl += field + '==null?\\'\\':' + field;\n                            } else {\n                                tmpl += '\\'\\'';\n                            }\n                            tmpl += '#';\n                            tmpl = kendo.template(tmpl, settings);\n                            html += '<div class=\"' + popupStyles.editField + '\">' + tmpl(model) + '</div>';\n                        }\n                    }\n                }\n                return html;\n            }\n        });\n        var PopupEditor = Editor.extend({\n            destroy: function () {\n                this.close();\n                this.unbind();\n            },\n            editTask: function (task) {\n                this.editable = this._createPopupEditor(task);\n            },\n            close: function () {\n                var that = this;\n                var destroy = function () {\n                    if (that.editable) {\n                        that.editable.destroy();\n                        that.editable = null;\n                        that.container = null;\n                    }\n                    if (that.popup) {\n                        that.popup.destroy();\n                        that.popup = null;\n                    }\n                };\n                if (this.editable && this.container.is(':visible')) {\n                    that.trigger('close', { window: that.container });\n                    this.container.data('kendoWindow').bind('deactivate', destroy).close();\n                } else {\n                    destroy();\n                }\n            },\n            showDialog: function (options) {\n                var buttons = options.buttons;\n                var popupStyles = Gantt.styles.popup;\n                var html = kendo.format('<div class=\"{0}\"><div class=\"{1}\"><p class=\"{2}\">{3}</p><div class=\"{4}\">', popupStyles.form, popupStyles.formContainer, popupStyles.message, options.text, popupStyles.buttonsContainer);\n                for (var i = 0, length = buttons.length; i < length; i++) {\n                    html += this.createButton(buttons[i]);\n                }\n                html += '</div></div></div>';\n                var wrapper = this.element;\n                if (this.popup) {\n                    this.popup.destroy();\n                }\n                var popup = this.popup = $(html).appendTo(wrapper).eq(0).on('click', DOT + popupStyles.button, function (e) {\n                    e.preventDefault();\n                    popup.close();\n                    var buttonIndex = $(e.currentTarget).index();\n                    buttons[buttonIndex].click();\n                }).kendoWindow({\n                    modal: true,\n                    resizable: false,\n                    draggable: false,\n                    title: options.title,\n                    visible: false,\n                    deactivate: function () {\n                        this.destroy();\n                        wrapper.focus();\n                    }\n                }).getKendoWindow();\n                popup.center().open();\n            },\n            _createPopupEditor: function (task) {\n                var that = this;\n                var options = {};\n                var messages = this.options.messages;\n                var ganttStyles = Gantt.styles;\n                var popupStyles = ganttStyles.popup;\n                var html = kendo.format('<div {0}=\"{1}\" class=\"{2} {3}\"><div class=\"{4}\">', kendo.attr('uid'), task.uid, popupStyles.form, popupStyles.editForm, popupStyles.formContainer);\n                var fields = this.fields(editors.desktop, task);\n                var editableFields = [];\n                html += this._buildEditTemplate(task, fields, editableFields);\n                html += '<div class=\"' + popupStyles.buttonsContainer + '\">';\n                html += this.createButton({\n                    name: 'update',\n                    text: messages.save,\n                    className: Gantt.styles.primary\n                });\n                html += this.createButton({\n                    name: 'cancel',\n                    text: messages.cancel\n                });\n                if (that.options.editable.destroy !== false) {\n                    html += this.createButton({\n                        name: 'delete',\n                        text: messages.destroy\n                    });\n                }\n                html += '</div></div></div>';\n                var container = this.container = $(html).appendTo(this.element).eq(0).kendoWindow(extend({\n                    modal: true,\n                    resizable: false,\n                    draggable: true,\n                    title: messages.editor.editorTitle,\n                    visible: false,\n                    close: function (e) {\n                        if (e.userTriggered) {\n                            if (that.trigger('cancel', {\n                                    container: container,\n                                    model: task\n                                })) {\n                                e.preventDefault();\n                            }\n                        }\n                    }\n                }, options));\n                var editableWidget = container.kendoEditable({\n                    fields: editableFields,\n                    model: task,\n                    clearContainer: false,\n                    validateOnBlur: true,\n                    target: that.options.target\n                }).data('kendoEditable');\n                kendo.cycleForm(container);\n                if (!this.trigger('edit', {\n                        container: container,\n                        model: task\n                    })) {\n                    container.data('kendoWindow').center().open();\n                    container.on(CLICK + NS, DOT + ganttStyles.buttonCancel, function (e) {\n                        e.preventDefault();\n                        e.stopPropagation();\n                        that.trigger('cancel', {\n                            container: container,\n                            model: task\n                        });\n                    });\n                    container.on(CLICK + NS, DOT + ganttStyles.buttonSave, function (e) {\n                        e.preventDefault();\n                        e.stopPropagation();\n                        var fields = that.fields(editors.desktop, task);\n                        var updateInfo = {};\n                        var field;\n                        for (var i = 0, length = fields.length; i < length; i++) {\n                            field = fields[i].field;\n                            updateInfo[field] = task.get(field);\n                        }\n                        that.trigger('save', {\n                            container: container,\n                            model: task,\n                            updateInfo: updateInfo\n                        });\n                    });\n                    container.on(CLICK + NS, DOT + ganttStyles.buttonDelete, function (e) {\n                        e.preventDefault();\n                        e.stopPropagation();\n                        that.trigger('remove', {\n                            container: container,\n                            model: task\n                        });\n                    });\n                } else {\n                    that.trigger('cancel', {\n                        container: container,\n                        model: task\n                    });\n                }\n                return editableWidget;\n            }\n        });\n        var ResourceEditor = Widget.extend({\n            init: function (element, options) {\n                Widget.fn.init.call(this, element, options);\n                this.wrapper = this.element;\n                this.model = this.options.model;\n                this.resourcesField = this.options.resourcesField;\n                this.createButton = this.options.createButton;\n                this._initContainer();\n                this._attachHandlers();\n            },\n            events: ['save'],\n            open: function () {\n                this.window.center().open();\n            },\n            close: function () {\n                this.window.bind('deactivate', proxy(this.destroy, this)).close();\n            },\n            destroy: function () {\n                this._dettachHandlers();\n                this.grid.destroy();\n                this.grid = null;\n                this.window.destroy();\n                this.window = null;\n                Widget.fn.destroy.call(this);\n                kendo.destroy(this.wrapper);\n                this.element = this.wrapper = null;\n            },\n            _attachHandlers: function () {\n                var ganttStyles = Gantt.styles;\n                var grid = this.grid;\n                var closeHandler = this._cancelProxy = proxy(this._cancel, this);\n                this.container.on(CLICK + NS, DOT + ganttStyles.buttonCancel, this._cancelProxy);\n                this._saveProxy = proxy(this._save, this);\n                this.container.on(CLICK + NS, DOT + ganttStyles.buttonSave, this._saveProxy);\n                this.window.bind('close', function (e) {\n                    if (e.userTriggered) {\n                        closeHandler(e);\n                    }\n                });\n                grid.wrapper.on(CLICK + NS, 'input[type=\\'checkbox\\']', function () {\n                    var element = $(this);\n                    var row = $(element).closest('tr');\n                    var model = grid.dataSource.getByUid(row.attr(kendo.attr('uid')));\n                    var value = $(element).is(':checked') ? 1 : '';\n                    model.set('value', value);\n                });\n            },\n            _dettachHandlers: function () {\n                this._cancelProxy = null;\n                this._saveProxy = null;\n                this.container.off(NS);\n                this.grid.wrapper.off();\n            },\n            _cancel: function (e) {\n                e.preventDefault();\n                this.close();\n            },\n            _save: function (e) {\n                e.preventDefault();\n                this._updateModel();\n                if (!this.wrapper.is(DOT + Gantt.styles.popup.resourcesField)) {\n                    this.trigger('save', {\n                        container: this.wrapper,\n                        model: this.model\n                    });\n                }\n                this.close();\n            },\n            _initContainer: function () {\n                var that = this;\n                var popupStyles = Gantt.styles.popup;\n                var dom = kendo.format('<div class=\"{0} {1}\"><div class=\"{2} {3}\"/></div>\"', popupStyles.form, popupStyles.editForm, popupStyles.formContainer, popupStyles.resourcesFormContainer);\n                dom = $(dom);\n                this.container = dom.find(DOT + popupStyles.resourcesFormContainer);\n                this.window = dom.kendoWindow({\n                    modal: true,\n                    resizable: false,\n                    draggable: true,\n                    visible: false,\n                    title: this.options.messages.resourcesEditorTitle,\n                    open: function () {\n                        that.grid.resize(true);\n                    }\n                }).data('kendoWindow');\n                this._resourceGrid();\n                this._createButtons();\n            },\n            _resourceGrid: function () {\n                var that = this;\n                var messages = this.options.messages;\n                var element = $('<div id=\"resources-grid\"/>').appendTo(this.container);\n                this.grid = new kendo.ui.Grid(element, {\n                    columns: [\n                        {\n                            field: 'name',\n                            title: messages.resourcesHeader,\n                            template: '<label><input type=\\'checkbox\\' value=\\'#=name#\\'' + '# if (value > 0 && value !== null) {#' + 'checked=\\'checked\\'' + '# } #' + '/>#=name#</labe>'\n                        },\n                        {\n                            field: 'value',\n                            title: messages.unitsHeader,\n                            template: function (dataItem) {\n                                var valueFormat = dataItem.format;\n                                var value = dataItem.value !== null ? dataItem.value : '';\n                                return valueFormat ? kendo.toString(value, valueFormat) : value;\n                            }\n                        }\n                    ],\n                    height: 280,\n                    sortable: true,\n                    editable: true,\n                    filterable: true,\n                    dataSource: {\n                        data: that.options.data,\n                        schema: {\n                            model: {\n                                id: 'id',\n                                fields: {\n                                    id: { from: 'id' },\n                                    name: {\n                                        from: 'name',\n                                        type: 'string',\n                                        editable: false\n                                    },\n                                    value: {\n                                        from: 'value',\n                                        type: 'number',\n                                        defaultValue: ''\n                                    },\n                                    format: {\n                                        from: 'format',\n                                        type: 'string'\n                                    }\n                                }\n                            }\n                        }\n                    },\n                    save: function (e) {\n                        var value = !!e.values.value;\n                        e.container.parent().find('input[type=\\'checkbox\\']').prop('checked', value);\n                    }\n                });\n            },\n            _createButtons: function () {\n                var buttons = this.options.buttons;\n                var html = '<div class=\"' + Gantt.styles.popup.buttonsContainer + '\">';\n                for (var i = 0, length = buttons.length; i < length; i++) {\n                    html += this.createButton(buttons[i]);\n                }\n                html += '</div>';\n                this.container.append(html);\n            },\n            _updateModel: function () {\n                var resources = [];\n                var value;\n                var data = this.grid.dataSource.data();\n                for (var i = 0, length = data.length; i < length; i++) {\n                    value = data[i].get('value');\n                    if (value !== null && value > 0) {\n                        resources.push(data[i]);\n                    }\n                }\n                this.model[this.resourcesField] = resources;\n            }\n        });\n        var Gantt = Widget.extend({\n            init: function (element, options, events) {\n                if (isArray(options)) {\n                    options = { dataSource: options };\n                }\n                defaultCommands = {\n                    append: {\n                        text: 'Add Task',\n                        action: 'add',\n                        className: Gantt.styles.toolbar.appendButton,\n                        iconClass: Gantt.styles.toolbar.iconPlus\n                    },\n                    pdf: {\n                        text: 'Export to PDF',\n                        className: Gantt.styles.toolbar.pdfButton,\n                        iconClass: Gantt.styles.toolbar.iconPdf\n                    }\n                };\n                Widget.fn.init.call(this, element, options);\n                if (events) {\n                    this._events = events;\n                }\n                this._wrapper();\n                this._resources();\n                if (!this.options.views || !this.options.views.length) {\n                    this.options.views = [\n                        'day',\n                        'week',\n                        'month'\n                    ];\n                }\n                this._timeline();\n                this._toolbar();\n                this._footer();\n                this._adjustDimensions();\n                this._preventRefresh = true;\n                this.view(this.timeline._selectedViewName);\n                this._preventRefresh = false;\n                this._dataSource();\n                this._assignments();\n                this._dropDowns();\n                this._list();\n                this._dependencies();\n                this._resizable();\n                this._scrollable();\n                this._dataBind();\n                this._attachEvents();\n                this._createEditor();\n                kendo.notify(this);\n            },\n            events: [\n                'dataBinding',\n                'dataBound',\n                'add',\n                'edit',\n                'remove',\n                'cancel',\n                'save',\n                'change',\n                'navigate',\n                'moveStart',\n                'move',\n                'moveEnd',\n                'resizeStart',\n                'resize',\n                'resizeEnd',\n                'columnResize'\n            ],\n            options: {\n                name: 'Gantt',\n                autoBind: true,\n                navigatable: false,\n                selectable: true,\n                editable: true,\n                resizable: false,\n                columnResizeHandleWidth: defaultIndicatorWidth,\n                columns: [],\n                views: [],\n                dataSource: {},\n                dependencies: {},\n                resources: {},\n                assignments: {},\n                taskTemplate: null,\n                messages: {\n                    save: 'Save',\n                    cancel: 'Cancel',\n                    destroy: 'Delete',\n                    deleteTaskConfirmation: TASK_DELETE_CONFIRM,\n                    deleteDependencyConfirmation: DEPENDENCY_DELETE_CONFIRM,\n                    deleteTaskWindowTitle: 'Delete task',\n                    deleteDependencyWindowTitle: 'Delete dependency',\n                    views: {\n                        day: 'Day',\n                        week: 'Week',\n                        month: 'Month',\n                        year: 'Year',\n                        start: 'Start',\n                        end: 'End'\n                    },\n                    actions: {\n                        append: 'Add Task',\n                        addChild: 'Add Child',\n                        insertBefore: 'Add Above',\n                        insertAfter: 'Add Below',\n                        pdf: 'Export to PDF'\n                    },\n                    editor: {\n                        editorTitle: 'Task',\n                        resourcesEditorTitle: 'Resources',\n                        title: 'Title',\n                        start: 'Start',\n                        end: 'End',\n                        percentComplete: 'Complete',\n                        resources: 'Resources',\n                        assignButton: 'Assign',\n                        resourcesHeader: 'Resources',\n                        unitsHeader: 'Units'\n                    }\n                },\n                showWorkHours: true,\n                showWorkDays: true,\n                toolbar: null,\n                workDayStart: new Date(1980, 1, 1, 8, 0, 0),\n                workDayEnd: new Date(1980, 1, 1, 17, 0, 0),\n                workWeekStart: 1,\n                workWeekEnd: 5,\n                hourSpan: 1,\n                snap: true,\n                height: 600,\n                listWidth: '30%',\n                rowHeight: null\n            },\n            select: function (value) {\n                var list = this.list;\n                if (!value) {\n                    return list.select();\n                }\n                list.select(value);\n                return;\n            },\n            clearSelection: function () {\n                this.list.clearSelection();\n            },\n            destroy: function () {\n                Widget.fn.destroy.call(this);\n                if (this.dataSource) {\n                    this.dataSource.unbind('change', this._refreshHandler);\n                    this.dataSource.unbind('progress', this._progressHandler);\n                    this.dataSource.unbind('error', this._errorHandler);\n                }\n                if (this.dependencies) {\n                    this.dependencies.unbind('change', this._dependencyRefreshHandler);\n                    this.dependencies.unbind('error', this._dependencyErrorHandler);\n                }\n                if (this.timeline) {\n                    this.timeline.unbind();\n                    this.timeline.destroy();\n                }\n                if (this.list) {\n                    this.list.unbind();\n                    this.list.destroy();\n                }\n                if (this.footerDropDown) {\n                    this.footerDropDown.destroy();\n                }\n                if (this.headerDropDown) {\n                    this.headerDropDown.destroy();\n                }\n                if (this._editor) {\n                    this._editor.destroy();\n                }\n                if (this._resizeDraggable) {\n                    this._resizeDraggable.destroy();\n                }\n                this.toolbar.off(NS);\n                if (supportsMedia) {\n                    this._mediaQuery.removeListener(this._mediaQueryHandler);\n                    this._mediaQuery = null;\n                }\n                $(window).off('resize' + NS, this._resizeHandler);\n                $(this.wrapper).off(NS);\n                this.toolbar = null;\n                this.footer = null;\n            },\n            setOptions: function (options) {\n                var newOptions = kendo.deepExtend({}, this.options, options);\n                var events = this._events;\n                if (!options.views) {\n                    var selectedView = this.view().name;\n                    newOptions.views = $.map(this.options.views, function (view) {\n                        var isSettings = isPlainObject(view);\n                        var name = isSettings ? typeof view.type !== 'string' ? view.title : view.type : view;\n                        if (selectedView === name) {\n                            if (isSettings) {\n                                view.selected = true;\n                            } else {\n                                view = {\n                                    type: name,\n                                    selected: true\n                                };\n                            }\n                        } else if (isSettings) {\n                            view.selected = false;\n                        }\n                        return view;\n                    });\n                }\n                if (!options.dataSource) {\n                    newOptions.dataSource = this.dataSource;\n                }\n                if (!options.dependencies) {\n                    newOptions.dependencies = this.dependencies;\n                }\n                if (!options.resources) {\n                    newOptions.resources = this.resources;\n                }\n                if (!options.assignments) {\n                    newOptions.assignments = this.assignments;\n                }\n                this.destroy();\n                this.element.empty();\n                this.options = null;\n                this.init(this.element, newOptions, events);\n                Widget.fn._setEvents.call(this, newOptions);\n            },\n            _attachEvents: function () {\n                this._resizeHandler = proxy(this.resize, this, false);\n                $(window).on('resize' + NS, this._resizeHandler);\n            },\n            _wrapper: function () {\n                var ganttStyles = Gantt.styles;\n                var splitBarHandleClassName = [\n                    ganttStyles.icon,\n                    ganttStyles.resizeHandle\n                ].join(' ');\n                var options = this.options;\n                var height = options.height;\n                var width = options.width;\n                this.wrapper = this.element.addClass(ganttStyles.wrapper).append('<div class=\\'' + ganttStyles.listWrapper + '\\'><div></div></div>').append('<div class=\\'' + ganttStyles.splitBarWrapper + '\\'><div class=\\'' + splitBarHandleClassName + '\\'></div></div>').append('<div class=\\'' + ganttStyles.timelineWrapper + '\\'><div></div></div>');\n                this.wrapper.find(DOT + ganttStyles.list).width(options.listWidth);\n                if (height) {\n                    this.wrapper.height(height);\n                }\n                if (width) {\n                    this.wrapper.width(width);\n                }\n                if (options.rowHeight) {\n                    this.wrapper.addClass(ganttStyles.rowHeight);\n                }\n            },\n            _toolbar: function () {\n                var that = this;\n                var ganttStyles = Gantt.styles;\n                var viewsSelector = DOT + ganttStyles.toolbar.views + ' > li';\n                var pdfSelector = DOT + ganttStyles.toolbar.pdfButton;\n                var toggleSelector = DOT + ganttStyles.buttonToggle;\n                var contentSelector = DOT + ganttStyles.gridContent;\n                var treelist = $(DOT + ganttStyles.list);\n                var timeline = $(DOT + ganttStyles.timeline);\n                var hoveredClassName = ganttStyles.hovered;\n                var actions = this.options.toolbar;\n                var actionsWrap = $('<div class=\\'' + ganttStyles.toolbar.actions + '\\'>');\n                var toolbar;\n                var views;\n                var toggleButton;\n                var handler = function (e) {\n                    if (e.matches) {\n                        treelist.css({\n                            'display': 'none',\n                            'max-width': 0\n                        });\n                    } else {\n                        treelist.css({\n                            'display': 'inline-block',\n                            'width': '30%',\n                            'max-width': 'none'\n                        });\n                        timeline.css('display', 'inline-block');\n                        that.refresh();\n                        timeline.find(contentSelector).scrollTop(that.scrollTop);\n                    }\n                    that._resize();\n                };\n                if (!isFunction(actions)) {\n                    actions = typeof actions === STRING ? actions : this._actions(actions);\n                    actions = proxy(kendo.template(actions), this);\n                }\n                toggleButton = $(TOGGLE_BUTTON_TEMPLATE({ styles: ganttStyles.toolbar }));\n                views = $(HEADER_VIEWS_TEMPLATE({\n                    ns: kendo.ns,\n                    views: this.timeline.views,\n                    styles: ganttStyles.toolbar\n                }));\n                actionsWrap.append(actions({}));\n                toolbar = $('<div class=\\'' + ganttStyles.toolbar.headerWrapper + '\\'>').append(toggleButton).append(views).append(actionsWrap);\n                if (views.find('li').length > 1) {\n                    views.prepend(VIEWBUTTONTEMPLATE({ styles: ganttStyles.toolbar }));\n                }\n                this.wrapper.prepend(toolbar);\n                this.toolbar = toolbar;\n                if (supportsMedia) {\n                    this._mediaQueryHandler = proxy(handler, this);\n                    this._mediaQuery = window.matchMedia('(max-width: 480px)');\n                    this._mediaQuery.addListener(this._mediaQueryHandler);\n                }\n                toolbar.on(CLICK + NS, viewsSelector, function (e) {\n                    e.preventDefault();\n                    var list = that.list;\n                    var name = $(this).attr(kendo.attr('name'));\n                    var currentView = views.find(DOT + ganttStyles.toolbar.currentView);\n                    if (currentView.is(':visible')) {\n                        currentView.parent().toggleClass(ganttStyles.toolbar.expanded);\n                    }\n                    if (list.editable && list.editable.trigger('validate')) {\n                        return;\n                    }\n                    if (!that.trigger('navigate', { view: name })) {\n                        that.view(name);\n                    }\n                }).on(CLICK + NS, pdfSelector, function (e) {\n                    e.preventDefault();\n                    that.saveAsPDF();\n                }).on(CLICK + NS, toggleSelector, function (e) {\n                    e.preventDefault();\n                    if (treelist.is(':visible')) {\n                        treelist.css({\n                            'display': 'none',\n                            'width': '0'\n                        });\n                        timeline.css({\n                            'display': 'inline-block',\n                            'width': '100%'\n                        });\n                        that.refresh();\n                        timeline.find(contentSelector).scrollTop(that.scrollTop);\n                    } else {\n                        timeline.css({\n                            'display': 'none',\n                            'width': 0\n                        });\n                        treelist.css({\n                            'display': 'inline-block',\n                            'width': '100%',\n                            'max-width': 'none'\n                        }).find(contentSelector).scrollTop(that.scrollTop);\n                    }\n                    that._resize();\n                });\n                this.wrapper.find(DOT + ganttStyles.toolbar.toolbar + ' li').hover(function () {\n                    $(this).addClass(hoveredClassName);\n                }, function () {\n                    $(this).removeClass(hoveredClassName);\n                });\n            },\n            _actions: function () {\n                var options = this.options;\n                var editable = options.editable;\n                var actions = options.toolbar;\n                var html = '';\n                if (!isArray(actions)) {\n                    if (editable && editable.create !== false) {\n                        actions = ['append'];\n                    } else {\n                        return html;\n                    }\n                }\n                for (var i = 0, length = actions.length; i < length; i++) {\n                    html += this._createButton(actions[i]);\n                }\n                return html;\n            },\n            _footer: function () {\n                var editable = this.options.editable;\n                if (!editable || editable.create === false) {\n                    return;\n                }\n                var ganttStyles = Gantt.styles.toolbar;\n                var messages = this.options.messages.actions;\n                var button = $(kendo.template(BUTTON_TEMPLATE)(extend(true, { styles: ganttStyles }, defaultCommands.append, { text: messages.append })));\n                var actionsWrap = $('<div class=\\'' + ganttStyles.actions + '\\'>').append(button);\n                var footer = $('<div class=\\'' + ganttStyles.footerWrapper + '\\'>').append(actionsWrap);\n                this.wrapper.append(footer);\n                this.footer = footer;\n            },\n            _createButton: function (command) {\n                var template = command.template || BUTTON_TEMPLATE;\n                var messages = this.options.messages.actions;\n                var commandName = typeof command === STRING ? command : command.name || command.text;\n                var className = defaultCommands[commandName] ? defaultCommands[commandName].className : 'k-gantt-' + (commandName || '').replace(/\\s/g, '');\n                var options = {\n                    iconClass: '',\n                    action: '',\n                    text: commandName,\n                    className: className,\n                    styles: Gantt.styles.toolbar\n                };\n                if (!commandName && !(isPlainObject(command) && command.template)) {\n                    throw new Error('Custom commands should have name specified');\n                }\n                options = extend(true, options, defaultCommands[commandName], { text: messages[commandName] });\n                if (isPlainObject(command)) {\n                    if (command.className && inArray(options.className, command.className.split(' ')) < 0) {\n                        command.className += ' ' + options.className;\n                    }\n                    options = extend(true, options, command);\n                }\n                return kendo.template(template)(options);\n            },\n            _adjustDimensions: function () {\n                var element = this.element;\n                var ganttStyles = Gantt.styles;\n                var listSelector = DOT + ganttStyles.list;\n                var timelineSelector = DOT + ganttStyles.timeline;\n                var splitBarSelector = DOT + ganttStyles.splitBar;\n                var toolbarHeight = outerHeight(this.toolbar);\n                var footerHeight = this.footer ? outerHeight(this.footer) : 0;\n                var totalHeight = element.height();\n                var totalWidth = element.width();\n                var splitBarWidth = outerWidth(element.find(splitBarSelector));\n                var treeListWidth = outerWidth(element.find(listSelector));\n                element.children([\n                    listSelector,\n                    timelineSelector,\n                    splitBarSelector\n                ].join(',')).height(totalHeight - (toolbarHeight + footerHeight)).end().children(timelineSelector).width(totalWidth - (splitBarWidth + treeListWidth));\n                if (totalWidth < treeListWidth + splitBarWidth) {\n                    element.find(listSelector).width(totalWidth - splitBarWidth);\n                }\n            },\n            _scrollTo: function (value) {\n                var view = this.timeline.view();\n                var list = this.list;\n                var attr = kendo.attr('uid');\n                var id = typeof value === 'string' ? value : value.closest('tr' + selector()).attr(attr);\n                var action;\n                var scrollTarget;\n                var scrollIntoView = function () {\n                    if (scrollTarget.length !== 0) {\n                        action();\n                    }\n                };\n                if (view.content.is(':visible')) {\n                    scrollTarget = view.content.find(selector(id));\n                    action = function () {\n                        view._scrollTo(scrollTarget);\n                    };\n                } else {\n                    scrollTarget = list.content.find(selector(id));\n                    action = function () {\n                        scrollTarget.get(0).scrollIntoView();\n                    };\n                }\n                scrollIntoView();\n            },\n            _dropDowns: function () {\n                var that = this;\n                var actionsSelector = DOT + Gantt.styles.toolbar.actions;\n                var actionMessages = this.options.messages.actions;\n                var timeline = this.timeline;\n                var editable = this.options.editable;\n                var handler = function (e) {\n                    var type = e.type;\n                    var orderId;\n                    var dataSource = that.dataSource;\n                    var task = dataSource._createNewModel();\n                    var selected = that.dataItem(that.select());\n                    var parent = dataSource.taskParent(selected);\n                    var firstSlot = timeline.view()._timeSlots()[0];\n                    var target = type === 'add' ? selected : parent;\n                    var editable = that.list.editable;\n                    if (editable && editable.trigger('validate')) {\n                        return;\n                    }\n                    task.set('title', 'New task');\n                    if (target) {\n                        task.set('parentId', target.get('id'));\n                        task.set('start', target.get('start'));\n                        task.set('end', target.get('end'));\n                    } else {\n                        task.set('start', firstSlot.start);\n                        task.set('end', firstSlot.end);\n                    }\n                    if (type !== 'add') {\n                        orderId = selected.get('orderId');\n                        orderId = type === 'insert-before' ? orderId : orderId + 1;\n                    }\n                    that._createTask(task, orderId);\n                };\n                if (!editable || editable.create === false) {\n                    return;\n                }\n                this.footerDropDown = new TaskDropDown(this.footer.children(actionsSelector).eq(0), {\n                    messages: { actions: actionMessages },\n                    direction: 'up',\n                    animation: { open: { effects: 'slideIn:up' } },\n                    navigatable: that.options.navigatable\n                });\n                this.headerDropDown = new TaskDropDown(this.toolbar.children(actionsSelector).eq(0), {\n                    messages: { actions: actionMessages },\n                    navigatable: that.options.navigatable\n                });\n                this.footerDropDown.bind('command', handler);\n                this.headerDropDown.bind('command', handler);\n            },\n            _list: function () {\n                var that = this;\n                var navigatable = that.options.navigatable;\n                var ganttStyles = Gantt.styles;\n                var listWrapper = this.wrapper.find(DOT + ganttStyles.list);\n                var element = listWrapper.find('> div');\n                var toggleButtons = this.wrapper.find(DOT + ganttStyles.toolbar.actions + ' > button');\n                var options = {\n                    columns: this.options.columns || [],\n                    dataSource: this.dataSource,\n                    selectable: this.options.selectable,\n                    editable: this.options.editable,\n                    resizable: this.options.resizable,\n                    columnResizeHandleWidth: this.options.columnResizeHandleWidth,\n                    listWidth: outerWidth(listWrapper),\n                    resourcesField: this.resources.field,\n                    rowHeight: this.options.rowHeight\n                };\n                var columns = options.columns;\n                var column;\n                var restoreFocus = function () {\n                    if (navigatable) {\n                        that._current(that._cachedCurrent);\n                        focusTable(that.list.content.find('table'), true);\n                    }\n                    delete that._cachedCurrent;\n                };\n                for (var i = 0; i < columns.length; i++) {\n                    column = columns[i];\n                    if (column.field === this.resources.field && typeof column.editor !== 'function') {\n                        column.editor = proxy(this._createResourceEditor, this);\n                    }\n                }\n                this.list = new kendo.ui.GanttList(element, options);\n                this.list.bind('render', function () {\n                    that._navigatable();\n                }, true).bind('edit', function (e) {\n                    that._cachedCurrent = e.cell;\n                    if (that.trigger('edit', {\n                            task: e.model,\n                            container: e.cell\n                        })) {\n                        e.preventDefault();\n                    }\n                }).bind('cancel', function (e) {\n                    if (that.trigger('cancel', {\n                            task: e.model,\n                            container: e.cell\n                        })) {\n                        e.preventDefault();\n                    }\n                    restoreFocus();\n                }).bind('update', function (e) {\n                    that._updateTask(e.task, e.updateInfo);\n                    restoreFocus();\n                }).bind('change', function () {\n                    that.trigger('change');\n                    var selection = that.list.select();\n                    if (selection.length) {\n                        toggleButtons.removeAttr('data-action', 'add');\n                        that.timeline.select('[data-uid=\\'' + selection.attr('data-uid') + '\\']');\n                    } else {\n                        toggleButtons.attr('data-action', 'add');\n                        that.timeline.clearSelection();\n                    }\n                }).bind('columnResize', function (e) {\n                    that.trigger('columnResize', {\n                        column: e.column,\n                        oldWidth: e.oldWidth,\n                        newWidth: e.newWidth\n                    });\n                });\n            },\n            _timeline: function () {\n                var that = this;\n                var ganttStyles = Gantt.styles;\n                var options = trimOptions(extend(true, { resourcesField: this.resources.field }, this.options));\n                var element = this.wrapper.find(DOT + ganttStyles.timeline + ' > div');\n                var currentViewSelector = DOT + ganttStyles.toolbar.currentView + ' > ' + DOT + ganttStyles.toolbar.link;\n                this.timeline = new kendo.ui.GanttTimeline(element, options);\n                this.timeline.bind('navigate', function (e) {\n                    var viewName = e.view.replace(/\\./g, '\\\\.').toLowerCase();\n                    var text = that.toolbar.find(DOT + ganttStyles.toolbar.views + ' > li').removeClass(ganttStyles.selected).end().find(DOT + ganttStyles.toolbar.viewButton + '-' + viewName).addClass(ganttStyles.selected).find(DOT + ganttStyles.toolbar.link).text();\n                    that.toolbar.find(currentViewSelector).text(text);\n                    that.refresh();\n                }).bind('moveStart', function (e) {\n                    var editable = that.list.editable;\n                    if (editable && editable.trigger('validate')) {\n                        e.preventDefault();\n                        return;\n                    }\n                    if (that.trigger('moveStart', { task: e.task })) {\n                        e.preventDefault();\n                    }\n                }).bind('move', function (e) {\n                    var task = e.task;\n                    var start = e.start;\n                    var end = new Date(start.getTime() + task.duration());\n                    if (that.trigger('move', {\n                            task: task,\n                            start: start,\n                            end: end\n                        })) {\n                        e.preventDefault();\n                    }\n                }).bind('moveEnd', function (e) {\n                    var task = e.task;\n                    var start = e.start;\n                    var end = new Date(start.getTime() + task.duration());\n                    if (!that.trigger('moveEnd', {\n                            task: task,\n                            start: start,\n                            end: end\n                        })) {\n                        that._updateTask(that.dataSource.getByUid(task.uid), {\n                            start: start,\n                            end: end\n                        });\n                    }\n                }).bind('resizeStart', function (e) {\n                    var editable = that.list.editable;\n                    if (editable && editable.trigger('validate')) {\n                        e.preventDefault();\n                        return;\n                    }\n                    if (that.trigger('resizeStart', { task: e.task })) {\n                        e.preventDefault();\n                    }\n                }).bind('resize', function (e) {\n                    if (that.trigger('resize', {\n                            task: e.task,\n                            start: e.start,\n                            end: e.end\n                        })) {\n                        e.preventDefault();\n                    }\n                }).bind('resizeEnd', function (e) {\n                    var task = e.task;\n                    var updateInfo = {};\n                    if (e.resizeStart) {\n                        updateInfo.start = e.start;\n                    } else {\n                        updateInfo.end = e.end;\n                    }\n                    if (!that.trigger('resizeEnd', {\n                            task: task,\n                            start: e.start,\n                            end: e.end\n                        })) {\n                        that._updateTask(that.dataSource.getByUid(task.uid), updateInfo);\n                    }\n                }).bind('percentResizeStart', function (e) {\n                    var editable = that.list.editable;\n                    if (editable && editable.trigger('validate')) {\n                        e.preventDefault();\n                    }\n                }).bind('percentResizeEnd', function (e) {\n                    that._updateTask(that.dataSource.getByUid(e.task.uid), { percentComplete: e.percentComplete });\n                }).bind('dependencyDragStart', function (e) {\n                    var editable = that.list.editable;\n                    if (editable && editable.trigger('validate')) {\n                        e.preventDefault();\n                    }\n                }).bind('dependencyDragEnd', function (e) {\n                    var dependency = that.dependencies._createNewModel({\n                        type: e.type,\n                        predecessorId: e.predecessor.id,\n                        successorId: e.successor.id\n                    });\n                    that._createDependency(dependency);\n                }).bind('select', function (e) {\n                    var editable = that.list.editable;\n                    if (editable) {\n                        editable.trigger('validate');\n                    }\n                    that.select('[data-uid=\\'' + e.uid + '\\']');\n                }).bind('editTask', function (e) {\n                    var editable = that.list.editable;\n                    if (editable && editable.trigger('validate')) {\n                        return;\n                    }\n                    that.editTask(e.uid);\n                }).bind('clear', function () {\n                    that.clearSelection();\n                }).bind('removeTask', function (e) {\n                    var editable = that.list.editable;\n                    if (editable && editable.trigger('validate')) {\n                        return;\n                    }\n                    that.removeTask(that.dataSource.getByUid(e.uid));\n                }).bind('removeDependency', function (e) {\n                    var editable = that.list.editable;\n                    if (editable && editable.trigger('validate')) {\n                        return;\n                    }\n                    that.removeDependency(that.dependencies.getByUid(e.uid));\n                });\n            },\n            _dataSource: function () {\n                var options = this.options;\n                var dataSource = options.dataSource;\n                dataSource = isArray(dataSource) ? { data: dataSource } : dataSource;\n                if (this.dataSource && this._refreshHandler) {\n                    this.dataSource.unbind('change', this._refreshHandler).unbind('progress', this._progressHandler).unbind('error', this._errorHandler);\n                } else {\n                    this._refreshHandler = proxy(this.refresh, this);\n                    this._progressHandler = proxy(this._requestStart, this);\n                    this._errorHandler = proxy(this._error, this);\n                }\n                this.dataSource = kendo.data.GanttDataSource.create(dataSource).bind('change', this._refreshHandler).bind('progress', this._progressHandler).bind('error', this._errorHandler);\n            },\n            _dependencies: function () {\n                var dependencies = this.options.dependencies || {};\n                var dataSource = isArray(dependencies) ? { data: dependencies } : dependencies;\n                if (this.dependencies && this._dependencyRefreshHandler) {\n                    this.dependencies.unbind('change', this._dependencyRefreshHandler).unbind('error', this._dependencyErrorHandler);\n                } else {\n                    this._dependencyRefreshHandler = proxy(this.refreshDependencies, this);\n                    this._dependencyErrorHandler = proxy(this._error, this);\n                }\n                this.dependencies = kendo.data.GanttDependencyDataSource.create(dataSource).bind('change', this._dependencyRefreshHandler).bind('error', this._dependencyErrorHandler);\n            },\n            _resources: function () {\n                var resources = this.options.resources;\n                var dataSource = resources.dataSource || {};\n                this.resources = {\n                    field: 'resources',\n                    dataTextField: 'name',\n                    dataColorField: 'color',\n                    dataFormatField: 'format'\n                };\n                extend(this.resources, resources);\n                this.resources.dataSource = kendo.data.DataSource.create(dataSource);\n            },\n            _assignments: function () {\n                var assignments = this.options.assignments;\n                var dataSource = assignments.dataSource || {};\n                if (this.assignments) {\n                    this.assignments.dataSource.unbind('change', this._assignmentsRefreshHandler);\n                } else {\n                    this._assignmentsRefreshHandler = proxy(this.refresh, this);\n                }\n                this.assignments = {\n                    dataTaskIdField: 'taskId',\n                    dataResourceIdField: 'resourceId',\n                    dataValueField: 'value'\n                };\n                extend(this.assignments, assignments);\n                this.assignments.dataSource = kendo.data.DataSource.create(dataSource);\n                this.assignments.dataSource.bind('change', this._assignmentsRefreshHandler);\n            },\n            _createEditor: function () {\n                var that = this;\n                var editor = this._editor = new PopupEditor(this.wrapper, extend({}, this.options, {\n                    target: this,\n                    resources: {\n                        field: this.resources.field,\n                        editor: proxy(this._createResourceEditor, this)\n                    },\n                    createButton: proxy(this._createPopupButton, this)\n                }));\n                editor.bind('cancel', function (e) {\n                    var task = that.dataSource.getByUid(e.model.uid);\n                    if (that.trigger('cancel', {\n                            container: e.container,\n                            task: task\n                        })) {\n                        e.preventDefault();\n                        return;\n                    }\n                    that.cancelTask();\n                }).bind('edit', function (e) {\n                    var task = that.dataSource.getByUid(e.model.uid);\n                    if (that.trigger('edit', {\n                            container: e.container,\n                            task: task\n                        })) {\n                        e.preventDefault();\n                    }\n                }).bind('save', function (e) {\n                    var task = that.dataSource.getByUid(e.model.uid);\n                    that.saveTask(task, e.updateInfo);\n                }).bind('remove', function (e) {\n                    that.removeTask(e.model.uid);\n                }).bind('close', that._onDialogClose);\n            },\n            _onDialogClose: function () {\n            },\n            _createResourceEditor: function (container, options) {\n                var that = this;\n                var model = options instanceof ObservableObject ? options : options.model;\n                var id = model.get('id');\n                var messages = this.options.messages;\n                var resourcesField = that.resources.field;\n                var editor = this._resourceEditor = new ResourceEditor(container, {\n                    resourcesField: resourcesField,\n                    data: this._wrapResourceData(id),\n                    model: model,\n                    messages: extend({}, messages.editor),\n                    buttons: [\n                        {\n                            name: 'update',\n                            text: messages.save,\n                            className: Gantt.styles.primary\n                        },\n                        {\n                            name: 'cancel',\n                            text: messages.cancel\n                        }\n                    ],\n                    createButton: proxy(this._createPopupButton, this),\n                    save: function (e) {\n                        that._updateAssignments(e.model.get('id'), e.model.get(resourcesField));\n                    }\n                });\n                editor.open();\n            },\n            _createPopupButton: function (command) {\n                var commandName = command.name || command.text;\n                var options = {\n                    className: Gantt.styles.popup.button + ' k-gantt-' + (commandName || '').replace(/\\s/g, ''),\n                    text: commandName,\n                    attr: ''\n                };\n                if (!commandName && !(isPlainObject(command) && command.template)) {\n                    throw new Error('Custom commands should have name specified');\n                }\n                if (isPlainObject(command)) {\n                    if (command.className) {\n                        command.className += ' ' + options.className;\n                    }\n                    options = extend(true, options, command);\n                }\n                return kendo.template(COMMAND_BUTTON_TEMPLATE)(options);\n            },\n            view: function (type) {\n                return this.timeline.view(type);\n            },\n            range: function (range) {\n                var dataSource = this.dataSource;\n                var view = this.view();\n                var timeline = this.timeline;\n                if (range) {\n                    view.options.range = {\n                        start: range.start,\n                        end: range.end\n                    };\n                    timeline._render(dataSource.taskTree());\n                    timeline._renderDependencies(this.dependencies.view());\n                }\n                return {\n                    start: view.start,\n                    end: view.end\n                };\n            },\n            date: function (date) {\n                var view = this.view();\n                if (date) {\n                    view.options.date = date;\n                    view._scrollToDate(date);\n                }\n                return view.options.date;\n            },\n            dataItem: function (value) {\n                if (!value) {\n                    return null;\n                }\n                var list = this.list;\n                var element = list.content.find(value);\n                return list._modelFromElement(element);\n            },\n            setDataSource: function (dataSource) {\n                this.options.dataSource = dataSource;\n                this._dataSource();\n                this.list._setDataSource(this.dataSource);\n                if (this.options.autoBind) {\n                    dataSource.fetch();\n                }\n            },\n            setDependenciesDataSource: function (dependencies) {\n                this.options.dependencies = dependencies;\n                this._dependencies();\n                if (this.options.autoBind) {\n                    dependencies.fetch();\n                }\n            },\n            items: function () {\n                return this.wrapper.children('.k-task');\n            },\n            _updateAssignments: function (id, resources) {\n                var dataSource = this.assignments.dataSource;\n                var taskId = this.assignments.dataTaskIdField;\n                var resourceId = this.assignments.dataResourceIdField;\n                var hasMatch = false;\n                var assignments = new Query(dataSource.view()).filter({\n                    field: taskId,\n                    operator: 'eq',\n                    value: id\n                }).toArray();\n                var assignment;\n                var resource;\n                var value;\n                while (assignments.length) {\n                    assignment = assignments[0];\n                    for (var i = 0, length = resources.length; i < length; i++) {\n                        resource = resources[i];\n                        if (assignment.get(resourceId) === resource.get('id')) {\n                            value = resources[i].get('value');\n                            this._updateAssignment(assignment, value);\n                            resources.splice(i, 1);\n                            hasMatch = true;\n                            break;\n                        }\n                    }\n                    if (!hasMatch) {\n                        this._removeAssignment(assignment);\n                    }\n                    hasMatch = false;\n                    assignments.shift();\n                }\n                for (var j = 0, newLength = resources.length; j < newLength; j++) {\n                    resource = resources[j];\n                    this._createAssignment(resource, id);\n                }\n                dataSource.sync();\n            },\n            cancelTask: function () {\n                var editor = this._editor;\n                var container = editor.container;\n                if (container) {\n                    editor.close();\n                }\n            },\n            editTask: function (uid) {\n                var task = typeof uid === 'string' ? this.dataSource.getByUid(uid) : uid;\n                if (!task) {\n                    return;\n                }\n                var taskCopy = this.dataSource._createNewModel(task.toJSON());\n                taskCopy.uid = task.uid;\n                this.cancelTask();\n                this._editTask(taskCopy);\n            },\n            _editTask: function (task) {\n                this._editor.editTask(task);\n            },\n            saveTask: function (task, updateInfo) {\n                var editor = this._editor;\n                var container = editor.container;\n                var editable = editor.editable;\n                if (container && editable && editable.end()) {\n                    this._updateTask(task, updateInfo);\n                }\n            },\n            _updateTask: function (task, updateInfo) {\n                var resourcesField = this.resources.field;\n                if (!this.trigger('save', {\n                        task: task,\n                        values: updateInfo\n                    })) {\n                    this._preventRefresh = true;\n                    this.dataSource.update(task, updateInfo);\n                    if (updateInfo[resourcesField]) {\n                        this._updateAssignments(task.get('id'), updateInfo[resourcesField]);\n                    }\n                    this._syncDataSource();\n                }\n            },\n            _updateAssignment: function (assignment, value) {\n                var resourceValueField = this.assignments.dataValueField;\n                assignment.set(resourceValueField, value);\n            },\n            removeTask: function (uid) {\n                var that = this;\n                var task = typeof uid === 'string' ? this.dataSource.getByUid(uid) : uid;\n                if (!task) {\n                    return;\n                }\n                this._taskConfirm(function (cancel) {\n                    if (!cancel) {\n                        that._removeTask(task);\n                    }\n                }, task);\n            },\n            _createTask: function (task, index) {\n                if (!this.trigger('add', {\n                        task: task,\n                        dependency: null\n                    })) {\n                    var dataSource = this.dataSource;\n                    this._preventRefresh = true;\n                    if (index === undefined) {\n                        dataSource.add(task);\n                    } else {\n                        dataSource.insert(index, task);\n                    }\n                    this._scrollToUid = task.uid;\n                    this._syncDataSource();\n                }\n            },\n            _createDependency: function (dependency) {\n                if (!this.trigger('add', {\n                        task: null,\n                        dependency: dependency\n                    })) {\n                    this._preventDependencyRefresh = true;\n                    this.dependencies.add(dependency);\n                    this._preventDependencyRefresh = false;\n                    this.dependencies.sync();\n                }\n            },\n            _createAssignment: function (resource, id) {\n                var assignments = this.assignments;\n                var dataSource = assignments.dataSource;\n                var taskId = assignments.dataTaskIdField;\n                var resourceId = assignments.dataResourceIdField;\n                var resourceValue = assignments.dataValueField;\n                var assignment = dataSource._createNewModel();\n                assignment[taskId] = id;\n                assignment[resourceId] = resource.get('id');\n                assignment[resourceValue] = resource.get('value');\n                dataSource.add(assignment);\n            },\n            removeDependency: function (uid) {\n                var that = this;\n                var dependency = typeof uid === 'string' ? this.dependencies.getByUid(uid) : uid;\n                if (!dependency) {\n                    return;\n                }\n                this._dependencyConfirm(function (cancel) {\n                    if (!cancel) {\n                        that._removeDependency(dependency);\n                    }\n                }, dependency);\n            },\n            _removeTaskDependencies: function (task, dependencies) {\n                this._preventDependencyRefresh = true;\n                for (var i = 0, length = dependencies.length; i < length; i++) {\n                    this.dependencies.remove(dependencies[i]);\n                }\n                this._preventDependencyRefresh = false;\n                this.dependencies.sync();\n            },\n            _removeTaskAssignments: function (task) {\n                var dataSource = this.assignments.dataSource;\n                var assignments = dataSource.view();\n                var filter = {\n                    field: this.assignments.dataTaskIdField,\n                    operator: 'eq',\n                    value: task.get('id')\n                };\n                assignments = new Query(assignments).filter(filter).toArray();\n                this._preventRefresh = true;\n                for (var i = 0, length = assignments.length; i < length; i++) {\n                    dataSource.remove(assignments[i]);\n                }\n                this._preventRefresh = false;\n                dataSource.sync();\n            },\n            _removeTask: function (task) {\n                var dependencies = this.dependencies.dependencies(task.id);\n                if (!this.trigger('remove', {\n                        task: task,\n                        dependencies: dependencies\n                    })) {\n                    this._removeTaskDependencies(task, dependencies);\n                    this._removeTaskAssignments(task);\n                    this._preventRefresh = true;\n                    if (this.dataSource.remove(task)) {\n                        this._syncDataSource();\n                    }\n                    this._preventRefresh = false;\n                }\n            },\n            _removeDependency: function (dependency) {\n                if (!this.trigger('remove', {\n                        task: null,\n                        dependencies: [dependency]\n                    })) {\n                    if (this.dependencies.remove(dependency)) {\n                        this.dependencies.sync();\n                    }\n                }\n            },\n            _removeAssignment: function (assignment) {\n                this.assignments.dataSource.remove(assignment);\n            },\n            _taskConfirm: function (callback, task) {\n                var messages = this.options.messages;\n                this._confirm(callback, {\n                    model: task,\n                    text: messages.deleteTaskConfirmation,\n                    title: messages.deleteTaskWindowTitle\n                });\n            },\n            _dependencyConfirm: function (callback, dependency) {\n                var messages = this.options.messages;\n                this._confirm(callback, {\n                    model: dependency,\n                    text: messages.deleteDependencyConfirmation,\n                    title: messages.deleteDependencyWindowTitle\n                });\n            },\n            _confirm: function (callback, options) {\n                var editable = this.options.editable;\n                var messages;\n                var buttons;\n                if (editable === true || editable.confirmation !== false) {\n                    messages = this.options.messages;\n                    buttons = [\n                        {\n                            name: 'delete',\n                            text: messages.destroy,\n                            className: Gantt.styles.primary,\n                            click: function () {\n                                callback();\n                            }\n                        },\n                        {\n                            name: 'cancel',\n                            text: messages.cancel,\n                            click: function () {\n                                callback(true);\n                            }\n                        }\n                    ];\n                    this.showDialog(extend(true, {}, options, { buttons: buttons }));\n                } else {\n                    callback();\n                }\n            },\n            showDialog: function (options) {\n                this._editor.showDialog(options);\n            },\n            refresh: function () {\n                if (this._preventRefresh || this.list.editable) {\n                    return;\n                }\n                this._progress(false);\n                var dataSource = this.dataSource;\n                var taskTree = dataSource.taskTree();\n                var scrollToUid = this._scrollToUid;\n                var current;\n                var cachedUid;\n                var cachedIndex = -1;\n                if (this.current) {\n                    cachedUid = this.current.closest('tr').attr(kendo.attr('uid'));\n                    cachedIndex = this.current.index();\n                }\n                if (this.trigger('dataBinding')) {\n                    return;\n                }\n                if (this.resources.dataSource.data().length !== 0) {\n                    this._assignResources(taskTree);\n                }\n                if (this._editor) {\n                    this._editor.close();\n                }\n                this.clearSelection();\n                this.list._render(taskTree);\n                this.timeline._render(taskTree);\n                this.timeline._renderDependencies(this.dependencies.view());\n                if (scrollToUid) {\n                    this._scrollTo(scrollToUid);\n                    this.select(selector(scrollToUid));\n                }\n                if ((scrollToUid || cachedUid) && cachedIndex >= 0) {\n                    current = this.list.content.find('tr' + selector(scrollToUid || cachedUid) + ' > td:eq(' + cachedIndex + ')');\n                    this._current(current);\n                }\n                this._scrollToUid = null;\n                this.trigger('dataBound');\n            },\n            refreshDependencies: function () {\n                if (this._preventDependencyRefresh) {\n                    return;\n                }\n                if (this.trigger('dataBinding')) {\n                    return;\n                }\n                this.timeline._renderDependencies(this.dependencies.view());\n                this.trigger('dataBound');\n            },\n            _assignResources: function (taskTree) {\n                var resources = this.resources;\n                var assignments = this.assignments;\n                var groupAssigments = function () {\n                    var data = assignments.dataSource.view();\n                    var group = { field: assignments.dataTaskIdField };\n                    data = new Query(data).group(group).toArray();\n                    return data;\n                };\n                var assigments = groupAssigments();\n                var applyTaskResource = function (task, action) {\n                    var taskId = task.get('id');\n                    kendo.setter(resources.field)(task, new ObservableArray([]));\n                    for (var i = 0, length = assigments.length; i < length; i++) {\n                        if (assigments[i].value === taskId) {\n                            action(task, assigments[i].items);\n                        }\n                    }\n                };\n                var wrapTask = function (task, items) {\n                    for (var j = 0, length = items.length; j < length; j++) {\n                        var item = items[j];\n                        var resource = resources.dataSource.get(item.get(assignments.dataResourceIdField));\n                        var resourceValue = item.get(assignments.dataValueField);\n                        var resourcedId = item.get(assignments.dataResourceIdField);\n                        var valueFormat = resource.get(resources.dataFormatField) || PERCENTAGE_FORMAT;\n                        var formatedValue = kendo.toString(resourceValue, valueFormat);\n                        task[resources.field].push(new ObservableObject({\n                            id: resourcedId,\n                            name: resource.get(resources.dataTextField),\n                            color: resource.get(resources.dataColorField),\n                            value: resourceValue,\n                            formatedValue: formatedValue\n                        }));\n                    }\n                };\n                for (var i = 0, length = taskTree.length; i < length; i++) {\n                    applyTaskResource(taskTree[i], wrapTask);\n                }\n            },\n            _wrapResourceData: function (id) {\n                var that = this;\n                var result = [];\n                var resource;\n                var resources = this.resources.dataSource.view();\n                var assignments = this.assignments.dataSource.view();\n                var taskAssignments = new Query(assignments).filter({\n                    field: that.assignments.dataTaskIdField,\n                    operator: 'eq',\n                    value: id\n                }).toArray();\n                var valuePerResource = function (id) {\n                    var resourceValue = null;\n                    new Query(taskAssignments).filter({\n                        field: that.assignments.dataResourceIdField,\n                        operator: 'eq',\n                        value: id\n                    }).select(function (assignment) {\n                        resourceValue += assignment.get(that.assignments.dataValueField);\n                    });\n                    return resourceValue;\n                };\n                for (var i = 0, length = resources.length; i < length; i++) {\n                    resource = resources[i];\n                    result.push({\n                        id: resource.get('id'),\n                        name: resource.get(that.resources.dataTextField),\n                        format: resource.get(that.resources.dataFormatField) || PERCENTAGE_FORMAT,\n                        value: valuePerResource(resource.id)\n                    });\n                }\n                return result;\n            },\n            _syncDataSource: function () {\n                this._preventRefresh = false;\n                this._requestStart();\n                this.dataSource.sync();\n            },\n            _requestStart: function () {\n                this._progress(true);\n            },\n            _error: function () {\n                this._progress(false);\n            },\n            _progress: function (toggle) {\n                kendo.ui.progress(this.element, toggle);\n            },\n            _resizable: function () {\n                var that = this;\n                var wrapper = this.wrapper;\n                var ganttStyles = Gantt.styles;\n                var contentSelector = DOT + ganttStyles.gridContent;\n                var treeListWrapper = wrapper.find(DOT + ganttStyles.list);\n                var timelineWrapper = wrapper.find(DOT + ganttStyles.timeline);\n                var treeListWidth;\n                var timelineWidth;\n                var timelineScroll;\n                this._resizeDraggable = wrapper.find(DOT + ganttStyles.splitBar).height(treeListWrapper.height()).hover(function () {\n                    $(this).addClass(ganttStyles.splitBarHover);\n                }, function () {\n                    $(this).removeClass(ganttStyles.splitBarHover);\n                }).end().kendoResizable({\n                    orientation: 'horizontal',\n                    handle: DOT + ganttStyles.splitBar,\n                    'start': function () {\n                        treeListWidth = treeListWrapper.width();\n                        timelineWidth = timelineWrapper.width();\n                        timelineScroll = timelineWrapper.find(contentSelector).scrollLeft();\n                    },\n                    'resize': function (e) {\n                        var delta = e.x.initialDelta;\n                        if (kendo.support.isRtl(wrapper)) {\n                            delta *= -1;\n                        }\n                        if (treeListWidth + delta < 0 || timelineWidth - delta < 0) {\n                            return;\n                        }\n                        treeListWrapper.width(treeListWidth + delta);\n                        timelineWrapper.width(timelineWidth - delta);\n                        timelineWrapper.find(contentSelector).scrollLeft(timelineScroll + delta);\n                        that.timeline.view()._renderCurrentTime();\n                    }\n                }).data('kendoResizable');\n            },\n            _scrollable: function () {\n                var that = this;\n                var ganttStyles = Gantt.styles;\n                var contentSelector = DOT + ganttStyles.gridContent;\n                var headerSelector = DOT + ganttStyles.gridHeaderWrap;\n                var timelineHeader = this.timeline.element.find(headerSelector);\n                var timelineContent = this.timeline.element.find(contentSelector);\n                var treeListHeader = this.list.element.find(headerSelector);\n                var treeListContent = this.list.element.find(contentSelector);\n                if (mobileOS) {\n                    treeListContent.css('overflow-y', 'auto');\n                }\n                timelineContent.on('scroll', function () {\n                    that.scrollTop = this.scrollTop;\n                    timelineHeader.scrollLeft(this.scrollLeft);\n                    treeListContent.scrollTop(this.scrollTop);\n                });\n                treeListContent.on('scroll', function () {\n                    treeListHeader.scrollLeft(this.scrollLeft);\n                }).on('DOMMouseScroll' + NS + ' mousewheel' + NS, function (e) {\n                    var scrollTop = timelineContent.scrollTop();\n                    var delta = kendo.wheelDeltaY(e);\n                    if (delta) {\n                        e.preventDefault();\n                        $(e.currentTarget).one('wheel' + NS, false);\n                        timelineContent.scrollTop(scrollTop + -delta);\n                    }\n                });\n            },\n            _navigatable: function () {\n                var that = this;\n                var navigatable = this.options.navigatable;\n                var editable = this.options.editable;\n                var headerTable = this.list.header.find('table');\n                var contentTable = this.list.content.find('table');\n                var ganttStyles = Gantt.styles;\n                var isRtl = kendo.support.isRtl(this.wrapper);\n                var timelineContent = this.timeline.element.find(DOT + ganttStyles.gridContent);\n                var tables = headerTable.add(contentTable);\n                var attr = selector();\n                var cellIndex;\n                var expandState = {\n                    collapse: false,\n                    expand: true\n                };\n                var scroll = function (reverse) {\n                    var width = that.timeline.view()._timeSlots()[0].offsetWidth;\n                    timelineContent.scrollLeft(timelineContent.scrollLeft() + (reverse ? -width : width));\n                };\n                var moveVertical = function (method) {\n                    var parent = that.current.parent('tr' + selector());\n                    var index = that.current.index();\n                    var subling = parent[method]();\n                    if (that.select().length !== 0) {\n                        that.clearSelection();\n                    }\n                    if (subling.length !== 0) {\n                        that._current(subling.children('td:eq(' + index + ')'));\n                        that._scrollTo(that.current);\n                    } else {\n                        if (that.current.is('td') && method == 'prev') {\n                            focusTable(headerTable);\n                        } else if (that.current.is('th') && method == 'next') {\n                            focusTable(contentTable);\n                        }\n                    }\n                };\n                var moveHorizontal = function (method) {\n                    var subling = that.current[method]();\n                    if (subling.length !== 0) {\n                        that._current(subling);\n                        cellIndex = that.current.index();\n                    }\n                };\n                var toggleExpandedState = function (value) {\n                    var model = that.dataItem(that.current);\n                    if (model.summary && model.expanded !== value) {\n                        model.set('expanded', value);\n                    }\n                };\n                var deleteAction = function () {\n                    var editable = that.options.editable;\n                    if (!editable || editable.destroy === false || that.list.editable) {\n                        return;\n                    }\n                    var selectedTask = that.select();\n                    var uid = kendo.attr('uid');\n                    if (selectedTask.length) {\n                        that.removeTask(selectedTask.attr(uid));\n                    }\n                };\n                $(this.wrapper).on('mousedown' + NS, 'tr' + attr + ', div' + attr + ':not(' + DOT + ganttStyles.line + ')', function (e) {\n                    var currentTarget = $(e.currentTarget);\n                    var isInput = $(e.target).is(':button,a,:input,a>.k-icon,textarea,span.k-icon,span.k-link,.k-input,.k-multiselect-wrap');\n                    var current;\n                    if (e.ctrlKey) {\n                        return;\n                    }\n                    if (navigatable) {\n                        if (currentTarget.is('tr')) {\n                            current = $(e.target).closest('td');\n                        } else {\n                            current = that.list.content.find('tr' + selector(currentTarget.attr(kendo.attr('uid'))) + ' > td:first');\n                        }\n                        that._current(current);\n                    }\n                    if ((navigatable || editable) && !isInput) {\n                        that._focusTimeout = setTimeout(function () {\n                            focusTable(that.list.content.find('table'), true);\n                        }, 2);\n                    }\n                });\n                if (navigatable !== true) {\n                    contentTable.on('keydown' + NS, function (e) {\n                        if (e.keyCode == keys.DELETE) {\n                            deleteAction();\n                        }\n                    });\n                    return;\n                }\n                tables.on('focus' + NS, function () {\n                    var selector = this === contentTable.get(0) ? 'td' : 'th';\n                    var selection = that.select();\n                    var current = that.current || $(selection.length ? selection : this).find(selector + ':eq(' + (cellIndex || 0) + ')');\n                    that._current(current);\n                }).on('blur' + NS, function () {\n                    that._current();\n                    if (this == headerTable) {\n                        $(this).attr(TABINDEX, -1);\n                    }\n                }).on('keydown' + NS, function (e) {\n                    var key = e.keyCode;\n                    var isCell;\n                    if (!that.current) {\n                        return;\n                    }\n                    isCell = that.current.is('td');\n                    switch (key) {\n                    case keys.RIGHT:\n                        e.preventDefault();\n                        if (e.altKey) {\n                            scroll();\n                        } else if (e.ctrlKey) {\n                            toggleExpandedState(isRtl ? expandState.collapse : expandState.expand);\n                        } else {\n                            moveHorizontal(isRtl ? 'prev' : 'next');\n                        }\n                        break;\n                    case keys.LEFT:\n                        e.preventDefault();\n                        if (e.altKey) {\n                            scroll(true);\n                        } else if (e.ctrlKey) {\n                            toggleExpandedState(isRtl ? expandState.expand : expandState.collapse);\n                        } else {\n                            moveHorizontal(isRtl ? 'next' : 'prev');\n                        }\n                        break;\n                    case keys.UP:\n                        e.preventDefault();\n                        moveVertical('prev');\n                        break;\n                    case keys.DOWN:\n                        e.preventDefault();\n                        moveVertical('next');\n                        break;\n                    case keys.SPACEBAR:\n                        e.preventDefault();\n                        if (isCell) {\n                            that.select(that.current.closest('tr'));\n                        }\n                        break;\n                    case keys.ENTER:\n                        e.preventDefault();\n                        if (isCell) {\n                            if (that.options.editable && that.options.editable.update !== false) {\n                                that._cachedCurrent = that.current;\n                                that.list._startEditHandler(that.current);\n                                $(this).one('keyup', function (e) {\n                                    e.stopPropagation();\n                                });\n                            }\n                        } else {\n                            that.current.children('a.k-link').click();\n                        }\n                        break;\n                    case keys.ESC:\n                        e.stopPropagation();\n                        break;\n                    case keys.DELETE:\n                        if (isCell) {\n                            deleteAction();\n                        }\n                        break;\n                    default:\n                        if (key >= 49 && key <= 57) {\n                            that.view(that.timeline._viewByIndex(key - 49));\n                        }\n                        break;\n                    }\n                });\n            },\n            _current: function (element) {\n                var ganttStyles = Gantt.styles;\n                var activeElement;\n                if (this.current && this.current.length) {\n                    this.current.removeClass(ganttStyles.focused).removeAttr('id');\n                }\n                if (element && element.length) {\n                    this.current = element.addClass(ganttStyles.focused).attr('id', ACTIVE_CELL);\n                    activeElement = $(kendo._activeElement());\n                    if (activeElement.is('table') && this.wrapper.find(activeElement).length > 0) {\n                        activeElement.removeAttr(ARIA_DESCENDANT).attr(ARIA_DESCENDANT, ACTIVE_CELL);\n                    }\n                } else {\n                    this.current = null;\n                }\n            },\n            _dataBind: function () {\n                var that = this;\n                if (that.options.autoBind) {\n                    this._preventRefresh = true;\n                    this._preventDependencyRefresh = true;\n                    var promises = $.map([\n                        this.dataSource,\n                        this.dependencies,\n                        this.resources.dataSource,\n                        this.assignments.dataSource\n                    ], function (dataSource) {\n                        return dataSource.fetch();\n                    });\n                    $.when.apply(null, promises).done(function () {\n                        that._preventRefresh = false;\n                        that._preventDependencyRefresh = false;\n                        that.refresh();\n                    });\n                }\n            },\n            _resize: function () {\n                this._adjustDimensions();\n                this.timeline.view()._adjustHeight();\n                this.timeline.view()._renderCurrentTime();\n                this.list._adjustHeight();\n            }\n        });\n        if (kendo.PDFMixin) {\n            kendo.PDFMixin.extend(Gantt.fn);\n            Gantt.fn._drawPDF = function () {\n                var ganttStyles = Gantt.styles;\n                var listClass = '.' + ganttStyles.list;\n                var listWidth = this.wrapper.find(listClass).width();\n                var content = this.wrapper.clone();\n                content.find(listClass).css('width', listWidth);\n                return this._drawPDFShadow({ content: content }, { avoidLinks: this.options.pdf.avoidLinks });\n            };\n        }\n        kendo.ui.plugin(Gantt);\n        extend(true, Gantt, { styles: ganttStyles });\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.treelist', [\n        'kendo.dom',\n        'kendo.data',\n        'kendo.columnsorter',\n        'kendo.editable',\n        'kendo.window',\n        'kendo.filtermenu',\n        'kendo.selectable',\n        'kendo.resizable',\n        'kendo.treeview.draganddrop'\n    ], f);\n}(function () {\n    var __meta__ = {\n        id: 'treelist',\n        name: 'TreeList',\n        category: 'web',\n        description: 'The TreeList widget displays self-referencing data and offers rich support for interacting with data, sorting, filtering, and selection.',\n        depends: [\n            'dom',\n            'data'\n        ],\n        features: [\n            {\n                id: 'treelist-sorting',\n                name: 'Sorting',\n                description: 'Support for column sorting',\n                depends: ['columnsorter']\n            },\n            {\n                id: 'treelist-filtering',\n                name: 'Filtering',\n                description: 'Support for record filtering',\n                depends: ['filtermenu']\n            },\n            {\n                id: 'treelist-editing',\n                name: 'Editing',\n                description: 'Support for record editing',\n                depends: [\n                    'editable',\n                    'window'\n                ]\n            },\n            {\n                id: 'treelist-selection',\n                name: 'Selection',\n                description: 'Support for row selection',\n                depends: ['selectable']\n            },\n            {\n                id: 'treelist-column-resize',\n                name: 'Column resizing',\n                description: 'Support for column resizing',\n                depends: ['resizable']\n            },\n            {\n                id: 'treelist-dragging',\n                name: 'Drag & Drop',\n                description: 'Support for drag & drop of rows',\n                depends: ['treeview.draganddrop']\n            },\n            {\n                id: 'treelist-excel-export',\n                name: 'Excel export',\n                description: 'Export data as Excel spreadsheet',\n                depends: ['excel']\n            },\n            {\n                id: 'treelist-pdf-export',\n                name: 'PDF export',\n                description: 'Export data as PDF',\n                depends: [\n                    'pdf',\n                    'drawing'\n                ]\n            }\n        ]\n    };\n    (function ($, undefined) {\n        var data = kendo.data;\n        var extend = $.extend;\n        var kendoDom = kendo.dom;\n        var kendoDomElement = kendoDom.element;\n        var kendoTextElement = kendoDom.text;\n        var kendoHtmlElement = kendoDom.html;\n        var outerWidth = kendo._outerWidth;\n        var outerHeight = kendo._outerHeight;\n        var ui = kendo.ui;\n        var DataBoundWidget = ui.DataBoundWidget;\n        var DataSource = data.DataSource;\n        var ObservableArray = data.ObservableArray;\n        var Query = data.Query;\n        var Model = data.Model;\n        var proxy = $.proxy;\n        var map = $.map;\n        var grep = $.grep;\n        var inArray = $.inArray;\n        var isPlainObject = $.isPlainObject;\n        var push = Array.prototype.push;\n        var STRING = 'string';\n        var CHANGE = 'change';\n        var ERROR = 'error';\n        var PROGRESS = 'progress';\n        var DOT = '.';\n        var NS = '.kendoTreeList';\n        var CLICK = 'click';\n        var MOUSEDOWN = 'mousedown';\n        var EDIT = 'edit';\n        var SAVE = 'save';\n        var EXPAND = 'expand';\n        var COLLAPSE = 'collapse';\n        var REMOVE = 'remove';\n        var DATABINDING = 'dataBinding';\n        var DATABOUND = 'dataBound';\n        var CANCEL = 'cancel';\n        var FILTERMENUINIT = 'filterMenuInit';\n        var COLUMNHIDE = 'columnHide';\n        var COLUMNSHOW = 'columnShow';\n        var HEADERCELLS = 'th.k-header';\n        var COLUMNREORDER = 'columnReorder';\n        var COLUMNRESIZE = 'columnResize';\n        var COLUMNMENUINIT = 'columnMenuInit';\n        var COLUMNLOCK = 'columnLock';\n        var COLUMNUNLOCK = 'columnUnlock';\n        var PARENTIDFIELD = 'parentId';\n        var DRAGSTART = 'dragstart';\n        var DRAG = 'drag';\n        var DROP = 'drop';\n        var DRAGEND = 'dragend';\n        var classNames = {\n            wrapper: 'k-treelist k-grid k-widget k-display-block',\n            header: 'k-header',\n            button: 'k-button',\n            alt: 'k-alt',\n            editCell: 'k-edit-cell',\n            group: 'k-treelist-group',\n            gridToolbar: 'k-grid-toolbar',\n            gridHeader: 'k-grid-header',\n            gridHeaderWrap: 'k-grid-header-wrap',\n            gridContent: 'k-grid-content',\n            gridContentWrap: 'k-grid-content',\n            gridFilter: 'k-grid-filter',\n            footerTemplate: 'k-footer-template',\n            loading: 'k-i-loading',\n            refresh: 'k-i-reload',\n            retry: 'k-request-retry',\n            selected: 'k-state-selected',\n            status: 'k-status',\n            link: 'k-link',\n            withIcon: 'k-with-icon',\n            filterable: 'k-filterable',\n            icon: 'k-icon',\n            iconFilter: 'k-i-filter',\n            iconCollapse: 'k-i-collapse',\n            iconExpand: 'k-i-expand',\n            iconHidden: 'k-i-none',\n            iconPlaceHolder: 'k-icon k-i-none',\n            input: 'k-input',\n            dropPositions: 'k-i-insert-up k-i-insert-down k-i-plus k-i-insert-middle',\n            dropTop: 'k-i-insert-up',\n            dropBottom: 'k-i-insert-down',\n            dropAdd: 'k-i-plus',\n            dropMiddle: 'k-i-insert-middle',\n            dropDenied: 'k-i-cancel',\n            dragStatus: 'k-drag-status',\n            dragClue: 'k-drag-clue',\n            dragClueText: 'k-clue-text'\n        };\n        var defaultCommands = {\n            create: {\n                imageClass: 'k-i-plus',\n                className: 'k-grid-add',\n                methodName: 'addRow'\n            },\n            createchild: {\n                imageClass: 'k-i-plus',\n                className: 'k-grid-add',\n                methodName: 'addRow'\n            },\n            destroy: {\n                imageClass: 'k-i-close',\n                className: 'k-grid-delete',\n                methodName: 'removeRow'\n            },\n            edit: {\n                imageClass: 'k-i-edit',\n                className: 'k-grid-edit',\n                methodName: 'editRow'\n            },\n            update: {\n                imageClass: 'k-i-check',\n                className: 'k-primary k-grid-update',\n                methodName: 'saveRow'\n            },\n            canceledit: {\n                imageClass: 'k-i-cancel',\n                className: 'k-grid-cancel',\n                methodName: '_cancelEdit'\n            },\n            excel: {\n                imageClass: 'k-i-file-excel',\n                className: 'k-grid-excel',\n                methodName: 'saveAsExcel'\n            },\n            pdf: {\n                imageClass: 'k-i-file-pdf',\n                className: 'k-grid-pdf',\n                methodName: 'saveAsPDF'\n            }\n        };\n        var TreeListModel = Model.define({\n            id: 'id',\n            parentId: PARENTIDFIELD,\n            fields: {\n                id: { type: 'number' },\n                parentId: {\n                    type: 'number',\n                    nullable: true\n                }\n            },\n            init: function (value) {\n                Model.fn.init.call(this, value);\n                this._loaded = false;\n                if (!this.parentIdField) {\n                    this.parentIdField = PARENTIDFIELD;\n                }\n                this.parentId = this.get(this.parentIdField);\n            },\n            accept: function (data) {\n                Model.fn.accept.call(this, data);\n                this.parentId = this.get(this.parentIdField);\n            },\n            set: function (field, value, initiator) {\n                if (field == PARENTIDFIELD && this.parentIdField != PARENTIDFIELD) {\n                    this[this.parentIdField] = value;\n                }\n                Model.fn.set.call(this, field, value, initiator);\n                if (field == this.parentIdField) {\n                    this.parentId = this.get(this.parentIdField);\n                }\n            },\n            loaded: function (value) {\n                if (value !== undefined) {\n                    this._loaded = value;\n                } else {\n                    return this._loaded;\n                }\n            },\n            shouldSerialize: function (field) {\n                return Model.fn.shouldSerialize.call(this, field) && field !== '_loaded' && field != '_error' && field != '_edit' && !(this.parentIdField !== 'parentId' && field === 'parentId');\n            }\n        });\n        TreeListModel.parentIdField = PARENTIDFIELD;\n        TreeListModel.define = function (base, options) {\n            if (options === undefined) {\n                options = base;\n                base = TreeListModel;\n            }\n            var parentId = options.parentId || PARENTIDFIELD;\n            options.parentIdField = parentId;\n            var model = Model.define(base, options);\n            if (parentId) {\n                model.parentIdField = parentId;\n            }\n            return model;\n        };\n        function is(field) {\n            return function (object) {\n                return object[field];\n            };\n        }\n        function not(func) {\n            return function (object) {\n                return !func(object);\n            };\n        }\n        var TreeListDataSource = DataSource.extend({\n            init: function (options) {\n                DataSource.fn.init.call(this, extend(true, {}, {\n                    schema: {\n                        modelBase: TreeListModel,\n                        model: TreeListModel\n                    }\n                }, options));\n            },\n            _createNewModel: function (data) {\n                var model = {};\n                var fromModel = data instanceof Model;\n                if (fromModel) {\n                    model = data;\n                }\n                model = DataSource.fn._createNewModel.call(this, model);\n                if (!fromModel) {\n                    if (data.parentId) {\n                        data[model.parentIdField] = data.parentId;\n                    }\n                    model.accept(data);\n                }\n                return model;\n            },\n            _shouldWrap: function () {\n                return true;\n            },\n            _push: function (result, operation) {\n                var data = DataSource.fn._readData.call(this, result);\n                if (!data) {\n                    data = result;\n                }\n                this[operation](data);\n            },\n            _readData: function (newData) {\n                var data = this.data();\n                newData = DataSource.fn._readData.call(this, newData);\n                this._replaceData(data.toJSON().concat(newData), data);\n                if (newData instanceof ObservableArray) {\n                    return newData;\n                }\n                return data;\n            },\n            _replaceData: function (source, target) {\n                var sourceLength = source.length;\n                for (var i = 0; i < sourceLength; i++) {\n                    target[i] = source[i];\n                }\n                target.length = sourceLength;\n            },\n            _readAggregates: function (data) {\n                var result = extend(this._aggregateResult, this.reader.aggregates(data));\n                if ('' in result) {\n                    result[this._defaultParentId()] = result[''];\n                    delete result[''];\n                }\n                return result;\n            },\n            remove: function (root) {\n                var items = this._subtree(this._childrenMap(this.data()), root.id);\n                this._removeItems(items);\n                DataSource.fn.remove.call(this, root);\n            },\n            _filterCallback: function (query) {\n                var i, item;\n                var map = {};\n                var result = [];\n                var data = query.toArray();\n                for (i = 0; i < data.length; i++) {\n                    item = data[i];\n                    while (item) {\n                        if (!map[item.id]) {\n                            map[item.id] = true;\n                            result.push(item);\n                        }\n                        if (!map[item.parentId]) {\n                            map[item.parentId] = true;\n                            item = this.parentNode(item);\n                            if (item) {\n                                result.push(item);\n                            }\n                        } else {\n                            break;\n                        }\n                    }\n                }\n                return new Query(result);\n            },\n            _subtree: function (map, id) {\n                var result = map[id] || [];\n                var defaultParentId = this._defaultParentId();\n                for (var i = 0, len = result.length; i < len; i++) {\n                    if (result[i].id !== defaultParentId) {\n                        result = result.concat(this._subtree(map, result[i].id));\n                    }\n                }\n                return result;\n            },\n            _childrenMap: function (data) {\n                var map = {};\n                var i, item, id, parentId;\n                data = this._observeView(data);\n                for (i = 0; i < data.length; i++) {\n                    item = data[i];\n                    id = item.id;\n                    parentId = item.parentId;\n                    map[id] = map[id] || [];\n                    map[parentId] = map[parentId] || [];\n                    map[parentId].push(item);\n                }\n                return map;\n            },\n            _calculateAggregates: function (data, options) {\n                options = options || {};\n                var result = {};\n                var item, subtree, i;\n                var filter = options.filter;\n                if (filter) {\n                    data = Query.process(data, {\n                        filter: filter,\n                        filterCallback: proxy(this._filterCallback, this)\n                    }).data;\n                }\n                var map = this._childrenMap(data);\n                result[this._defaultParentId()] = new Query(this._subtree(map, this._defaultParentId())).aggregate(options.aggregate);\n                for (i = 0; i < data.length; i++) {\n                    item = data[i];\n                    subtree = this._subtree(map, item.id);\n                    result[item.id] = new Query(subtree).aggregate(options.aggregate);\n                }\n                return result;\n            },\n            _queryProcess: function (data, options) {\n                options = options || {};\n                options.filterCallback = proxy(this._filterCallback, this);\n                var defaultParentId = this._defaultParentId();\n                var result = Query.process(data, options);\n                var map = this._childrenMap(result.data);\n                var hasLoadedChildren, i, item, children;\n                data = map[defaultParentId] || [];\n                for (i = 0; i < data.length; i++) {\n                    item = data[i];\n                    if (item.id === defaultParentId) {\n                        continue;\n                    }\n                    children = map[item.id];\n                    hasLoadedChildren = !!(children && children.length);\n                    if (!item.loaded()) {\n                        item.loaded(hasLoadedChildren || !item.hasChildren);\n                    }\n                    if (item.loaded() || item.hasChildren !== true) {\n                        item.hasChildren = hasLoadedChildren;\n                    }\n                    if (hasLoadedChildren) {\n                        data = data.slice(0, i + 1).concat(children, data.slice(i + 1));\n                    }\n                }\n                result.data = data;\n                return result;\n            },\n            _queueRequest: function (options, callback) {\n                callback.call(this);\n            },\n            _modelLoaded: function (id) {\n                var model = this.get(id);\n                model.loaded(true);\n                model.hasChildren = this.childNodes(model).length > 0;\n            },\n            _modelError: function (id, e) {\n                this.get(id)._error = e;\n            },\n            success: function (data, requestParams) {\n                if (!requestParams || typeof requestParams.id == 'undefined') {\n                    this._data = this._observe([]);\n                }\n                return DataSource.fn.success.call(this, data, requestParams);\n            },\n            load: function (model) {\n                var method = '_query';\n                var remote = this.options.serverSorting || this.options.serverPaging || this.options.serverFiltering || this.options.serverGrouping || this.options.serverAggregates;\n                var defaultPromise = $.Deferred().resolve().promise();\n                if (model.loaded()) {\n                    if (remote) {\n                        return defaultPromise;\n                    }\n                } else if (model.hasChildren) {\n                    method = 'read';\n                }\n                return this[method]({ id: model.id }).done(proxy(this._modelLoaded, this, model.id)).fail(proxy(this._modelError, this, model.id));\n            },\n            contains: function (root, child) {\n                var rootId = root.id;\n                while (child) {\n                    if (child.parentId === rootId) {\n                        return true;\n                    }\n                    child = this.parentNode(child);\n                }\n                return false;\n            },\n            _byParentId: function (id, defaultId) {\n                var result = [];\n                var view = this.view();\n                var current;\n                if (id === defaultId) {\n                    return [];\n                }\n                for (var i = 0; i < view.length; i++) {\n                    current = view.at(i);\n                    if (current.parentId == id) {\n                        result.push(current);\n                    }\n                }\n                return result;\n            },\n            _defaultParentId: function () {\n                return this.reader.model.fn.defaults[this.reader.model.parentIdField];\n            },\n            childNodes: function (model) {\n                return this._byParentId(model.id, this._defaultParentId());\n            },\n            rootNodes: function () {\n                return this._byParentId(this._defaultParentId());\n            },\n            parentNode: function (model) {\n                return this.get(model.parentId);\n            },\n            level: function (model) {\n                var result = -1;\n                if (!(model instanceof TreeListModel)) {\n                    model = this.get(model);\n                }\n                do {\n                    model = this.parentNode(model);\n                    result++;\n                } while (model);\n                return result;\n            },\n            filter: function (value) {\n                var baseFilter = DataSource.fn.filter;\n                if (value === undefined) {\n                    return baseFilter.call(this, value);\n                }\n                baseFilter.call(this, value);\n            }\n        });\n        TreeListDataSource.create = function (options) {\n            if ($.isArray(options)) {\n                options = { data: options };\n            } else if (options instanceof ObservableArray) {\n                options = { data: options.toJSON() };\n            }\n            return options instanceof TreeListDataSource ? options : new TreeListDataSource(options);\n        };\n        function isCellVisible() {\n            return this.style.display !== 'none';\n        }\n        function leafDataCells(container) {\n            var rows = container.find('>tr:not(.k-filter-row)');\n            var filter = function () {\n                var el = $(this);\n                return !el.hasClass('k-group-cell') && !el.hasClass('k-hierarchy-cell');\n            };\n            var cells = $();\n            if (rows.length > 1) {\n                cells = rows.find('th').filter(filter).filter(function () {\n                    return this.rowSpan > 1;\n                });\n            }\n            cells = cells.add(rows.last().find('th').filter(filter));\n            var indexAttr = kendo.attr('index');\n            cells.sort(function (a, b) {\n                a = $(a);\n                b = $(b);\n                var indexA = a.attr(indexAttr);\n                var indexB = b.attr(indexAttr);\n                if (indexA === undefined) {\n                    indexA = $(a).index();\n                }\n                if (indexB === undefined) {\n                    indexB = $(b).index();\n                }\n                indexA = parseInt(indexA, 10);\n                indexB = parseInt(indexB, 10);\n                return indexA > indexB ? 1 : indexA < indexB ? -1 : 0;\n            });\n            return cells;\n        }\n        function createPlaceholders(options) {\n            var spans = [];\n            var className = options.className;\n            for (var i = 0, level = options.level; i < level; i++) {\n                spans.push(kendoDomElement('span', { className: className }));\n            }\n            return spans;\n        }\n        function columnsWidth(cols) {\n            var colWidth, width = 0;\n            for (var idx = 0, length = cols.length; idx < length; idx++) {\n                colWidth = cols[idx].style.width;\n                if (colWidth && colWidth.indexOf('%') == -1) {\n                    width += parseInt(colWidth, 10);\n                }\n            }\n            return width;\n        }\n        function syncTableHeight(table1, table2) {\n            table1 = table1[0];\n            table2 = table2[0];\n            if (table1.rows.length !== table2.rows.length) {\n                var lockedHeigth = table1.offsetHeight;\n                var tableHeigth = table2.offsetHeight;\n                var row;\n                var diff;\n                if (lockedHeigth > tableHeigth) {\n                    row = table2.rows[table2.rows.length - 1];\n                    diff = lockedHeigth - tableHeigth;\n                } else {\n                    row = table1.rows[table1.rows.length - 1];\n                    diff = tableHeigth - lockedHeigth;\n                }\n                row.style.height = row.offsetHeight + diff + 'px';\n            }\n        }\n        var Editor = kendo.Observable.extend({\n            init: function (element, options) {\n                kendo.Observable.fn.init.call(this);\n                options = this.options = extend(true, {}, this.options, options);\n                this.element = element;\n                this.bind(this.events, options);\n                this.model = this.options.model;\n                this.fields = this._fields(this.options.columns);\n                this._initContainer();\n                this.createEditable();\n            },\n            events: [],\n            _initContainer: function () {\n                this.wrapper = this.element;\n            },\n            createEditable: function () {\n                var options = this.options;\n                this.editable = new ui.Editable(this.wrapper, {\n                    fields: this.fields,\n                    target: options.target,\n                    clearContainer: options.clearContainer,\n                    model: this.model\n                });\n            },\n            _isEditable: function (column) {\n                return column.field && this.model.editable(column.field);\n            },\n            _fields: function (columns) {\n                var fields = [];\n                var idx, length, column;\n                for (idx = 0, length = columns.length; idx < length; idx++) {\n                    column = columns[idx];\n                    if (this._isEditable(column)) {\n                        fields.push({\n                            field: column.field,\n                            format: column.format,\n                            editor: column.editor\n                        });\n                    }\n                }\n                return fields;\n            },\n            end: function () {\n                return this.editable.end();\n            },\n            close: function () {\n                this.destroy();\n            },\n            destroy: function () {\n                this.editable.destroy();\n                this.editable.element.find('[' + kendo.attr('container-for') + ']').empty().end().removeAttr(kendo.attr('role'));\n                this.model = this.wrapper = this.element = this.columns = this.editable = null;\n            }\n        });\n        var PopupEditor = Editor.extend({\n            init: function (element, options) {\n                Editor.fn.init.call(this, element, options);\n                this._attachHandlers();\n                kendo.cycleForm(this.wrapper);\n                this.open();\n            },\n            events: [\n                CANCEL,\n                SAVE\n            ],\n            options: {\n                window: {\n                    modal: true,\n                    resizable: false,\n                    draggable: true,\n                    title: 'Edit',\n                    visible: false\n                }\n            },\n            _initContainer: function () {\n                var options = this.options;\n                var formContent = [];\n                this.wrapper = $('<div class=\"k-popup-edit-form\"/>').attr(kendo.attr('uid'), this.model.uid).append('<div class=\"k-edit-form-container\"/>');\n                if (options.template) {\n                    this._appendTemplate(formContent);\n                    this.fields = [];\n                } else {\n                    this._appendFields(formContent);\n                }\n                this._appendButtons(formContent);\n                new kendoDom.Tree(this.wrapper.children()[0]).render(formContent);\n                this.wrapper.appendTo(options.appendTo);\n                this.window = new ui.Window(this.wrapper, options.window);\n            },\n            _appendTemplate: function (form) {\n                var template = this.options.template;\n                if (typeof template === STRING) {\n                    template = window.unescape(template);\n                }\n                template = kendo.template(template)(this.model);\n                form.push(kendoHtmlElement(template));\n            },\n            _appendFields: function (form) {\n                var idx, length, column;\n                var columns = this.options.columns;\n                for (idx = 0, length = columns.length; idx < length; idx++) {\n                    column = columns[idx];\n                    if (column.command) {\n                        continue;\n                    }\n                    form.push(kendoHtmlElement('<div class=\"k-edit-label\"><label for=\"' + column.field + '\">' + (column.title || column.field || '') + '</label></div>'));\n                    if (this._isEditable(column)) {\n                        form.push(kendoHtmlElement('<div ' + kendo.attr('container-for') + '=\"' + column.field + '\" class=\"k-edit-field\"></div>'));\n                    } else {\n                        form.push(kendoDomElement('div', { 'class': 'k-edit-field' }, [this.options.fieldRenderer(column, this.model)]));\n                    }\n                }\n            },\n            _appendButtons: function (form) {\n                form.push(kendoDomElement('div', { 'class': 'k-edit-buttons k-state-default' }, this.options.commandRenderer()));\n            },\n            _attachHandlers: function () {\n                var closeHandler = this._cancelProxy = proxy(this._cancel, this);\n                this.wrapper.on(CLICK + NS, '.k-grid-cancel', this._cancelProxy);\n                this._saveProxy = proxy(this._save, this);\n                this.wrapper.on(CLICK + NS, '.k-grid-update', this._saveProxy);\n                this.window.bind('close', function (e) {\n                    if (e.userTriggered) {\n                        closeHandler(e);\n                    }\n                });\n            },\n            _dettachHandlers: function () {\n                this._cancelProxy = null;\n                this._saveProxy = null;\n                this.wrapper.off(NS);\n            },\n            _cancel: function (e) {\n                this.trigger(CANCEL, e);\n            },\n            _save: function () {\n                this.trigger(SAVE);\n            },\n            open: function () {\n                this.window.center().open();\n            },\n            close: function () {\n                this.window.bind('deactivate', proxy(this.destroy, this)).close();\n            },\n            destroy: function () {\n                this.window.destroy();\n                this.window = null;\n                this._dettachHandlers();\n                Editor.fn.destroy.call(this);\n            }\n        });\n        var TreeList = DataBoundWidget.extend({\n            init: function (element, options) {\n                DataBoundWidget.fn.init.call(this, element, options);\n                this._dataSource(this.options.dataSource);\n                this._columns();\n                this._layout();\n                this._selectable();\n                this._sortable();\n                this._resizable();\n                this._filterable();\n                this._attachEvents();\n                this._toolbar();\n                this._scrollable();\n                this._reorderable();\n                this._columnMenu();\n                this._minScreenSupport();\n                this._draggable();\n                if (this.options.autoBind) {\n                    this.dataSource.fetch();\n                }\n                if (this._hasLockedColumns) {\n                    var widget = this;\n                    this.wrapper.addClass('k-grid-lockedcolumns');\n                    this._resizeHandler = function () {\n                        widget.resize();\n                    };\n                    $(window).on('resize' + NS, this._resizeHandler);\n                }\n                kendo.notify(this);\n            },\n            _draggable: function () {\n                var editable = this.options.editable;\n                if (!editable || !editable.move) {\n                    return;\n                }\n                this._dragging = new kendo.ui.HierarchicalDragAndDrop(this.wrapper, {\n                    $angular: this.$angular,\n                    autoScroll: true,\n                    filter: 'tbody>tr',\n                    itemSelector: 'tr',\n                    allowedContainers: this.wrapper,\n                    hintText: function (row) {\n                        var text = function () {\n                            return $(this).text();\n                        };\n                        var separator = '<span class=\\'k-header k-drag-separator\\' />';\n                        return row.children('td').map(text).toArray().join(separator);\n                    },\n                    contains: proxy(function (source, destination) {\n                        var dest = this.dataItem(destination);\n                        var src = this.dataItem(source);\n                        return src == dest || this.dataSource.contains(src, dest);\n                    }, this),\n                    itemFromTarget: function (target) {\n                        var tr = target.closest('tr');\n                        return {\n                            item: tr,\n                            content: tr\n                        };\n                    },\n                    dragstart: proxy(function (source) {\n                        this.wrapper.addClass('k-treelist-dragging');\n                        var model = this.dataItem(source);\n                        return this.trigger(DRAGSTART, { source: model });\n                    }, this),\n                    drag: proxy(function (e) {\n                        e.source = this.dataItem(e.source);\n                        this.trigger(DRAG, e);\n                    }, this),\n                    drop: proxy(function (e) {\n                        e.source = this.dataItem(e.source);\n                        e.destination = this.dataItem(e.destination);\n                        this.wrapper.removeClass('k-treelist-dragging');\n                        return this.trigger(DROP, e);\n                    }, this),\n                    dragend: proxy(function (e) {\n                        var dest = this.dataItem(e.destination);\n                        var src = this.dataItem(e.source);\n                        src.set('parentId', dest ? dest.id : null);\n                        e.source = src;\n                        e.destination = dest;\n                        this.trigger(DRAGEND, e);\n                    }, this),\n                    reorderable: false,\n                    dropHintContainer: function (item) {\n                        return item.children('td:eq(1)');\n                    },\n                    dropPositionFrom: function (dropHint) {\n                        return dropHint.prevAll('.k-i-none').length > 0 ? 'after' : 'before';\n                    }\n                });\n            },\n            itemFor: function (model) {\n                if (typeof model == 'number') {\n                    model = this.dataSource.get(model);\n                }\n                return this.tbody.find('[' + kendo.attr('uid') + '=' + model.uid + ']');\n            },\n            _scrollable: function () {\n                if (this.options.scrollable) {\n                    var scrollables = this.thead.closest('.k-grid-header-wrap');\n                    var lockedContent = $(this.lockedContent).bind('DOMMouseScroll' + NS + ' mousewheel' + NS, proxy(this._wheelScroll, this));\n                    this.content.bind('scroll' + NS, function () {\n                        scrollables.scrollLeft(this.scrollLeft);\n                        lockedContent.scrollTop(this.scrollTop);\n                    });\n                    var touchScroller = kendo.touchScroller(this.content);\n                    if (touchScroller && touchScroller.movable) {\n                        this._touchScroller = touchScroller;\n                        touchScroller.movable.bind('change', function (e) {\n                            scrollables.scrollLeft(-e.sender.x);\n                            if (lockedContent) {\n                                lockedContent.scrollTop(-e.sender.y);\n                            }\n                        });\n                    }\n                }\n            },\n            _wheelScroll: function (e) {\n                if (e.ctrlKey) {\n                    return;\n                }\n                var delta = kendo.wheelDeltaY(e);\n                var lockedDiv = $(e.currentTarget);\n                if (delta) {\n                    if (lockedDiv[0].scrollHeight > lockedDiv[0].clientHeight && (lockedDiv[0].scrollTop < lockedDiv[0].scrollHeight - lockedDiv[0].clientHeight && delta < 0 || lockedDiv[0].scrollTop > 0 && delta > 0)) {\n                        e.preventDefault();\n                    }\n                    lockedDiv.one('wheel' + NS, false);\n                    this.content.scrollTop(this.content.scrollTop() + -delta);\n                }\n            },\n            _progress: function () {\n                var messages = this.options.messages;\n                if (!this.tbody.find('tr').length) {\n                    this._showStatus(kendo.template('<span class=\\'#= className #\\' /> #: messages.loading #')({\n                        className: classNames.icon + ' ' + classNames.loading,\n                        messages: messages\n                    }));\n                }\n            },\n            _error: function (e) {\n                if (!this.dataSource.rootNodes().length) {\n                    this._render({ error: e });\n                }\n            },\n            refresh: function (e) {\n                e = e || {};\n                if (e.action == 'itemchange' && this.editor) {\n                    return;\n                }\n                if (this.trigger(DATABINDING)) {\n                    return;\n                }\n                this._cancelEditor();\n                this._render();\n                this._adjustHeight();\n                this.trigger(DATABOUND);\n            },\n            _angularFooters: function (command) {\n                var i, footer, aggregates;\n                var allAggregates = this.dataSource.aggregates();\n                var footerRows = this._footerItems();\n                for (i = 0; i < footerRows.length; i++) {\n                    footer = footerRows.eq(i);\n                    aggregates = allAggregates[footer.attr('data-parentId')];\n                    this._angularFooter(command, footer.find('td').get(), aggregates);\n                }\n            },\n            _angularFooter: function (command, cells, aggregates) {\n                var columns = this.columns;\n                this.angular(command, function () {\n                    return {\n                        elements: cells,\n                        data: map(columns, function (col) {\n                            return {\n                                column: col,\n                                aggregate: aggregates && aggregates[col.field]\n                            };\n                        })\n                    };\n                });\n            },\n            items: function () {\n                if (this._hasLockedColumns) {\n                    return this._items(this.tbody).add(this._items(this.lockedTable));\n                } else {\n                    return this._items(this.tbody);\n                }\n            },\n            _items: function (container) {\n                return container.find('tr').filter(function () {\n                    return !$(this).hasClass(classNames.footerTemplate);\n                });\n            },\n            _footerItems: function () {\n                var container = this.tbody;\n                if (this._hasLockedColumns) {\n                    container = container.add(this.lockedTable);\n                }\n                return container.find('tr').filter(function () {\n                    return $(this).hasClass(classNames.footerTemplate);\n                });\n            },\n            dataItems: function () {\n                var dataItems = kendo.ui.DataBoundWidget.fn.dataItems.call(this);\n                if (this._hasLockedColumns) {\n                    var n = dataItems.length, tmp = new Array(2 * n);\n                    for (var i = n; --i >= 0;) {\n                        tmp[i] = tmp[i + n] = dataItems[i];\n                    }\n                    dataItems = tmp;\n                }\n                return dataItems;\n            },\n            _showStatus: function (message) {\n                var status = this.element.find('.k-status');\n                var content = $(this.content).add(this.lockedContent);\n                if (!status.length) {\n                    status = $('<div class=\\'k-status\\' />').appendTo(this.element);\n                }\n                this._contentTree.render([]);\n                if (this._hasLockedColumns) {\n                    this._lockedContentTree.render([]);\n                }\n                content.hide();\n                status.html(message);\n            },\n            _hideStatus: function () {\n                this.element.find('.k-status').remove();\n                $(this.content).add(this.lockedContent).show();\n            },\n            _adjustHeight: function () {\n                var element = this.element;\n                var contentWrap = element.find(DOT + classNames.gridContentWrap);\n                var header = element.find(DOT + classNames.gridHeader);\n                var toolbar = element.find(DOT + classNames.gridToolbar);\n                var height;\n                var scrollbar = kendo.support.scrollbar();\n                element.height(this.options.height);\n                var isHeightSet = function (el) {\n                    var initialHeight, newHeight;\n                    if (el[0].style.height) {\n                        return true;\n                    } else {\n                        initialHeight = el.height();\n                    }\n                    el.height('auto');\n                    newHeight = el.height();\n                    el.height('');\n                    return initialHeight != newHeight;\n                };\n                if (isHeightSet(element)) {\n                    height = element.height() - outerHeight(header) - outerHeight(toolbar);\n                    contentWrap.height(height);\n                    if (this._hasLockedColumns) {\n                        scrollbar = this.table[0].offsetWidth > this.table.parent()[0].clientWidth ? scrollbar : 0;\n                        this.lockedContent.height(height - scrollbar);\n                    }\n                }\n            },\n            _resize: function () {\n                this._applyLockedContainersWidth();\n                this._adjustHeight();\n            },\n            _minScreenSupport: function () {\n                var any = this.hideMinScreenCols();\n                if (any) {\n                    this.minScreenResizeHandler = proxy(this.hideMinScreenCols, this);\n                    $(window).on('resize', this.minScreenResizeHandler);\n                }\n            },\n            hideMinScreenCols: function () {\n                var cols = this.columns, any = false, screenWidth = window.innerWidth > 0 ? window.innerWidth : screen.width;\n                for (var i = 0; i < cols.length; i++) {\n                    var col = cols[i];\n                    var minWidth = col.minScreenWidth;\n                    if (minWidth !== undefined && minWidth !== null) {\n                        any = true;\n                        if (minWidth > screenWidth) {\n                            this.hideColumn(col);\n                        } else {\n                            this.showColumn(col);\n                        }\n                    }\n                }\n                return any;\n            },\n            destroy: function () {\n                DataBoundWidget.fn.destroy.call(this);\n                var dataSource = this.dataSource;\n                dataSource.unbind(CHANGE, this._refreshHandler);\n                dataSource.unbind(ERROR, this._errorHandler);\n                dataSource.unbind(PROGRESS, this._progressHandler);\n                if (this._resizeHandler) {\n                    $(window).off('resize' + NS, this._resizeHandler);\n                }\n                if (this._dragging) {\n                    this._dragging.destroy();\n                    this._dragging = null;\n                }\n                if (this.resizable) {\n                    this.resizable.destroy();\n                    this.resizable = null;\n                }\n                if (this.reorderable) {\n                    this.reorderable.destroy();\n                    this.reorderable = null;\n                }\n                if (this._draggableInstance && this._draggableInstance.element) {\n                    this._draggableInstance.destroy();\n                    this._draggableInstance = null;\n                }\n                if (this.minScreenResizeHandler) {\n                    $(window).off('resize', this.minScreenResizeHandler);\n                }\n                this._destroyEditor();\n                this.element.off(NS);\n                if (this._touchScroller) {\n                    this._touchScroller.destroy();\n                }\n                this._autoExpandable = null;\n                this._refreshHandler = this._errorHandler = this._progressHandler = this._dataSourceFetchProxy = null;\n                this.thead = this.content = this.tbody = this.table = this.element = this.lockedHeader = this.lockedContent = null;\n                this._statusTree = this._headerTree = this._contentTree = this._lockedHeaderColsTree = this._lockedContentColsTree = this._lockedHeaderTree = this._lockedContentTree = null;\n            },\n            options: {\n                name: 'TreeList',\n                columns: [],\n                autoBind: true,\n                scrollable: true,\n                selectable: false,\n                sortable: false,\n                toolbar: null,\n                height: null,\n                columnMenu: false,\n                messages: {\n                    noRows: 'No records to display',\n                    loading: 'Loading...',\n                    requestFailed: 'Request failed.',\n                    retry: 'Retry',\n                    commands: {\n                        edit: 'Edit',\n                        update: 'Update',\n                        canceledit: 'Cancel',\n                        create: 'Add new record',\n                        createchild: 'Add child record',\n                        destroy: 'Delete',\n                        excel: 'Export to Excel',\n                        pdf: 'Export to PDF'\n                    }\n                },\n                excel: { hierarchy: true },\n                resizable: false,\n                filterable: false,\n                editable: false,\n                reorderable: false\n            },\n            events: [\n                CHANGE,\n                EDIT,\n                SAVE,\n                REMOVE,\n                EXPAND,\n                COLLAPSE,\n                DATABINDING,\n                DATABOUND,\n                CANCEL,\n                DRAGSTART,\n                DRAG,\n                DROP,\n                DRAGEND,\n                FILTERMENUINIT,\n                COLUMNHIDE,\n                COLUMNSHOW,\n                COLUMNREORDER,\n                COLUMNRESIZE,\n                COLUMNMENUINIT,\n                COLUMNLOCK,\n                COLUMNUNLOCK\n            ],\n            _toggle: function (model, expand) {\n                var defaultPromise = $.Deferred().resolve().promise();\n                var loaded = model.loaded();\n                if (model._error) {\n                    model.expanded = false;\n                    model._error = undefined;\n                }\n                if (!loaded && model.expanded) {\n                    return defaultPromise;\n                }\n                if (typeof expand == 'undefined') {\n                    expand = !model.expanded;\n                }\n                model.expanded = expand;\n                if (!loaded) {\n                    defaultPromise = this.dataSource.load(model).always(proxy(function () {\n                        this._render();\n                        this._syncLockedContentHeight();\n                    }, this));\n                }\n                this._render();\n                this._syncLockedContentHeight();\n                return defaultPromise;\n            },\n            expand: function (row) {\n                return this._toggle(this.dataItem(row), true);\n            },\n            collapse: function (row) {\n                return this._toggle(this.dataItem(row), false);\n            },\n            _toggleChildren: function (e) {\n                var icon = $(e.currentTarget);\n                var model = this.dataItem(icon);\n                var event = !model.expanded ? EXPAND : COLLAPSE;\n                if (!this.trigger(event, { model: model })) {\n                    this._toggle(model);\n                }\n                e.preventDefault();\n            },\n            _attachEvents: function () {\n                var icons = DOT + classNames.iconCollapse + ', .' + classNames.iconExpand + ', .' + classNames.refresh;\n                var retryButton = DOT + classNames.retry;\n                this.element.on(MOUSEDOWN + NS, icons, proxy(this._toggleChildren, this)).on(CLICK + NS, retryButton, this._dataSourceFetchProxy).on(CLICK + NS, '.k-button[data-command]', proxy(this._commandClick, this));\n            },\n            _commandByName: function (name) {\n                var columns = this.columns;\n                var toolbar = $.isArray(this.options.toolbar) ? this.options.toolbar : [];\n                var i, j, commands, currentName;\n                name = name.toLowerCase();\n                if (defaultCommands[name]) {\n                    return defaultCommands[name];\n                }\n                for (i = 0; i < columns.length; i++) {\n                    commands = columns[i].command;\n                    if (commands) {\n                        for (j = 0; j < commands.length; j++) {\n                            currentName = commands[j].name;\n                            if (!currentName) {\n                                continue;\n                            }\n                            if (currentName.toLowerCase() == name) {\n                                return commands[j];\n                            }\n                        }\n                    }\n                }\n                for (i = 0; i < toolbar.length; i++) {\n                    currentName = toolbar[i].name;\n                    if (!currentName) {\n                        continue;\n                    }\n                    if (currentName.toLowerCase() == name) {\n                        return toolbar[i];\n                    }\n                }\n            },\n            _commandClick: function (e) {\n                var button = $(e.currentTarget);\n                var commandName = button.attr('data-command');\n                var command = this._commandByName(commandName);\n                var row = button.parentsUntil(this.wrapper, 'tr');\n                row = row.length ? row : undefined;\n                if (command) {\n                    if (command.methodName) {\n                        this[command.methodName](row);\n                    } else if (command.click) {\n                        command.click.call(this, e);\n                    }\n                    e.preventDefault();\n                }\n            },\n            _ensureExpandableColumn: function () {\n                if (this._autoExpandable) {\n                    delete this._autoExpandable.expandable;\n                }\n                var visibleColumns = grep(this.columns, not(is('hidden')));\n                var expandableColumns = grep(visibleColumns, is('expandable'));\n                if (this.columns.length && !expandableColumns.length) {\n                    this._autoExpandable = visibleColumns[0];\n                    visibleColumns[0].expandable = true;\n                }\n            },\n            _columns: function () {\n                var columns = this.options.columns || [];\n                this.columns = map(columns, function (column) {\n                    column = typeof column === 'string' ? { field: column } : column;\n                    return extend({ encoded: true }, column);\n                });\n                var lockedColumns = this._lockedColumns();\n                if (lockedColumns.length > 0) {\n                    this._hasLockedColumns = true;\n                    this.columns = lockedColumns.concat(this._nonLockedColumns());\n                }\n                this._ensureExpandableColumn();\n                this._columnTemplates();\n                this._columnAttributes();\n            },\n            _columnTemplates: function () {\n                var idx, length, column;\n                var columns = this.columns;\n                for (idx = 0, length = columns.length; idx < length; idx++) {\n                    column = columns[idx];\n                    if (column.template) {\n                        column.template = kendo.template(column.template);\n                    }\n                    if (column.headerTemplate) {\n                        column.headerTemplate = kendo.template(column.headerTemplate);\n                    }\n                    if (column.footerTemplate) {\n                        column.footerTemplate = kendo.template(column.footerTemplate);\n                    }\n                }\n            },\n            _columnAttributes: function () {\n                var idx, length;\n                var columns = this.columns;\n                function convertStyle(attr) {\n                    var properties, i, declaration;\n                    if (attr && attr.style) {\n                        properties = attr.style.split(';');\n                        attr.style = {};\n                        for (i = 0; i < properties.length; i++) {\n                            declaration = properties[i].split(':');\n                            var name = $.trim(declaration[0]);\n                            if (name) {\n                                attr.style[$.camelCase(name)] = $.trim(declaration[1]);\n                            }\n                        }\n                    }\n                }\n                for (idx = 0, length = columns.length; idx < length; idx++) {\n                    convertStyle(columns[idx].attributes);\n                    convertStyle(columns[idx].headerAttributes);\n                }\n            },\n            _layout: function () {\n                var columns = this.columns;\n                var element = this.element;\n                var layout = '';\n                this.wrapper = element.addClass(classNames.wrapper);\n                layout = '<div class=\\'#= gridHeader #\\'>';\n                if (this._hasLockedColumns) {\n                    layout += '<div class=\\'k-grid-header-locked\\'>' + '<table role=\\'grid\\'>' + '<colgroup></colgroup>' + '<thead role=\\'rowgroup\\' />' + '</table>' + '</div>';\n                }\n                layout += '<div class=\\'#= gridHeaderWrap #\\'>' + '<table role=\\'grid\\'>' + '<colgroup></colgroup>' + '<thead role=\\'rowgroup\\' />' + '</table>' + '</div>' + '</div>';\n                if (this._hasLockedColumns) {\n                    layout += '<div class=\\'k-grid-content-locked\\'>' + '<table role=\\'treegrid\\' tabindex=\\'0\\'>' + '<colgroup></colgroup>' + '<tbody />' + '</table>' + '</div>';\n                }\n                layout += '<div class=\\'#= gridContentWrap # k-auto-scrollable\\'>' + '<table role=\\'treegrid\\' tabindex=\\'0\\'>' + '<colgroup></colgroup>' + '<tbody />' + '</table>' + '</div>';\n                if (!this.options.scrollable) {\n                    layout = '<table role=\\'treegrid\\' tabindex=\\'0\\'>' + '<colgroup></colgroup>' + '<thead class=\\'#= gridHeader #\\' role=\\'rowgroup\\' />' + '<tbody />' + '</table>';\n                }\n                if (this.options.toolbar) {\n                    layout = '<div class=\\'#= header # #= gridToolbar #\\' />' + layout;\n                }\n                element.append(kendo.template(layout)(classNames) + '<div class=\\'k-status\\' />');\n                this.toolbar = element.find(DOT + classNames.gridToolbar);\n                var header = element.find(DOT + classNames.gridHeader).find('thead').addBack().filter('thead');\n                this.thead = header.last();\n                if (this.options.scrollable) {\n                    var rtl = kendo.support.isRtl(element);\n                    element.find('div.' + classNames.gridHeader).css(rtl ? 'padding-left' : 'padding-right', kendo.support.scrollbar());\n                }\n                var content = element.find(DOT + classNames.gridContentWrap);\n                if (!content.length) {\n                    content = element;\n                } else {\n                    this.content = content;\n                }\n                this.table = content.find('>table');\n                this.tbody = this.table.find('>tbody');\n                if (this._hasLockedColumns) {\n                    this.lockedHeader = header.first().closest('.k-grid-header-locked');\n                    this.lockedContent = element.find('.k-grid-content-locked');\n                    this.lockedTable = this.lockedContent.children();\n                }\n                this._initVirtualTrees();\n                this._renderCols();\n                this._renderHeader();\n                this.angular('compile', function () {\n                    return {\n                        elements: header.find('th.k-header').get(),\n                        data: map(columns, function (col) {\n                            return { column: col };\n                        })\n                    };\n                });\n            },\n            _initVirtualTrees: function () {\n                this._headerColsTree = new kendoDom.Tree(this.thead.prev()[0]);\n                this._contentColsTree = new kendoDom.Tree(this.tbody.prev()[0]);\n                this._headerTree = new kendoDom.Tree(this.thead[0]);\n                this._contentTree = new kendoDom.Tree(this.tbody[0]);\n                this._statusTree = new kendoDom.Tree(this.element.children('.k-status')[0]);\n                if (this.lockedHeader) {\n                    this._lockedHeaderColsTree = new kendoDom.Tree(this.lockedHeader.find('colgroup')[0]);\n                    this._lockedContentColsTree = new kendoDom.Tree(this.lockedTable.find('>colgroup')[0]);\n                    this._lockedHeaderTree = new kendoDom.Tree(this.lockedHeader.find('thead')[0]);\n                    this._lockedContentTree = new kendoDom.Tree(this.lockedTable.find('>tbody')[0]);\n                }\n            },\n            _toolbar: function () {\n                var options = this.options.toolbar;\n                var toolbar = this.toolbar;\n                if (!options) {\n                    return;\n                }\n                if ($.isArray(options)) {\n                    var buttons = this._buildCommands(options);\n                    new kendoDom.Tree(toolbar[0]).render(buttons);\n                } else {\n                    toolbar.append(kendo.template(options)({}));\n                }\n                this.angular('compile', function () {\n                    return { elements: toolbar.get() };\n                });\n            },\n            _lockedColumns: function () {\n                return grep(this.columns, is('locked'));\n            },\n            _nonLockedColumns: function () {\n                return grep(this.columns, not(is('locked')));\n            },\n            _templateColumns: function () {\n                return grep(this.columns, is('template'));\n            },\n            _flushCache: function () {\n                if (this.options.$angular && this._templateColumns().length) {\n                    this._contentTree.render([]);\n                    if (this._hasLockedColumns) {\n                        this._lockedContentTree.render([]);\n                    }\n                }\n            },\n            _render: function (options) {\n                options = options || {};\n                var messages = this.options.messages;\n                var data = this.dataSource.rootNodes();\n                var uidAttr = kendo.attr('uid');\n                var selected = this.select().removeClass('k-state-selected').map(function (_, row) {\n                    return $(row).attr(uidAttr);\n                });\n                this._absoluteIndex = 0;\n                this._angularItems('cleanup');\n                this._angularFooters('cleanup');\n                this._flushCache();\n                if (options.error) {\n                    this._showStatus(kendo.template('#: messages.requestFailed # ' + '<button class=\\'#= buttonClass #\\'>#: messages.retry #</button>')({\n                        buttonClass: [\n                            classNames.button,\n                            classNames.retry\n                        ].join(' '),\n                        messages: messages\n                    }));\n                } else if (!data.length) {\n                    this._showStatus(kendo.htmlEncode(messages.noRows));\n                } else {\n                    this._hideStatus();\n                    this._contentTree.render(this._trs({\n                        columns: this._nonLockedColumns(),\n                        aggregates: options.aggregates,\n                        selected: selected,\n                        data: data,\n                        visible: true,\n                        level: 0\n                    }));\n                    if (this._hasLockedColumns) {\n                        this._absoluteIndex = 0;\n                        this._lockedContentTree.render(this._trs({\n                            columns: this._lockedColumns(),\n                            aggregates: options.aggregates,\n                            selected: selected,\n                            data: data,\n                            visible: true,\n                            level: 0\n                        }));\n                    }\n                }\n                if (this._touchScroller) {\n                    this._touchScroller.contentResized();\n                }\n                this._muteAngularRebind(function () {\n                    this._angularItems('compile');\n                    this._angularFooters('compile');\n                });\n                this.items().filter(function () {\n                    return $.inArray($(this).attr(uidAttr), selected) >= 0;\n                }).addClass('k-state-selected');\n                this._adjustRowsHeight();\n            },\n            _adjustRowsHeight: function () {\n                if (!this._hasLockedColumns) {\n                    return;\n                }\n                var table = this.table;\n                var lockedTable = this.lockedTable;\n                var rows = table[0].rows;\n                var length = rows.length;\n                var idx;\n                var lockedRows = lockedTable[0].rows;\n                var containers = table.add(lockedTable);\n                var containersLength = containers.length;\n                var heights = [];\n                var lockedHeaderRows = this.lockedHeader.find('tr');\n                var headerRows = this.thead.find('tr');\n                lockedHeaderRows.add(headerRows).height('auto').height(Math.max(lockedHeaderRows.height(), headerRows.height()));\n                for (idx = 0; idx < length; idx++) {\n                    if (!lockedRows[idx]) {\n                        break;\n                    }\n                    if (rows[idx].style.height) {\n                        rows[idx].style.height = lockedRows[idx].style.height = '';\n                    }\n                }\n                for (idx = 0; idx < length; idx++) {\n                    if (!lockedRows[idx]) {\n                        break;\n                    }\n                    var offsetHeight1 = rows[idx].offsetHeight;\n                    var offsetHeight2 = lockedRows[idx].offsetHeight;\n                    var height = 0;\n                    if (offsetHeight1 > offsetHeight2) {\n                        height = offsetHeight1;\n                    } else if (offsetHeight1 < offsetHeight2) {\n                        height = offsetHeight2;\n                    }\n                    heights.push(height);\n                }\n                for (idx = 0; idx < containersLength; idx++) {\n                    containers[idx].style.display = 'none';\n                }\n                for (idx = 0; idx < length; idx++) {\n                    if (heights[idx]) {\n                        rows[idx].style.height = lockedRows[idx].style.height = heights[idx] + 1 + 'px';\n                    }\n                }\n                for (idx = 0; idx < containersLength; idx++) {\n                    containers[idx].style.display = '';\n                }\n            },\n            _ths: function (columns) {\n                var ths = [];\n                var column, title, children, cellClasses, attr, headerContent;\n                for (var i = 0, length = columns.length; i < length; i++) {\n                    column = columns[i];\n                    children = [];\n                    cellClasses = [classNames.header];\n                    if (column.headerTemplate) {\n                        title = column.headerTemplate({});\n                    } else {\n                        title = column.title || column.field || '';\n                    }\n                    if (column.headerTemplate) {\n                        headerContent = kendoHtmlElement(title);\n                    } else {\n                        headerContent = kendoTextElement(title);\n                    }\n                    if (column.sortable) {\n                        children.push(kendoDomElement('a', {\n                            href: '#',\n                            className: classNames.link\n                        }, [headerContent]));\n                    } else {\n                        children.push(headerContent);\n                    }\n                    attr = {\n                        'data-field': column.field,\n                        'data-title': column.title,\n                        'style': column.hidden === true ? { 'display': 'none' } : {},\n                        className: cellClasses.join(' '),\n                        'role': 'columnheader'\n                    };\n                    attr = extend(true, {}, attr, column.headerAttributes);\n                    ths.push(kendoDomElement('th', attr, children));\n                }\n                return ths;\n            },\n            _cols: function (columns) {\n                var cols = [];\n                var width, attr;\n                for (var i = 0; i < columns.length; i++) {\n                    if (columns[i].hidden === true) {\n                        continue;\n                    }\n                    width = columns[i].width;\n                    attr = {};\n                    if (width && parseInt(width, 10) !== 0) {\n                        attr.style = { width: typeof width === 'string' ? width : width + 'px' };\n                    }\n                    cols.push(kendoDomElement('col', attr));\n                }\n                return cols;\n            },\n            _renderCols: function () {\n                var columns = this._nonLockedColumns();\n                this._headerColsTree.render(this._cols(columns));\n                if (this.options.scrollable) {\n                    this._contentColsTree.render(this._cols(columns));\n                }\n                if (this._hasLockedColumns) {\n                    columns = this._lockedColumns();\n                    this._lockedHeaderColsTree.render(this._cols(columns));\n                    this._lockedContentColsTree.render(this._cols(columns));\n                }\n            },\n            _renderHeader: function () {\n                var columns = this._nonLockedColumns();\n                this._headerTree.render([kendoDomElement('tr', { 'role': 'row' }, this._ths(columns))]);\n                if (this._hasLockedColumns) {\n                    columns = this._lockedColumns();\n                    this._lockedHeaderTree.render([kendoDomElement('tr', { 'role': 'row' }, this._ths(columns))]);\n                    this._applyLockedContainersWidth();\n                }\n            },\n            _applyLockedContainersWidth: function () {\n                if (!this._hasLockedColumns) {\n                    return;\n                }\n                var lockedWidth = columnsWidth(this.lockedHeader.find('>table>colgroup>col'));\n                var headerTable = this.thead.parent();\n                var nonLockedWidth = columnsWidth(headerTable.find('>colgroup>col'));\n                var wrapperWidth = this.wrapper[0].clientWidth;\n                var scrollbar = kendo.support.scrollbar();\n                if (lockedWidth >= wrapperWidth) {\n                    lockedWidth = wrapperWidth - 3 * scrollbar;\n                }\n                this.lockedHeader.add(this.lockedContent).width(lockedWidth);\n                headerTable.add(this.table).width(nonLockedWidth);\n                var width = wrapperWidth - lockedWidth - 2;\n                this.content.width(width);\n                headerTable.parent().width(width - scrollbar);\n            },\n            _trs: function (options) {\n                var model, attr, className, hasChildren, childNodes, i, length;\n                var rows = [];\n                var level = options.level;\n                var data = options.data;\n                var dataSource = this.dataSource;\n                var aggregates = dataSource.aggregates() || {};\n                var columns = options.columns;\n                for (i = 0, length = data.length; i < length; i++) {\n                    className = [];\n                    model = data[i];\n                    childNodes = model.loaded() && dataSource.childNodes(model);\n                    hasChildren = childNodes && childNodes.length;\n                    attr = { 'role': 'row' };\n                    attr[kendo.attr('uid')] = model.uid;\n                    if (hasChildren) {\n                        attr['aria-expanded'] = !!model.expanded;\n                    }\n                    if (options.visible) {\n                        if (this._absoluteIndex % 2 !== 0) {\n                            className.push(classNames.alt);\n                        }\n                        this._absoluteIndex++;\n                    } else {\n                        attr.style = { display: 'none' };\n                    }\n                    if ($.inArray(model.uid, options.selected) >= 0) {\n                        className.push(classNames.selected);\n                    }\n                    if (hasChildren) {\n                        className.push(classNames.group);\n                    }\n                    if (model._edit) {\n                        className.push('k-grid-edit-row');\n                    }\n                    attr.className = className.join(' ');\n                    rows.push(this._tds({\n                        model: model,\n                        attr: attr,\n                        level: level\n                    }, columns, proxy(this._td, this)));\n                    if (hasChildren) {\n                        rows = rows.concat(this._trs({\n                            columns: columns,\n                            aggregates: aggregates,\n                            selected: options.selected,\n                            visible: options.visible && !!model.expanded,\n                            data: childNodes,\n                            level: level + 1\n                        }));\n                    }\n                }\n                if (this._hasFooterTemplate()) {\n                    attr = {\n                        className: classNames.footerTemplate,\n                        'data-parentId': model.parentId\n                    };\n                    if (!options.visible) {\n                        attr.style = { display: 'none' };\n                    }\n                    rows.push(this._tds({\n                        model: aggregates[model.parentId],\n                        attr: attr,\n                        level: level\n                    }, columns, this._footerTd));\n                }\n                return rows;\n            },\n            _footerTd: function (options) {\n                var content = [];\n                var column = options.column;\n                var template = options.column.footerTemplate || $.noop;\n                var aggregates = options.model[column.field] || {};\n                var attr = {\n                    'role': 'gridcell',\n                    'style': column.hidden === true ? { 'display': 'none' } : {}\n                };\n                if (column.expandable) {\n                    content = content.concat(createPlaceholders({\n                        level: options.level + 1,\n                        className: classNames.iconPlaceHolder\n                    }));\n                }\n                if (column.attributes) {\n                    extend(attr, column.attributes);\n                }\n                content.push(kendoHtmlElement(template(aggregates) || ''));\n                return kendoDomElement('td', attr, content);\n            },\n            _hasFooterTemplate: function () {\n                return !!grep(this.columns, function (c) {\n                    return c.footerTemplate;\n                }).length;\n            },\n            _tds: function (options, columns, renderer) {\n                var children = [];\n                var column;\n                for (var i = 0, l = columns.length; i < l; i++) {\n                    column = columns[i];\n                    children.push(renderer({\n                        model: options.model,\n                        column: column,\n                        level: options.level\n                    }));\n                }\n                return kendoDomElement('tr', options.attr, children);\n            },\n            _td: function (options) {\n                var children = [];\n                var model = options.model;\n                var column = options.column;\n                var iconClass;\n                var attr = {\n                    'role': 'gridcell',\n                    'style': column.hidden === true ? { 'display': 'none' } : {}\n                };\n                if (column.attributes) {\n                    extend(true, attr, column.attributes);\n                }\n                if (model._edit && column.field && model.editable(column.field)) {\n                    attr[kendo.attr('container-for')] = column.field;\n                } else {\n                    if (column.expandable) {\n                        children = createPlaceholders({\n                            level: options.level,\n                            className: classNames.iconPlaceHolder\n                        });\n                        iconClass = [classNames.icon];\n                        if (model.hasChildren) {\n                            iconClass.push(model.expanded ? classNames.iconCollapse : classNames.iconExpand);\n                        } else {\n                            iconClass.push(classNames.iconHidden);\n                        }\n                        if (model._error) {\n                            iconClass.push(classNames.refresh);\n                        } else if (!model.loaded() && model.expanded) {\n                            iconClass.push(classNames.loading);\n                        }\n                        children.push(kendoDomElement('span', { className: iconClass.join(' ') }));\n                        attr.style['white-space'] = 'nowrap';\n                    }\n                    if (column.command) {\n                        if (model._edit) {\n                            children = this._buildCommands([\n                                'update',\n                                'canceledit'\n                            ]);\n                        } else {\n                            children = this._buildCommands(column.command);\n                        }\n                    } else {\n                        children.push(this._cellContent(column, model));\n                    }\n                }\n                return kendoDomElement('td', attr, children);\n            },\n            _cellContent: function (column, model) {\n                var value;\n                if (column.template) {\n                    value = column.template(model);\n                } else if (column.field) {\n                    value = model.get(column.field);\n                    if (value !== null && column.format) {\n                        value = kendo.format(column.format, value);\n                    }\n                }\n                if (value === null || typeof value == 'undefined') {\n                    value = '';\n                }\n                if (column.template || !column.encoded) {\n                    return kendoHtmlElement(value);\n                } else {\n                    return kendoTextElement(value);\n                }\n            },\n            _buildCommands: function (commands) {\n                var i, result = [];\n                for (i = 0; i < commands.length; i++) {\n                    result.push(this._button(commands[i]));\n                }\n                return result;\n            },\n            _button: function (command) {\n                var name = (command.name || command).toLowerCase();\n                var text = this.options.messages.commands[name];\n                var icon = [];\n                command = extend({}, defaultCommands[name], { text: text }, command);\n                if (command.imageClass) {\n                    icon.push(kendoDomElement('span', {\n                        className: [\n                            'k-icon',\n                            command.imageClass\n                        ].join(' ')\n                    }));\n                }\n                return kendoDomElement('button', {\n                    'type': 'button',\n                    'data-command': name,\n                    className: [\n                        'k-button',\n                        'k-button-icontext',\n                        command.className\n                    ].join(' ')\n                }, icon.concat([kendoTextElement(command.text || command.name)]));\n            },\n            _positionResizeHandle: function (e) {\n                var th = $(e.currentTarget);\n                var resizeHandle = this.resizeHandle;\n                var position = th.position();\n                var left = position.left;\n                var cellWidth = outerWidth(th);\n                var container = th.closest('div');\n                var clientX = e.clientX + $(window).scrollLeft();\n                var indicatorWidth = this.options.columnResizeHandleWidth || 3;\n                left += container.scrollLeft();\n                if (!resizeHandle) {\n                    resizeHandle = this.resizeHandle = $('<div class=\"k-resize-handle\"><div class=\"k-resize-handle-inner\" /></div>');\n                }\n                var cellOffset = th.offset().left + cellWidth;\n                var show = clientX > cellOffset - indicatorWidth && clientX < cellOffset + indicatorWidth;\n                if (!show) {\n                    resizeHandle.hide();\n                    return;\n                }\n                container.append(resizeHandle);\n                resizeHandle.show().css({\n                    top: position.top,\n                    left: left + cellWidth - indicatorWidth - 1,\n                    height: outerHeight(th),\n                    width: indicatorWidth * 3\n                }).data('th', th);\n                var that = this;\n                resizeHandle.off('dblclick' + NS).on('dblclick' + NS, function () {\n                    var index = th.index();\n                    if ($.contains(that.thead[0], th[0])) {\n                        index += grep(that.columns, function (val) {\n                            return val.locked && !val.hidden;\n                        }).length;\n                    }\n                    that.autoFitColumn(index);\n                });\n            },\n            autoFitColumn: function (column) {\n                var that = this, options = that.options, columns = that.columns, index, browser = kendo.support.browser, th, headerTable, isLocked, visibleLocked = that.lockedHeader ? leafDataCells(that.lockedHeader.find('>table>thead')).filter(isCellVisible).length : 0, col;\n                if (typeof column == 'number') {\n                    column = columns[column];\n                } else if (isPlainObject(column)) {\n                    column = grep(columns, function (item) {\n                        return item === column;\n                    })[0];\n                } else {\n                    column = grep(columns, function (item) {\n                        return item.field === column;\n                    })[0];\n                }\n                if (!column || column.hidden) {\n                    return;\n                }\n                index = inArray(column, columns);\n                isLocked = column.locked;\n                if (isLocked) {\n                    headerTable = that.lockedHeader.children('table');\n                } else {\n                    headerTable = that.thead.parent();\n                }\n                th = headerTable.find('[data-index=\\'' + index + '\\']');\n                var contentTable = isLocked ? that.lockedTable : that.table, footer = that.footer || $();\n                if (that.footer && that.lockedContent) {\n                    footer = isLocked ? that.footer.children('.k-grid-footer-locked') : that.footer.children('.k-grid-footer-wrap');\n                }\n                var footerTable = footer.find('table').first();\n                if (that.lockedHeader && visibleLocked >= index && !isLocked) {\n                    index -= visibleLocked;\n                }\n                for (var j = 0; j < columns.length; j++) {\n                    if (columns[j] === column) {\n                        break;\n                    } else {\n                        if (columns[j].hidden) {\n                            index--;\n                        }\n                    }\n                }\n                if (options.scrollable) {\n                    col = headerTable.find('col:not(.k-group-col):not(.k-hierarchy-col):eq(' + index + ')').add(contentTable.children('colgroup').find('col:not(.k-group-col):not(.k-hierarchy-col):eq(' + index + ')')).add(footerTable.find('colgroup').find('col:not(.k-group-col):not(.k-hierarchy-col):eq(' + index + ')'));\n                } else {\n                    col = contentTable.children('colgroup').find('col:not(.k-group-col):not(.k-hierarchy-col):eq(' + index + ')');\n                }\n                var tables = headerTable.add(contentTable).add(footerTable);\n                var oldColumnWidth = outerWidth(th);\n                col.width('');\n                tables.css('table-layout', 'fixed');\n                col.width('auto');\n                tables.addClass('k-autofitting');\n                tables.css('table-layout', '');\n                var newColumnWidth = Math.ceil(Math.max(outerWidth(th), outerWidth(contentTable.find('tr').eq(0).children('td:visible').eq(index)), outerWidth(footerTable.find('tr').eq(0).children('td:visible').eq(index))));\n                col.width(newColumnWidth);\n                column.width = newColumnWidth;\n                if (options.scrollable) {\n                    var cols = headerTable.find('col'), colWidth, totalWidth = 0;\n                    for (var idx = 0, length = cols.length; idx < length; idx += 1) {\n                        colWidth = cols[idx].style.width;\n                        if (colWidth && colWidth.indexOf('%') == -1) {\n                            totalWidth += parseInt(colWidth, 10);\n                        } else {\n                            totalWidth = 0;\n                            break;\n                        }\n                    }\n                    if (totalWidth) {\n                        tables.each(function () {\n                            this.style.width = totalWidth + 'px';\n                        });\n                    }\n                }\n                if (browser.msie && browser.version == 8) {\n                    tables.css('display', 'inline-table');\n                    setTimeout(function () {\n                        tables.css('display', 'table');\n                    }, 1);\n                }\n                tables.removeClass('k-autofitting');\n                that.trigger(COLUMNRESIZE, {\n                    column: column,\n                    oldWidth: oldColumnWidth,\n                    newWidth: newColumnWidth\n                });\n                that._applyLockedContainersWidth();\n                that._syncLockedContentHeight();\n                that._syncLockedHeaderHeight();\n            },\n            _adjustLockedHorizontalScrollBar: function () {\n                var table = this.table, content = table.parent();\n                var scrollbar = table[0].offsetWidth > content[0].clientWidth ? kendo.support.scrollbar() : 0;\n                this.lockedContent.height(content.height() - scrollbar);\n            },\n            _syncLockedContentHeight: function () {\n                if (this.lockedTable) {\n                    if (!this._touchScroller) {\n                        this._adjustLockedHorizontalScrollBar();\n                    }\n                    this._adjustRowsHeight(this.table, this.lockedTable);\n                }\n            },\n            _syncLockedHeaderHeight: function () {\n                if (this.lockedHeader) {\n                    var lockedTable = this.lockedHeader.children('table');\n                    var table = this.thead.parent();\n                    this._adjustRowsHeight(lockedTable, table);\n                    syncTableHeight(lockedTable, table);\n                }\n            },\n            _resizable: function () {\n                if (!this.options.resizable) {\n                    return;\n                }\n                if (this.resizable) {\n                    this.resizable.destroy();\n                }\n                var treelist = this;\n                $(this.lockedHeader).find('thead').add(this.thead).on('mousemove' + NS, 'th', $.proxy(this._positionResizeHandle, this));\n                this.resizable = new kendo.ui.Resizable(this.wrapper, {\n                    handle: '.k-resize-handle',\n                    start: function (e) {\n                        var th = $(e.currentTarget).data('th');\n                        var colSelector = 'col:eq(' + $.inArray(th[0], th.parent().children().filter(':visible')) + ')';\n                        var header, contentTable;\n                        treelist.wrapper.addClass('k-grid-column-resizing');\n                        if (treelist.lockedHeader && $.contains(treelist.lockedHeader[0], th[0])) {\n                            header = treelist.lockedHeader;\n                            contentTable = treelist.lockedTable;\n                        } else {\n                            header = treelist.thead.parent();\n                            contentTable = treelist.table;\n                        }\n                        this.col = contentTable.children('colgroup').find(colSelector).add(header.find(colSelector));\n                        this.th = th;\n                        this.startLocation = e.x.location;\n                        this.columnWidth = outerWidth(th);\n                        this.table = this.col.closest('table');\n                        this.totalWidth = this.table.width();\n                    },\n                    resize: function (e) {\n                        var minColumnWidth = 11;\n                        var delta = e.x.location - this.startLocation;\n                        if (this.columnWidth + delta < minColumnWidth) {\n                            delta = minColumnWidth - this.columnWidth;\n                        }\n                        this.table.width(this.totalWidth + delta);\n                        this.col.width(this.columnWidth + delta);\n                    },\n                    resizeend: function () {\n                        treelist.wrapper.removeClass('k-grid-column-resizing');\n                        var field = this.th.attr('data-field');\n                        var column = grep(treelist.columns, function (c) {\n                            return c.field == field;\n                        });\n                        var newWidth = Math.floor(outerWidth(this.th));\n                        column[0].width = newWidth;\n                        treelist._resize();\n                        treelist._adjustRowsHeight();\n                        treelist.trigger(COLUMNRESIZE, {\n                            column: column,\n                            oldWidth: this.columnWidth,\n                            newWidth: newWidth\n                        });\n                        this.table = this.col = this.th = null;\n                    }\n                });\n            },\n            _sortable: function () {\n                var columns = this.columns;\n                var column;\n                var sortableInstance;\n                var cells = $(this.lockedHeader).add(this.thead).find('th');\n                var cell, idx, length;\n                var fieldAttr = kendo.attr('field');\n                var sortable = this.options.sortable;\n                if (!sortable) {\n                    return;\n                }\n                for (idx = 0, length = cells.length; idx < length; idx++) {\n                    column = columns[idx];\n                    if (column.sortable !== false && !column.command && column.field) {\n                        cell = cells.eq(idx);\n                        sortableInstance = cell.data('kendoColumnSorter');\n                        if (sortableInstance) {\n                            sortableInstance.destroy();\n                        }\n                        cell.attr(fieldAttr, column.field).kendoColumnSorter(extend({}, sortable, column.sortable, { dataSource: this.dataSource }));\n                    }\n                }\n            },\n            _filterable: function () {\n                var cells = $(this.lockedHeader).add(this.thead).find('th');\n                var filterable = this.options.filterable;\n                var idx, length, column, cell, filterMenuInstance;\n                if (!filterable || this.options.columnMenu) {\n                    return;\n                }\n                var filterInit = proxy(function (e) {\n                    this.trigger(FILTERMENUINIT, {\n                        field: e.field,\n                        container: e.container\n                    });\n                }, this);\n                for (idx = 0, length = cells.length; idx < length; idx++) {\n                    column = this.columns[idx];\n                    cell = cells.eq(idx);\n                    filterMenuInstance = cell.data('kendoFilterMenu');\n                    if (filterMenuInstance) {\n                        filterMenuInstance.destroy();\n                    }\n                    if (column.command || column.filterable === false) {\n                        continue;\n                    }\n                    cell.kendoFilterMenu(extend(true, {}, filterable, column.filterable, {\n                        dataSource: this.dataSource,\n                        init: filterInit\n                    }));\n                }\n            },\n            _change: function () {\n                this.trigger(CHANGE);\n            },\n            _selectable: function () {\n                var selectable = this.options.selectable;\n                var filter;\n                var element = this.table;\n                var useAllItems;\n                if (selectable) {\n                    selectable = kendo.ui.Selectable.parseOptions(selectable);\n                    if (this._hasLockedColumns) {\n                        element = element.add(this.lockedTable);\n                        useAllItems = selectable.multiple && selectable.cell;\n                    }\n                    filter = '>tbody>tr:not(.k-footer-template)';\n                    if (selectable.cell) {\n                        filter = filter + '>td';\n                    }\n                    this.selectable = new kendo.ui.Selectable(element, {\n                        filter: filter,\n                        aria: true,\n                        multiple: selectable.multiple,\n                        change: proxy(this._change, this),\n                        useAllItems: useAllItems,\n                        continuousItems: proxy(this._continuousItems, this, filter, selectable.cell),\n                        relatedTarget: !selectable.cell && this._hasLockedColumns ? proxy(this._selectableTarget, this) : undefined\n                    });\n                }\n            },\n            _continuousItems: function (filter, cell) {\n                if (!this.lockedContent) {\n                    return;\n                }\n                var lockedItems = $(filter, this.lockedTable);\n                var nonLockedItems = $(filter, this.table);\n                var columns = cell ? this._lockedColumns().length : 1;\n                var nonLockedColumns = cell ? this.columns.length - columns : 1;\n                var result = [];\n                for (var idx = 0; idx < lockedItems.length; idx += columns) {\n                    push.apply(result, lockedItems.slice(idx, idx + columns));\n                    push.apply(result, nonLockedItems.splice(0, nonLockedColumns));\n                }\n                return result;\n            },\n            _selectableTarget: function (items) {\n                var related;\n                var result = $();\n                for (var idx = 0, length = items.length; idx < length; idx++) {\n                    related = this._relatedRow(items[idx]);\n                    if (inArray(related[0], items) < 0) {\n                        result = result.add(related);\n                    }\n                }\n                return result;\n            },\n            _relatedRow: function (row) {\n                var lockedTable = this.lockedTable;\n                row = $(row);\n                if (!lockedTable) {\n                    return row;\n                }\n                var table = row.closest(this.table.add(this.lockedTable));\n                var index = table.find('>tbody>tr').index(row);\n                table = table[0] === this.table[0] ? lockedTable : this.table;\n                return table.find('>tbody>tr').eq(index);\n            },\n            select: function (value) {\n                var selectable = this.selectable;\n                if (!selectable) {\n                    return $();\n                }\n                if (typeof value !== 'undefined') {\n                    if (!selectable.options.multiple) {\n                        selectable.clear();\n                        value = value.first();\n                    }\n                    if (this._hasLockedColumns) {\n                        value = value.add($.map(value, proxy(this._relatedRow, this)));\n                    }\n                }\n                return selectable.value(value);\n            },\n            clearSelection: function () {\n                var selected = this.select();\n                if (selected.length) {\n                    this.selectable.clear();\n                    this.trigger(CHANGE);\n                }\n            },\n            _dataSource: function (dataSource) {\n                var ds = this.dataSource;\n                if (ds) {\n                    ds.unbind(CHANGE, this._refreshHandler);\n                    ds.unbind(ERROR, this._errorHandler);\n                    ds.unbind(PROGRESS, this._progressHandler);\n                }\n                this._refreshHandler = proxy(this.refresh, this);\n                this._errorHandler = proxy(this._error, this);\n                this._progressHandler = proxy(this._progress, this);\n                ds = this.dataSource = TreeListDataSource.create(dataSource);\n                ds.bind(CHANGE, this._refreshHandler);\n                ds.bind(ERROR, this._errorHandler);\n                ds.bind(PROGRESS, this._progressHandler);\n                this._dataSourceFetchProxy = proxy(function () {\n                    this.dataSource.fetch();\n                }, this);\n            },\n            setDataSource: function (dataSource) {\n                this._dataSource(dataSource);\n                this._sortable();\n                this._filterable();\n                this._contentTree.render([]);\n                if (this.options.autoBind) {\n                    this.dataSource.fetch();\n                }\n            },\n            dataItem: function (element) {\n                if (element instanceof TreeListModel) {\n                    return element;\n                }\n                var row = $(element).closest('tr');\n                var model = this.dataSource.getByUid(row.attr(kendo.attr('uid')));\n                return model;\n            },\n            editRow: function (row) {\n                var model;\n                if (typeof row === STRING) {\n                    row = this.tbody.find(row);\n                }\n                model = this.dataItem(row);\n                if (!model) {\n                    return;\n                }\n                if (this._editMode() != 'popup') {\n                    model._edit = true;\n                }\n                this._cancelEditor();\n                this._render();\n                this._createEditor(model);\n                this.trigger(EDIT, {\n                    container: this.editor.wrapper,\n                    model: model\n                });\n            },\n            _cancelEdit: function (e) {\n                e = extend(e, {\n                    container: this.editor.wrapper,\n                    model: this.editor.model\n                });\n                if (this.trigger(CANCEL, e)) {\n                    return;\n                }\n                this.cancelRow();\n            },\n            cancelRow: function () {\n                this._cancelEditor();\n                this._render();\n            },\n            saveRow: function () {\n                var editor = this.editor;\n                var args;\n                if (!editor) {\n                    return;\n                }\n                args = {\n                    model: editor.model,\n                    container: editor.wrapper\n                };\n                if (editor.end() && !this.trigger(SAVE, args)) {\n                    this.dataSource.sync();\n                }\n            },\n            addRow: function (parent) {\n                var editor = this.editor;\n                var index = 0;\n                var model = {};\n                if (editor && !editor.end()) {\n                    return;\n                }\n                if (parent) {\n                    if (!(parent instanceof TreeListModel)) {\n                        parent = this.dataItem(parent);\n                    }\n                    model[parent.parentIdField] = parent.id;\n                    index = this.dataSource.indexOf(parent) + 1;\n                    this.expand(parent).then(proxy(this._insertAt, this, model, index));\n                    return;\n                }\n                this._insertAt(model, index);\n            },\n            _insertAt: function (model, index) {\n                model = this.dataSource.insert(index, model);\n                var row = this.itemFor(model);\n                this.editRow(row);\n            },\n            removeRow: function (row) {\n                var model = this.dataItem(row);\n                var args = {\n                    model: model,\n                    row: row\n                };\n                if (model && !this.trigger(REMOVE, args)) {\n                    this.dataSource.remove(model);\n                    this.dataSource.sync();\n                }\n            },\n            _cancelEditor: function () {\n                var model;\n                var editor = this.editor;\n                if (editor) {\n                    model = editor.model;\n                    this._destroyEditor();\n                    this.dataSource.cancelChanges(model);\n                    model._edit = false;\n                }\n            },\n            _destroyEditor: function () {\n                if (!this.editor) {\n                    return;\n                }\n                this.editor.close();\n                this.editor = null;\n            },\n            _createEditor: function (model) {\n                var row = this.itemFor(model);\n                row = row.add(this._relatedRow(row));\n                var mode = this._editMode();\n                var options = {\n                    columns: this.columns,\n                    model: model,\n                    target: this,\n                    clearContainer: false,\n                    template: this.options.editable.template\n                };\n                if (mode == 'inline') {\n                    this.editor = new Editor(row, options);\n                } else {\n                    extend(options, {\n                        window: this.options.editable.window,\n                        commandRenderer: proxy(function () {\n                            return this._buildCommands([\n                                'update',\n                                'canceledit'\n                            ]);\n                        }, this),\n                        fieldRenderer: this._cellContent,\n                        save: proxy(this.saveRow, this),\n                        cancel: proxy(this._cancelEdit, this),\n                        appendTo: this.wrapper\n                    });\n                    this.editor = new PopupEditor(row, options);\n                }\n            },\n            _editMode: function () {\n                var mode = 'inline', editable = this.options.editable;\n                if (editable !== true) {\n                    if (typeof editable == 'string') {\n                        mode = editable;\n                    } else {\n                        mode = editable.mode || mode;\n                    }\n                }\n                return mode.toLowerCase();\n            },\n            hideColumn: function (column) {\n                this._toggleColumnVisibility(column, true);\n            },\n            showColumn: function (column) {\n                this._toggleColumnVisibility(column, false);\n            },\n            _toggleColumnVisibility: function (column, hidden) {\n                column = this._findColumn(column);\n                if (!column || column.hidden === hidden) {\n                    return;\n                }\n                column.hidden = hidden;\n                this._ensureExpandableColumn();\n                this._renderCols();\n                this._renderHeader();\n                this._render();\n                this._adjustTablesWidth();\n                this.trigger(hidden ? COLUMNHIDE : COLUMNSHOW, { column: column });\n                if (!hidden && !column.width) {\n                    this.table.add(this.thead.closest('table')).width('');\n                }\n            },\n            _findColumn: function (column) {\n                if (typeof column == 'number') {\n                    column = this.columns[column];\n                } else if (isPlainObject(column)) {\n                    column = grep(this.columns, function (item) {\n                        return item === column;\n                    })[0];\n                } else {\n                    column = grep(this.columns, function (item) {\n                        return item.field === column;\n                    })[0];\n                }\n                return column;\n            },\n            _adjustTablesWidth: function () {\n                var idx, length;\n                var cols = this.thead.prev().children();\n                var colWidth, width = 0;\n                for (idx = 0, length = cols.length; idx < length; idx++) {\n                    colWidth = cols[idx].style.width;\n                    if (colWidth && colWidth.indexOf('%') == -1) {\n                        width += parseInt(colWidth, 10);\n                    } else {\n                        width = 0;\n                        break;\n                    }\n                }\n                if (width) {\n                    this.table.add(this.thead.closest('table')).width(width);\n                }\n            },\n            _reorderable: function () {\n                if (!this.options.reorderable) {\n                    return;\n                }\n                var scrollable = this.options.scrollable === true;\n                var selector = (scrollable ? '.k-grid-header:first ' : 'table:first>.k-grid-header ') + HEADERCELLS;\n                var that = this;\n                this._draggableInstance = new ui.Draggable(this.wrapper, {\n                    group: kendo.guid(),\n                    filter: selector,\n                    hint: function (target) {\n                        return $('<div class=\"k-header k-drag-clue\" />').css({\n                            width: target.width(),\n                            paddingLeft: target.css('paddingLeft'),\n                            paddingRight: target.css('paddingRight'),\n                            lineHeight: target.height() + 'px',\n                            paddingTop: target.css('paddingTop'),\n                            paddingBottom: target.css('paddingBottom')\n                        }).html(target.attr(kendo.attr('title')) || target.attr(kendo.attr('field')) || target.text()).prepend('<span class=\"k-icon k-drag-status k-i-cancel\" />');\n                    }\n                });\n                this.reorderable = new ui.Reorderable(this.wrapper, {\n                    draggable: this._draggableInstance,\n                    dragOverContainers: proxy(this._allowDragOverContainers, this),\n                    inSameContainer: function (e) {\n                        return $(e.source).parent()[0] === $(e.target).parent()[0];\n                    },\n                    change: function (e) {\n                        var newIndex = e.newIndex;\n                        var oldIndex = e.oldIndex;\n                        var before = e.position === 'before';\n                        var column = that.columns[oldIndex];\n                        that.trigger(COLUMNREORDER, {\n                            newIndex: newIndex,\n                            oldIndex: oldIndex,\n                            column: column\n                        });\n                        that.reorderColumn(newIndex, column, before);\n                    }\n                });\n            },\n            _allowDragOverContainers: function (index) {\n                return this.columns[index].lockable !== false;\n            },\n            reorderColumn: function (destIndex, column, before) {\n                var lockChanged;\n                var columns = this.columns;\n                var sourceIndex = inArray(column, columns);\n                var destColumn = columns[destIndex];\n                var isLocked = !!destColumn.locked;\n                var nonLockedColumnsLength = this._nonLockedColumns().length;\n                if (sourceIndex === destIndex) {\n                    return;\n                }\n                if (isLocked && !column.locked && nonLockedColumnsLength == 1) {\n                    return;\n                }\n                if (!isLocked && column.locked && columns.length - nonLockedColumnsLength == 1) {\n                    return;\n                }\n                if (before === undefined) {\n                    before = destIndex < sourceIndex;\n                }\n                lockChanged = !!column.locked;\n                lockChanged = lockChanged != isLocked;\n                column.locked = isLocked;\n                columns.splice(before ? destIndex : destIndex + 1, 0, column);\n                columns.splice(sourceIndex < destIndex ? sourceIndex : sourceIndex + 1, 1);\n                this._renderCols();\n                var ths = $(this.lockedHeader).add(this.thead).find('th');\n                ths.eq(sourceIndex)[before ? 'insertBefore' : 'insertAfter'](ths.eq(destIndex));\n                var dom = this._headerTree.children[0].children;\n                if (this._hasLockedColumns) {\n                    dom = this._lockedHeaderTree.children[0].children.concat(dom);\n                }\n                dom.splice(before ? destIndex : destIndex + 1, 0, dom[sourceIndex]);\n                dom.splice(sourceIndex < destIndex ? sourceIndex : sourceIndex + 1, 1);\n                if (this._hasLockedColumns) {\n                    this._lockedHeaderTree.children[0].children = dom.splice(0, this._lockedColumns().length);\n                    this._headerTree.children[0].children = dom;\n                }\n                this._applyLockedContainersWidth();\n                this.refresh();\n                if (!lockChanged) {\n                    return;\n                }\n                if (isLocked) {\n                    this.trigger(COLUMNLOCK, { column: column });\n                } else {\n                    this.trigger(COLUMNUNLOCK, { column: column });\n                }\n            },\n            lockColumn: function (column) {\n                var columns = this.columns;\n                if (typeof column == 'number') {\n                    column = columns[column];\n                } else {\n                    column = grep(columns, function (item) {\n                        return item.field === column;\n                    })[0];\n                }\n                if (!column || column.hidden) {\n                    return;\n                }\n                var index = this._lockedColumns().length - 1;\n                this.reorderColumn(index, column, false);\n            },\n            unlockColumn: function (column) {\n                var columns = this.columns;\n                if (typeof column == 'number') {\n                    column = columns[column];\n                } else {\n                    column = grep(columns, function (item) {\n                        return item.field === column;\n                    })[0];\n                }\n                if (!column || column.hidden) {\n                    return;\n                }\n                var index = this._lockedColumns().length;\n                this.reorderColumn(index, column, true);\n            },\n            _columnMenu: function () {\n                var ths = $(this.lockedHeader).add(this.thead).find('th');\n                var columns = this.columns;\n                var options = this.options;\n                var columnMenu = options.columnMenu;\n                var column, menu, menuOptions, sortable, filterable;\n                var initHandler = proxy(this._columnMenuInit, this);\n                var lockedColumnsLength = this._lockedColumns().length;\n                if (!columnMenu) {\n                    return;\n                }\n                if (typeof columnMenu == 'boolean') {\n                    columnMenu = {};\n                }\n                for (var i = 0; i < ths.length; i++) {\n                    column = columns[i];\n                    if (!column.field) {\n                        continue;\n                    }\n                    menu = ths.eq(i).data('kendoColumnMenu');\n                    if (menu) {\n                        menu.destroy();\n                    }\n                    sortable = false;\n                    if (column.sortable !== false && columnMenu.sortable !== false && options.sortable !== false) {\n                        sortable = extend({}, options.sortable, { compare: (column.sortable || {}).compare });\n                    }\n                    filterable = false;\n                    if (options.filterable && column.filterable !== false && columnMenu.filterable !== false) {\n                        filterable = extend({ pane: this.pane }, column.filterable, options.filterable);\n                    }\n                    menuOptions = {\n                        dataSource: this.dataSource,\n                        values: column.values,\n                        columns: columnMenu.columns,\n                        sortable: sortable,\n                        filterable: filterable,\n                        messages: columnMenu.messages,\n                        owner: this,\n                        closeCallback: $.noop,\n                        init: initHandler,\n                        pane: this.pane,\n                        lockedColumns: column.lockable !== false && lockedColumnsLength > 0\n                    };\n                    if (options.$angular) {\n                        menuOptions.$angular = options.$angular;\n                    }\n                    ths.eq(i).kendoColumnMenu(menuOptions);\n                }\n            },\n            _columnMenuInit: function (e) {\n                this.trigger(COLUMNMENUINIT, {\n                    field: e.field,\n                    container: e.container\n                });\n            }\n        });\n        if (kendo.ExcelMixin) {\n            kendo.ExcelMixin.extend(TreeList.prototype);\n        }\n        if (kendo.PDFMixin) {\n            kendo.PDFMixin.extend(TreeList.prototype);\n            TreeList.fn._drawPDF = function (progress) {\n                var promise = new $.Deferred();\n                this._drawPDFShadow({ width: this.wrapper.width() }, { avoidLinks: this.options.pdf.avoidLinks }).done(function (group) {\n                    var args = {\n                        page: group,\n                        pageNumber: 1,\n                        progress: 1,\n                        totalPages: 1\n                    };\n                    progress.notify(args);\n                    promise.resolve(args.page);\n                }).fail(function (err) {\n                    promise.reject(err);\n                });\n                return promise;\n            };\n        }\n        extend(true, kendo.data, {\n            TreeListDataSource: TreeListDataSource,\n            TreeListModel: TreeListModel\n        });\n        extend(true, kendo.ui, { TreeList: TreeList });\n        ui.plugin(TreeList);\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('util/main', ['kendo.core'], f);\n}(function () {\n    (function () {\n        var kendo = window.kendo, deepExtend = kendo.deepExtend;\n        function sqr(value) {\n            return value * value;\n        }\n        var now = Date.now;\n        if (!now) {\n            now = function () {\n                return new Date().getTime();\n            };\n        }\n        function renderSize(size) {\n            if (typeof size !== 'string') {\n                size += 'px';\n            }\n            return size;\n        }\n        function renderPos(pos) {\n            var result = [];\n            if (pos) {\n                var parts = kendo.toHyphens(pos).split('-');\n                for (var i = 0; i < parts.length; i++) {\n                    result.push('k-pos-' + parts[i]);\n                }\n            }\n            return result.join(' ');\n        }\n        function arabicToRoman(n) {\n            var literals = {\n                1: 'i',\n                10: 'x',\n                100: 'c',\n                2: 'ii',\n                20: 'xx',\n                200: 'cc',\n                3: 'iii',\n                30: 'xxx',\n                300: 'ccc',\n                4: 'iv',\n                40: 'xl',\n                400: 'cd',\n                5: 'v',\n                50: 'l',\n                500: 'd',\n                6: 'vi',\n                60: 'lx',\n                600: 'dc',\n                7: 'vii',\n                70: 'lxx',\n                700: 'dcc',\n                8: 'viii',\n                80: 'lxxx',\n                800: 'dccc',\n                9: 'ix',\n                90: 'xc',\n                900: 'cm',\n                1000: 'm'\n            };\n            var values = [\n                1000,\n                900,\n                800,\n                700,\n                600,\n                500,\n                400,\n                300,\n                200,\n                100,\n                90,\n                80,\n                70,\n                60,\n                50,\n                40,\n                30,\n                20,\n                10,\n                9,\n                8,\n                7,\n                6,\n                5,\n                4,\n                3,\n                2,\n                1\n            ];\n            var roman = '';\n            while (n > 0) {\n                if (n < values[0]) {\n                    values.shift();\n                } else {\n                    roman += literals[values[0]];\n                    n -= values[0];\n                }\n            }\n            return roman;\n        }\n        function romanToArabic(r) {\n            r = r.toLowerCase();\n            var digits = {\n                i: 1,\n                v: 5,\n                x: 10,\n                l: 50,\n                c: 100,\n                d: 500,\n                m: 1000\n            };\n            var value = 0, prev = 0;\n            for (var i = 0; i < r.length; ++i) {\n                var v = digits[r.charAt(i)];\n                if (!v) {\n                    return null;\n                }\n                value += v;\n                if (v > prev) {\n                    value -= 2 * prev;\n                }\n                prev = v;\n            }\n            return value;\n        }\n        function memoize(f) {\n            var cache = Object.create(null);\n            return function () {\n                var id = '';\n                for (var i = arguments.length; --i >= 0;) {\n                    id += ':' + arguments[i];\n                }\n                return id in cache ? cache[id] : cache[id] = f.apply(this, arguments);\n            };\n        }\n        function isUnicodeLetter(ch) {\n            return RX_UNICODE_LETTER.test(ch);\n        }\n        deepExtend(kendo, {\n            util: {\n                now: now,\n                renderPos: renderPos,\n                renderSize: renderSize,\n                sqr: sqr,\n                romanToArabic: romanToArabic,\n                arabicToRoman: arabicToRoman,\n                memoize: memoize,\n                isUnicodeLetter: isUnicodeLetter\n            }\n        });\n        var RX_UNICODE_LETTER = new RegExp('[\\\\u0041-\\\\u005A\\\\u0061-\\\\u007A\\\\u00AA\\\\u00B5\\\\u00BA\\\\u00C0-\\\\u00D6\\\\u00D8-\\\\u00F6\\\\u00F8-\\\\u02C1\\\\u02C6-\\\\u02D1\\\\u02E0-\\\\u02E4\\\\u02EC\\\\u02EE\\\\u0370-\\\\u0374\\\\u0376\\\\u0377\\\\u037A-\\\\u037D\\\\u037F\\\\u0386\\\\u0388-\\\\u038A\\\\u038C\\\\u038E-\\\\u03A1\\\\u03A3-\\\\u03F5\\\\u03F7-\\\\u0481\\\\u048A-\\\\u052F\\\\u0531-\\\\u0556\\\\u0559\\\\u0561-\\\\u0587\\\\u05D0-\\\\u05EA\\\\u05F0-\\\\u05F2\\\\u0620-\\\\u064A\\\\u066E\\\\u066F\\\\u0671-\\\\u06D3\\\\u06D5\\\\u06E5\\\\u06E6\\\\u06EE\\\\u06EF\\\\u06FA-\\\\u06FC\\\\u06FF\\\\u0710\\\\u0712-\\\\u072F\\\\u074D-\\\\u07A5\\\\u07B1\\\\u07CA-\\\\u07EA\\\\u07F4\\\\u07F5\\\\u07FA\\\\u0800-\\\\u0815\\\\u081A\\\\u0824\\\\u0828\\\\u0840-\\\\u0858\\\\u08A0-\\\\u08B2\\\\u0904-\\\\u0939\\\\u093D\\\\u0950\\\\u0958-\\\\u0961\\\\u0971-\\\\u0980\\\\u0985-\\\\u098C\\\\u098F\\\\u0990\\\\u0993-\\\\u09A8\\\\u09AA-\\\\u09B0\\\\u09B2\\\\u09B6-\\\\u09B9\\\\u09BD\\\\u09CE\\\\u09DC\\\\u09DD\\\\u09DF-\\\\u09E1\\\\u09F0\\\\u09F1\\\\u0A05-\\\\u0A0A\\\\u0A0F\\\\u0A10\\\\u0A13-\\\\u0A28\\\\u0A2A-\\\\u0A30\\\\u0A32\\\\u0A33\\\\u0A35\\\\u0A36\\\\u0A38\\\\u0A39\\\\u0A59-\\\\u0A5C\\\\u0A5E\\\\u0A72-\\\\u0A74\\\\u0A85-\\\\u0A8D\\\\u0A8F-\\\\u0A91\\\\u0A93-\\\\u0AA8\\\\u0AAA-\\\\u0AB0\\\\u0AB2\\\\u0AB3\\\\u0AB5-\\\\u0AB9\\\\u0ABD\\\\u0AD0\\\\u0AE0\\\\u0AE1\\\\u0B05-\\\\u0B0C\\\\u0B0F\\\\u0B10\\\\u0B13-\\\\u0B28\\\\u0B2A-\\\\u0B30\\\\u0B32\\\\u0B33\\\\u0B35-\\\\u0B39\\\\u0B3D\\\\u0B5C\\\\u0B5D\\\\u0B5F-\\\\u0B61\\\\u0B71\\\\u0B83\\\\u0B85-\\\\u0B8A\\\\u0B8E-\\\\u0B90\\\\u0B92-\\\\u0B95\\\\u0B99\\\\u0B9A\\\\u0B9C\\\\u0B9E\\\\u0B9F\\\\u0BA3\\\\u0BA4\\\\u0BA8-\\\\u0BAA\\\\u0BAE-\\\\u0BB9\\\\u0BD0\\\\u0C05-\\\\u0C0C\\\\u0C0E-\\\\u0C10\\\\u0C12-\\\\u0C28\\\\u0C2A-\\\\u0C39\\\\u0C3D\\\\u0C58\\\\u0C59\\\\u0C60\\\\u0C61\\\\u0C85-\\\\u0C8C\\\\u0C8E-\\\\u0C90\\\\u0C92-\\\\u0CA8\\\\u0CAA-\\\\u0CB3\\\\u0CB5-\\\\u0CB9\\\\u0CBD\\\\u0CDE\\\\u0CE0\\\\u0CE1\\\\u0CF1\\\\u0CF2\\\\u0D05-\\\\u0D0C\\\\u0D0E-\\\\u0D10\\\\u0D12-\\\\u0D3A\\\\u0D3D\\\\u0D4E\\\\u0D60\\\\u0D61\\\\u0D7A-\\\\u0D7F\\\\u0D85-\\\\u0D96\\\\u0D9A-\\\\u0DB1\\\\u0DB3-\\\\u0DBB\\\\u0DBD\\\\u0DC0-\\\\u0DC6\\\\u0E01-\\\\u0E30\\\\u0E32\\\\u0E33\\\\u0E40-\\\\u0E46\\\\u0E81\\\\u0E82\\\\u0E84\\\\u0E87\\\\u0E88\\\\u0E8A\\\\u0E8D\\\\u0E94-\\\\u0E97\\\\u0E99-\\\\u0E9F\\\\u0EA1-\\\\u0EA3\\\\u0EA5\\\\u0EA7\\\\u0EAA\\\\u0EAB\\\\u0EAD-\\\\u0EB0\\\\u0EB2\\\\u0EB3\\\\u0EBD\\\\u0EC0-\\\\u0EC4\\\\u0EC6\\\\u0EDC-\\\\u0EDF\\\\u0F00\\\\u0F40-\\\\u0F47\\\\u0F49-\\\\u0F6C\\\\u0F88-\\\\u0F8C\\\\u1000-\\\\u102A\\\\u103F\\\\u1050-\\\\u1055\\\\u105A-\\\\u105D\\\\u1061\\\\u1065\\\\u1066\\\\u106E-\\\\u1070\\\\u1075-\\\\u1081\\\\u108E\\\\u10A0-\\\\u10C5\\\\u10C7\\\\u10CD\\\\u10D0-\\\\u10FA\\\\u10FC-\\\\u1248\\\\u124A-\\\\u124D\\\\u1250-\\\\u1256\\\\u1258\\\\u125A-\\\\u125D\\\\u1260-\\\\u1288\\\\u128A-\\\\u128D\\\\u1290-\\\\u12B0\\\\u12B2-\\\\u12B5\\\\u12B8-\\\\u12BE\\\\u12C0\\\\u12C2-\\\\u12C5\\\\u12C8-\\\\u12D6\\\\u12D8-\\\\u1310\\\\u1312-\\\\u1315\\\\u1318-\\\\u135A\\\\u1380-\\\\u138F\\\\u13A0-\\\\u13F4\\\\u1401-\\\\u166C\\\\u166F-\\\\u167F\\\\u1681-\\\\u169A\\\\u16A0-\\\\u16EA\\\\u16EE-\\\\u16F8\\\\u1700-\\\\u170C\\\\u170E-\\\\u1711\\\\u1720-\\\\u1731\\\\u1740-\\\\u1751\\\\u1760-\\\\u176C\\\\u176E-\\\\u1770\\\\u1780-\\\\u17B3\\\\u17D7\\\\u17DC\\\\u1820-\\\\u1877\\\\u1880-\\\\u18A8\\\\u18AA\\\\u18B0-\\\\u18F5\\\\u1900-\\\\u191E\\\\u1950-\\\\u196D\\\\u1970-\\\\u1974\\\\u1980-\\\\u19AB\\\\u19C1-\\\\u19C7\\\\u1A00-\\\\u1A16\\\\u1A20-\\\\u1A54\\\\u1AA7\\\\u1B05-\\\\u1B33\\\\u1B45-\\\\u1B4B\\\\u1B83-\\\\u1BA0\\\\u1BAE\\\\u1BAF\\\\u1BBA-\\\\u1BE5\\\\u1C00-\\\\u1C23\\\\u1C4D-\\\\u1C4F\\\\u1C5A-\\\\u1C7D\\\\u1CE9-\\\\u1CEC\\\\u1CEE-\\\\u1CF1\\\\u1CF5\\\\u1CF6\\\\u1D00-\\\\u1DBF\\\\u1E00-\\\\u1F15\\\\u1F18-\\\\u1F1D\\\\u1F20-\\\\u1F45\\\\u1F48-\\\\u1F4D\\\\u1F50-\\\\u1F57\\\\u1F59\\\\u1F5B\\\\u1F5D\\\\u1F5F-\\\\u1F7D\\\\u1F80-\\\\u1FB4\\\\u1FB6-\\\\u1FBC\\\\u1FBE\\\\u1FC2-\\\\u1FC4\\\\u1FC6-\\\\u1FCC\\\\u1FD0-\\\\u1FD3\\\\u1FD6-\\\\u1FDB\\\\u1FE0-\\\\u1FEC\\\\u1FF2-\\\\u1FF4\\\\u1FF6-\\\\u1FFC\\\\u2071\\\\u207F\\\\u2090-\\\\u209C\\\\u2102\\\\u2107\\\\u210A-\\\\u2113\\\\u2115\\\\u2119-\\\\u211D\\\\u2124\\\\u2126\\\\u2128\\\\u212A-\\\\u212D\\\\u212F-\\\\u2139\\\\u213C-\\\\u213F\\\\u2145-\\\\u2149\\\\u214E\\\\u2160-\\\\u2188\\\\u2C00-\\\\u2C2E\\\\u2C30-\\\\u2C5E\\\\u2C60-\\\\u2CE4\\\\u2CEB-\\\\u2CEE\\\\u2CF2\\\\u2CF3\\\\u2D00-\\\\u2D25\\\\u2D27\\\\u2D2D\\\\u2D30-\\\\u2D67\\\\u2D6F\\\\u2D80-\\\\u2D96\\\\u2DA0-\\\\u2DA6\\\\u2DA8-\\\\u2DAE\\\\u2DB0-\\\\u2DB6\\\\u2DB8-\\\\u2DBE\\\\u2DC0-\\\\u2DC6\\\\u2DC8-\\\\u2DCE\\\\u2DD0-\\\\u2DD6\\\\u2DD8-\\\\u2DDE\\\\u2E2F\\\\u3005-\\\\u3007\\\\u3021-\\\\u3029\\\\u3031-\\\\u3035\\\\u3038-\\\\u303C\\\\u3041-\\\\u3096\\\\u309D-\\\\u309F\\\\u30A1-\\\\u30FA\\\\u30FC-\\\\u30FF\\\\u3105-\\\\u312D\\\\u3131-\\\\u318E\\\\u31A0-\\\\u31BA\\\\u31F0-\\\\u31FF\\\\u3400-\\\\u4DB5\\\\u4E00-\\\\u9FCC\\\\uA000-\\\\uA48C\\\\uA4D0-\\\\uA4FD\\\\uA500-\\\\uA60C\\\\uA610-\\\\uA61F\\\\uA62A\\\\uA62B\\\\uA640-\\\\uA66E\\\\uA67F-\\\\uA69D\\\\uA6A0-\\\\uA6EF\\\\uA717-\\\\uA71F\\\\uA722-\\\\uA788\\\\uA78B-\\\\uA78E\\\\uA790-\\\\uA7AD\\\\uA7B0\\\\uA7B1\\\\uA7F7-\\\\uA801\\\\uA803-\\\\uA805\\\\uA807-\\\\uA80A\\\\uA80C-\\\\uA822\\\\uA840-\\\\uA873\\\\uA882-\\\\uA8B3\\\\uA8F2-\\\\uA8F7\\\\uA8FB\\\\uA90A-\\\\uA925\\\\uA930-\\\\uA946\\\\uA960-\\\\uA97C\\\\uA984-\\\\uA9B2\\\\uA9CF\\\\uA9E0-\\\\uA9E4\\\\uA9E6-\\\\uA9EF\\\\uA9FA-\\\\uA9FE\\\\uAA00-\\\\uAA28\\\\uAA40-\\\\uAA42\\\\uAA44-\\\\uAA4B\\\\uAA60-\\\\uAA76\\\\uAA7A\\\\uAA7E-\\\\uAAAF\\\\uAAB1\\\\uAAB5\\\\uAAB6\\\\uAAB9-\\\\uAABD\\\\uAAC0\\\\uAAC2\\\\uAADB-\\\\uAADD\\\\uAAE0-\\\\uAAEA\\\\uAAF2-\\\\uAAF4\\\\uAB01-\\\\uAB06\\\\uAB09-\\\\uAB0E\\\\uAB11-\\\\uAB16\\\\uAB20-\\\\uAB26\\\\uAB28-\\\\uAB2E\\\\uAB30-\\\\uAB5A\\\\uAB5C-\\\\uAB5F\\\\uAB64\\\\uAB65\\\\uABC0-\\\\uABE2\\\\uAC00-\\\\uD7A3\\\\uD7B0-\\\\uD7C6\\\\uD7CB-\\\\uD7FB\\\\uF900-\\\\uFA6D\\\\uFA70-\\\\uFAD9\\\\uFB00-\\\\uFB06\\\\uFB13-\\\\uFB17\\\\uFB1D\\\\uFB1F-\\\\uFB28\\\\uFB2A-\\\\uFB36\\\\uFB38-\\\\uFB3C\\\\uFB3E\\\\uFB40\\\\uFB41\\\\uFB43\\\\uFB44\\\\uFB46-\\\\uFBB1\\\\uFBD3-\\\\uFD3D\\\\uFD50-\\\\uFD8F\\\\uFD92-\\\\uFDC7\\\\uFDF0-\\\\uFDFB\\\\uFE70-\\\\uFE74\\\\uFE76-\\\\uFEFC\\\\uFF21-\\\\uFF3A\\\\uFF41-\\\\uFF5A\\\\uFF66-\\\\uFFBE\\\\uFFC2-\\\\uFFC7\\\\uFFCA-\\\\uFFCF\\\\uFFD2-\\\\uFFD7\\\\uFFDA-\\\\uFFDC]');\n    }());\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('util/parse-xml', [\n        'kendo.core',\n        'util/main'\n    ], f);\n}(function () {\n    'use strict';\n    var STRING = String.fromCharCode;\n    var ENTITIES = {\n        'amp': 38,\n        'lt': 60,\n        'gt': 62,\n        'quot': 34,\n        'apos': 39,\n        'nbsp': 160\n    };\n    function CODE(str) {\n        var out = [];\n        for (var i = 0; i < str.length; ++i) {\n            out.push(str.charCodeAt(i));\n        }\n        return out;\n    }\n    function UCS2(out, code) {\n        if (code > 65535) {\n            code -= 65536;\n            out.push(code >>> 10 & 1023 | 55296, 56320 | code & 1023);\n        } else {\n            out.push(code);\n        }\n    }\n    var START_CDATA = CODE('<![CDATA[');\n    var END_CDATA = CODE(']]>');\n    var END_COMMENT = CODE('-->');\n    var START_COMMENT = CODE('!--');\n    var END_SHORT_TAG = CODE('/>');\n    var END_TAG = CODE('</');\n    var END_DECLARATION = CODE('?>');\n    var QUESTION_MARK = CODE('?');\n    var LESS_THAN = CODE('<');\n    var GREATER_THAN = CODE('>');\n    var SEMICOLON = CODE(';');\n    var EQUAL = CODE('=');\n    var AMPERSAND = CODE('&');\n    var QUOTE = CODE('\"');\n    var APOSTROPHE = CODE('\\'');\n    var SHARP = CODE('#');\n    var LOWERCASE_X = CODE('x');\n    var UPPERCASE_X = CODE('X');\n    var EXIT = {};\n    function parse(data, callbacks) {\n        var index = 0;\n        var stack = [];\n        var object = {\n            is: function (selector) {\n                var i = stack.length, j = selector.length;\n                while (--i >= 0 && --j >= 0) {\n                    if (stack[i].$tag != selector[j] && selector[j] != '*') {\n                        return false;\n                    }\n                }\n                return j < 0 ? stack[stack.length - 1] : null;\n            },\n            exit: function () {\n                throw EXIT;\n            },\n            stack: stack\n        };\n        function readChar(body) {\n            var code = data[index++];\n            if (!(code & 240 ^ 240)) {\n                UCS2(body, (code & 3) << 18 | (data[index++] & 63) << 12 | (data[index++] & 63) << 6 | data[index++] & 63);\n            } else if (!(code & 224 ^ 224)) {\n                UCS2(body, (code & 15) << 12 | (data[index++] & 63) << 6 | data[index++] & 63);\n            } else if (!(code & 192 ^ 192)) {\n                UCS2(body, (code & 31) << 6 | data[index++] & 63);\n            } else {\n                body.push(code);\n            }\n        }\n        function croak(msg) {\n            throw new Error(msg + ', at ' + index);\n        }\n        function readWhile(pred) {\n            var a = [];\n            while (index < data.length && pred(data[index])) {\n                a.push(data[index++]);\n            }\n            return a;\n        }\n        function readAsciiWhile(pred) {\n            return STRING.apply(0, readWhile(pred));\n        }\n        function skipWhitespace() {\n            readWhile(isWhitespace);\n        }\n        function eat(a) {\n            var save = index;\n            for (var i = 0; i < a.length; ++i) {\n                if (data[index++] != a[i]) {\n                    index = save;\n                    return false;\n                }\n            }\n            return a;\n        }\n        function skip(code) {\n            if (!eat(code)) {\n                croak('Expecting ' + code.join(', '));\n            }\n        }\n        function isWhitespace(code) {\n            return code == 9 || code == 10 || code == 13 || code == 32;\n        }\n        function isDigit(code) {\n            return code >= 48 && code <= 57;\n        }\n        function isHexDigit(code) {\n            return code >= 48 && code <= 57 || (code |= 32) >= 97 && code <= 102;\n        }\n        function isNameStart(code) {\n            return code == 58 || code == 95 || (code |= 32) >= 97 && code <= 122;\n        }\n        function isName(code) {\n            return code == 45 || isDigit(code) || isNameStart(code);\n        }\n        function xmlComment() {\n            var body = [];\n            while (index < data.length) {\n                if (eat(END_COMMENT)) {\n                    return call('comment', STRING.apply(0, body));\n                }\n                readChar(body);\n            }\n        }\n        function xmlTag() {\n            var name, attrs;\n            if (eat(QUESTION_MARK)) {\n                xmlDecl();\n            } else if (eat(START_COMMENT)) {\n                xmlComment();\n            } else {\n                name = xmlName();\n                attrs = xmlAttrs(name);\n                stack.push(attrs);\n                if (eat(END_SHORT_TAG)) {\n                    call('enter', name, attrs, true);\n                } else {\n                    skip(GREATER_THAN);\n                    call('enter', name, attrs);\n                    xmlContent(name);\n                    if (name != xmlName()) {\n                        croak('Bad closing tag');\n                    }\n                    call('leave', name, attrs);\n                    skipWhitespace();\n                    skip(GREATER_THAN);\n                }\n                stack.pop();\n            }\n        }\n        function xmlContent(name) {\n            var body = [];\n            while (index < data.length) {\n                if (eat(END_TAG)) {\n                    return body.length && call('text', STRING.apply(0, body));\n                } else if (eat(START_CDATA)) {\n                    while (index < data.length && !eat(END_CDATA)) {\n                        readChar(body);\n                    }\n                } else if (eat(LESS_THAN)) {\n                    if (body.length) {\n                        call('text', STRING.apply(0, body));\n                    }\n                    xmlTag();\n                    body = [];\n                } else if (eat(AMPERSAND)) {\n                    xmlEntity(body);\n                } else {\n                    readChar(body);\n                }\n            }\n            croak('Unclosed tag ' + name);\n        }\n        function xmlName() {\n            if (!isNameStart(data[index])) {\n                croak('Expecting XML name');\n            }\n            return readAsciiWhile(isName);\n        }\n        function xmlString() {\n            var quote = eat(QUOTE) || eat(APOSTROPHE);\n            if (!quote) {\n                croak('Expecting string');\n            }\n            var body = [];\n            while (index < data.length) {\n                if (eat(quote)) {\n                    return STRING.apply(0, body);\n                } else if (eat(AMPERSAND)) {\n                    xmlEntity(body);\n                } else {\n                    readChar(body);\n                }\n            }\n            croak('Unfinished string');\n        }\n        function xmlEntity(body) {\n            var code;\n            if (eat(SHARP)) {\n                if (eat(LOWERCASE_X) || eat(UPPERCASE_X)) {\n                    code = parseInt(readAsciiWhile(isHexDigit), 16);\n                } else {\n                    code = parseInt(readAsciiWhile(isDigit), 10);\n                }\n                if (isNaN(code)) {\n                    croak('Bad numeric entity');\n                }\n            } else {\n                var name = xmlName();\n                code = ENTITIES[name];\n                if (code === undefined) {\n                    croak('Unknown entity ' + name);\n                }\n            }\n            UCS2(body, code);\n            skip(SEMICOLON);\n        }\n        function xmlDecl() {\n            call('decl', xmlName(), xmlAttrs());\n            skip(END_DECLARATION);\n        }\n        function xmlAttrs(name) {\n            var map = { $tag: name };\n            while (index < data.length) {\n                skipWhitespace();\n                var code = data[index];\n                if (code == 63 || code == 62 || code == 47) {\n                    break;\n                }\n                map[xmlName()] = (skip(EQUAL), xmlString());\n            }\n            return map;\n        }\n        function call(what, thing, arg1, arg2) {\n            var f = callbacks && callbacks[what];\n            if (f) {\n                f.call(object, thing, arg1, arg2);\n            }\n        }\n        var tmp = [];\n        readChar(tmp);\n        if (tmp[0] != 65279) {\n            index = 0;\n        }\n        while (index < data.length) {\n            skipWhitespace();\n            skip(LESS_THAN);\n            xmlTag();\n            skipWhitespace();\n        }\n    }\n    kendo.util.parseXML = function parseXML() {\n        try {\n            return parse.apply(this, arguments);\n        } catch (ex) {\n            if (ex !== EXIT) {\n                throw ex;\n            }\n        }\n    };\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('spreadsheet/commands', [\n        'kendo.core',\n        'kendo.binder',\n        'kendo.window',\n        'kendo.list',\n        'kendo.tabstrip'\n    ], f);\n}(function () {\n    (function (kendo) {\n        if (kendo.support.browser.msie && kendo.support.browser.version < 9) {\n            return;\n        }\n        var $ = kendo.jQuery;\n        var Command = kendo.spreadsheet.Command = kendo.Class.extend({\n            init: function (options) {\n                this.options = options;\n                this._workbook = options.workbook;\n                this._property = options && options.property;\n                this._state = {};\n            },\n            range: function (range) {\n                if (range !== undefined) {\n                    this._setRange(range);\n                }\n                return this._range;\n            },\n            _setRange: function (range) {\n                this._range = range;\n            },\n            redo: function () {\n                this.exec();\n            },\n            undo: function () {\n                this.setState(this._state);\n            },\n            getState: function () {\n                this._state = this.range().getState(this._property);\n            },\n            setState: function (state) {\n                this.range().setState(state);\n            },\n            _forEachCell: function (callback) {\n                var range = this.range();\n                var ref = range._ref;\n                ref.forEach(function (ref) {\n                    range.sheet().forEach(ref.toRangeRef(), callback.bind(this));\n                }.bind(this));\n            }\n        });\n        var TargetValueCommand = Command.extend({\n            init: function (options) {\n                Command.fn.init.call(this, options);\n                this._target = options.target;\n                this._value = options.value;\n            },\n            exec: function () {\n                this.getState();\n                this.setState(this._value);\n            }\n        });\n        kendo.spreadsheet.ColumnWidthCommand = TargetValueCommand.extend({\n            getState: function () {\n                this._state = this.range().sheet().columnWidth(this._target);\n            },\n            setState: function (state) {\n                this.range().sheet().columnWidth(this._target, state);\n            }\n        });\n        kendo.spreadsheet.RowHeightCommand = TargetValueCommand.extend({\n            getState: function () {\n                this._state = this.range().sheet().rowHeight(this._target);\n            },\n            setState: function (state) {\n                this.range().sheet().rowHeight(this._target, state);\n            }\n        });\n        kendo.spreadsheet.HyperlinkCommand = Command.extend({\n            init: function (options) {\n                Command.fn.init.call(this, options);\n                this._link = options.link;\n            },\n            exec: function () {\n                var range = this.range();\n                this._prevLink = range.link();\n                this._prevUnderline = range.underline();\n                range.link(this._link);\n                range.underline(true);\n                if (range.value() == null) {\n                    this._hasSetValue = true;\n                    range.value(this._link);\n                }\n            },\n            undo: function () {\n                var range = this.range();\n                range.link(this._prevLink);\n                range.underline(this._prevUnderline);\n                if (this._hasSetValue) {\n                    range.value(null);\n                }\n            }\n        });\n        kendo.spreadsheet.GridLinesChangeCommand = TargetValueCommand.extend({\n            getState: function () {\n                this._state = this._range.sheet().showGridLines();\n            },\n            setState: function (v) {\n                this._range.sheet().showGridLines(v);\n            }\n        });\n        var PropertyChangeCommand = kendo.spreadsheet.PropertyChangeCommand = Command.extend({\n            _setRange: function (range) {\n                Command.prototype._setRange.call(this, range.skipHiddenCells());\n            },\n            init: function (options) {\n                Command.fn.init.call(this, options);\n                this._value = options.value;\n            },\n            exec: function () {\n                var range = this.range();\n                if (range.enable()) {\n                    this.getState();\n                    if (this.options.property === 'format') {\n                        this._workbook.trigger('changeFormat', { range: range });\n                    }\n                    range[this._property](this._value);\n                }\n            }\n        });\n        kendo.spreadsheet.ClearContentCommand = Command.extend({\n            exec: function () {\n                this.getState();\n                this.range().clearContent();\n            }\n        });\n        kendo.spreadsheet.EditCommand = PropertyChangeCommand.extend({\n            init: function (options) {\n                options.property = options.property || 'input';\n                PropertyChangeCommand.fn.init.call(this, options);\n            },\n            rejectState: function (validationState) {\n                this.undo();\n                return {\n                    title: validationState.title,\n                    body: validationState.message,\n                    reason: 'error',\n                    type: 'validationError'\n                };\n            },\n            getState: function () {\n                this._state = this.range().getState();\n            },\n            exec: function () {\n                var range = this.range();\n                if (!range.enable()) {\n                    return {\n                        reason: 'error',\n                        type: 'rangeDisabled'\n                    };\n                }\n                var value = this._value;\n                this.getState();\n                if (this._property == 'value') {\n                    range.value(value);\n                    return;\n                }\n                try {\n                    range.link(null);\n                    if (value === '') {\n                        range.value(null);\n                    } else {\n                        range.input(value);\n                        if (/\\n/.test(range.value())) {\n                            range.wrap(true);\n                        }\n                    }\n                    range._adjustRowHeight();\n                    var validationState = range._getValidationState();\n                    if (validationState) {\n                        return this.rejectState(validationState);\n                    }\n                } catch (ex) {\n                    if (ex instanceof kendo.spreadsheet.calc.ParseError) {\n                        return {\n                            title: 'Error in formula',\n                            body: ex + '',\n                            reason: 'error'\n                        };\n                    } else {\n                        throw ex;\n                    }\n                }\n            }\n        });\n        kendo.spreadsheet.TextWrapCommand = PropertyChangeCommand.extend({\n            init: function (options) {\n                options.property = 'wrap';\n                PropertyChangeCommand.fn.init.call(this, options);\n                this._value = options.value;\n            },\n            getState: function () {\n                var rowHeight = {};\n                this.range().forEachRow(function (range) {\n                    var index = range.topLeft().row;\n                    rowHeight[index] = range.sheet().rowHeight(index);\n                });\n                this._state = this.range().getState(this._property);\n                this._rowHeight = rowHeight;\n            },\n            undo: function () {\n                var sheet = this.range().sheet();\n                var rowHeight = this._rowHeight;\n                this.range().setState(this._state);\n                for (var row in rowHeight) {\n                    sheet.rowHeight(row, rowHeight[row]);\n                }\n            }\n        });\n        kendo.spreadsheet.AdjustDecimalsCommand = Command.extend({\n            init: function (options) {\n                this._decimals = options.value;\n                options.property = 'format';\n                Command.fn.init.call(this, options);\n            },\n            exec: function () {\n                var sheet = this.range().sheet();\n                var decimals = this._decimals;\n                var formatting = kendo.spreadsheet.formatting;\n                this.getState();\n                sheet.batch(function () {\n                    this.range().forEachCell(function (row, col, cell) {\n                        var format = cell.format;\n                        if (format || decimals > 0) {\n                            format = formatting.adjustDecimals(format || '#', decimals);\n                            sheet.range(row, col).format(format);\n                        }\n                    });\n                }.bind(this));\n            }\n        });\n        kendo.spreadsheet.BorderChangeCommand = Command.extend({\n            init: function (options) {\n                options.property = 'border';\n                Command.fn.init.call(this, options);\n                this._type = options.border;\n                this._style = options.style;\n            },\n            _batch: function (f) {\n                return this.range().sheet().batch(f, {});\n            },\n            exec: function () {\n                var self = this;\n                self.getState();\n                self._batch(function () {\n                    self[self._type](self._style);\n                });\n            },\n            noBorders: function () {\n                this.range().insideBorders(null);\n                this.outsideBorders(null);\n            },\n            allBorders: function (style) {\n                this.range().insideBorders(style);\n                this.outsideBorders(style);\n            },\n            leftBorder: function (style) {\n                this.range().leftColumn().borderLeft(style);\n            },\n            rightBorder: function (style) {\n                this.range().rightColumn().borderRight(style);\n            },\n            topBorder: function (style) {\n                this.range().topRow().borderTop(style);\n            },\n            bottomBorder: function (style) {\n                this.range().bottomRow().borderBottom(style);\n            },\n            outsideBorders: function (style) {\n                var range = this.range();\n                range.leftColumn().borderLeft(style);\n                range.topRow().borderTop(style);\n                range.rightColumn().borderRight(style);\n                range.bottomRow().borderBottom(style);\n            },\n            insideBorders: function (style) {\n                this.range().insideBorders(style);\n                this.outsideBorders(null);\n            },\n            insideHorizontalBorders: function (style) {\n                this.range().insideHorizontalBorders(style);\n            },\n            insideVerticalBorders: function (style) {\n                this.range().insideVerticalBorders(style);\n            }\n        });\n        kendo.spreadsheet.MergeCellCommand = Command.extend({\n            init: function (options) {\n                Command.fn.init.call(this, options);\n                this._type = options.value;\n            },\n            exec: function () {\n                this.getState();\n                this[this._type]();\n            },\n            activate: function (ref) {\n                this.range().sheet().activeCell(ref);\n            },\n            getState: function () {\n                this._state = this.range().getState();\n            },\n            undo: function () {\n                if (this._type !== 'unmerge') {\n                    this.range().unmerge();\n                    this.activate(this.range().topLeft());\n                }\n                this.range().setState(this._state);\n            },\n            cells: function () {\n                var range = this.range();\n                var ref = range._ref;\n                range.merge();\n                this.activate(ref);\n            },\n            horizontally: function () {\n                var ref = this.range().topRow()._ref;\n                this.range().forEachRow(function (range) {\n                    range.merge();\n                });\n                this.activate(ref);\n            },\n            vertically: function () {\n                var ref = this.range().leftColumn()._ref;\n                this.range().forEachColumn(function (range) {\n                    range.merge();\n                });\n                this.activate(ref);\n            },\n            unmerge: function () {\n                var range = this.range();\n                var ref = range._ref.topLeft;\n                range.unmerge();\n                this.activate(ref);\n            }\n        });\n        kendo.spreadsheet.FreezePanesCommand = Command.extend({\n            init: function (options) {\n                Command.fn.init.call(this, options);\n                this._type = options.value;\n            },\n            exec: function () {\n                this.getState();\n                this._topLeft = this.range().topLeft();\n                this[this._type]();\n            },\n            getState: function () {\n                this._state = this.range().sheet().getState();\n            },\n            undo: function () {\n                this.range().sheet().setState(this._state);\n            },\n            panes: function () {\n                var topLeft = this._topLeft;\n                var sheet = this.range().sheet();\n                sheet.frozenColumns(topLeft.col).frozenRows(topLeft.row);\n            },\n            rows: function () {\n                var topLeft = this._topLeft;\n                var sheet = this.range().sheet();\n                sheet.frozenRows(topLeft.row);\n            },\n            columns: function () {\n                var topLeft = this._topLeft;\n                var sheet = this.range().sheet();\n                sheet.frozenColumns(topLeft.col);\n            },\n            unfreeze: function () {\n                var sheet = this.range().sheet();\n                sheet.frozenRows(0).frozenColumns(0);\n            }\n        });\n        kendo.spreadsheet.PasteCommand = Command.extend({\n            init: function (options) {\n                Command.fn.init.call(this, options);\n                this._clipboard = options.workbook.clipboard();\n                this._event = options.event;\n            },\n            getState: function () {\n                this._range = this._workbook.activeSheet().range(this._clipboard.pasteRef());\n                this._state = this._range.getState();\n            },\n            exec: function () {\n                this.getState();\n                this._clipboard.parse();\n                var status = this._clipboard.canPaste();\n                if (!status.canPaste) {\n                    if (status.menuInvoked) {\n                        return {\n                            reason: 'error',\n                            type: 'useKeyboard'\n                        };\n                    }\n                    if (status.pasteOnMerged) {\n                        return {\n                            reason: 'error',\n                            type: 'modifyMerged'\n                        };\n                    }\n                    if (status.overflow) {\n                        return {\n                            reason: 'error',\n                            type: 'overflow'\n                        };\n                    }\n                    if (status.pasteOnDisabled) {\n                        this._event.preventDefault();\n                        return {\n                            reason: 'error',\n                            type: 'cannotModifyDisabled'\n                        };\n                    }\n                    return { reason: 'error' };\n                }\n                var range = this._workbook.activeSheet().selection();\n                var preventDefault = this._workbook.trigger('paste', { range: range });\n                if (preventDefault) {\n                    this._event.preventDefault();\n                } else {\n                    this._clipboard.paste();\n                    range._adjustRowHeight();\n                }\n            }\n        });\n        kendo.spreadsheet.AdjustRowHeightCommand = Command.extend({\n            exec: function () {\n                var options = this.options;\n                var sheet = this._workbook.activeSheet();\n                var range = options.range || sheet.range(options.rowIndex);\n                range._adjustRowHeight();\n            }\n        });\n        kendo.spreadsheet.ToolbarPasteCommand = Command.extend({\n            exec: function () {\n                if (kendo.support.clipboard.paste) {\n                    this._workbook._view.clipboard.focus().select();\n                    document.execCommand('paste');\n                } else {\n                    return {\n                        reason: 'error',\n                        type: 'useKeyboard'\n                    };\n                }\n            }\n        });\n        kendo.spreadsheet.CopyCommand = Command.extend({\n            init: function (options) {\n                Command.fn.init.call(this, options);\n                this._clipboard = options.workbook.clipboard();\n                this._event = options.event;\n            },\n            undo: $.noop,\n            exec: function () {\n                var status = this._clipboard.canCopy();\n                this._clipboard.menuInvoked = true;\n                if (!status.canCopy) {\n                    if (status.menuInvoked) {\n                        return {\n                            reason: 'error',\n                            type: 'useKeyboard'\n                        };\n                    } else if (status.multiSelection) {\n                        return {\n                            reason: 'error',\n                            type: 'unsupportedSelection'\n                        };\n                    }\n                    return;\n                }\n                var range = this._workbook.activeSheet().selection();\n                var preventDefault = this._workbook.trigger('copy', { range: range });\n                if (preventDefault) {\n                    this._event.preventDefault();\n                } else {\n                    this._clipboard.copy();\n                }\n            }\n        });\n        function copyToClipboard(html) {\n            var textarea = document.createElement('textarea');\n            $(textarea).addClass('k-spreadsheet-clipboard').val(html).appendTo(document.body).focus().select();\n            document.execCommand('copy');\n            $(textarea).remove();\n        }\n        kendo.spreadsheet.ToolbarCopyCommand = Command.extend({\n            init: function (options) {\n                Command.fn.init.call(this, options);\n                this._clipboard = options.workbook.clipboard();\n            },\n            undo: $.noop,\n            exec: function () {\n                if (kendo.support.clipboard.copy) {\n                    var clipboard = this._workbook._view.clipboard;\n                    copyToClipboard(clipboard.html());\n                    clipboard.trigger('copy');\n                } else {\n                    return {\n                        reason: 'error',\n                        type: 'useKeyboard'\n                    };\n                }\n            }\n        });\n        kendo.spreadsheet.CutCommand = Command.extend({\n            init: function (options) {\n                Command.fn.init.call(this, options);\n                this._clipboard = options.workbook.clipboard();\n                this._event = options.event;\n            },\n            exec: function () {\n                if (!(this.range().enable() && this._clipboard.canCopy())) {\n                    this._event.preventDefault();\n                    return {\n                        reason: 'error',\n                        type: 'cannotModifyDisabled'\n                    };\n                }\n                this.getState();\n                var range = this._workbook.activeSheet().selection();\n                var preventDefault = this._workbook.trigger('cut', { range: range });\n                if (preventDefault) {\n                    this._event.preventDefault();\n                    return;\n                }\n                this._clipboard.cut();\n            }\n        });\n        kendo.spreadsheet.AutoFillCommand = Command.extend({\n            init: function (options) {\n                Command.fn.init.call(this, options);\n            },\n            origin: function (origin) {\n                this._origin = origin;\n            },\n            exec: function () {\n                var range = this.range();\n                if (!range.enable()) {\n                    return {\n                        reason: 'error',\n                        type: 'rangeDisabled'\n                    };\n                }\n                this.getState();\n                try {\n                    range.fillFrom(this._origin);\n                } catch (ex) {\n                    if (ex instanceof kendo.spreadsheet.Range.FillError) {\n                        return {\n                            reason: 'error',\n                            type: ex.code\n                        };\n                    }\n                    throw ex;\n                }\n            }\n        });\n        kendo.spreadsheet.ToolbarCutCommand = Command.extend({\n            init: function (options) {\n                Command.fn.init.call(this, options);\n                this._clipboard = options.workbook.clipboard();\n            },\n            exec: function () {\n                if (kendo.support.clipboard.copy) {\n                    var clipboard = this._workbook._view.clipboard;\n                    copyToClipboard(clipboard.html());\n                    clipboard.trigger('cut');\n                } else {\n                    return {\n                        reason: 'error',\n                        type: 'useKeyboard'\n                    };\n                }\n            }\n        });\n        kendo.spreadsheet.FilterCommand = Command.extend({\n            undo: function () {\n                this.range().filter(this._state);\n            },\n            exec: function () {\n                var range = this.range();\n                this._state = range.hasFilter();\n                range.filter(!this._state);\n            }\n        });\n        kendo.spreadsheet.SortCommand = Command.extend({\n            undo: function () {\n                var sheet = this.range().sheet();\n                sheet.setState(this._state);\n            },\n            exec: function () {\n                var range = this.range();\n                var sheet = range.sheet();\n                var activeCell = sheet.activeCell();\n                var col = this.options.sheet ? activeCell.topLeft.col : this.options.column || 0;\n                var ascending = this.options.value === 'asc' ? true : false;\n                this._state = sheet.getState();\n                if (this.options.sheet) {\n                    range = this.expandRange();\n                }\n                var reason = range.cantSort();\n                if (reason) {\n                    return {\n                        reason: 'error',\n                        type: reason.code\n                    };\n                }\n                range.sort({\n                    column: col,\n                    ascending: ascending\n                });\n            },\n            expandRange: function () {\n                var sheet = this.range().sheet();\n                return new kendo.spreadsheet.Range(sheet._sheetRef, sheet);\n            }\n        });\n        var ApplyFilterCommand = kendo.spreadsheet.ApplyFilterCommand = Command.extend({\n            column: function () {\n                return this.options.column || 0;\n            },\n            undo: function () {\n                var sheet = this.range().sheet();\n                sheet.clearFilter(this.column());\n                if (this._state.length) {\n                    this.range().filter(this._state);\n                }\n            },\n            getState: function () {\n                var sheet = this.range().sheet();\n                var current = sheet.filter();\n                if (current) {\n                    this._state = current.columns.filter(function (c) {\n                        return c.index == this.column();\n                    }.bind(this));\n                }\n            },\n            exec: function () {\n                var range = this.range();\n                var column = this.column();\n                var current = range.sheet().filter();\n                var options;\n                var filterRule;\n                var exists = false;\n                if (this.options.valueFilter) {\n                    filterRule = {\n                        column: column,\n                        filter: new kendo.spreadsheet.ValueFilter(this.options.valueFilter)\n                    };\n                } else if (this.options.customFilter) {\n                    filterRule = {\n                        column: column,\n                        filter: new kendo.spreadsheet.CustomFilter(this.options.customFilter)\n                    };\n                }\n                this.getState();\n                if (current && current.ref.eq(range._ref) && current.columns.length) {\n                    current.columns.forEach(function (element) {\n                        if (element.index === column) {\n                            exists = true;\n                        }\n                    });\n                    options = current.columns.map(function (element) {\n                        return element.index === column ? filterRule : {\n                            column: element.index,\n                            filter: element.filter\n                        };\n                    });\n                    if (!exists) {\n                        options.push(filterRule);\n                    }\n                } else {\n                    options = filterRule;\n                }\n                range.filter(options);\n            }\n        });\n        kendo.spreadsheet.ClearFilterCommand = ApplyFilterCommand.extend({\n            exec: function () {\n                var range = this.range();\n                var column = this.column();\n                this.getState();\n                range.clearFilter(column);\n            }\n        });\n        kendo.spreadsheet.HideLineCommand = Command.extend({\n            init: function (options) {\n                Command.fn.init.call(this, options);\n                this.axis = options.axis;\n            },\n            undo: function () {\n                var sheet = this.range().sheet();\n                sheet.setAxisState(this._state);\n            },\n            exec: function () {\n                var sheet = this.range().sheet();\n                this._state = sheet.getAxisState();\n                if (this.axis == 'row') {\n                    sheet.axisManager().hideSelectedRows();\n                } else {\n                    sheet.axisManager().hideSelectedColumns();\n                }\n            }\n        });\n        kendo.spreadsheet.UnHideLineCommand = kendo.spreadsheet.HideLineCommand.extend({\n            exec: function () {\n                var sheet = this.range().sheet();\n                this._state = sheet.getAxisState();\n                if (this.axis == 'row') {\n                    sheet.axisManager().unhideSelectedRows();\n                } else {\n                    sheet.axisManager().unhideSelectedColumns();\n                }\n            }\n        });\n        var DeleteCommand = kendo.spreadsheet.DeleteCommand = Command.extend({\n            undo: function () {\n                var sheet = this.range().sheet();\n                sheet.setState(this._state);\n            }\n        });\n        kendo.spreadsheet.DeleteRowCommand = DeleteCommand.extend({\n            exec: function () {\n                var sheet = this.range().sheet();\n                this._state = sheet.getState();\n                sheet.axisManager().deleteSelectedRows();\n            }\n        });\n        kendo.spreadsheet.DeleteColumnCommand = DeleteCommand.extend({\n            exec: function () {\n                var sheet = this.range().sheet();\n                this._state = sheet.getState();\n                sheet.axisManager().deleteSelectedColumns();\n            }\n        });\n        var AddCommand = Command.extend({\n            init: function (options) {\n                Command.fn.init.call(this, options);\n                this._value = options.value;\n            },\n            undo: function () {\n                var sheet = this.range().sheet();\n                sheet.setState(this._state);\n            }\n        });\n        kendo.spreadsheet.AddColumnCommand = AddCommand.extend({\n            exec: function () {\n                var sheet = this.range().sheet();\n                var result = sheet.axisManager().preventAddColumn();\n                if (result) {\n                    return result;\n                }\n                this._state = sheet.getState();\n                if (this._value === 'left') {\n                    sheet.axisManager().addColumnLeft();\n                } else {\n                    sheet.axisManager().addColumnRight();\n                }\n            }\n        });\n        kendo.spreadsheet.AddRowCommand = AddCommand.extend({\n            exec: function () {\n                var sheet = this.range().sheet();\n                var result = sheet.axisManager().preventAddRow();\n                if (result) {\n                    return result;\n                }\n                this._state = sheet.getState();\n                if (this._value === 'above') {\n                    sheet.axisManager().addRowAbove();\n                } else {\n                    sheet.axisManager().addRowBelow();\n                }\n            }\n        });\n        kendo.spreadsheet.EditValidationCommand = Command.extend({\n            init: function (options) {\n                Command.fn.init.call(this, options);\n                this._value = options.value;\n            },\n            exec: function () {\n                this.range().validation(this._value);\n            }\n        });\n        kendo.spreadsheet.OpenCommand = Command.extend({\n            cannotUndo: true,\n            exec: function () {\n                var file = this.options.file;\n                if (file.name.match(/.xlsx$/i) === null) {\n                    return {\n                        reason: 'error',\n                        type: 'openUnsupported'\n                    };\n                }\n                var workbook = this.options.workbook;\n                workbook.fromFile(this.options.file).then(function () {\n                    var errors = workbook.excelImportErrors;\n                    if (errors && errors.length) {\n                        workbook._view.openDialog('importError', { errors: errors });\n                    }\n                });\n            }\n        });\n        kendo.spreadsheet.SaveAsCommand = Command.extend({\n            exec: function () {\n                var fileName = this.options.name + this.options.extension;\n                if (this.options.extension === '.xlsx') {\n                    this.options.workbook.saveAsExcel({ fileName: fileName });\n                } else if (this.options.extension === '.pdf') {\n                    this.options.workbook.saveAsPDF($.extend(this.options.pdf, {\n                        workbook: this.options.workbook,\n                        fileName: fileName\n                    }));\n                }\n            }\n        });\n        var NameCommand = Command.extend({\n            init: function (options) {\n                Command.fn.init.call(this, options);\n                this._name = options.name;\n                this._value = options.value;\n            },\n            getState: function () {\n                this._state = this._workbook.nameDefinition(this._name);\n            },\n            setState: function () {\n                this._workbook.nameDefinition(this._name, this._state);\n                this._workbook.trigger('change', { recalc: true });\n            }\n        });\n        kendo.spreadsheet.DefineNameCommand = NameCommand.extend({\n            exec: function () {\n                this.getState();\n                try {\n                    this._workbook.defineName(this._name, this._value);\n                    this._workbook.trigger('change', { recalc: true });\n                } catch (ex) {\n                    return {\n                        title: 'Error',\n                        body: ex + '',\n                        reason: 'error'\n                    };\n                }\n            }\n        });\n        kendo.spreadsheet.DeleteNameCommand = NameCommand.extend({\n            exec: function () {\n                this.getState();\n                this._workbook.undefineName(this._name);\n                this._workbook.trigger('change', { recalc: true });\n            }\n        });\n    }(kendo));\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('spreadsheet/formulabar', ['kendo.core'], f);\n}(function () {\n    (function (kendo) {\n        if (kendo.support.browser.msie && kendo.support.browser.version < 9) {\n            return;\n        }\n        var $ = kendo.jQuery;\n        var classNames = { wrapper: 'k-spreadsheet-formula-bar' };\n        var FormulaBar = kendo.ui.Widget.extend({\n            init: function (element, options) {\n                kendo.ui.Widget.call(this, element, options);\n                element = this.element.addClass(FormulaBar.classNames.wrapper);\n                this.formulaInput = new kendo.spreadsheet.FormulaInput($('<div/>').appendTo(element));\n            },\n            destroy: function () {\n                if (this.formulaInput) {\n                    this.formulaInput.destroy();\n                }\n                this.formulaInput = null;\n            }\n        });\n        kendo.spreadsheet.FormulaBar = FormulaBar;\n        $.extend(true, FormulaBar, { classNames: classNames });\n    }(window.kendo));\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('spreadsheet/formulainput', ['kendo.core'], f);\n}(function () {\n    (function (kendo, window) {\n        if (kendo.support.browser.msie && kendo.support.browser.version < 9) {\n            return;\n        }\n        var $ = kendo.jQuery;\n        var Widget = kendo.ui.Widget;\n        var ns = '.kendoFormulaInput';\n        var keys = kendo.keys;\n        var classNames = {\n            wrapper: 'k-spreadsheet-formula-input',\n            listWrapper: 'k-spreadsheet-formula-list'\n        };\n        var styles = [\n            'font-family',\n            'font-size',\n            'font-stretch',\n            'font-style',\n            'font-weight',\n            'letter-spacing',\n            'text-transform',\n            'line-height'\n        ];\n        var KEY_NAMES = {\n            27: 'esc',\n            37: 'left',\n            39: 'right',\n            35: 'end',\n            36: 'home',\n            32: 'spacebar'\n        };\n        var PRIVATE_FORMULA_CHECK = /(^_|[^a-z0-9]$)/i;\n        var FormulaInput = Widget.extend({\n            init: function (element, options) {\n                Widget.call(this, element, options);\n                element = this.element;\n                element.addClass(FormulaInput.classNames.wrapper).attr('contenteditable', true).attr('spellcheck', false).css('white-space', 'pre');\n                if (this.options.autoScale) {\n                    element.on('input', this.scale.bind(this));\n                }\n                this._highlightedRefs = [];\n                this._staticTokens = [];\n                this._formulaSource();\n                this._formulaList();\n                this._popup();\n                this._tooltip();\n                element.on('keydown', this._keydown.bind(this)).on('keyup', this._keyup.bind(this)).on('blur', this._blur.bind(this)).on('input click', this._input.bind(this)).on('focus', this._focus.bind(this)).on('paste', this._paste.bind(this));\n            },\n            options: {\n                name: 'FormulaInput',\n                autoScale: false,\n                filterOperator: 'startswith',\n                scalePadding: 30,\n                minLength: 1\n            },\n            events: [\n                'keyup',\n                'focus'\n            ],\n            enable: function (enable) {\n                if (enable === undefined) {\n                    return this.element.attr('contenteditable') === 'true';\n                }\n                if (enable) {\n                    this.element.attr('contenteditable', enable);\n                } else {\n                    this.element.removeAttr('contenteditable');\n                }\n                this.element.toggleClass('k-state-disabled', !enable);\n            },\n            getPos: function () {\n                var div = this.element[0];\n                var sel = window.getSelection();\n                var a = lookup(sel.focusNode, sel.focusOffset);\n                var b = lookup(sel.anchorNode, sel.anchorOffset);\n                if (a != null && b != null) {\n                    if (a > b) {\n                        var tmp = a;\n                        a = b;\n                        b = tmp;\n                    }\n                    return {\n                        begin: a,\n                        end: b,\n                        collapsed: a == b\n                    };\n                }\n                function lookup(lookupNode, pos) {\n                    try {\n                        (function loop(node) {\n                            if (node === lookupNode) {\n                                throw pos;\n                            } else if (node.nodeType == 1) {\n                                for (var i = node.firstChild; i; i = i.nextSibling) {\n                                    loop(i);\n                                }\n                            } else if (node.nodeType == 3) {\n                                pos += node.nodeValue.length;\n                            }\n                        }(div));\n                    } catch (index) {\n                        return index;\n                    }\n                }\n            },\n            setPos: function (begin, end) {\n                var eiv = this.element[0];\n                begin = lookup(eiv, begin);\n                if (end != null) {\n                    end = lookup(eiv, end);\n                } else {\n                    end = begin;\n                }\n                if (begin && end) {\n                    var range = document.createRange();\n                    range.setStart(begin.node, begin.pos);\n                    range.setEnd(end.node, end.pos);\n                    var sel = window.getSelection();\n                    var currentRange = sel.getRangeAt(0);\n                    if (differ(range, currentRange)) {\n                        sel.removeAllRanges();\n                        sel.addRange(range);\n                    }\n                }\n                function differ(a, b) {\n                    return a.startOffset != b.startOffset || a.endOffset != b.endOffset || a.startContainer != b.endContainer || a.endContainer != b.endContainer;\n                }\n                function lookup(node, pos) {\n                    try {\n                        (function loop(node) {\n                            if (node.nodeType == 3) {\n                                var len = node.nodeValue.length;\n                                if (len >= pos) {\n                                    throw node;\n                                }\n                                pos -= len;\n                            } else if (node.nodeType == 1) {\n                                for (var i = node.firstChild; i; i = i.nextSibling) {\n                                    loop(i);\n                                }\n                            }\n                        }(node));\n                    } catch (el) {\n                        return {\n                            node: el,\n                            pos: pos\n                        };\n                    }\n                }\n            },\n            end: function () {\n                this.setPos(this.length());\n            },\n            home: function () {\n                this.setPos(0);\n            },\n            select: function () {\n                this.setPos(0, this.length());\n            },\n            length: function () {\n                return this.value().length;\n            },\n            _formulaSource: function () {\n                var result = [];\n                var value;\n                for (var key in kendo.spreadsheet.calc.runtime.FUNCS) {\n                    if (!PRIVATE_FORMULA_CHECK.test(key)) {\n                        value = key.toUpperCase();\n                        result.push({\n                            value: value,\n                            text: value\n                        });\n                    }\n                }\n                this.formulaSource = new kendo.data.DataSource({ data: result });\n            },\n            _formulaList: function () {\n                this.list = new kendo.ui.StaticList($('<ul />').addClass(FormulaInput.classNames.listWrapper).insertAfter(this.element), {\n                    autoBind: false,\n                    selectable: true,\n                    change: this._formulaListChange.bind(this),\n                    dataSource: this.formulaSource,\n                    dataValueField: 'value',\n                    template: '#:data.value#'\n                });\n                this.list.element.on('mousedown', function (e) {\n                    e.preventDefault();\n                });\n            },\n            _formulaListChange: function () {\n                var tokenCtx = this._tokenContext();\n                if (!tokenCtx || this._mute) {\n                    return;\n                }\n                var activeToken = tokenCtx.token;\n                var completion = this.list.value()[0];\n                var ctx = {\n                    replace: true,\n                    token: activeToken,\n                    end: activeToken.end\n                };\n                if (!tokenCtx.nextToken || tokenCtx.nextToken.value != '(') {\n                    completion += '(';\n                }\n                this._replaceAt(ctx, completion);\n                this.popup.close();\n            },\n            _popup: function () {\n                this.popup = new kendo.ui.Popup(this.list.element, { anchor: this.element });\n            },\n            _blur: function () {\n                this.popup.close();\n                clearTimeout(this._focusId);\n                this.trigger('blur');\n            },\n            _isFormula: function () {\n                return /^=/.test(this.value());\n            },\n            _keydown: function (e) {\n                var key = e.keyCode;\n                if (KEY_NAMES[key]) {\n                    this.popup.close();\n                    this._navigated = true;\n                } else if (this._move(key)) {\n                    this._navigated = true;\n                    e.preventDefault();\n                }\n                this._keyDownTimeout = setTimeout(this._syntaxHighlight.bind(this));\n            },\n            _keyup: function () {\n                var popup = this.popup;\n                var value;\n                if (this._isFormula() && !this._navigated) {\n                    value = ((this._tokenContext() || {}).token || {}).value;\n                    this.filter(value);\n                    if (!value || !this.formulaSource.view().length) {\n                        popup.close();\n                    } else {\n                        popup[popup.visible() ? 'position' : 'open']();\n                        this.list.focusFirst();\n                    }\n                }\n                this._navigated = false;\n                this._syntaxHighlight();\n                this.trigger('keyup');\n            },\n            _input: function () {\n                this._syntaxHighlight();\n            },\n            _focus: function () {\n                this._focusTimeout = setTimeout(this._syntaxHighlight.bind(this));\n                this.trigger('focus');\n            },\n            _paste: function (ev) {\n                ev.preventDefault();\n                var pos = this.getPos();\n                var text;\n                if (kendo.support.browser.msie) {\n                    text = window.clipboardData.getData('Text');\n                } else {\n                    text = ev.originalEvent.clipboardData.getData('text/plain');\n                }\n                var val = this.value();\n                val = val.substr(0, pos.begin) + text + val.substr(pos.end);\n                this.value(val);\n                this.setPos(pos.begin + text.length);\n                this.scale();\n            },\n            _move: function (key) {\n                var list = this.list;\n                var popup = this.popup;\n                if (popup.visible()) {\n                    if (key === keys.DOWN) {\n                        list.focusNext();\n                        if (!list.focus()) {\n                            list.focusFirst();\n                        }\n                        return true;\n                    }\n                    if (key === keys.UP) {\n                        list.focusPrev();\n                        if (!list.focus()) {\n                            list.focusLast();\n                        }\n                        return true;\n                    }\n                    if (key === keys.ENTER) {\n                        list.select(list.focus());\n                        popup.close();\n                        return true;\n                    }\n                    if (key === keys.TAB) {\n                        list.select(list.focus());\n                        popup.close();\n                        return true;\n                    }\n                    if (key === keys.PAGEUP) {\n                        list.focusFirst();\n                        return true;\n                    }\n                    if (key === keys.PAGEDOWN) {\n                        list.focusLast();\n                        return true;\n                    }\n                }\n                return key === keys.ENTER || key === keys.TAB;\n            },\n            _tokenContext: function () {\n                var point = this.getPos();\n                var value = this.value();\n                if (!value || !point || !point.collapsed) {\n                    return null;\n                }\n                var tokens = kendo.spreadsheet.calc.tokenize(value, this.row(), this.col());\n                var tok;\n                for (var i = 0; i < tokens.length; ++i) {\n                    tok = tokens[i];\n                    if (touches(tok, point) && /^(?:str|sym|func)$/.test(tok.type)) {\n                        return {\n                            token: tok,\n                            nextToken: tokens[i + 1]\n                        };\n                    }\n                }\n                return null;\n            },\n            _sync: function () {\n                if (this._editorToSync && this.isActive()) {\n                    this._editorToSync.value(this.value());\n                }\n            },\n            _textContainer: function () {\n                var computedStyles = kendo.getComputedStyles(this.element[0], styles);\n                computedStyles.position = 'absolute';\n                computedStyles.visibility = 'hidden';\n                computedStyles.whiteSpace = 'pre';\n                computedStyles.top = -3333;\n                computedStyles.left = -3333;\n                this._span = $('<span style=\\'white-space: pre\\'/>').css(computedStyles).insertAfter(this.element);\n            },\n            _tooltip: function () {\n                this._cellTooltip = $('<div class=\"k-widget k-tooltip\" style=\"position:absolute; display:none\">A1</div>').insertAfter(this.element);\n            },\n            tooltip: function (value) {\n                this._cellTooltip.text(value);\n            },\n            toggleTooltip: function (show) {\n                this._cellTooltip.toggle(show);\n            },\n            isActive: function () {\n                return this.element[0] === kendo._activeElement();\n            },\n            filter: function (value) {\n                if (!value || value.length < this.options.minLength) {\n                    return;\n                }\n                this._mute = true;\n                this.list.select(-1);\n                this._mute = false;\n                this.formulaSource.filter({\n                    field: this.list.options.dataValueField,\n                    operator: this.options.filterOperator,\n                    value: value\n                });\n            },\n            hide: function () {\n                this.enable(false);\n                this.element.hide();\n                this._cellTooltip.hide();\n            },\n            show: function () {\n                this.enable(true);\n                this.element.show();\n            },\n            row: function () {\n                if (this.activeCell) {\n                    return this.activeCell.row;\n                }\n            },\n            col: function () {\n                if (this.activeCell) {\n                    return this.activeCell.col;\n                }\n            },\n            position: function (rectangle) {\n                if (!rectangle) {\n                    return;\n                }\n                this.show();\n                this.element.css({\n                    'top': rectangle.top + 1 + 'px',\n                    'left': rectangle.left + 1 + 'px'\n                });\n                this._cellTooltip.css({\n                    'top': rectangle.top - this._cellTooltip.height() - 10 + 'px',\n                    'left': rectangle.left\n                });\n            },\n            resize: function (rectangle) {\n                if (!rectangle) {\n                    return;\n                }\n                this.element.css({\n                    width: rectangle.width - 1,\n                    height: rectangle.height - 1\n                });\n            },\n            canInsertRef: function (isKeyboardAction) {\n                var result = this._canInsertRef(isKeyboardAction);\n                var token = result && result.token;\n                var idx;\n                if (token) {\n                    for (idx = 0; idx < this._staticTokens.length; idx++) {\n                        if (isEqualToken(token, this._staticTokens[idx])) {\n                            return null;\n                        }\n                    }\n                }\n                return result;\n            },\n            _canInsertRef: function (isKeyboardAction) {\n                if (this.popup.visible()) {\n                    return null;\n                }\n                var strictMode = isKeyboardAction;\n                var point = this.getPos();\n                var tokens, tok;\n                if (point && this._isFormula()) {\n                    if (point.begin === 0) {\n                        return null;\n                    }\n                    tokens = kendo.spreadsheet.calc.tokenize(this.value(), this.row(), this.col());\n                    for (var i = 0; i < tokens.length; ++i) {\n                        tok = tokens[i];\n                        if (touches(tok, point)) {\n                            return canReplace(tok);\n                        }\n                        if (afterPoint(tok)) {\n                            return canInsertBetween(tokens[i - 1], tok);\n                        }\n                    }\n                    return canInsertBetween(tok, null);\n                }\n                return null;\n                function afterPoint(tok) {\n                    return tok.begin > point.begin;\n                }\n                function canReplace(tok) {\n                    if (tok) {\n                        if (/^(?:num|str|bool|sym|ref)$/.test(tok.type)) {\n                            return {\n                                replace: true,\n                                token: tok,\n                                end: tok.end\n                            };\n                        }\n                        if (/^(?:op|punc|startexp)$/.test(tok.type)) {\n                            if (tok.end == point.end) {\n                                return canInsertBetween(tok, tokens[i + 1]);\n                            }\n                            return canInsertBetween(tokens[i - 1], tok);\n                        }\n                    }\n                }\n                function canInsertBetween(left, right) {\n                    if (left == null) {\n                        return null;\n                    }\n                    if (right == null) {\n                        if (/^(?:op|startexp)$/.test(left.type) || isOpenParen(left.value)) {\n                            return {\n                                token: left,\n                                end: point.end\n                            };\n                        }\n                        return null;\n                    }\n                    if (strictMode) {\n                        if (left.type == 'op' && /^(?:punc|op)$/.test(right.type)) {\n                            return {\n                                token: left,\n                                end: point.end\n                            };\n                        }\n                    } else {\n                        if (left.type == 'startexp') {\n                            return {\n                                token: left,\n                                end: point.end\n                            };\n                        }\n                        if (/^(?:ref|op|punc)$/.test(left.type)) {\n                            return {\n                                token: left,\n                                end: point.end\n                            };\n                        }\n                        if (/^(?:punc|op)$/.test(left.type)) {\n                            return /^[,;({]$/.test(left.value) ? {\n                                token: left,\n                                end: point.end\n                            } : null;\n                        }\n                    }\n                    return false;\n                }\n            },\n            refAtPoint: function (sheet) {\n                var x = this._canInsertRef();\n                if (x) {\n                    var ref = sheet.selection()._ref.simplify().clone().relative(0, 0, 3);\n                    if (sheet !== this.activeSheet) {\n                        ref = ref.setSheet(sheet.name(), true);\n                    }\n                    this._replaceAt(x, ref.print(0, 0));\n                }\n            },\n            _replaceAt: function (ctx, newValue) {\n                var value = this.value();\n                var tok = ctx.token;\n                var rest = value.substr(ctx.end);\n                value = value.substr(0, ctx.replace ? tok.begin : ctx.end) + newValue;\n                var point = value.length;\n                value += rest;\n                this._value(value);\n                this.setPos(point);\n                this.scale();\n                this._syntaxHighlight();\n                this._sync();\n            },\n            syncWith: function (formulaInput) {\n                var self = this;\n                var eventName = 'input' + ns;\n                var handler = self._sync.bind(self), iehandler;\n                if (kendo.support.browser.msie) {\n                    eventName = 'keydown' + ns;\n                    iehandler = function () {\n                        setTimeout(handler);\n                    };\n                }\n                self._editorToSync = formulaInput;\n                self.element.off(eventName).on(eventName, iehandler || handler);\n            },\n            scale: function () {\n                var element = this.element;\n                var width, height;\n                if (!this._span) {\n                    this._textContainer();\n                }\n                this._span.html(element.html());\n                width = this._span.width() + this.options.scalePadding;\n                height = this._span.height();\n                if (width > element.width()) {\n                    element.width(width);\n                }\n                if (height > element.height()) {\n                    element.height(height);\n                }\n            },\n            _value: function (value) {\n                this.element.text(value);\n            },\n            value: function (value) {\n                if (value === undefined) {\n                    var txt = this.element[0].innerText;\n                    return txt.replace(/\\n$/, '');\n                }\n                this._value(value);\n                this._syntaxHighlight();\n            },\n            highlightedRefs: function () {\n                return this._highlightedRefs.slice();\n            },\n            _syntaxHighlight: function () {\n                var pos = this.getPos();\n                var value = this.value();\n                var refClasses = kendo.spreadsheet.Pane.classNames.series;\n                var highlightedRefs = [];\n                var refIndex = 0;\n                var parens = [];\n                var tokens = [];\n                var activeToken;\n                if (pos && !pos.collapsed) {\n                    return;\n                }\n                if (!/^=/.test(value)) {\n                    if (this._staticTokens.length || this._highlightedRefs.length) {\n                        this._staticTokens = [];\n                        this._highlightedRefs = [];\n                        this.element.text(value);\n                    }\n                    if (this.popup) {\n                        this.popup.close();\n                    }\n                    return;\n                } else {\n                    tokens = kendo.spreadsheet.calc.tokenize(value, this.row(), this.col());\n                    tokens.forEach(function (tok) {\n                        tok.active = false;\n                        tok.cls = ['k-syntax-' + tok.type];\n                        if (tok.type == 'ref') {\n                            tok.colorClass = refClasses[refIndex++ % refClasses.length];\n                            tok.cls.push(tok.colorClass);\n                            highlightedRefs.push(tok);\n                        }\n                        if (pos && tok.type == 'punc') {\n                            if (isOpenParen(tok.value)) {\n                                parens.unshift(tok);\n                            } else if (isCloseParen(tok.value)) {\n                                var open = parens.shift();\n                                if (open) {\n                                    if (isMatchingParen(tok.value, open.value)) {\n                                        if (touches(tok, pos) || touches(open, pos)) {\n                                            tok.cls.push('k-syntax-paren-match');\n                                            open.cls.push('k-syntax-paren-match');\n                                        }\n                                    } else {\n                                        tok.cls.push('k-syntax-error');\n                                        open.cls.push('k-syntax-error');\n                                    }\n                                } else {\n                                    tok.cls.push('k-syntax-error');\n                                }\n                            }\n                        }\n                        if (pos && touches(tok, pos)) {\n                            tok.cls.push('k-syntax-at-point');\n                            tok.active = true;\n                            activeToken = tok;\n                        }\n                        if (tok.type == 'func' && !knownFunction(tok.value) && (!pos || !touches(tok, pos))) {\n                            tok.cls.push('k-syntax-error');\n                        }\n                    });\n                    tokens.reverse().forEach(function (tok) {\n                        var begin = tok.begin, end = tok.end;\n                        var text = kendo.htmlEncode(value.substring(begin, end));\n                        value = value.substr(0, begin) + '<span class=\\'' + tok.cls.join(' ') + '\\'>' + text + '</span>' + value.substr(end);\n                    });\n                    this.element.html(value);\n                }\n                if (pos) {\n                    this.setPos(pos.begin, pos.end);\n                }\n                if (activeToken && /^(?:startexp|op|punc)$/.test(activeToken.type)) {\n                    this._setStaticTokens(tokens);\n                }\n                this._highlightedRefs = highlightedRefs;\n            },\n            _setStaticTokens: function (tokens) {\n                var idx, tok;\n                this._staticTokens = [];\n                for (idx = 0; idx < tokens.length; idx++) {\n                    tok = tokens[idx];\n                    if (/^(?:num|str|bool|sym|ref)$/.test(tok.type)) {\n                        this._staticTokens.push(tok);\n                    }\n                }\n            },\n            destroy: function () {\n                this._editorToSync = null;\n                this.element.off(ns);\n                clearTimeout(this._focusTimeout);\n                clearTimeout(this._keyDownTimeout);\n                this._cellTooltip = null;\n                this._span = null;\n                this.popup.destroy();\n                this.popup = null;\n                Widget.fn.destroy.call(this);\n            },\n            insertNewline: function () {\n                var val = this.value();\n                var pos = this.getPos();\n                var eof = pos.end == val.length;\n                val = val.substr(0, pos.begin) + (eof ? '\\n\\n' : '\\n' + val.substr(pos.end));\n                this.value(val);\n                this.setPos(pos.begin + 1);\n            }\n        });\n        function isOpenParen(ch) {\n            return ch == '(' || ch == '[' || ch == '{';\n        }\n        function isCloseParen(ch) {\n            return ch == ')' || ch == ']' || ch == '}';\n        }\n        function isMatchingParen(close, open) {\n            return open == '(' ? close == ')' : open == '[' ? close == ']' : open == '{' ? close == '}' : false;\n        }\n        function touches(pos, target) {\n            return pos.begin <= target.begin && pos.end >= target.end;\n        }\n        function knownFunction(name) {\n            return kendo.spreadsheet.calc.runtime.FUNCS[name.toLowerCase()];\n        }\n        function isEqualToken(tok1, tok2) {\n            if (!tok1 || !tok2) {\n                return false;\n            }\n            if (tok1.type == 'ref' && tok2.type == 'ref') {\n                return tok1.ref.eq(tok2.ref);\n            } else {\n                return tok1.value === tok2.value;\n            }\n        }\n        kendo.spreadsheet.FormulaInput = FormulaInput;\n        $.extend(true, FormulaInput, { classNames: classNames });\n    }(kendo, window));\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('spreadsheet/eventlistener', ['kendo.core'], f);\n}(function () {\n    (function (kendo) {\n        if (kendo.support.browser.msie && kendo.support.browser.version < 9) {\n            return;\n        }\n        var $ = kendo.jQuery;\n        var KEY_NAMES = {\n            8: 'backspace',\n            9: 'tab',\n            13: 'enter',\n            27: 'esc',\n            37: 'left',\n            38: 'up',\n            39: 'right',\n            40: 'down',\n            35: 'end',\n            36: 'home',\n            32: 'spacebar',\n            33: 'pageup',\n            34: 'pagedown',\n            46: 'delete',\n            113: ':edit'\n        };\n        var Mac = navigator.platform.toUpperCase().indexOf('MAC') >= 0;\n        var isAlphaNum = function (keyCode) {\n            if (keyCode > 47 && keyCode < 58 || keyCode > 64 && keyCode < 91 || keyCode > 95 && keyCode < 112 || keyCode > 185 && keyCode < 193 || keyCode > 218 && keyCode < 223) {\n                return true;\n            }\n            return false;\n        };\n        var keyName = function (event) {\n            var keyCode = event.keyCode;\n            var name = KEY_NAMES[keyCode];\n            if (!name && isAlphaNum(keyCode)) {\n                name = ':alphanum';\n            }\n            if (!name && event.key && event.key.length == 1) {\n                name = ':alphanum';\n            }\n            return name;\n        };\n        var EventListener = kendo.Class.extend({\n            init: function (target, observer, handlers) {\n                this._handlers = {};\n                this.target = target;\n                this._observer = observer || window;\n                this.keyDownProxy = this.keyDown.bind(this);\n                this.mouseProxy = this.mouse.bind(this);\n                this.threshold = 5;\n                this._pressLocation = null;\n                target.on('keydown', this.keyDownProxy);\n                target.on('contextmenu mousedown cut copy paste scroll wheel click dblclick focus', this.mouseProxy);\n                $(document.documentElement).on('mousemove mouseup', this.mouseProxy);\n                if (handlers) {\n                    for (var key in handlers) {\n                        this.on(key, handlers[key]);\n                    }\n                }\n            },\n            keyDown: function (e) {\n                this.handleEvent(e, keyName(e.originalEvent));\n            },\n            mouse: function (e) {\n                var rightClick;\n                if (e.which) {\n                    rightClick = e.which == 3;\n                } else if (e.button) {\n                    rightClick = e.button == 2;\n                }\n                var type = e.type;\n                if (type === 'mousedown') {\n                    if (rightClick) {\n                        type = 'rightmousedown';\n                    } else {\n                        this._pressLocation = {\n                            x: e.pageX,\n                            y: e.pageY\n                        };\n                    }\n                }\n                if (type === 'mouseup') {\n                    if (!rightClick) {\n                        this._pressLocation = null;\n                    }\n                }\n                if (type === 'mousemove' && this._pressLocation) {\n                    var dx = this._pressLocation.x - e.pageX;\n                    var dy = this._pressLocation.y - e.pageY;\n                    var distance = Math.sqrt(dx * dx + dy * dy);\n                    if (distance > this.threshold) {\n                        type = 'mousedrag';\n                    }\n                }\n                this.handleEvent(e, type);\n            },\n            handleEvent: function (e, name) {\n                var eventKey = '';\n                e.mod = Mac ? e.metaKey : e.ctrlKey && !e.altKey;\n                if (e.altKey) {\n                    eventKey += 'alt+';\n                }\n                if (e.shiftKey) {\n                    eventKey += 'shift+';\n                }\n                if (e.ctrlKey) {\n                    eventKey += 'ctrl+';\n                }\n                eventKey += name;\n                var catchAllHandler = this._handlers['*+' + name];\n                if (catchAllHandler) {\n                    catchAllHandler.call(this._observer, e, eventKey);\n                }\n                var handler = this._handlers[eventKey];\n                if (handler) {\n                    handler.call(this._observer, e, eventKey);\n                }\n            },\n            on: function (event, callback) {\n                var handlers = this._handlers;\n                if (typeof callback === 'string') {\n                    callback = this._observer[callback];\n                }\n                if (typeof event === 'string') {\n                    event = event.split(',');\n                }\n                event.forEach(function (e) {\n                    handlers[e] = callback;\n                });\n            },\n            destroy: function () {\n                this.target.off('keydown', this.keyDownProxy);\n                this.target.off('keydown', this.mouseProxy);\n                $(document.documentElement).off('mousemove mouseup', this.mouseProxy);\n            }\n        });\n        kendo.spreadsheet.EventListener = EventListener;\n    }(window.kendo));\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('spreadsheet/rangelist', ['kendo.core'], f);\n}(function () {\n    (function (kendo) {\n        if (kendo.support.browser.msie && kendo.support.browser.version < 9) {\n            return;\n        }\n        var RangeTreeNode = kendo.Class.extend({\n            init: function Node(level, value, left, right) {\n                this.level = level;\n                this.value = value;\n                this.left = left;\n                this.right = right;\n            }\n        });\n        var NilNode = new function NIL() {\n            this.left = this;\n            this.right = this;\n            this.level = 0;\n        }();\n        function passThrough(value) {\n            return value;\n        }\n        function skew(node) {\n            if (node.left.level === node.level) {\n                var temp = node;\n                node = node.left;\n                temp.left = node.right;\n                node.right = temp;\n            }\n            return node;\n        }\n        function split(node) {\n            if (node.right.right.level === node.level) {\n                var temp = node;\n                node = node.right;\n                temp.right = node.left;\n                node.left = temp;\n                node.level += 1;\n            }\n            return node;\n        }\n        function insert(node, value) {\n            if (node === NilNode) {\n                return new RangeTreeNode(1, value, NilNode, NilNode);\n            } else if (node.value.start > value.start) {\n                node.left = insert(node.left, value);\n            } else {\n                node.right = insert(node.right, value);\n            }\n            return split(skew(node));\n        }\n        function remove(node, value) {\n            if (node === NilNode) {\n                return node;\n            }\n            var diff = node.value.start - value.start;\n            if (diff === 0) {\n                if (node.left !== NilNode && node.right !== NilNode) {\n                    var heir = node.left;\n                    while (heir.right !== NilNode) {\n                        heir = heir.right;\n                    }\n                    node.value = heir.value;\n                    node.left = remove(node.left, node.value);\n                } else if (node.left === NilNode) {\n                    node = node.right;\n                } else {\n                    node = node.left;\n                }\n            } else if (diff > 0) {\n                node.left = remove(node.left, value);\n            } else {\n                node.right = remove(node.right, value);\n            }\n            if (node.left.level < node.level - 1 || node.right.level < node.level - 1) {\n                node.level -= 1;\n                if (node.right.level > node.level) {\n                    node.right.level = node.level;\n                }\n                node = skew(node);\n                node.right = skew(node.right);\n                node.right.right = skew(node.right.right);\n                node = split(node);\n                node.right = split(node.right);\n            }\n            return node;\n        }\n        var Range = kendo.Class.extend({\n            init: function Value(start, end, value) {\n                this.start = start;\n                this.end = end;\n                this.value = value;\n            },\n            intersects: function (range) {\n                return range.start <= this.end && range.end >= this.start;\n            }\n        });\n        var RangeTree = kendo.Class.extend({\n            init: function () {\n                this.root = NilNode;\n            },\n            insert: function (value) {\n                this.root = insert(this.root, value);\n            },\n            remove: function (value) {\n                this.root = remove(this.root, value);\n            },\n            findrange: function (value) {\n                var node = this.root;\n                while (node != NilNode) {\n                    if (value < node.value.start) {\n                        node = node.left;\n                    } else if (value > node.value.end) {\n                        node = node.right;\n                    } else {\n                        return node.value;\n                    }\n                }\n                return null;\n            },\n            values: function () {\n                var result = [];\n                values(this.root, result);\n                return result;\n            },\n            intersecting: function (start, end) {\n                var ranges = [];\n                intersecting(this.root, new Range(start, end), ranges);\n                return ranges;\n            },\n            map: function (callback) {\n                var tree = new RangeTree();\n                map(tree, this.root, callback);\n                return tree;\n            },\n            clone: function () {\n                return this.map(passThrough);\n            },\n            first: function () {\n                var first = this.root;\n                while (first.left != NilNode) {\n                    first = first.left;\n                }\n                return first;\n            },\n            last: function () {\n                var last = this.root;\n                while (last.right != NilNode) {\n                    last = last.right;\n                }\n                return last;\n            }\n        });\n        function values(node, result) {\n            if (node === NilNode) {\n                return;\n            }\n            values(node.left, result);\n            result.push(node.value);\n            values(node.right, result);\n        }\n        function intersecting(node, range, ranges) {\n            if (node === NilNode) {\n                return;\n            }\n            var value = node.value;\n            if (range.start < value.start) {\n                intersecting(node.left, range, ranges);\n            }\n            if (value.intersects(range)) {\n                ranges.push(value);\n            }\n            if (range.end > value.end) {\n                intersecting(node.right, range, ranges);\n            }\n        }\n        function map(tree, root, callback) {\n            if (root === NilNode) {\n                return;\n            }\n            map(tree, root.left, callback);\n            tree.insert(callback(root.value));\n            map(tree, root.right, callback);\n        }\n        var RangeList = kendo.Class.extend({\n            init: function (start, end, value) {\n                if (end === undefined) {\n                    this.tree = start;\n                } else {\n                    this.tree = new RangeTree();\n                    this.tree.insert(new Range(start, end, value));\n                }\n            },\n            values: function () {\n                return this.tree.values();\n            },\n            map: function (callback) {\n                return new RangeList(this.tree.map(callback));\n            },\n            intersecting: function (start, end) {\n                return this.tree.intersecting(start, end);\n            },\n            first: function () {\n                return this.tree.first().value;\n            },\n            last: function () {\n                return this.tree.last().value;\n            },\n            insert: function (start, end, value) {\n                return this.tree.insert(new Range(start, end, value));\n            },\n            value: function (start, end, value) {\n                if (value === undefined) {\n                    if (end === undefined) {\n                        end = start;\n                    }\n                    return this.intersecting(start, end)[0].value;\n                }\n                var ranges = this.tree.intersecting(start - 1, end + 1);\n                if (ranges.length) {\n                    var firstRange = ranges[0], lastRange = ranges[ranges.length - 1];\n                    if (firstRange.end < start) {\n                        if (firstRange.value === value) {\n                            start = firstRange.start;\n                        } else {\n                            ranges.shift();\n                        }\n                    }\n                    if (lastRange.start > end) {\n                        if (lastRange.value === value) {\n                            end = lastRange.end;\n                        } else {\n                            ranges.pop();\n                        }\n                    }\n                    for (var i = 0, length = ranges.length; i < length; i++) {\n                        var range = ranges[i];\n                        var rangeValue = range.value;\n                        var rangeStart = range.start;\n                        var rangeEnd = range.end;\n                        this.tree.remove(range);\n                        if (rangeStart < start) {\n                            if (rangeValue !== value) {\n                                this.insert(rangeStart, start - 1, rangeValue);\n                            } else {\n                                start = rangeStart;\n                            }\n                        }\n                        if (rangeEnd > end) {\n                            if (rangeValue !== value) {\n                                this.insert(end + 1, rangeEnd, rangeValue);\n                            } else {\n                                end = rangeEnd;\n                            }\n                        }\n                    }\n                }\n                this.insert(start, end, value);\n            },\n            expandedValues: function (start, end) {\n                var ranges = this.intersecting(start, end);\n                var result = [];\n                var rangeIndex = 0;\n                for (var i = start; i <= end; i++) {\n                    if (ranges[rangeIndex].end < i) {\n                        rangeIndex++;\n                    }\n                    result.push({\n                        index: i - start,\n                        value: ranges[rangeIndex].value\n                    });\n                }\n                return result;\n            },\n            sortedIndices: function (start, end, valueComparer, indices) {\n                var result = this.expandedValues(start, end);\n                var comparer = function (a, b) {\n                    if (a.value === b.value) {\n                        return a.index - b.index;\n                    }\n                    return valueComparer(a.value, b.value);\n                };\n                if (indices) {\n                    comparer = function (a, b) {\n                        var x = indices[a.index];\n                        var y = indices[b.index];\n                        if (x.value === y.value) {\n                            return valueComparer(a.value, b.value);\n                        }\n                        return a.index - b.index;\n                    };\n                }\n                result.sort(comparer);\n                return result;\n            },\n            sort: function (start, end, indices) {\n                if (this.intersecting(start, end).length === 1) {\n                    return;\n                }\n                var values = this.expandedValues(start, end);\n                for (var i = 0, len = indices.length; i < len; i++) {\n                    this.value(i + start, i + start, values[indices[i].index].value);\n                }\n            },\n            copy: function (sourceStart, sourceEnd, targetStart) {\n                var values = this.intersecting(sourceStart, sourceEnd);\n                var start = targetStart;\n                var end;\n                for (var i = 0, len = values.length; i < len; i++) {\n                    var rangeStart = values[i].start;\n                    if (rangeStart < sourceStart) {\n                        rangeStart = sourceStart;\n                    }\n                    var rangeEnd = values[i].end;\n                    if (rangeEnd > sourceEnd) {\n                        rangeEnd = sourceEnd;\n                    }\n                    end = start + (rangeEnd - rangeStart);\n                    this.value(start, end, values[i].value);\n                    start = ++end;\n                }\n            },\n            iterator: function (start, end) {\n                return new Iterator(start, end, this.intersecting(start, end));\n            },\n            getState: function () {\n                return this.tree.clone();\n            },\n            setState: function (state) {\n                this.tree = state;\n            }\n        });\n        var Iterator = kendo.Class.extend({\n            init: function (start, end, ranges) {\n                this.start = start;\n                this.end = end;\n                this.index = 0;\n                this.ranges = ranges;\n            },\n            unique: function () {\n                return this.ranges.map(function (range) {\n                    return range.value;\n                });\n            },\n            at: function (index) {\n                while (this.ranges[this.index].end < index) {\n                    this.index++;\n                }\n                return this.ranges[this.index].value;\n            },\n            forEach: function (callback) {\n                for (var i = this.start; i <= this.end; i++) {\n                    callback(this.at(i), i);\n                }\n                this.index = 0;\n            }\n        });\n        var SparseRangeList = RangeList.extend({\n            init: function (start, end, value) {\n                this.tree = new RangeTree();\n                this.range = new Range(start, end, value);\n            },\n            intersecting: function (start, end) {\n                var ranges = this.tree.intersecting(start, end);\n                var result = [];\n                var range;\n                if (!ranges.length) {\n                    return [this.range];\n                }\n                for (var i = 0, len = ranges.length; i < len; i++) {\n                    range = ranges[i];\n                    if (range.start > start) {\n                        result.push(new Range(start, range.start - 1, this.range.value));\n                    }\n                    result.push(range);\n                    start = range.end + 1;\n                }\n                if (range.end < end) {\n                    result.push(new Range(range.end + 1, end, this.range.value));\n                }\n                return result;\n            },\n            insert: function (start, end, value) {\n                if (value !== this.range.value) {\n                    this.tree.insert(new Range(start, end, value));\n                }\n            },\n            lastRangeStart: function () {\n                var node = this.tree.root;\n                if (node === NilNode) {\n                    return this.range.start;\n                }\n                while (node.right !== NilNode) {\n                    node = node.right;\n                }\n                return node.value.end + 1;\n            }\n        });\n        kendo.spreadsheet.RangeTree = RangeTree;\n        kendo.spreadsheet.RangeList = RangeList;\n        kendo.spreadsheet.SparseRangeList = SparseRangeList;\n        kendo.spreadsheet.ValueRange = Range;\n    }(kendo));\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('spreadsheet/propertybag', ['kendo.core'], f);\n}(function () {\n    (function (kendo) {\n        if (kendo.support.browser.msie && kendo.support.browser.version < 9) {\n            return;\n        }\n        var Property = kendo.Class.extend({\n            init: function (list) {\n                this.list = list;\n            },\n            get: function (index) {\n                return this.parse(this.list.value(index, index));\n            },\n            set: function (start, end, value) {\n                if (value === undefined) {\n                    value = end;\n                    end = start;\n                }\n                this.list.value(start, end, value);\n            },\n            parse: function (value) {\n                return value;\n            },\n            copy: function (start, end, dst) {\n                this.list.copy(start, end, dst);\n            },\n            iterator: function (start, end) {\n                return this.list.iterator(start, end);\n            }\n        });\n        var JsonProperty = Property.extend({\n            set: function (start, end, value) {\n                this.list.value(start, end, JSON.stringify(value));\n            },\n            parse: function (value) {\n                return JSON.parse(value);\n            }\n        });\n        var ValueProperty = Property.extend({\n            init: function (values, formats) {\n                Property.prototype.init.call(this, values);\n                this.formats = formats;\n            },\n            set: function (start, end, value) {\n                if (value instanceof Date) {\n                    value = kendo.spreadsheet.dateToNumber(value);\n                    if (!this.formats.value(start, end)) {\n                        this.formats.value(start, end, toExcelFormat(kendo.culture().calendar.patterns.d));\n                    }\n                }\n                this.list.value(start, end, value);\n            }\n        });\n        function toExcelFormat(format) {\n            return format.replace(/M/g, 'm').replace(/'/g, '\"').replace(/tt/, 'am/pm');\n        }\n        kendo.spreadsheet.PropertyBag = kendo.Class.extend({\n            specs: [\n                {\n                    property: Property,\n                    name: 'format',\n                    value: null,\n                    sortable: true,\n                    serializable: true\n                },\n                {\n                    property: ValueProperty,\n                    name: 'value',\n                    value: null,\n                    sortable: true,\n                    serializable: true,\n                    depends: 'format'\n                },\n                {\n                    property: Property,\n                    name: 'formula',\n                    value: null,\n                    sortable: true,\n                    serializable: true\n                },\n                {\n                    property: Property,\n                    name: 'background',\n                    value: null,\n                    sortable: true,\n                    serializable: true\n                },\n                {\n                    property: JsonProperty,\n                    name: 'vBorders',\n                    value: null,\n                    sortable: false,\n                    serializable: false\n                },\n                {\n                    property: JsonProperty,\n                    name: 'hBorders',\n                    value: null,\n                    sortable: false,\n                    serializable: false\n                },\n                {\n                    property: Property,\n                    name: 'color',\n                    value: null,\n                    sortable: true,\n                    serializable: true\n                },\n                {\n                    property: Property,\n                    name: 'fontFamily',\n                    value: null,\n                    sortable: true,\n                    serializable: true\n                },\n                {\n                    property: Property,\n                    name: 'underline',\n                    value: null,\n                    sortable: true,\n                    serializable: true\n                },\n                {\n                    property: Property,\n                    name: 'fontSize',\n                    value: null,\n                    sortable: true,\n                    serializable: true\n                },\n                {\n                    property: Property,\n                    name: 'italic',\n                    value: null,\n                    sortable: true,\n                    serializable: true\n                },\n                {\n                    property: Property,\n                    name: 'bold',\n                    value: null,\n                    sortable: true,\n                    serializable: true\n                },\n                {\n                    property: Property,\n                    name: 'textAlign',\n                    value: null,\n                    sortable: true,\n                    serializable: true\n                },\n                {\n                    property: Property,\n                    name: 'verticalAlign',\n                    value: null,\n                    sortable: true,\n                    serializable: true\n                },\n                {\n                    property: Property,\n                    name: 'wrap',\n                    value: null,\n                    sortable: true,\n                    serializable: true\n                },\n                {\n                    property: Property,\n                    name: 'validation',\n                    value: null,\n                    sortable: false,\n                    serializable: true\n                },\n                {\n                    property: Property,\n                    name: 'enable',\n                    value: null,\n                    sortable: false,\n                    serializable: true\n                },\n                {\n                    property: Property,\n                    name: 'link',\n                    value: null,\n                    sortable: false,\n                    serializable: true\n                },\n                {\n                    property: Property,\n                    name: 'editor',\n                    value: null,\n                    sortable: false,\n                    serializable: true\n                }\n            ],\n            init: function (rowCount, columnCount, defaultValues) {\n                defaultValues = defaultValues || {};\n                var cellCount = rowCount * columnCount - 1;\n                this.rowCount = rowCount;\n                this.columnCount = columnCount;\n                this.cellCount = cellCount;\n                this.properties = {};\n                this.lists = {};\n                this.specs.forEach(function (spec) {\n                    var name = spec.name;\n                    var value = defaultValues[name];\n                    if (value === undefined) {\n                        value = spec.value;\n                    }\n                    this.lists[name] = new kendo.spreadsheet.SparseRangeList(0, cellCount, value);\n                    this.properties[name] = new spec.property(this.lists[name], this.lists[spec.depends]);\n                }, this);\n            },\n            getState: function () {\n                var state = {};\n                this.specs.forEach(function (spec) {\n                    state[spec.name] = this.lists[spec.name].getState();\n                }, this);\n                return state;\n            },\n            setState: function (state) {\n                this.specs.forEach(function (spec) {\n                    this.lists[spec.name].setState(state[spec.name]);\n                }, this);\n            },\n            get: function (name, index) {\n                if (index === undefined) {\n                    return this.lists[name];\n                }\n                switch (name) {\n                case 'borderRight':\n                    index += this.rowCount;\n                case 'borderLeft':\n                    name = 'vBorders';\n                    break;\n                case 'borderBottom':\n                    index++;\n                case 'borderTop':\n                    name = 'hBorders';\n                    break;\n                }\n                return index > this.cellCount ? null : this.properties[name].get(index);\n            },\n            set: function (name, start, end, value) {\n                switch (name) {\n                case 'borderRight':\n                    start += this.rowCount;\n                    end += this.rowCount;\n                case 'borderLeft':\n                    name = 'vBorders';\n                    break;\n                case 'borderBottom':\n                    start++;\n                    end++;\n                case 'borderTop':\n                    name = 'hBorders';\n                    break;\n                }\n                if (start <= end && end <= this.cellCount) {\n                    this.properties[name].set(start, end, value);\n                }\n            },\n            fromJSON: function (index, value) {\n                for (var si = 0; si < this.specs.length; si++) {\n                    var spec = this.specs[si];\n                    if (spec.serializable) {\n                        if (value[spec.name] !== undefined) {\n                            this.set(spec.name, index, index, value[spec.name], false);\n                        }\n                    }\n                }\n                [\n                    'borderLeft',\n                    'borderRight',\n                    'borderTop',\n                    'borderBottom'\n                ].forEach(function (b) {\n                    if (value[b] !== undefined) {\n                        this.set(b, index, index, value[b]);\n                    }\n                }, this);\n            },\n            copy: function (sourceStart, sourceEnd, targetStart) {\n                this.specs.forEach(function (spec) {\n                    this.properties[spec.name].copy(sourceStart, sourceEnd, targetStart);\n                }, this);\n            },\n            iterator: function (name, start, end) {\n                var prop = this.properties[name];\n                var iter = prop.iterator(start, end), at = iter.at;\n                var cellCount = this.cellCount;\n                iter.at = function (index) {\n                    return index > cellCount ? null : prop.parse(at.call(iter, index));\n                };\n                iter.name = name;\n                iter.value = prop.list.range.value;\n                return iter;\n            },\n            sortable: function () {\n                return this.specs.filter(function (spec) {\n                    return spec.sortable;\n                }).map(function (spec) {\n                    return this.lists[spec.name];\n                }, this);\n            },\n            iterators: function (start, end) {\n                return this.specs.reduce(function (ret, spec) {\n                    if (spec.serializable) {\n                        ret.push(this.iterator(spec.name, start, end));\n                    }\n                    return ret;\n                }.bind(this), []);\n            },\n            forEach: function (start, end, callback) {\n                var iterators = this.iterators(start, end);\n                var hBorders = this.iterator('hBorders', start, end + 1);\n                var leftBorders = this.iterator('vBorders', start, end);\n                var rightBorders = this.iterator('vBorders', start + this.rowCount, end + this.rowCount);\n                var values, index;\n                function addBorder(name, iterator, index) {\n                    var val = iterator.at(index);\n                    if (val !== iterator.value) {\n                        values[name] = val;\n                    }\n                }\n                for (index = start; index <= end; index++) {\n                    values = {};\n                    for (var i = 0; i < iterators.length; i++) {\n                        var iterator = iterators[i];\n                        var value = iterator.at(index);\n                        if (value !== iterator.value) {\n                            values[iterator.name] = value;\n                        }\n                    }\n                    addBorder('borderLeft', leftBorders, index);\n                    addBorder('borderRight', rightBorders, index + this.rowCount);\n                    addBorder('borderTop', hBorders, index);\n                    if ((index + 1) % this.rowCount) {\n                        addBorder('borderBottom', hBorders, index + 1);\n                    }\n                    callback(values);\n                }\n            },\n            forEachProperty: function (callback) {\n                for (var name in this.properties) {\n                    callback(this.properties[name]);\n                }\n            }\n        });\n        kendo.spreadsheet.ALL_PROPERTIES = kendo.spreadsheet.PropertyBag.prototype.specs.reduce(function (a, spec) {\n            if (spec.serializable) {\n                a.push(spec.name);\n            }\n            return a;\n        }, [\n            'borderTop',\n            'borderRight',\n            'borderBottom',\n            'borderLeft'\n        ]);\n    }(window.kendo));\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('spreadsheet/references', ['kendo.core'], f);\n}(function () {\n    'use strict';\n    if (kendo.support.browser.msie && kendo.support.browser.version < 9) {\n        return;\n    }\n    var spreadsheet = kendo.spreadsheet;\n    var Class = kendo.Class;\n    function columnName(colIndex) {\n        var letter = Math.floor(colIndex / 26) - 1;\n        return (letter >= 0 ? columnName(letter) : '') + String.fromCharCode(65 + colIndex % 26);\n    }\n    function displaySheet(sheet) {\n        if (/^[a-z0-9_]*$/i.test(sheet)) {\n            return sheet;\n        }\n        return '\\'' + sheet.replace(/\\x27/g, '\\\\\\'') + '\\'';\n    }\n    function displayRef(sheet, row, col, rel) {\n        var aa = '';\n        ++row;\n        if (!isFinite(row)) {\n            row = '';\n        } else if (rel != null && !(rel & 2)) {\n            row = '$' + row;\n        }\n        if (!isFinite(col)) {\n            col = '';\n        } else {\n            aa = columnName(col);\n            if (rel != null && !(rel & 1)) {\n                aa = '$' + aa;\n            }\n        }\n        if (sheet) {\n            return displaySheet(sheet) + '!' + aa + row;\n        } else {\n            return aa + row;\n        }\n    }\n    var Ref = Class.extend({\n        type: 'ref',\n        sheet: '',\n        clone: function () {\n            return this;\n        },\n        hasSheet: function () {\n            return this._hasSheet;\n        },\n        simplify: function () {\n            return this;\n        },\n        setSheet: function (sheet, hasSheet) {\n            this.sheet = sheet;\n            if (hasSheet != null) {\n                this._hasSheet = hasSheet;\n            }\n            return this;\n        },\n        absolute: function () {\n            return this;\n        },\n        relative: function () {\n            return this;\n        },\n        adjust: function () {\n            return this;\n        },\n        toString: function () {\n            return this.relative(0, 0, 3, 3).print(0, 0);\n        },\n        forEach: function (callback, obj) {\n            callback.call(obj, this);\n        },\n        map: function (callback, obj) {\n            return callback.call(obj, this);\n        },\n        intersects: function (ref) {\n            return this.intersect(ref) !== NULL;\n        },\n        isCell: function () {\n            return false;\n        },\n        toRow: function () {\n            return this;\n        },\n        toColumn: function () {\n            return this;\n        },\n        first: function () {\n            return this;\n        },\n        lastRange: function () {\n            return this;\n        },\n        size: function () {\n            return 1;\n        },\n        rangeAt: function () {\n            return this;\n        },\n        nextRangeIndex: function () {\n            return 0;\n        },\n        previousRangeIndex: function () {\n            return 0;\n        },\n        eq: function (reference) {\n            var r1 = this;\n            var r2 = reference;\n            if (r1 === NULL || r2 === NULL) {\n                return r1 === r2;\n            }\n            if (r2 instanceof CellRef || r2 instanceof RangeRef && !(r1 instanceof CellRef)) {\n                r1 = reference;\n                r2 = this;\n            }\n            if (r1 instanceof CellRef) {\n                r2 = r2.simplify();\n                return r2 instanceof CellRef && r1.row == r2.row && r1.col == r2.col && r1.sheet == r2.sheet;\n            } else if (r1 instanceof RangeRef) {\n                if (r2 instanceof RangeRef) {\n                    return r2.topLeft.eq(r1.topLeft) && r2.bottomRight.eq(r1.bottomRight);\n                }\n                if (r2 instanceof UnionRef) {\n                    return r2.single() && r1.eq(r2.refs[0]);\n                }\n            } else if (r1 instanceof UnionRef && r2 instanceof UnionRef) {\n                var refs1 = r1.refs;\n                var refs2 = r2.refs;\n                if (refs1.length != refs2.length) {\n                    return false;\n                }\n                for (var i = 0, len = refs1.length; i < len; i++) {\n                    if (!refs1[i].eq(refs2[i])) {\n                        return false;\n                    }\n                }\n                return true;\n            }\n            return r1 === r2;\n        },\n        concat: function (ref) {\n            return new UnionRef([\n                this,\n                ref\n            ]);\n        },\n        replaceAt: function (index, ref) {\n            return ref;\n        },\n        forEachColumnIndex: function (callback) {\n            this.forEachAxisIndex('col', callback);\n        },\n        forEachRowIndex: function (callback) {\n            this.forEachAxisIndex('row', callback);\n        },\n        forEachAxisIndex: function (axis, callback) {\n            var sorted = [];\n            var method = axis === 'row' ? 'forEachRow' : 'forEachColumn';\n            this[method](function (ref) {\n                var index = ref.first()[axis];\n                if (sorted.indexOf(index) === -1) {\n                    sorted.push(index);\n                }\n            });\n            sorted.sort(function (a, b) {\n                return a > b ? 1 : a < b ? -1 : 0;\n            }).forEach(callback);\n        },\n        valid: function () {\n            return false;\n        },\n        renameSheet: function (oldSheetName, newSheetName) {\n            if (this.sheet && this.sheet.toLowerCase() == oldSheetName.toLowerCase()) {\n                this.sheet = newSheetName;\n                return true;\n            }\n        }\n    });\n    Ref.display = displayRef;\n    var NULL = new (Ref.extend({\n        init: function NullRef() {\n        },\n        print: function () {\n            return '#NULL!';\n        },\n        eq: function (ref) {\n            return ref === this;\n        },\n        forEach: function () {\n        }\n    }))();\n    var NameRef = Ref.extend({\n        ref: 'name',\n        init: function NameRef(name) {\n            this.name = name;\n        },\n        clone: function () {\n            return new NameRef(this.name).setSheet(this.sheet, this.hasSheet());\n        },\n        print: function () {\n            var ret = displaySheet(this.name);\n            if (this.hasSheet()) {\n                ret = displaySheet(this.sheet) + '!' + ret;\n            }\n            return ret;\n        }\n    });\n    var CellRef = Ref.extend({\n        ref: 'cell',\n        init: function CellRef(row, col, rel) {\n            this.row = row;\n            this.col = col;\n            this.rel = rel || 0;\n        },\n        clone: function () {\n            return new CellRef(this.row, this.col, this.rel).setSheet(this.sheet, this.hasSheet());\n        },\n        intersect: function (ref) {\n            if (ref instanceof CellRef) {\n                if (this.eq(ref)) {\n                    return this;\n                } else {\n                    return NULL;\n                }\n            }\n            return ref.intersect(this);\n        },\n        print: function (trow, tcol, mod) {\n            var col = this.col, row = this.row, rel = this.rel, abs;\n            if (trow == null && rel) {\n                var sheet = this.hasSheet() ? displaySheet(this.sheet) + '!' : '';\n                if (isFinite(col)) {\n                    col = rel & 1 ? 'C[' + col + ']' : 'C' + (col + 1);\n                } else {\n                    col = '';\n                }\n                if (isFinite(row)) {\n                    row = rel & 2 ? 'R[' + row + ']' : 'R' + (row + 1);\n                } else {\n                    row = '';\n                }\n                return sheet + row + col;\n            } else {\n                abs = this.absolute(trow, tcol);\n                if (mod) {\n                    row = abs.row % 1048576;\n                    col = abs.col % 16384;\n                    if (row < 0) {\n                        row += 1048576;\n                    }\n                    if (col < 0) {\n                        col += 16384;\n                    }\n                    return displayRef(this._hasSheet && this.sheet, row, col, rel);\n                }\n                return abs.valid() ? displayRef(this._hasSheet && this.sheet, abs.row, abs.col, rel) : '#REF!';\n            }\n        },\n        absolute: function (arow, acol) {\n            var ret = this.clone();\n            if (ret.rel & 3 === 0) {\n                return ret;\n            }\n            if (ret.rel & 1) {\n                ret.col = (ret.col + acol) % 16384;\n            }\n            if (ret.rel & 2) {\n                ret.row = (ret.row + arow) % 1048576;\n            }\n            ret.rel = 0;\n            return ret;\n        },\n        toRangeRef: function () {\n            return new RangeRef(this, this);\n        },\n        relative: function (arow, acol, rel) {\n            if (rel == null) {\n                rel = this.rel;\n            }\n            var row = rel & 2 ? this.row - arow : this.row;\n            var col = rel & 1 ? this.col - acol : this.col;\n            return new CellRef(row, col, rel).setSheet(this.sheet, this.hasSheet());\n        },\n        height: function () {\n            return 1;\n        },\n        width: function () {\n            return 1;\n        },\n        toString: function () {\n            return displayRef(null, this.row, this.col, 3);\n        },\n        isCell: function () {\n            return true;\n        },\n        leftColumn: function () {\n            return this;\n        },\n        rightColumn: function () {\n            return this;\n        },\n        topRow: function () {\n            return this;\n        },\n        bottomRow: function () {\n            return this;\n        },\n        forEachRow: function (callback) {\n            callback(this.toRangeRef());\n        },\n        forEachColumn: function (callback) {\n            callback(this.toRangeRef());\n        },\n        adjust: function (row, col, trow, tcol, forRow, start, delta) {\n            var ref = this.absolute(row, col);\n            if (forRow) {\n                if (ref.row >= start) {\n                    if (delta < 0 && ref.row < start - delta) {\n                        return NULL;\n                    }\n                    ref.row += delta;\n                }\n            } else {\n                if (ref.col >= start) {\n                    if (delta < 0 && ref.col < start - delta) {\n                        return NULL;\n                    }\n                    ref.col += delta;\n                }\n            }\n            if (trow != null && tcol != null) {\n                ref = ref.relative(trow, tcol, this.rel);\n            }\n            return ref;\n        },\n        valid: function () {\n            if (this.rel) {\n                throw new Error('valid() called on relative reference');\n            }\n            var col = this.col, row = this.row;\n            return !(isFinite(col) && col < 0 || isFinite(row) && row < 0);\n        }\n    });\n    var RangeRef = Ref.extend({\n        ref: 'range',\n        init: function RangeRef(tl, br) {\n            if (tl._hasSheet && br._hasSheet && tl.sheet.toLowerCase() != br.sheet.toLowerCase()) {\n                this.endSheet = br.sheet;\n            }\n            this.topLeft = new CellRef(tl.row, tl.col, tl.rel);\n            this.bottomRight = new CellRef(br.row, br.col, br.rel);\n            this.normalize();\n        },\n        clone: function () {\n            return new RangeRef(this.topLeft.clone(), this.bottomRight.clone()).setSheet(this.sheet, this.hasSheet());\n        },\n        _containsRange: function (range) {\n            return this._containsCell(range.topLeft) && this._containsCell(range.bottomRight);\n        },\n        _containsCell: function (cell) {\n            return cell.sheet == this.sheet && cell.row >= this.topLeft.row && cell.col >= this.topLeft.col && cell.row <= this.bottomRight.row && cell.col <= this.bottomRight.col;\n        },\n        contains: function (ref) {\n            if (ref instanceof Array) {\n                var that = this;\n                return ref.some(function (_ref) {\n                    return that.contains(_ref);\n                });\n            }\n            if (ref instanceof CellRef) {\n                return this._containsCell(ref);\n            }\n            if (ref instanceof RangeRef) {\n                return this._containsRange(ref);\n            }\n            return false;\n        },\n        _intersectRange: function (ref) {\n            if (this.sheet != ref.sheet) {\n                return NULL;\n            }\n            var a_left = this.topLeft.col;\n            var a_top = this.topLeft.row;\n            var a_right = this.bottomRight.col;\n            var a_bottom = this.bottomRight.row;\n            var b_left = ref.topLeft.col;\n            var b_top = ref.topLeft.row;\n            var b_right = ref.bottomRight.col;\n            var b_bottom = ref.bottomRight.row;\n            if (a_left <= b_right && b_left <= a_right && a_top <= b_bottom && b_top <= a_bottom) {\n                return new RangeRef(new CellRef(Math.max(a_top, b_top), Math.max(a_left, b_left)), new CellRef(Math.min(a_bottom, b_bottom), Math.min(a_right, b_right))).setSheet(this.sheet, this.hasSheet());\n            } else {\n                return NULL;\n            }\n        },\n        intersect: function (ref) {\n            if (ref instanceof CellRef) {\n                return this._containsCell(ref) ? ref : NULL;\n            }\n            if (ref instanceof RangeRef) {\n                return this._intersectRange(ref).simplify();\n            }\n            if (ref instanceof UnionRef) {\n                return ref.intersect(this);\n            }\n            return NULL;\n        },\n        simplify: function () {\n            if (this.isCell()) {\n                return new CellRef(this.topLeft.row, this.topLeft.col, this.topLeft.rel).setSheet(this.sheet, this.hasSheet());\n            }\n            return this;\n        },\n        normalize: function () {\n            var a = this.topLeft, b = this.bottomRight;\n            var r1 = a.row, c1 = a.col, r2 = b.row, c2 = b.col;\n            var rr1 = a.rel & 2, rc1 = a.rel & 1;\n            var rr2 = b.rel & 2, rc2 = b.rel & 1;\n            var tmp, changes = false;\n            if (r1 > r2) {\n                changes = true;\n                tmp = r1;\n                r1 = r2;\n                r2 = tmp;\n                tmp = rr1;\n                rr1 = rr2;\n                rr2 = tmp;\n            }\n            if (c1 > c2) {\n                changes = true;\n                tmp = c1;\n                c1 = c2;\n                c2 = tmp;\n                tmp = rc1;\n                rc1 = rc2;\n                rc2 = tmp;\n            }\n            if (changes) {\n                this.topLeft = new CellRef(r1, c1, rc1 | rr1);\n                this.bottomRight = new CellRef(r2, c2, rc2 | rr2);\n            }\n            return this;\n        },\n        print: function (trow, tcol, mod) {\n            if (mod || this.absolute(trow, tcol).valid()) {\n                var ret = this.topLeft.print(trow, tcol, mod) + ':' + this.bottomRight.print(trow, tcol, mod);\n                if (this.hasSheet()) {\n                    ret = displaySheet(this.sheet) + (this.endSheet ? ':' + displaySheet(this.endSheet) : '') + '!' + ret;\n                }\n                return ret;\n            }\n            return '#REF!';\n        },\n        absolute: function (arow, acol) {\n            return new RangeRef(this.topLeft.absolute(arow, acol), this.bottomRight.absolute(arow, acol)).setSheet(this.sheet, this.hasSheet());\n        },\n        relative: function (arow, acol, relTL, relBR) {\n            if (relBR == null) {\n                relBR = relTL;\n            }\n            return new RangeRef(this.topLeft.relative(arow, acol, relTL), this.bottomRight.relative(arow, acol, relBR)).setSheet(this.sheet, this.hasSheet());\n        },\n        height: function () {\n            if (this.topLeft.rel != this.bottomRight.rel) {\n                throw new Error('Mixed relative/absolute references');\n            }\n            return this.bottomRight.row - this.topLeft.row + 1;\n        },\n        width: function () {\n            if (this.topLeft.rel != this.bottomRight.rel) {\n                throw new Error('Mixed relative/absolute references');\n            }\n            return this.bottomRight.col - this.topLeft.col + 1;\n        },\n        collapse: function () {\n            return this.topLeft.toRangeRef();\n        },\n        leftColumn: function () {\n            return new RangeRef(this.topLeft, new CellRef(this.bottomRight.row, this.topLeft.col));\n        },\n        rightColumn: function () {\n            return new RangeRef(new CellRef(this.topLeft.row, this.bottomRight.col), this.bottomRight);\n        },\n        topRow: function () {\n            return new RangeRef(this.topLeft, new CellRef(this.topLeft.row, this.bottomRight.col));\n        },\n        bottomRow: function () {\n            return new RangeRef(new CellRef(this.bottomRight.row, this.topLeft.col), this.bottomRight);\n        },\n        toRangeRef: function () {\n            return this;\n        },\n        toRow: function (row) {\n            row += Math.max(0, this.topLeft.row);\n            return new RangeRef(new CellRef(row, this.topLeft.col), new CellRef(row, this.bottomRight.col)).setSheet(this.sheet, this.hasSheet());\n        },\n        toColumn: function (col) {\n            col += Math.max(0, this.topLeft.col);\n            return new RangeRef(new CellRef(this.topLeft.row, col), new CellRef(this.bottomRight.row, col)).setSheet(this.sheet, this.hasSheet());\n        },\n        toCell: function (row, col) {\n            row += Math.max(0, this.topLeft.row);\n            col += Math.max(0, this.topLeft.col);\n            return new CellRef(row, col, 0).setSheet(this.sheet, this.hasSheet());\n        },\n        forEachRow: function (callback) {\n            var startRow = this.topLeft.row;\n            var endRow = this.bottomRight.row;\n            var startCol = this.topLeft.col;\n            var endCol = this.bottomRight.col;\n            for (var i = startRow; i <= endRow; i++) {\n                callback(new RangeRef(new CellRef(i, startCol), new CellRef(i, endCol)));\n            }\n        },\n        forEachColumn: function (callback) {\n            var startRow = this.topLeft.row;\n            var endRow = this.bottomRight.row;\n            var startCol = this.topLeft.col;\n            var endCol = this.bottomRight.col;\n            for (var i = startCol; i <= endCol; i++) {\n                callback(new RangeRef(new CellRef(startRow, i), new CellRef(endRow, i)));\n            }\n        },\n        intersecting: function (refs) {\n            return refs.filter(function (ref) {\n                return ref.toRangeRef().intersects(this);\n            }, this);\n        },\n        union: function (refs, callback) {\n            var intersecting = this.intersecting(refs);\n            var topLeftRow = this.topLeft.row;\n            var topLeftCol = this.topLeft.col;\n            var bottomRightRow = this.bottomRight.row;\n            var bottomRightCol = this.bottomRight.col;\n            var modified = false;\n            intersecting.forEach(function (ref) {\n                ref = ref.toRangeRef();\n                if (ref.topLeft.row < topLeftRow) {\n                    modified = true;\n                    topLeftRow = ref.topLeft.row;\n                }\n                if (ref.topLeft.col < topLeftCol) {\n                    modified = true;\n                    topLeftCol = ref.topLeft.col;\n                }\n                if (ref.bottomRight.row > bottomRightRow) {\n                    modified = true;\n                    bottomRightRow = ref.bottomRight.row;\n                }\n                if (ref.bottomRight.col > bottomRightCol) {\n                    modified = true;\n                    bottomRightCol = ref.bottomRight.col;\n                }\n                if (callback) {\n                    callback(ref);\n                }\n            });\n            var result = new RangeRef(new CellRef(topLeftRow, topLeftCol), new CellRef(bottomRightRow, bottomRightCol));\n            if (modified) {\n                return result.union(refs, callback);\n            } else {\n                return result;\n            }\n        },\n        resize: function (options) {\n            var limit = Math.max.bind(Math, 0);\n            function num(value) {\n                return value || 0;\n            }\n            var top = this.topLeft.row + num(options.top);\n            var left = this.topLeft.col + num(options.left);\n            var bottom = this.bottomRight.row + num(options.bottom);\n            var right = this.bottomRight.col + num(options.right);\n            if (left < 0 && right < 0 || top < 0 && bottom < 0) {\n                return NULL;\n            } else if (top <= bottom && left <= right) {\n                return new RangeRef(new CellRef(limit(top), limit(left)), new CellRef(limit(bottom), limit(right)));\n            } else {\n                return NULL;\n            }\n        },\n        move: function (rows, cols) {\n            return new RangeRef(new CellRef(this.topLeft.row + rows, this.topLeft.col + cols), new CellRef(this.bottomRight.row + rows, this.bottomRight.col + cols));\n        },\n        first: function () {\n            return this.topLeft;\n        },\n        isCell: function () {\n            return !this.endSheet && this.topLeft.eq(this.bottomRight);\n        },\n        toString: function () {\n            return this.topLeft + ':' + this.bottomRight;\n        },\n        adjust: function (row, col, trow, tcol, forRow, start, delta) {\n            var tl = this.topLeft.adjust(row, col, trow, tcol, forRow, start, delta);\n            var tr = this.bottomRight.adjust(row, col, trow, tcol, forRow, start, delta);\n            if (tl === NULL && tr === NULL) {\n                return NULL;\n            }\n            if (tl === NULL) {\n                tl = this.topLeft.absolute(row, col);\n                if (forRow) {\n                    tl.row = start;\n                } else {\n                    tl.col = start;\n                }\n                if (trow != null && tcol != null) {\n                    tl = tl.relative(trow, tcol, this.topLeft.rel);\n                }\n            } else if (tr === NULL) {\n                tr = this.bottomRight.absolute(row, col);\n                if (forRow) {\n                    tr.row = start - 1;\n                } else {\n                    tr.col = start - 1;\n                }\n                if (trow != null && tcol != null) {\n                    tr = tr.relative(trow, tcol, this.bottomRight.rel);\n                }\n            }\n            return new RangeRef(tl, tr).setSheet(this.sheet, this.hasSheet()).simplify();\n        },\n        valid: function () {\n            return this.topLeft.valid() && this.bottomRight.valid();\n        }\n    });\n    var UnionRef = Ref.extend({\n        init: function UnionRef(refs) {\n            this.refs = refs;\n            this.length = refs.length;\n        },\n        clone: function () {\n            return new UnionRef(this.refs.slice());\n        },\n        intersect: function (ref) {\n            var a = [];\n            for (var i = 0; i < this.length; ++i) {\n                var x = ref.intersect(this.refs[i]);\n                if (x !== NULL) {\n                    a.push(x);\n                }\n            }\n            if (a.length > 0) {\n                return new UnionRef(a).simplify();\n            }\n            return NULL;\n        },\n        simplify: function () {\n            var u = new UnionRef(this.refs.reduce(function (a, ref) {\n                ref = ref.simplify();\n                if (ref !== NULL) {\n                    a.push(ref);\n                }\n                return a;\n            }, []));\n            if (u.empty()) {\n                return NULL;\n            }\n            if (u.single()) {\n                return u.refs[0];\n            }\n            return u;\n        },\n        absolute: function (arow, acol) {\n            return new UnionRef(this.refs.map(function (ref) {\n                return ref.absolute(arow, acol);\n            }));\n        },\n        forEach: function (callback, obj) {\n            this.refs.forEach(function (ref) {\n                if (ref instanceof UnionRef) {\n                    ref.forEach(callback, obj);\n                } else {\n                    callback.call(obj, ref);\n                }\n            }, obj);\n        },\n        toRangeRef: function () {\n            return this.refs[0].toRangeRef();\n        },\n        contains: function (theRef) {\n            return this.refs.some(function (ref) {\n                return ref.contains(theRef);\n            });\n        },\n        map: function (callback, obj) {\n            var refs = [];\n            this.forEach(function (ref) {\n                refs.push(callback.call(obj, ref));\n            });\n            return new UnionRef(refs);\n        },\n        first: function () {\n            return this.refs[0].first();\n        },\n        lastRange: function () {\n            return this.refs[this.length - 1];\n        },\n        size: function () {\n            return this.length;\n        },\n        single: function () {\n            return this.length == 1;\n        },\n        empty: function () {\n            return this.length === 0;\n        },\n        isCell: function () {\n            return this.single() && this.refs[0].isCell();\n        },\n        rangeAt: function (index) {\n            return this.refs[index];\n        },\n        nextRangeIndex: function (index) {\n            if (index === this.length - 1) {\n                return 0;\n            } else {\n                return index + 1;\n            }\n        },\n        previousRangeIndex: function (index) {\n            if (index === 0) {\n                return this.length - 1;\n            } else {\n                return index - 1;\n            }\n        },\n        concat: function (ref) {\n            return new UnionRef(this.refs.concat([ref]));\n        },\n        print: function (row, col, mod) {\n            return this.refs.map(function (ref) {\n                return ref.print(row, col, mod);\n            }).join(',');\n        },\n        replaceAt: function (index, ref) {\n            var newRefs = this.refs.slice();\n            newRefs.splice(index, 1, ref);\n            return new UnionRef(newRefs);\n        },\n        leftColumn: function () {\n            return this.map(function (ref) {\n                return ref.leftColumn();\n            });\n        },\n        rightColumn: function () {\n            return this.map(function (ref) {\n                return ref.rightColumn();\n            });\n        },\n        topRow: function () {\n            return this.map(function (ref) {\n                return ref.topRow();\n            });\n        },\n        bottomRow: function () {\n            return this.map(function (ref) {\n                return ref.bottomRow();\n            });\n        },\n        forEachRow: function (callback) {\n            this.forEach(function (ref) {\n                ref.forEachRow(callback);\n            });\n        },\n        forEachColumn: function (callback) {\n            this.forEach(function (ref) {\n                ref.forEachColumn(callback);\n            });\n        },\n        adjust: function (row, col, trow, tcol, forRow, start, delta) {\n            return this.map(function (ref) {\n                return ref.adjust(row, col, trow, tcol, forRow, start, delta);\n            }).simplify();\n        },\n        toString: function () {\n            return this.refs.map(function (ref) {\n                return ref.toString();\n            }).join(', ');\n        },\n        valid: function () {\n            for (var i = this.refs.length; --i >= 0;) {\n                if (this.refs[i].valid()) {\n                    return false;\n                }\n            }\n            return true;\n        },\n        renameSheet: function (oldSheetName, newSheetName) {\n            this.refs.forEach(function (ref) {\n                ref.renameSheet(oldSheetName, newSheetName);\n            });\n        }\n    });\n    spreadsheet.NULLREF = NULL;\n    spreadsheet.SHEETREF = new RangeRef(new CellRef(0, 0), new CellRef(Infinity, Infinity));\n    spreadsheet.FIRSTREF = new CellRef(0, 0);\n    spreadsheet.Ref = Ref;\n    spreadsheet.NameRef = NameRef;\n    spreadsheet.CellRef = CellRef;\n    spreadsheet.RangeRef = RangeRef;\n    spreadsheet.UnionRef = UnionRef;\n    spreadsheet.SHEETREF.print = function () {\n        return '#SHEET';\n    };\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('spreadsheet/autofillcalculator', ['kendo.core'], f);\n}(function () {\n    (function (kendo) {\n        if (kendo.support.browser.msie && kendo.support.browser.version < 9) {\n            return;\n        }\n        var RangeRef = kendo.spreadsheet.RangeRef;\n        var CellRef = kendo.spreadsheet.CellRef;\n        var AutoFillCalculator = kendo.Class.extend({\n            init: function (grid) {\n                this._grid = grid;\n            },\n            rectIsVertical: function (start, end, x, y) {\n                var startRect = this._grid.rectangle(start.toRangeRef());\n                var endRect = this._grid.rectangle(end.toRangeRef());\n                return Math.abs(endRect[y] - startRect[y]) > Math.abs(startRect[x] - endRect[x]);\n            },\n            autoFillDest: function (selection, cursor) {\n                var topLeft = selection.topLeft;\n                var bottomRight = selection.bottomRight;\n                var quadrant;\n                var lower = cursor.row >= topLeft.row;\n                var further = cursor.col >= topLeft.col;\n                if (lower) {\n                    quadrant = further ? 4 : 3;\n                } else {\n                    quadrant = further ? 2 : 1;\n                }\n                var pivot, opposite, cornerResult, expanding;\n                if (quadrant === 4) {\n                    pivot = topLeft;\n                    opposite = bottomRight;\n                    expanding = cursor.row > opposite.row || cursor.col > opposite.col;\n                    if (expanding) {\n                        cursor = new CellRef(Math.max(cursor.row, opposite.row), Math.max(cursor.col, opposite.col));\n                    }\n                    if (this.rectIsVertical(opposite, cursor, 'right', 'bottom')) {\n                        cornerResult = new CellRef(cursor.row, opposite.col);\n                    } else {\n                        cornerResult = new CellRef(opposite.row, cursor.col);\n                    }\n                } else if (quadrant === 3) {\n                    var bottomLeft = new CellRef(topLeft.col, bottomRight.row);\n                    if (cursor.row > bottomRight.row && this.rectIsVertical(bottomLeft, cursor, 'left', 'bottom')) {\n                        pivot = topLeft;\n                        cornerResult = new CellRef(cursor.row, bottomRight.col);\n                    } else {\n                        pivot = bottomRight;\n                        cornerResult = new CellRef(topLeft.row, cursor.col);\n                    }\n                } else if (quadrant === 2) {\n                    var topRight = new CellRef(topLeft.row, bottomRight.col);\n                    if (cursor.col > bottomRight.col && !this.rectIsVertical(topRight, cursor, 'right', 'top')) {\n                        pivot = topLeft;\n                        cornerResult = new CellRef(bottomRight.row, cursor.col);\n                    } else {\n                        pivot = bottomRight;\n                        cornerResult = new CellRef(cursor.row, topLeft.col);\n                    }\n                } else {\n                    pivot = bottomRight;\n                    if (this.rectIsVertical(topLeft, cursor, 'left', 'top')) {\n                        cornerResult = new CellRef(cursor.row, topLeft.col);\n                    } else {\n                        cornerResult = new CellRef(topLeft.row, cursor.col);\n                    }\n                }\n                return this._grid.normalize(new RangeRef(pivot, cornerResult));\n            }\n        });\n        kendo.spreadsheet.AutoFillCalculator = AutoFillCalculator;\n    }(kendo));\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('spreadsheet/navigator', [\n        'kendo.core',\n        'spreadsheet/autofillcalculator'\n    ], f);\n}(function () {\n    (function (kendo) {\n        if (kendo.support.browser.msie && kendo.support.browser.version < 9) {\n            return;\n        }\n        var RangeRef = kendo.spreadsheet.RangeRef;\n        var CellRef = kendo.spreadsheet.CellRef;\n        var EdgeNavigator = kendo.Class.extend({\n            init: function (field, axis, rangeGetter, union) {\n                this.rangeGetter = rangeGetter;\n                this.prevLeft = function (index) {\n                    var current = union(this.range(index));\n                    var range = this.range(axis.prevVisible(current.topLeft[field]));\n                    return union(range).topLeft[field];\n                };\n                this.nextRight = function (index) {\n                    var current = union(this.range(index));\n                    var range = this.range(axis.nextVisible(current.bottomRight[field]));\n                    return union(range).bottomRight[field];\n                };\n                this.nextLeft = function (index) {\n                    var range = union(this.range(index));\n                    return axis.nextVisible(range.bottomRight[field]);\n                };\n                this.prevRight = function (index) {\n                    var range = union(this.range(index));\n                    return axis.prevVisible(range.topLeft[field]);\n                };\n            },\n            boundary: function (top, bottom) {\n                this.top = top;\n                this.bottom = bottom;\n            },\n            range: function (index) {\n                return this.rangeGetter(index, this.top, this.bottom);\n            }\n        });\n        var SheetNavigator = kendo.Class.extend({\n            init: function (sheet) {\n                this._sheet = sheet;\n                this.columns = this._sheet._grid._columns;\n                this.autoFillCalculator = new kendo.spreadsheet.AutoFillCalculator(sheet._grid);\n                this.colEdge = new EdgeNavigator('col', this._sheet._grid._columns, this.columnRange.bind(this), this.union.bind(this));\n                this.rowEdge = new EdgeNavigator('row', this._sheet._grid._rows, this.rowRange.bind(this), this.union.bind(this));\n            },\n            height: function (height) {\n                this._viewPortHeight = height;\n            },\n            union: function (ref) {\n                return this._sheet.unionWithMerged(ref);\n            },\n            columnRange: function (col, topRow, bottomRow) {\n                return this._sheet._ref(topRow, col, bottomRow - topRow, 1);\n            },\n            rowRange: function (row, leftCol, rightCol) {\n                return this._sheet._ref(row, leftCol, 1, rightCol - leftCol);\n            },\n            selectionIncludesMergedCells: function () {\n                return this._sheet.select().contains(this._sheet._mergedCells);\n            },\n            setSelectionValue: function (value) {\n                var selection = this._sheet.selection();\n                setTimeout(function () {\n                    selection.value(value());\n                });\n            },\n            selectAll: function () {\n                this._sheet.select(this._sheet._sheetRef);\n            },\n            select: function (ref, mode, addToExisting) {\n                ref = this.refForMode(ref, mode);\n                if (addToExisting) {\n                    ref = this._sheet.select().concat(ref);\n                }\n                this._sheet.select(ref);\n            },\n            refForMode: function (ref, mode) {\n                var grid = this._sheet._grid;\n                switch (mode) {\n                case 'range':\n                    ref = grid.normalize(ref);\n                    break;\n                case 'row':\n                    ref = grid.rowRef(ref.row);\n                    break;\n                case 'column':\n                    ref = grid.colRef(ref.col);\n                    break;\n                case 'sheet':\n                    ref = this._sheet._sheetRef;\n                    break;\n                }\n                return ref;\n            },\n            startSelection: function (ref, mode, addToExisting, shiftKey) {\n                if (mode == 'autofill') {\n                    this._sheet.startAutoFill();\n                } else if (shiftKey && mode == 'range') {\n                    var range = new RangeRef(this._sheet.activeCell().first(), ref);\n                    this._sheet.select(range, false, false);\n                    this._sheet.startSelection();\n                } else {\n                    this._sheet.startSelection();\n                    this.select(ref, mode, addToExisting);\n                }\n            },\n            completeSelection: function () {\n                this._sheet.completeSelection();\n            },\n            selectForContextMenu: function (ref, mode) {\n                var sheet = this._sheet;\n                if (!sheet.select().contains(this.refForMode(ref, mode))) {\n                    this.select(ref, mode);\n                }\n            },\n            modifySelection: function (action) {\n                var direction = this.determineDirection(action);\n                var sheet = this._sheet;\n                var viewPortHeight = this._viewPortHeight;\n                var rows = sheet._grid._rows;\n                var columns = sheet._grid._columns;\n                var originalSelection = sheet.currentOriginalSelectionRange();\n                var selection = sheet.select().toRangeRef();\n                var activeCell = sheet.activeCell();\n                var topLeft = originalSelection.topLeft.clone();\n                var bottomRight = originalSelection.bottomRight.clone();\n                var scrollInto;\n                this.colEdge.boundary(selection.topLeft.row, selection.bottomRight.row);\n                this.rowEdge.boundary(selection.topLeft.col, selection.bottomRight.col);\n                switch (direction) {\n                case 'expand-left':\n                    topLeft.col = this.colEdge.prevLeft(topLeft.col);\n                    scrollInto = topLeft;\n                    break;\n                case 'shrink-right':\n                    topLeft.col = this.colEdge.nextLeft(topLeft.col);\n                    scrollInto = topLeft;\n                    break;\n                case 'expand-right':\n                    bottomRight.col = this.colEdge.nextRight(bottomRight.col);\n                    scrollInto = bottomRight;\n                    break;\n                case 'shrink-left':\n                    bottomRight.col = this.colEdge.prevRight(bottomRight.col);\n                    scrollInto = bottomRight;\n                    break;\n                case 'expand-up':\n                    topLeft.row = this.rowEdge.prevLeft(topLeft.row);\n                    scrollInto = topLeft;\n                    break;\n                case 'shrink-down':\n                    topLeft.row = this.rowEdge.nextLeft(topLeft.row);\n                    scrollInto = topLeft;\n                    break;\n                case 'expand-down':\n                    bottomRight.row = this.rowEdge.nextRight(bottomRight.row);\n                    scrollInto = bottomRight;\n                    break;\n                case 'shrink-up':\n                    bottomRight.row = this.rowEdge.prevRight(bottomRight.row);\n                    scrollInto = bottomRight;\n                    break;\n                case 'expand-page-up':\n                    topLeft.row = rows.prevPage(topLeft.row, viewPortHeight);\n                    break;\n                case 'shrink-page-up':\n                    bottomRight.row = rows.prevPage(bottomRight.row, viewPortHeight);\n                    break;\n                case 'expand-page-down':\n                    bottomRight.row = rows.nextPage(bottomRight.row, viewPortHeight);\n                    break;\n                case 'shrink-page-down':\n                    topLeft.row = rows.nextPage(topLeft.row, viewPortHeight);\n                    break;\n                case 'first-col':\n                    topLeft.col = columns.firstVisible();\n                    bottomRight.col = activeCell.bottomRight.col;\n                    scrollInto = topLeft;\n                    break;\n                case 'last-col':\n                    bottomRight.col = columns.lastVisible();\n                    topLeft.col = activeCell.topLeft.col;\n                    scrollInto = bottomRight;\n                    break;\n                case 'first-row':\n                    topLeft.row = rows.firstVisible();\n                    bottomRight.row = activeCell.bottomRight.row;\n                    scrollInto = topLeft;\n                    break;\n                case 'last-row':\n                    bottomRight.row = rows.lastVisible();\n                    topLeft.row = activeCell.topLeft.row;\n                    scrollInto = bottomRight;\n                    break;\n                case 'last':\n                    bottomRight.row = rows.lastVisible();\n                    bottomRight.col = columns.lastVisible();\n                    topLeft = activeCell.topLeft;\n                    scrollInto = bottomRight;\n                    break;\n                case 'first':\n                    topLeft.row = rows.firstVisible();\n                    topLeft.col = columns.firstVisible();\n                    bottomRight = activeCell.bottomRight;\n                    scrollInto = topLeft;\n                    break;\n                }\n                var newSelection = new RangeRef(topLeft, bottomRight);\n                if (!this.union(newSelection).intersects(activeCell)) {\n                    this.modifySelection(direction.replace('shrink', 'expand'));\n                    return;\n                }\n                if (scrollInto) {\n                    sheet.focus(scrollInto);\n                }\n                this.updateCurrentSelectionRange(newSelection);\n            },\n            moveActiveCell: function (direction) {\n                var sheet = this._sheet;\n                var activeCell = sheet.activeCell();\n                var topLeft = activeCell.topLeft;\n                var bottomRight = activeCell.bottomRight;\n                var cell = sheet.originalActiveCell();\n                var rows = sheet._grid._rows;\n                var columns = sheet._grid._columns;\n                var row = cell.row;\n                var column = cell.col;\n                switch (direction) {\n                case 'left':\n                    column = columns.prevVisible(topLeft.col);\n                    break;\n                case 'up':\n                    row = rows.prevVisible(topLeft.row);\n                    break;\n                case 'right':\n                    column = columns.nextVisible(bottomRight.col);\n                    break;\n                case 'down':\n                    row = rows.nextVisible(bottomRight.row);\n                    break;\n                case 'first-col':\n                    column = columns.firstVisible();\n                    break;\n                case 'last-col':\n                    column = columns.lastVisible();\n                    break;\n                case 'first-row':\n                    row = rows.firstVisible();\n                    break;\n                case 'last-row':\n                    row = rows.lastVisible();\n                    break;\n                case 'last':\n                    row = rows.lastVisible();\n                    column = columns.lastVisible();\n                    break;\n                case 'first':\n                    row = rows.firstVisible();\n                    column = columns.firstVisible();\n                    break;\n                case 'next-page':\n                    row = rows.nextPage(bottomRight.row, this._viewPortHeight);\n                    break;\n                case 'prev-page':\n                    row = rows.prevPage(bottomRight.row, this._viewPortHeight);\n                    break;\n                }\n                sheet.select(new CellRef(row, column));\n            },\n            navigateInSelection: function (direction) {\n                var sheet = this._sheet;\n                var activeCell = sheet.activeCell();\n                var topLeft = activeCell.topLeft;\n                var cell = sheet.originalActiveCell();\n                var rows = sheet._grid._rows;\n                var columns = sheet._grid._columns;\n                var row = cell.row;\n                var column = cell.col;\n                var selection = sheet.currentNavigationRange();\n                var selTopLeft = selection.topLeft;\n                var selBottomRight = selection.bottomRight;\n                var done = false;\n                var topLeftCol = topLeft.col;\n                var topLeftRow = topLeft.row;\n                while (!done) {\n                    var current = new CellRef(row, column);\n                    switch (direction) {\n                    case 'next':\n                        if (selBottomRight.eq(current)) {\n                            selection = sheet.nextNavigationRange();\n                            row = selection.topLeft.row;\n                            column = selection.topLeft.col;\n                        } else {\n                            column = columns.nextVisible(topLeftCol, true);\n                            if (column > selBottomRight.col) {\n                                column = selTopLeft.col;\n                                row = rows.nextVisible(row, true);\n                            }\n                        }\n                        break;\n                    case 'previous':\n                        if (selTopLeft.eq(current)) {\n                            selection = sheet.previousNavigationRange();\n                            row = selection.bottomRight.row;\n                            column = selection.bottomRight.col;\n                        } else {\n                            column = columns.prevVisible(topLeftCol, true);\n                            if (column < selTopLeft.col) {\n                                column = selBottomRight.col;\n                                row = rows.prevVisible(row, true);\n                            }\n                        }\n                        break;\n                    case 'lower':\n                        if (selBottomRight.eq(current)) {\n                            selection = sheet.nextNavigationRange();\n                            row = selection.topLeft.row;\n                            column = selection.topLeft.col;\n                        } else {\n                            row = rows.nextVisible(topLeftRow, true);\n                            if (row > selBottomRight.row) {\n                                row = selTopLeft.row;\n                                column = columns.nextVisible(column, true);\n                            }\n                        }\n                        break;\n                    case 'upper':\n                        if (selTopLeft.eq(current)) {\n                            selection = sheet.previousNavigationRange();\n                            row = selection.bottomRight.row;\n                            column = selection.bottomRight.col;\n                        } else {\n                            row = rows.prevVisible(topLeftRow, true);\n                            if (row < selTopLeft.row) {\n                                row = selBottomRight.row;\n                                column = columns.prevVisible(column, true);\n                            }\n                        }\n                        break;\n                    default:\n                        throw new Error('Unknown entry navigation: ' + direction);\n                    }\n                    done = !this.shouldSkip(row, column);\n                    topLeftCol = column;\n                    topLeftRow = row;\n                }\n                if (sheet.singleCellSelection()) {\n                    sheet.select(new CellRef(row, column));\n                } else {\n                    sheet.activeCell(new CellRef(row, column));\n                }\n            },\n            extendSelection: function (ref, mode) {\n                var sheet = this._sheet;\n                var grid = sheet._grid;\n                if (mode === 'autofill') {\n                    this.resizeAutoFill(ref);\n                    return;\n                }\n                if (mode === 'range') {\n                    ref = grid.normalize(ref);\n                } else if (mode === 'row') {\n                    ref = grid.rowRef(ref.row).bottomRight;\n                } else if (mode === 'column') {\n                    ref = grid.colRef(ref.col).bottomRight;\n                }\n                var activeCell = sheet.originalActiveCell().toRangeRef();\n                this.updateCurrentSelectionRange(new RangeRef(activeCell.topLeft, ref));\n            },\n            shouldSkip: function (row, col) {\n                var ref = new CellRef(row, col);\n                var isMerged = false;\n                this._sheet.forEachMergedCell(function (merged) {\n                    if (merged.intersects(ref) && !merged.collapse().eq(ref)) {\n                        isMerged = true;\n                    }\n                });\n                return isMerged;\n            },\n            resizeAutoFill: function (ref) {\n                var sheet = this._sheet;\n                var selection = sheet.select();\n                var origin = sheet._autoFillOrigin;\n                var dest = this.autoFillCalculator.autoFillDest(selection, ref);\n                var punch = this.punch(selection, dest);\n                var hint, direction, row;\n                if (!punch) {\n                    var preview = sheet.range(dest)._previewFillFrom(sheet.range(origin));\n                    if (preview) {\n                        direction = preview.direction;\n                        var props = preview.props;\n                        if (direction === 0 || direction == 1) {\n                            row = props[props.length - 1];\n                            hint = row[row.length - 1].value;\n                        } else if (direction === 2) {\n                            row = props[0];\n                            hint = row[row.length - 1].value;\n                        } else if (direction === 3) {\n                            row = props[props.length - 1];\n                            hint = row[0].value;\n                        }\n                    }\n                }\n                sheet.updateAutoFill(dest, punch, hint, direction);\n            },\n            determineDirection: function (action) {\n                var selection = this._sheet.currentSelectionRange();\n                var activeCell = this._sheet.activeCell();\n                var leftMode = activeCell.topLeft.col == selection.topLeft.col;\n                var rightMode = activeCell.bottomRight.col == selection.bottomRight.col;\n                var topMode = activeCell.topLeft.row == selection.topLeft.row;\n                var bottomMode = activeCell.bottomRight.row == selection.bottomRight.row;\n                switch (action) {\n                case 'left':\n                    action = rightMode ? 'expand-left' : 'shrink-left';\n                    break;\n                case 'right':\n                    action = leftMode ? 'expand-right' : 'shrink-right';\n                    break;\n                case 'up':\n                    action = bottomMode ? 'expand-up' : 'shrink-up';\n                    break;\n                case 'down':\n                    action = topMode ? 'expand-down' : 'shrink-down';\n                    break;\n                case 'prev-page':\n                    action = bottomMode ? 'expand-page-up' : 'shrink-page-up';\n                    break;\n                case 'next-page':\n                    action = topMode ? 'expand-page-down' : 'shrink-page-down';\n                    break;\n                }\n                return action;\n            },\n            updateCurrentSelectionRange: function (ref) {\n                var sheet = this._sheet;\n                sheet.select(sheet.originalSelect().replaceAt(sheet.selectionRangeIndex(), ref), false);\n            },\n            punch: function (selection, subset) {\n                var punch;\n                if (subset.topLeft.eq(selection.topLeft)) {\n                    if (subset.bottomRight.row < selection.bottomRight.row) {\n                        var bottomRow = this.rowEdge.nextRight(subset.bottomRight.row);\n                        punch = new RangeRef(new CellRef(bottomRow, selection.topLeft.col), selection.bottomRight);\n                    } else if (subset.bottomRight.col < selection.bottomRight.col) {\n                        var bottomCol = this.colEdge.nextRight(subset.bottomRight.col);\n                        punch = new RangeRef(new CellRef(selection.topLeft.row, bottomCol), selection.bottomRight);\n                    }\n                }\n                return punch;\n            }\n        });\n        kendo.spreadsheet.SheetNavigator = SheetNavigator;\n    }(kendo));\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('spreadsheet/axismanager', ['kendo.core'], f);\n}(function () {\n    (function (kendo) {\n        if (kendo.support.browser.msie && kendo.support.browser.version < 9) {\n            return;\n        }\n        var AxisManager = kendo.Class.extend({\n            init: function (sheet) {\n                this._sheet = sheet;\n            },\n            forEachSelectedColumn: function (callback) {\n                var sheet = this._sheet;\n                sheet.batch(function () {\n                    sheet.select().forEachColumnIndex(function (index, i) {\n                        callback(sheet, index, i);\n                    });\n                }, {\n                    layout: true,\n                    recalc: true\n                });\n            },\n            forEachSelectedRow: function (callback) {\n                var sheet = this._sheet;\n                sheet.batch(function () {\n                    sheet.select().forEachRowIndex(function (index, i) {\n                        callback(sheet, index, i);\n                    });\n                }, {\n                    layout: true,\n                    recalc: true\n                });\n            },\n            includesHiddenColumns: function (ref) {\n                return this._sheet._grid._columns.includesHidden(ref.topLeft.col, ref.bottomRight.col);\n            },\n            includesHiddenRows: function (ref) {\n                return this._sheet._grid._rows.includesHidden(ref.topLeft.row, ref.bottomRight.row);\n            },\n            selectionIncludesHiddenColumns: function () {\n                return this.includesHiddenColumns(this._sheet.select());\n            },\n            selectionIncludesHiddenRows: function () {\n                return this.includesHiddenRows(this._sheet.select());\n            },\n            deleteSelectedColumns: function () {\n                this.forEachSelectedColumn(function (sheet, index, i) {\n                    sheet.deleteColumn(index - i);\n                });\n            },\n            deleteSelectedRows: function () {\n                this.forEachSelectedRow(function (sheet, index, i) {\n                    sheet.deleteRow(index - i);\n                });\n            },\n            hideSelectedColumns: function () {\n                this.forEachSelectedColumn(function (sheet, index) {\n                    sheet.hideColumn(index);\n                });\n                var sheet = this._sheet;\n                var ref = sheet.select().toRangeRef();\n                var left = ref.topLeft.col;\n                var right = ref.bottomRight.col;\n                var sel = null;\n                while (true) {\n                    var hasRight = right < sheet._columns._count;\n                    var hasLeft = left >= 0;\n                    if (!hasLeft && !hasRight) {\n                        break;\n                    }\n                    if (hasRight && !sheet.isHiddenColumn(right)) {\n                        sel = right;\n                        break;\n                    }\n                    if (hasLeft && !sheet.isHiddenColumn(left)) {\n                        sel = left;\n                        break;\n                    }\n                    left--;\n                    right++;\n                }\n                if (sel !== null) {\n                    ref = new kendo.spreadsheet.RangeRef(new kendo.spreadsheet.CellRef(0, sel), new kendo.spreadsheet.CellRef(sheet._rows._count - 1, sel));\n                    sheet.range(ref).select();\n                }\n            },\n            hideSelectedRows: function () {\n                this.forEachSelectedRow(function (sheet, index) {\n                    sheet.hideRow(index);\n                });\n                var sheet = this._sheet;\n                var ref = sheet.select().toRangeRef();\n                var top = ref.topLeft.row;\n                var bottom = ref.bottomRight.row;\n                var sel = null;\n                while (true) {\n                    var hasBottom = bottom < sheet._rows._count;\n                    var hasTop = top >= 0;\n                    if (!hasTop && !hasBottom) {\n                        break;\n                    }\n                    if (hasBottom && !sheet.isHiddenRow(bottom)) {\n                        sel = bottom;\n                        break;\n                    }\n                    if (hasTop && !sheet.isHiddenRow(top)) {\n                        sel = top;\n                        break;\n                    }\n                    top--;\n                    bottom++;\n                }\n                if (sel !== null) {\n                    ref = new kendo.spreadsheet.RangeRef(new kendo.spreadsheet.CellRef(sel, 0), new kendo.spreadsheet.CellRef(sel, sheet._columns._count - 1));\n                    sheet.range(ref).select();\n                }\n            },\n            unhideSelectedColumns: function () {\n                this.forEachSelectedColumn(function (sheet, index) {\n                    sheet.unhideColumn(index);\n                });\n            },\n            unhideSelectedRows: function () {\n                this.forEachSelectedRow(function (sheet, index) {\n                    sheet.unhideRow(index);\n                });\n            },\n            addColumnLeft: function () {\n                this.forEachSelectedColumn(function (sheet, index, i) {\n                    sheet.insertColumn(index - i);\n                });\n            },\n            addColumnRight: function () {\n                this.forEachSelectedColumn(function (sheet, index, i) {\n                    sheet.insertColumn(index + (i + 1));\n                });\n            },\n            preventAddRow: function () {\n                var range = this._sheet.select().toRangeRef();\n                var rowCount = range.height();\n                return this._sheet.preventInsertRow(0, rowCount);\n            },\n            preventAddColumn: function () {\n                var range = this._sheet.select().toRangeRef();\n                var columnCount = range.width();\n                return this._sheet.preventInsertColumn(0, columnCount);\n            },\n            addRowAbove: function () {\n                this.forEachSelectedRow(function (sheet, index, i) {\n                    sheet.insertRow(index - i);\n                });\n            },\n            addRowBelow: function () {\n                this.forEachSelectedRow(function (sheet, index, i) {\n                    sheet.insertRow(index + (i + 1));\n                });\n            }\n        });\n        kendo.spreadsheet.AxisManager = AxisManager;\n    }(kendo));\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('spreadsheet/clipboard', ['kendo.core'], f);\n}(function () {\n    (function (kendo) {\n        if (kendo.support.browser.msie && kendo.support.browser.version < 9) {\n            return;\n        }\n        var $ = kendo.jQuery;\n        var CellRef = kendo.spreadsheet.CellRef;\n        var Clipboard = kendo.Class.extend({\n            init: function (workbook) {\n                this._content = {};\n                this._externalContent = {};\n                this._internalContent = {};\n                this.workbook = workbook;\n                this.origin = kendo.spreadsheet.NULLREF;\n                this.iframe = document.createElement('iframe');\n                this.iframe.className = 'k-spreadsheet-clipboard-paste';\n                this.menuInvoked = true;\n                this._uid = kendo.guid();\n                document.body.appendChild(this.iframe);\n            },\n            destroy: function () {\n                document.body.removeChild(this.iframe);\n            },\n            canCopy: function () {\n                var status = { canCopy: true };\n                var selection = this.workbook.activeSheet().select();\n                if (selection === kendo.spreadsheet.NULLREF) {\n                    status.canCopy = false;\n                }\n                if (selection instanceof kendo.spreadsheet.UnionRef) {\n                    status.canCopy = false;\n                    status.multiSelection = true;\n                }\n                if (this.menuInvoked) {\n                    status.canCopy = false;\n                    status.menuInvoked = true;\n                }\n                return status;\n            },\n            canPaste: function () {\n                var sheet = this.workbook.activeSheet();\n                var ref = this.pasteRef();\n                var range = sheet.range(ref);\n                var status = {\n                    canPaste: true,\n                    pasteOnMerged: false,\n                    pasteOnDisabled: false\n                };\n                if (!range.enable()) {\n                    status.canPaste = false;\n                    status.pasteOnDisabled = true;\n                }\n                if (!ref.eq(sheet.unionWithMerged(ref))) {\n                    status.canPaste = false;\n                    status.pasteOnMerged = true;\n                }\n                if (this.menuInvoked) {\n                    status.canPaste = false;\n                    status.menuInvoked = true;\n                }\n                if (ref.bottomRight.row >= sheet._rows._count || ref.bottomRight.col >= sheet._columns._count) {\n                    status.canPaste = false;\n                    status.overflow = true;\n                }\n                return status;\n            },\n            intersectsMerged: function () {\n                var sheet = this.workbook.activeSheet();\n                this.parse();\n                this.origin = this._content.origRef;\n                var ref = this.pasteRef();\n                return !ref.eq(sheet.unionWithMerged(ref));\n            },\n            copy: function () {\n                var sheet = this.workbook.activeSheet();\n                this.origin = sheet.select();\n                this._internalContent = sheet.selection().getState();\n                delete this._externalContent.html;\n                delete this._externalContent.plain;\n            },\n            cut: function () {\n                var sheet = this.workbook.activeSheet();\n                this.copy();\n                sheet.range(sheet.select()).clear();\n            },\n            pasteRef: function () {\n                var sheet = this.workbook.activeSheet();\n                var destination = sheet.activeCell().first();\n                var originActiveCell = this.origin.first();\n                var rowDelta = originActiveCell.row - destination.row;\n                var colDelta = originActiveCell.col - destination.col;\n                return this.origin.relative(rowDelta, colDelta, 3);\n            },\n            paste: function () {\n                var sheet = this.workbook.activeSheet();\n                var pasteRef = this.pasteRef();\n                sheet.range(pasteRef).setState(this._content, this);\n                sheet.triggerChange({\n                    recalc: true,\n                    ref: pasteRef\n                });\n            },\n            external: function (data) {\n                if (data && (data.html || data.plain)) {\n                    this._externalContent = data;\n                } else {\n                    return this._externalContent;\n                }\n            },\n            isExternal: function () {\n                return !this._isInternal();\n            },\n            parse: function () {\n                var state = newState();\n                if (this._isInternal()) {\n                    state = this._internalContent;\n                } else {\n                    var data = this._externalContent;\n                    if (data.html) {\n                        var doc = this.iframe.contentWindow.document;\n                        doc.open();\n                        doc.write(data.html);\n                        doc.close();\n                        var table = $(doc).find('table:first');\n                        if (table.length) {\n                            state = parseHTML(table);\n                        } else {\n                            state = parseTSV(data.plain);\n                        }\n                    } else {\n                        state = parseTSV(data.plain);\n                    }\n                    this.origin = state.origRef;\n                }\n                this._content = state;\n            },\n            _isInternal: function () {\n                if (this._externalContent.html === undefined) {\n                    return true;\n                }\n                var internalHTML = $('<div/>').html(this._externalContent.html).find('table.kendo-clipboard-' + this._uid).length ? true : false;\n                var internalPlain = $('<div/>').html(this._externalContent.plain).find('table.kendo-clipboard-' + this._uid).length ? true : false;\n                return internalHTML || internalPlain;\n            }\n        });\n        kendo.spreadsheet.Clipboard = Clipboard;\n        function newState() {\n            var ref = new CellRef(0, 0, 0);\n            return {\n                ref: ref,\n                mergedCells: [],\n                data: [],\n                foreign: true,\n                origRef: ref.toRangeRef()\n            };\n        }\n        function setStateData(state, row, col, value) {\n            var data = state.data || (state.data = []);\n            if (!data[row]) {\n                data[row] = [];\n            }\n            data[row][col] = value;\n            var br = state.origRef.bottomRight;\n            br.row = Math.max(br.row, row);\n            br.col = Math.max(br.col, col);\n        }\n        function stripStyle(style) {\n            return style.replace(/^-(?:ms|moz|webkit)-/, '');\n        }\n        function borderObject(styles) {\n            var obj = {};\n            [\n                'borderBottom',\n                'borderRight',\n                'borderLeft',\n                'borderTop'\n            ].forEach(function (key) {\n                obj[key] = styles[key + 'Style'] == 'none' ? null : {\n                    size: 1,\n                    color: styles[key + 'Color']\n                };\n            });\n            return obj;\n        }\n        function cellState(element) {\n            var styles = window.getComputedStyle(element[0]);\n            var text = element[0].innerText;\n            var borders = borderObject(styles);\n            var state = {\n                value: text === '' ? null : text,\n                borderBottom: borders.borderBottom,\n                borderRight: borders.borderRight,\n                borderLeft: borders.borderLeft,\n                borderTop: borders.borderTop,\n                fontSize: parseInt(styles['font-size'], 10)\n            };\n            if (styles['background-color'] !== 'rgb(0, 0, 0)' && styles['background-color'] !== 'rgba(0, 0, 0, 0)') {\n                state.background = styles['background-color'];\n            }\n            if (styles.color !== 'rgb(0, 0, 0)' && styles.color !== 'rgba(0, 0, 0, 0)') {\n                state.color = styles.color;\n            }\n            if (styles['text-decoration'] == 'underline') {\n                state.underline = true;\n            }\n            if (styles['font-style'] == 'italic') {\n                state.italic = true;\n            }\n            if (styles['font-weight'] == 'bold') {\n                state.bold = true;\n            }\n            if (stripStyle(styles['text-align']) !== 'right') {\n                state.textAlign = stripStyle(styles['text-align']);\n            }\n            if (styles['vertical-align'] !== 'middle') {\n                state.verticalAlign = styles['vertical-align'];\n            }\n            if (styles['word-wrap'] !== 'normal') {\n                state.wrap = true;\n            }\n            return state;\n        }\n        function parseHTML(table) {\n            var state = newState();\n            table.find('>tr, >tbody>tr').each(function (rowIndex, tr) {\n                $(tr).find('>td, >th').each(function (colIndex, td) {\n                    var rowspan = parseInt($(td).attr('rowspan'), 10) - 1 || 0;\n                    var colspan = parseInt($(td).attr('colspan'), 10) - 1 || 0;\n                    var blankCell = '<td/>';\n                    var ci;\n                    if (rowspan) {\n                        var endRow = rowIndex + rowspan;\n                        for (var ri = rowIndex; ri <= endRow; ri++) {\n                            var row = table.find('tr').eq(ri);\n                            if (ri > rowIndex) {\n                                blankCell = '<td class=\\'rowspan\\'></td>';\n                                if (colIndex === 0) {\n                                    row.find('td').eq(colIndex).after(blankCell);\n                                } else {\n                                    var last = Math.min(row.find('td').length, colIndex);\n                                    row.find('td').eq(last - 1).after(blankCell);\n                                }\n                            }\n                            if (colspan) {\n                                for (ci = colIndex; ci < colspan + colIndex; ci++) {\n                                    blankCell = '<td class=\\'rowspan colspan\\'></td>';\n                                    row.find('td').eq(ci).after(blankCell);\n                                }\n                            }\n                        }\n                    } else {\n                        if (colspan) {\n                            for (ci = colIndex; ci < colspan + colIndex; ci++) {\n                                blankCell = '<td class=\\'colspan\\'></td>';\n                                $(tr).find('td').eq(ci).after(blankCell);\n                            }\n                        }\n                    }\n                });\n            });\n            table.find('>tr, >tbody>tr').each(function (rowIndex, tr) {\n                $(tr).find('>td, >th').each(function (colIndex, td) {\n                    var rowspan = parseInt($(td).attr('rowspan'), 10) - 1 || 0;\n                    var colspan = parseInt($(td).attr('colspan'), 10) - 1 || 0;\n                    setStateData(state, rowIndex, colIndex, cellState($(td)));\n                    if (rowspan || colspan) {\n                        var startCol = String.fromCharCode(65 + colIndex);\n                        var endCol = String.fromCharCode(65 + colIndex + colspan);\n                        var address = startCol + (rowIndex + 1) + ':' + endCol + (rowIndex + 1 + rowspan);\n                        state.mergedCells.push(address);\n                    }\n                });\n            });\n            return state;\n        }\n        function parseTSV(data) {\n            var state = newState();\n            if (data.indexOf('\\t') === -1 && data.indexOf('\\n') == -1) {\n                setStateData(state, 0, 0, { value: data });\n            } else {\n                var rows = data.split('\\n');\n                for (var ri = 0; ri < rows.length; ri++) {\n                    var cols = rows[ri].split('\\t');\n                    for (var ci = 0; ci < cols.length; ci++) {\n                        setStateData(state, ri, ci, { value: cols[ci] });\n                    }\n                }\n            }\n            return state;\n        }\n    }(kendo));\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('spreadsheet/range', [\n        'kendo.core',\n        'util/text-metrics'\n    ], f);\n}(function () {\n    (function (kendo) {\n        if (kendo.support.browser.msie && kendo.support.browser.version < 9) {\n            return;\n        }\n        var $ = kendo.jQuery;\n        var UnionRef = kendo.spreadsheet.UnionRef;\n        var CellRef = kendo.spreadsheet.CellRef;\n        var RangeRef = kendo.spreadsheet.RangeRef;\n        var PROPERTIES = [\n            'color',\n            'fontFamily',\n            'underline',\n            'italic',\n            'bold',\n            'textAlign',\n            'verticalAlign',\n            'background',\n            'format',\n            'link',\n            'editor',\n            'borderTop',\n            'borderRight',\n            'borderBottom',\n            'borderLeft'\n        ];\n        var Range = kendo.Class.extend({\n            init: function (ref, sheet) {\n                this._sheet = sheet;\n                this._ref = ref;\n            },\n            clone: function () {\n                return new Range(this._ref.clone(), this._sheet);\n            },\n            skipHiddenCells: function () {\n                var refs = [];\n                var self = this, sheet = self._sheet;\n                var skipHiddenRows = sheet.isHiddenRow.bind(sheet);\n                var skipHiddenCols = sheet.isHiddenColumn.bind(sheet);\n                self._ref.forEach(function (ref) {\n                    ref = self._normalize(ref.toRangeRef());\n                    var tl = ref.topLeft, br = ref.bottomRight;\n                    var rows = partition(tl.row, br.row, skipHiddenRows);\n                    var cols = partition(tl.col, br.col, skipHiddenCols);\n                    for (var i = 0; i < rows.length; ++i) {\n                        for (var j = 0; j < cols.length; ++j) {\n                            refs.push(new RangeRef(new CellRef(rows[i].begin, cols[j].begin), new CellRef(rows[i].end, cols[j].end)));\n                        }\n                    }\n                });\n                return sheet.range(refs.length > 1 ? new UnionRef(refs) : refs[0]);\n            },\n            _normalize: function (ref) {\n                return this._sheet._grid.normalize(ref);\n            },\n            _set: function (name, value, noTrigger) {\n                var self = this;\n                var sheet = self._sheet;\n                self._ref.forEach(function (ref) {\n                    sheet._set(ref.toRangeRef(), name, value);\n                });\n                if (!noTrigger) {\n                    sheet.triggerChange({\n                        recalc: name == 'formula' || name == 'value' || name == 'validation',\n                        value: value,\n                        range: self,\n                        ref: self._ref\n                    });\n                }\n                return self;\n            },\n            _get: function (name) {\n                return this._sheet._get(this._ref.toRangeRef(), name);\n            },\n            _property: function (name, value) {\n                if (value === undefined) {\n                    return this._get(name);\n                } else {\n                    return this._set(name, value);\n                }\n            },\n            value: function (value) {\n                if (value !== undefined) {\n                    this._set('formula', null, true);\n                }\n                return this._property('value', value);\n            },\n            resize: function (direction) {\n                var ref = this._resizedRef(direction);\n                return new Range(ref, this._sheet);\n            },\n            _resizedRef: function (direction) {\n                return this._ref.map(function (ref) {\n                    return ref.toRangeRef().resize(direction);\n                });\n            },\n            input: function (value) {\n                var existingFormat = this._get('format'), x;\n                if (value !== undefined) {\n                    var tl = this._ref.toRangeRef().topLeft;\n                    x = kendo.spreadsheet.calc.parse(this._sheet.name(), tl.row, tl.col, value);\n                    this._sheet.batch(function () {\n                        var formula = null;\n                        if (x.type == 'exp') {\n                            formula = kendo.spreadsheet.calc.compile(x);\n                        } else if (existingFormat != '@') {\n                            var existingFormatType = existingFormat && kendo.spreadsheet.formatting.type(x.value, existingFormat);\n                            if (x.type == 'date' && existingFormatType != 'date') {\n                                this.format(x.format || toExcelFormat(kendo.culture().calendar.patterns.d));\n                            } else if (x.type == 'percent' && existingFormatType != 'percent') {\n                                this.format(x.value * 100 == (x.value * 100 | 0) ? '0%' : '0.00%');\n                            } else if (x.format && !existingFormat) {\n                                this.format(x.format);\n                            }\n                        } else if (x.type != 'string') {\n                            x.value = value;\n                        }\n                        this.formula(formula);\n                        if (!formula) {\n                            this.value(x.value);\n                        }\n                    }.bind(this), {\n                        recalc: true,\n                        value: value,\n                        ref: this._ref,\n                        editorChange: this._sheet.isInEditMode()\n                    });\n                    return this;\n                } else {\n                    value = this._get('value');\n                    var formula = this._get('formula');\n                    var type = existingFormat && !formula && kendo.spreadsheet.formatting.type(value, existingFormat);\n                    if (formula) {\n                        value = '=' + formula;\n                    } else\n                        OUT: {\n                            if (existingFormat && type == 'date') {\n                                var t1 = kendo.spreadsheet.formatting.text(value, existingFormat);\n                                x = kendo.spreadsheet.calc.parse(null, null, null, t1);\n                                if (typeof x.value == 'number') {\n                                    var t2 = kendo.spreadsheet.formatting.text(x.value, existingFormat);\n                                    if (t1 == t2) {\n                                        value = t1;\n                                        break OUT;\n                                    }\n                                }\n                            }\n                            if (type === 'date') {\n                                value = kendo.toString(kendo.spreadsheet.numberToDate(value), kendo.culture().calendar.patterns.d);\n                            } else if (type === 'percent') {\n                                value = value * 100 + '%';\n                            } else if (typeof value == 'string' && (/^[=']/.test(value) || /^(?:true|false)$/i.test(value) || looksLikeANumber(value))) {\n                                value = '\\'' + value;\n                            }\n                        }\n                    return value;\n                }\n            },\n            enable: function (value) {\n                if (value === undefined) {\n                    value = true;\n                    this._sheet.forEach(this._ref.toRangeRef(), function (_, __, data) {\n                        if (data.enable === false) {\n                            value = false;\n                        }\n                    });\n                    return value;\n                }\n                return this._property('enable', value);\n            },\n            formula: function (value) {\n                if (value === undefined) {\n                    var f = this._get('formula');\n                    return f ? '' + f : null;\n                }\n                return this._property('formula', value);\n            },\n            validation: function (value) {\n                if (value === undefined) {\n                    var f = this._get('validation');\n                    return f ? f.toJSON() : null;\n                }\n                return this._property('validation', value);\n            },\n            _getValidationState: function () {\n                var ref = this._ref.toRangeRef();\n                var topLeftRow = ref.topLeft.row;\n                var topLeftCol = ref.topLeft.col;\n                var bottomRightRow = ref.bottomRight.row;\n                var bottomRightCol = ref.bottomRight.col;\n                var ci, ri;\n                for (ci = topLeftCol; ci <= bottomRightCol; ci++) {\n                    for (ri = topLeftRow; ri <= bottomRightRow; ri++) {\n                        var validation = this._sheet._validation(ri, ci);\n                        if (validation && validation.type === 'reject' && validation.value === false) {\n                            return validation;\n                        }\n                    }\n                }\n                return false;\n            },\n            merge: function () {\n                this._ref = this._sheet._merge(this._ref);\n                return this;\n            },\n            unmerge: function () {\n                var mergedCells = this._sheet._mergedCells;\n                this._ref.forEach(function (ref) {\n                    ref.toRangeRef().intersecting(mergedCells).forEach(function (mergedRef) {\n                        mergedCells.splice(mergedCells.indexOf(mergedRef), 1);\n                    });\n                });\n                this._sheet.triggerChange({});\n                return this;\n            },\n            select: function () {\n                this._sheet.select(this._ref);\n                return this;\n            },\n            values: function (values) {\n                if (this._ref instanceof UnionRef) {\n                    throw new Error('Unsupported for multiple ranges.');\n                }\n                if (this._ref === kendo.spreadsheet.NULLREF) {\n                    if (values !== undefined) {\n                        throw new Error('Unsupported for NULLREF.');\n                    } else {\n                        return [];\n                    }\n                }\n                var ref = this._ref.toRangeRef();\n                var topLeftRow = ref.topLeft.row;\n                var topLeftCol = ref.topLeft.col;\n                var bottomRightRow = ref.bottomRight.row;\n                var bottomRightCol = ref.bottomRight.col;\n                var ci, ri;\n                if (values === undefined) {\n                    values = new Array(ref.height());\n                    for (var vi = 0; vi < values.length; vi++) {\n                        values[vi] = new Array(ref.width());\n                    }\n                    for (ci = topLeftCol; ci <= bottomRightCol; ci++) {\n                        for (ri = topLeftRow; ri <= bottomRightRow; ri++) {\n                            values[ri - topLeftRow][ci - topLeftCol] = this._sheet._value(ri, ci);\n                        }\n                    }\n                    return values;\n                } else {\n                    this._sheet._set(ref, 'formula', null);\n                    for (ci = topLeftCol; ci <= bottomRightCol; ci++) {\n                        for (ri = topLeftRow; ri <= bottomRightRow; ri++) {\n                            var row = values[ri - topLeftRow];\n                            if (row) {\n                                var value = row[ci - topLeftCol];\n                                if (value !== undefined) {\n                                    this._sheet._value(ri, ci, value);\n                                }\n                            }\n                        }\n                    }\n                    this._sheet.triggerChange({\n                        recalc: true,\n                        ref: ref\n                    });\n                    return this;\n                }\n            },\n            _properties: function (props) {\n                if (this._ref instanceof UnionRef) {\n                    throw new Error('Unsupported for multiple ranges.');\n                }\n                if (this._ref === kendo.spreadsheet.NULLREF) {\n                    if (props !== undefined) {\n                        throw new Error('Unsupported for NULLREF.');\n                    } else {\n                        return [];\n                    }\n                }\n                var ref = this._ref.toRangeRef();\n                var topLeftRow = ref.topLeft.row;\n                var topLeftCol = ref.topLeft.col;\n                var bottomRightRow = ref.bottomRight.row;\n                var bottomRightCol = ref.bottomRight.col;\n                var ci, ri;\n                var sheet = this._sheet;\n                if (props === undefined) {\n                    props = new Array(ref.height());\n                    sheet.forEach(ref, function (row, col, data) {\n                        row -= topLeftRow;\n                        col -= topLeftCol;\n                        var line = props[row] || (props[row] = []);\n                        line[col] = data;\n                    });\n                    return props;\n                } else {\n                    var data;\n                    ref = ref.clone();\n                    var setProp = function (propName) {\n                        var propValue = data[propName];\n                        ref.topLeft.row = ref.bottomRight.row = ri;\n                        ref.topLeft.col = ref.bottomRight.col = ci;\n                        if (propName == 'value') {\n                            sheet._set(ref, 'formula', null);\n                        }\n                        sheet._set(ref, propName, propValue);\n                    };\n                    for (ci = topLeftCol; ci <= bottomRightCol; ci++) {\n                        if (sheet.isHiddenColumn(ci)) {\n                            continue;\n                        }\n                        for (ri = topLeftRow; ri <= bottomRightRow; ri++) {\n                            var row = props[ri - topLeftRow];\n                            if (row && !sheet.isHiddenRow(ri)) {\n                                data = row[ci - topLeftCol];\n                                if (data) {\n                                    Object.keys(data).forEach(setProp);\n                                }\n                            }\n                        }\n                    }\n                    sheet.triggerChange({\n                        recalc: true,\n                        ref: this._ref\n                    });\n                    return this;\n                }\n            },\n            clear: function (options) {\n                options = options || {};\n                var clearAll = options.clearAll || !Object.keys(options).length;\n                var sheet = this._sheet;\n                var reason = {\n                    recalc: clearAll || options.contentsOnly,\n                    ref: this._ref\n                };\n                sheet.batch(function () {\n                    if (reason.recalc) {\n                        this.formula(null);\n                    }\n                    if (clearAll) {\n                        this.validation(null);\n                    }\n                    if (clearAll || options.formatOnly) {\n                        PROPERTIES.forEach(function (x) {\n                            if (!(options.keepBorders && /^border/i.test(x))) {\n                                this[x](null);\n                            }\n                        }.bind(this));\n                        this.unmerge();\n                    }\n                }.bind(this), reason);\n                return this;\n            },\n            clearContent: function () {\n                return this.clear({ contentsOnly: true });\n            },\n            clearFormat: function () {\n                return this.clear({ formatOnly: true });\n            },\n            isSortable: function () {\n                return !this.cantSort();\n            },\n            cantSort: function () {\n                if (this._ref instanceof UnionRef) {\n                    return {\n                        code: 'cantSortMultipleSelection',\n                        message: 'Unsupported for multiple ranges.'\n                    };\n                }\n                if (this._ref === kendo.spreadsheet.NULLREF) {\n                    return {\n                        code: 'cantSortNullRef',\n                        message: 'Unsupported for NULLREF.'\n                    };\n                }\n                var mc = this._sheet._getMergedCells(this._ref.toRangeRef());\n                var primary = mc.primary;\n                var secondary = mc.secondary;\n                var width = null, height = null;\n                var cant = {};\n                try {\n                    this._sheet.forEach(this, function (row, col) {\n                        var id = new CellRef(row, col).print();\n                        var merged = primary[id];\n                        if (merged) {\n                            if (width === null) {\n                                width = merged.width();\n                                height = merged.height();\n                            } else if (!(width == merged.width() && height == merged.height())) {\n                                throw cant;\n                            }\n                        } else if (!secondary[id] && mc.hasMerged) {\n                            throw cant;\n                        }\n                    });\n                } catch (ex) {\n                    if (ex !== cant) {\n                        throw ex;\n                    }\n                    return {\n                        code: 'cantSortMixedCells',\n                        message: 'Unsupported for range containing cells of different shapes.'\n                    };\n                }\n                return false;\n            },\n            sort: function (spec) {\n                var reason = this.cantSort();\n                if (reason) {\n                    throw new Error(reason.message);\n                }\n                if (spec === undefined) {\n                    spec = { column: 0 };\n                }\n                spec = spec instanceof Array ? spec : [spec];\n                this._sheet._sortBy(this._ref.toRangeRef(), spec.map(function (spec, index) {\n                    if (typeof spec === 'number') {\n                        spec = { column: spec };\n                    }\n                    return {\n                        index: spec.column === undefined ? index : spec.column,\n                        ascending: spec.ascending === undefined ? true : spec.ascending\n                    };\n                }));\n                return this;\n            },\n            isFilterable: function () {\n                return !(this._ref instanceof UnionRef);\n            },\n            filter: function (spec) {\n                if (this._ref instanceof UnionRef) {\n                    throw new Error('Unsupported for multiple ranges.');\n                }\n                if (spec === false) {\n                    this.clearFilters();\n                } else {\n                    spec = spec === true ? [] : spec instanceof Array ? spec : [spec];\n                    this._sheet._filterBy(this._ref.toRangeRef(), spec.map(function (spec, index) {\n                        return {\n                            index: spec.column === undefined ? index : spec.column,\n                            filter: spec.filter\n                        };\n                    }));\n                }\n                return this;\n            },\n            clearFilter: function (spec) {\n                this._sheet.clearFilter(spec);\n            },\n            clearFilters: function () {\n                var filter = this._sheet.filter();\n                var spec = [];\n                if (filter) {\n                    for (var i = 0; i < filter.columns.length; i++) {\n                        spec.push(i);\n                    }\n                    this._sheet.batch(function () {\n                        this.clearFilter(spec);\n                        this._filter = null;\n                    }, {\n                        layout: true,\n                        filter: true\n                    });\n                }\n            },\n            hasFilter: function () {\n                var filter = this._sheet.filter();\n                return !!filter;\n            },\n            leftColumn: function () {\n                return new Range(this._ref.leftColumn(), this._sheet);\n            },\n            rightColumn: function () {\n                return new Range(this._ref.rightColumn(), this._sheet);\n            },\n            topRow: function () {\n                return new Range(this._ref.topRow(), this._sheet);\n            },\n            bottomRow: function () {\n                return new Range(this._ref.bottomRow(), this._sheet);\n            },\n            column: function (column) {\n                return new Range(this._ref.toColumn(column), this._sheet);\n            },\n            row: function (row) {\n                return new Range(this._ref.toRow(row), this._sheet);\n            },\n            forEachRow: function (callback) {\n                this._ref.forEachRow(function (ref) {\n                    callback(new Range(ref, this._sheet));\n                }.bind(this));\n            },\n            forEachColumn: function (callback) {\n                this._ref.forEachColumn(function (ref) {\n                    callback(new Range(ref, this._sheet));\n                }.bind(this));\n            },\n            sheet: function () {\n                return this._sheet;\n            },\n            topLeft: function () {\n                return this._ref.toRangeRef().topLeft;\n            },\n            intersectingMerged: function () {\n                var sheet = this._sheet;\n                var mergedCells = [];\n                sheet._mergedCells.forEach(function (ref) {\n                    if (ref.intersects(this._ref)) {\n                        mergedCells.push(ref.toString());\n                    }\n                }.bind(this));\n                return mergedCells;\n            },\n            getState: function (propertyName) {\n                var topLeft = this._ref.first();\n                var state = {\n                    ref: topLeft,\n                    data: [],\n                    origRef: this._ref\n                };\n                var properties;\n                if (!propertyName) {\n                    properties = kendo.spreadsheet.ALL_PROPERTIES;\n                    state.mergedCells = this.intersectingMerged();\n                } else if (propertyName === 'input') {\n                    properties = [\n                        'value',\n                        'formula'\n                    ];\n                } else if (propertyName === 'border') {\n                    properties = [\n                        'borderLeft',\n                        'borderTop',\n                        'borderRight',\n                        'borderBottom'\n                    ];\n                } else {\n                    properties = [propertyName];\n                }\n                var data = state.data;\n                this.forEachCell(function (row, col, cell) {\n                    var cellState = {};\n                    var dr = row - topLeft.row;\n                    var dc = col - topLeft.col;\n                    if (!data[dr]) {\n                        data[dr] = [];\n                    }\n                    data[dr][dc] = cellState;\n                    properties.forEach(function (property) {\n                        cellState[property] = typeof cell[property] == 'undefined' ? null : cell[property];\n                    });\n                });\n                return state;\n            },\n            setState: function (state, clipboard) {\n                var sheet = this._sheet;\n                var origin = this._ref.first();\n                var rowDelta = state.ref.row - origin.row;\n                var colDelta = state.ref.col - origin.col;\n                sheet.batch(function () {\n                    if (state.mergedCells) {\n                        this.unmerge();\n                    }\n                    var row = origin.row;\n                    var hasFilter = this.hasFilter();\n                    state.data.forEach(function (data, dr) {\n                        if (hasFilter && clipboard && !clipboard.isExternal() && sheet.isHiddenRow(state.ref.row + dr)) {\n                            return;\n                        }\n                        var col = origin.col;\n                        data.forEach(function (cellState, dc) {\n                            if (hasFilter && clipboard && !clipboard.isExternal() && sheet.isHiddenColumn(state.ref.col + dc)) {\n                                return;\n                            }\n                            var range = clipboard ? sheet.range(row, col) : sheet.range(origin.row + dr, origin.col + dc);\n                            if (range.enable()) {\n                                for (var property in cellState) {\n                                    if (property != 'value') {\n                                        if (!(clipboard && property == 'enable')) {\n                                            range._set(property, cellState[property]);\n                                        }\n                                    }\n                                }\n                                if (!cellState.formula) {\n                                    if (clipboard && clipboard.isExternal()) {\n                                        try {\n                                            if (cellState.value == null) {\n                                                range._set('value', null);\n                                            } else {\n                                                range.input(cellState.value);\n                                            }\n                                        } catch (ex) {\n                                            range._set('value', cellState.value);\n                                        }\n                                    } else {\n                                        range._set('value', cellState.value);\n                                    }\n                                }\n                            }\n                            col++;\n                        });\n                        row++;\n                    });\n                    if (state.mergedCells) {\n                        state.mergedCells.forEach(function (merged) {\n                            merged = sheet._ref(merged).relative(rowDelta, colDelta, 3);\n                            sheet.range(merged).merge();\n                        }, this);\n                    }\n                }.bind(this), {\n                    recalc: true,\n                    ref: this._ref\n                });\n            },\n            _adjustRowHeight: function () {\n                var sheet = this._sheet;\n                var state = this.getState();\n                var mergedCells = [];\n                for (var i = 0; i < state.mergedCells.length; i++) {\n                    mergedCells.push(sheet.range(state.mergedCells[i]));\n                }\n                this.forEachRow(function (row) {\n                    if (row.topLeft().row >= row.sheet()._rows._count) {\n                        return;\n                    }\n                    var maxHeight = row.sheet().rowHeight(row.topLeft().row);\n                    row.forEachCell(function (rowIndex, colIndex, cell) {\n                        var cellRange = sheet.range(rowIndex, colIndex);\n                        var totalWidth = 0;\n                        for (var i = 0; i < mergedCells.length; i++) {\n                            if (cellRange._ref.intersects(mergedCells[i]._ref)) {\n                                totalWidth += cell.width;\n                                break;\n                            }\n                        }\n                        var width = Math.max(sheet.columnWidth(colIndex), totalWidth);\n                        maxHeight = Math.max(maxHeight, kendo.spreadsheet.util.getTextHeight(cell.value, width, cell.fontSize, cell.wrap));\n                    });\n                    sheet.rowHeight(row.topLeft().row, Math.max(sheet.rowHeight(row.topLeft().row), maxHeight));\n                });\n            },\n            forEachCell: function (callback) {\n                this._ref.forEach(function (ref) {\n                    this._sheet.forEach(ref.toRangeRef(), callback.bind(this));\n                }.bind(this));\n            },\n            hasValue: function () {\n                var yesItHas = {};\n                var defStyle = this._sheet._defaultCellStyle;\n                try {\n                    this.forEachCell(function (row, col, cell) {\n                        for (var key in cell) {\n                            var val = cell[key];\n                            if (val !== undefined && val !== null && val !== defStyle[key]) {\n                                throw yesItHas;\n                            }\n                        }\n                    });\n                } catch (ex) {\n                    if (ex === yesItHas) {\n                        return true;\n                    } else {\n                        throw ex;\n                    }\n                }\n                return false;\n            },\n            wrap: function (flag) {\n                if (flag === undefined) {\n                    return !!this._property('wrap');\n                }\n                this.forEachRow(function (range) {\n                    var maxHeight = range.sheet().rowHeight(range.topLeft().row);\n                    range.forEachCell(function (row, col, cell) {\n                        var width = this._sheet.columnWidth(col);\n                        if (cell.value !== null && cell.value !== undefined) {\n                            maxHeight = Math.max(maxHeight, kendo.spreadsheet.util.getTextHeight(cell.value, width, cell.fontSize, true));\n                        }\n                    });\n                    range.sheet().rowHeight(range.topLeft().row, maxHeight);\n                }.bind(this));\n                this._property('wrap', flag);\n                return this;\n            },\n            fontSize: function (size) {\n                if (size === undefined) {\n                    return this._property('fontSize');\n                }\n                this.forEachRow(function (range) {\n                    var maxHeight = range.sheet().rowHeight(range.topLeft().row);\n                    range.forEachCell(function (row, col, cell) {\n                        var width = this._sheet.columnWidth(col);\n                        if (cell.value !== null && cell.value !== undefined) {\n                            maxHeight = Math.max(maxHeight, kendo.spreadsheet.util.getTextHeight(cell.value, width, size, cell.wrap));\n                        }\n                    });\n                    range.sheet().rowHeight(range.topLeft().row, maxHeight);\n                }.bind(this));\n                this._property('fontSize', size);\n                return this;\n            },\n            draw: function (options, callback) {\n                this._sheet.draw(this, options, callback);\n            },\n            insideBorders: function (value) {\n                return this.insideVerticalBorders(value).insideHorizontalBorders(value);\n            },\n            insideVerticalBorders: function (value) {\n                this._ref.forEach(function (ref) {\n                    if (ref instanceof RangeRef && ref.width() > 1) {\n                        ref = ref.clone();\n                        ref.topLeft.col++;\n                        this._sheet.range(ref)._set('vBorders', value);\n                    }\n                }, this);\n                return this;\n            },\n            insideHorizontalBorders: function (value) {\n                this._ref.forEach(function (ref) {\n                    if (ref instanceof RangeRef && ref.height() > 1) {\n                        ref = ref.clone();\n                        ref.topLeft.row++;\n                        this._sheet.range(ref)._set('hBorders', value);\n                    }\n                }, this);\n                return this;\n            }\n        });\n        function partition(begin, end, predicate) {\n            while (begin <= end && predicate(begin)) {\n                begin++;\n            }\n            if (begin > end) {\n                return [];\n            }\n            for (var i = begin + 1; i <= end; ++i) {\n                if (predicate(i)) {\n                    return [{\n                            begin: begin,\n                            end: i - 1\n                        }].concat(partition(i + 1, end, predicate));\n                }\n            }\n            return [{\n                    begin: begin,\n                    end: end\n                }];\n        }\n        $.each(PROPERTIES, function (i, property) {\n            Range.prototype[property] = function (value) {\n                return this._property(property, value);\n            };\n        });\n        function toExcelFormat(format) {\n            return format.replace(/M/g, 'm').replace(/'/g, '\"').replace(/tt/, 'am/pm');\n        }\n        function looksLikeANumber(str) {\n            return !/^=/.test(str) && /number|percent/.test(kendo.spreadsheet.calc.parse(null, 0, 0, str).type);\n        }\n        var measureBox = $('<div style=\"position: absolute !important; top: -4000px !important; height: auto !important;' + 'padding: 1px !important; margin: 0 !important; border: 1px solid black !important;' + 'line-height: normal !important; visibility: hidden !important;' + 'white-space: pre-wrap; word-break: break-all;\" />')[0];\n        function getTextHeight(text, width, fontSize, wrap) {\n            var styles = {\n                'baselineMarkerSize': 0,\n                'width': wrap === true ? width + 'px' : 'auto',\n                'font-size': (fontSize || 12) + 'px',\n                'word-break': wrap === true ? 'break-all' : 'normal',\n                'white-space': wrap === true ? 'pre-wrap' : 'pre'\n            };\n            return kendo.util.measureText(text, styles, measureBox).height;\n        }\n        kendo.spreadsheet.util = { getTextHeight: getTextHeight };\n        kendo.spreadsheet.Range = Range;\n    }(window.kendo));\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('spreadsheet/runtime', ['spreadsheet/references'], f);\n}(function () {\n    'use strict';\n    if (kendo.support.browser.msie && kendo.support.browser.version < 9) {\n        return;\n    }\n    var calc = {};\n    var spreadsheet = kendo.spreadsheet;\n    spreadsheet.calc = calc;\n    var exports = calc.runtime = {};\n    var Class = kendo.Class;\n    var Ref = spreadsheet.Ref;\n    var CellRef = spreadsheet.CellRef;\n    var RangeRef = spreadsheet.RangeRef;\n    var UnionRef = spreadsheet.UnionRef;\n    var NULL = spreadsheet.NULLREF;\n    function CalcError(code) {\n        if (code instanceof CalcError) {\n            return code;\n        }\n        this.code = code;\n    }\n    CalcError.prototype.toString = function () {\n        return '#' + this.code + (this.code == 'NAME' ? '?' : '!');\n    };\n    var Context = Class.extend({\n        init: function Context(callback, formula, ss, parent) {\n            this.callback = callback;\n            this.formula = formula;\n            this.ss = ss;\n            this.parent = parent;\n        },\n        resolve: function (val) {\n            var self = this;\n            if (val instanceof Ref) {\n                self.resolveCells([val], function () {\n                    self._resolve(val);\n                });\n            } else {\n                self._resolve(val);\n            }\n        },\n        error: function (val) {\n            return new CalcError(val);\n        },\n        _resolve: function (val) {\n            if (val === undefined) {\n                val = null;\n            } else if (Array.isArray(val)) {\n                val = this.asMatrix(val);\n            } else {\n                val = maybeRoundFloatErrors(val);\n            }\n            var f = this.formula;\n            f.value = val;\n            if (this.ss.onFormula(f) && this.callback) {\n                this.callback.call(f, val);\n            }\n        },\n        resolveCells: function (a, f) {\n            var context = this, formulas = [];\n            (function loop(a) {\n                for (var i = 0; i < a.length; ++i) {\n                    var x = a[i];\n                    if (x instanceof Ref) {\n                        add(context.getRefCells(x));\n                    }\n                    if (Array.isArray(x)) {\n                        loop(x);\n                    }\n                }\n            }(a));\n            if (!formulas.length) {\n                return f.call(context);\n            }\n            for (var pending = formulas.length, i = 0; i < formulas.length; ++i) {\n                fetch(formulas[i]);\n            }\n            function fetch(formula) {\n                formula.exec(context.ss, function () {\n                    if (!--pending) {\n                        f.call(context);\n                    }\n                }, context);\n            }\n            function add(a) {\n                for (var i = 0; i < a.length; ++i) {\n                    var cell = a[i];\n                    if (cell.formula) {\n                        formulas.push(cell.formula);\n                    }\n                }\n                return true;\n            }\n        },\n        cellValues: function (a, f) {\n            var ret = [];\n            for (var i = 0; i < a.length; ++i) {\n                var val = a[i];\n                if (val instanceof Ref) {\n                    val = this.getRefData(val);\n                    ret = ret.concat(val);\n                } else if (Array.isArray(val)) {\n                    ret = ret.concat(this.cellValues(val));\n                } else if (val instanceof Matrix) {\n                    ret = ret.concat(this.cellValues(val.data));\n                } else {\n                    ret.push(val);\n                }\n            }\n            if (f) {\n                return f.apply(this, ret);\n            }\n            return ret;\n        },\n        fetchName: function (ref, callback) {\n            var f = this.formula;\n            var val = this.ss.nameValue(ref, f.sheet, f.row, f.col);\n            if (val instanceof Formula) {\n                val = val.clone(f.sheet, f.row, f.col, true);\n                var ss = new spreadsheet.ValidationFormulaContext(this.ss.workbook);\n                val.exec(ss, callback, this);\n            } else {\n                if (val instanceof Ref) {\n                    val = val.absolute(f.row, f.col);\n                    if (!val.sheet) {\n                        val.sheet = f.sheet;\n                    }\n                }\n                callback(val == null ? new CalcError('NAME') : val);\n            }\n        },\n        force: function (val) {\n            if (val instanceof Ref) {\n                return this.getRefData(val);\n            }\n            return val;\n        },\n        func: function (fname, callback, args) {\n            fname = fname.toLowerCase();\n            var f = FUNCS[fname];\n            if (f) {\n                return f.call(this, callback, args);\n            }\n            callback(new CalcError('NAME'));\n        },\n        bool: function (val) {\n            if (val instanceof Ref) {\n                val = this.getRefData(val);\n            }\n            if (typeof val == 'string') {\n                return val.toLowerCase() == 'true';\n            }\n            if (typeof val == 'number') {\n                return val !== 0;\n            }\n            if (typeof val == 'boolean') {\n                return val;\n            }\n            return val != null;\n        },\n        asMatrix: function (range) {\n            if (range instanceof Matrix) {\n                return range;\n            }\n            var self = this;\n            if (range instanceof RangeRef) {\n                var tl = range.topLeft;\n                var top = tl.row, left = tl.col;\n                var cells = self.getRefCells(range);\n                var m = new Matrix(self);\n                if (isFinite(range.width())) {\n                    m.width = range.width();\n                }\n                if (isFinite(range.height())) {\n                    m.height = range.height();\n                }\n                if (!isFinite(top)) {\n                    top = 0;\n                }\n                if (!isFinite(left)) {\n                    left = 0;\n                }\n                cells.forEach(function (cell) {\n                    m.set(cell.row - top, cell.col - left, cell.value);\n                });\n                return m;\n            }\n            if (Array.isArray(range) && range.length > 0) {\n                var m = new Matrix(self), row = 0;\n                range.forEach(function (line) {\n                    var col = 0;\n                    var h = 1;\n                    line.forEach(function (el) {\n                        var isRange = el instanceof RangeRef;\n                        if (el instanceof Ref && !isRange) {\n                            el = self.getRefData(el);\n                        }\n                        if (isRange || Array.isArray(el)) {\n                            el = self.asMatrix(el);\n                        }\n                        if (el instanceof Matrix) {\n                            el.each(function (el, r, c) {\n                                m.set(row + r, col + c, el);\n                            });\n                            h = Math.max(h, el.height);\n                            col += el.width;\n                        } else {\n                            m.set(row, col++, el);\n                        }\n                    });\n                    row += h;\n                });\n                return m;\n            }\n        },\n        getRefCells: function (refs, hiddenInfo) {\n            var f = this.formula;\n            return this.ss.getRefCells(refs, hiddenInfo, f.sheet, f.row, f.col);\n        },\n        getRefData: function (ref) {\n            var f = this.formula;\n            return this.ss.getData(ref, f.sheet, f.row, f.col);\n        },\n        workbook: function () {\n            return this.ss.workbook;\n        }\n    });\n    var Matrix = Class.extend({\n        init: function Matrix(context) {\n            this.context = context;\n            this.height = 0;\n            this.width = 0;\n            this.data = [];\n        },\n        clone: function () {\n            var m = new Matrix(this.context);\n            m.height = this.height;\n            m.width = this.width;\n            m.data = this.data.map(function (row) {\n                return row.slice();\n            });\n            return m;\n        },\n        get: function (row, col) {\n            var line = this.data[row];\n            var val = line ? line[col] : null;\n            return val instanceof Ref ? this.context.getRefData(val) : val;\n        },\n        set: function (row, col, data) {\n            var line = this.data[row];\n            if (line == null) {\n                line = this.data[row] = [];\n            }\n            line[col] = data;\n            if (row >= this.height) {\n                this.height = row + 1;\n            }\n            if (col >= this.width) {\n                this.width = col + 1;\n            }\n        },\n        each: function (f, includeEmpty) {\n            for (var row = 0; row < this.height; ++row) {\n                for (var col = 0; col < this.width; ++col) {\n                    var val = this.get(row, col);\n                    if (includeEmpty || val != null) {\n                        val = f.call(this.context, val, row, col);\n                        if (val !== undefined) {\n                            return val;\n                        }\n                    }\n                }\n            }\n        },\n        map: function (f, includeEmpty) {\n            var m = new Matrix(this.context);\n            this.each(function (el, row, col) {\n                m.set(row, col, f.call(this, el, row, col));\n            }, includeEmpty);\n            return m;\n        },\n        eachRow: function (f) {\n            for (var row = 0; row < this.height; ++row) {\n                var val = f.call(this.context, row);\n                if (val !== undefined) {\n                    return val;\n                }\n            }\n        },\n        eachCol: function (f) {\n            for (var col = 0; col < this.width; ++col) {\n                var val = f.call(this.context, col);\n                if (val !== undefined) {\n                    return val;\n                }\n            }\n        },\n        mapRow: function (f) {\n            var m = new Matrix(this.context);\n            this.eachRow(function (row) {\n                m.set(row, 0, f.call(this.context, row));\n            });\n            return m;\n        },\n        mapCol: function (f) {\n            var m = new Matrix(this.context);\n            this.eachCol(function (col) {\n                m.set(0, col, f.call(this.context, col));\n            });\n            return m;\n        },\n        toString: function () {\n            return JSON.stringify(this.data);\n        },\n        transpose: function () {\n            var m = new Matrix(this.context);\n            this.each(function (el, row, col) {\n                m.set(col, row, el);\n            });\n            return m;\n        },\n        unit: function (n) {\n            this.width = this.height = n;\n            var a = this.data = new Array(n);\n            for (var i = n; --i >= 0;) {\n                var row = a[i] = new Array(n);\n                for (var j = n; --j >= 0;) {\n                    row[j] = i == j ? 1 : 0;\n                }\n            }\n            return this;\n        },\n        multiply: function (b) {\n            var a = this, m = new Matrix(a.context);\n            for (var row = 0; row < a.height; ++row) {\n                for (var col = 0; col < b.width; ++col) {\n                    var s = 0;\n                    for (var i = 0; i < a.width; ++i) {\n                        var va = a.get(row, i);\n                        var vb = b.get(i, col);\n                        if (typeof va != 'number' || typeof vb != 'number') {\n                            throw new CalcError('VALUE');\n                        }\n                        s += va * vb;\n                    }\n                    m.set(row, col, s);\n                }\n            }\n            return m;\n        },\n        adds: function (b, s) {\n            var a = this, m = new Matrix(a.context);\n            var sign = s ? -1 : 1;\n            for (var row = 0; row < a.height; ++row) {\n                for (var col = 0; col < a.width; ++col) {\n                    var x = a.get(row, col), y = b.get(row, col);\n                    m.set(row, col, x + sign * y);\n                }\n            }\n            return m;\n        },\n        determinant: function () {\n            var a = this.clone().data;\n            var n = a.length;\n            var d = 1, C, L, i, k;\n            for (C = 0; C < n; C++) {\n                for (L = C; L < n && !a[L][C]; L++) {\n                }\n                if (L == n) {\n                    return 0;\n                }\n                if (L != C) {\n                    d = -d;\n                    for (k = C; k < n; k++) {\n                        var t = a[C][k];\n                        a[C][k] = a[L][k];\n                        a[L][k] = t;\n                    }\n                }\n                for (i = C + 1; i < n; i++) {\n                    for (k = C + 1; k < n; k++) {\n                        a[i][k] -= a[C][k] * a[i][C] / a[C][C];\n                    }\n                }\n                d *= a[C][C];\n            }\n            return d;\n        },\n        inverse: function () {\n            var n = this.width;\n            var m = this.augment(new Matrix(this.context).unit(n));\n            var a = m.data;\n            var tmp;\n            for (var k = 0; k < n; ++k) {\n                var imax = argmax(k, n, function (i) {\n                    return a[i][k];\n                });\n                if (!a[imax][k]) {\n                    return null;\n                }\n                if (k != imax) {\n                    tmp = a[k];\n                    a[k] = a[imax];\n                    a[imax] = tmp;\n                }\n                for (var i = k + 1; i < n; ++i) {\n                    for (var j = k + 1; j < 2 * n; ++j) {\n                        a[i][j] -= a[k][j] * a[i][k] / a[k][k];\n                    }\n                    a[i][k] = 0;\n                }\n            }\n            for (var i = 0; i < n; ++i) {\n                for (var f = a[i][i], j = 0; j < 2 * n; ++j) {\n                    a[i][j] /= f;\n                }\n            }\n            for (var k = n; --k >= 0;) {\n                for (var i = k; --i >= 0;) {\n                    if (a[i][k]) {\n                        for (var j = 2 * n; --j >= n;) {\n                            a[i][j] -= a[k][j] * a[i][k];\n                        }\n                    }\n                }\n            }\n            return m.slice(0, n, n, n);\n        },\n        augment: function (m) {\n            var ret = this.clone(), n = ret.width;\n            m.each(function (val, row, col) {\n                ret.set(row, col + n, val);\n            });\n            return ret;\n        },\n        slice: function (row, col, height, width) {\n            var m = new Matrix(this.context);\n            for (var i = 0; i < height; ++i) {\n                for (var j = 0; j < width; ++j) {\n                    m.set(i, j, this.get(row + i, col + j));\n                }\n            }\n            return m;\n        }\n    });\n    function argmax(i, end, f) {\n        var max = f(i), pos = i;\n        while (++i < end) {\n            var v = f(i);\n            if (v > max) {\n                max = v;\n                pos = i;\n            }\n        }\n        return pos;\n    }\n    var Formula = Class.extend({\n        init: function Formula(refs, handler, printer, sheet, row, col) {\n            this.refs = refs;\n            this.handler = handler;\n            this.print = printer;\n            this.absrefs = null;\n            this.sheet = sheet;\n            this.row = row;\n            this.col = col;\n            this.onReady = [];\n            this.pending = false;\n        },\n        clone: function (sheet, row, col, forceRefs) {\n            var lcsheet = sheet.toLowerCase();\n            var refs = this.refs;\n            if (forceRefs || lcsheet != this.sheet.toLowerCase()) {\n                refs = refs.map(function (ref) {\n                    if (!ref.hasSheet() && (!ref.sheet || ref.sheet.toLowerCase() != lcsheet)) {\n                        ref = ref.clone().setSheet(sheet);\n                    }\n                    return ref;\n                });\n            }\n            return new Formula(refs, this.handler, this.print, sheet, row, col);\n        },\n        resolve: function (val) {\n            this.pending = false;\n            this.onReady.forEach(function (callback) {\n                callback(val);\n            });\n        },\n        exec: function (ss, callback, parentContext) {\n            if ('value' in this) {\n                if (callback) {\n                    callback(this.value);\n                }\n            } else {\n                if (callback) {\n                    this.onReady.push(callback);\n                }\n                var ctx = new Context(this.resolve, this, ss, parentContext);\n                var level = 0;\n                while (parentContext) {\n                    if (parentContext.formula === this) {\n                        this.pending = false;\n                        ctx.resolve(new CalcError('CIRCULAR'));\n                        return;\n                    }\n                    parentContext = parentContext.parent;\n                    ++level;\n                }\n                if (this.pending) {\n                    return;\n                }\n                this.pending = true;\n                var next = function () {\n                    if (!this.absrefs) {\n                        this.absrefs = this.refs.map(function (ref) {\n                            return ref.absolute(this.row, this.col);\n                        }, this);\n                    }\n                    this.handler.call(ctx);\n                }.bind(this);\n                if (level < 20) {\n                    next();\n                } else {\n                    setTimeout(next, 0);\n                }\n            }\n        },\n        reset: function () {\n            this.onReady = [];\n            this.pending = false;\n            delete this.value;\n        },\n        renameSheet: function (oldSheetName, newSheetName) {\n            oldSheetName = oldSheetName.toLowerCase();\n            this.absrefs = null;\n            if (this.sheet.toLowerCase() == oldSheetName) {\n                this.sheet = newSheetName;\n            }\n            this.refs.forEach(function (ref) {\n                ref.renameSheet(oldSheetName, newSheetName);\n            });\n        },\n        adjust: function (affectedSheet, operation, start, delta) {\n            affectedSheet = affectedSheet.toLowerCase();\n            var formulaRow = this.row;\n            var formulaCol = this.col;\n            var formulaSheet = this.sheet.toLowerCase();\n            var formulaMoves = false;\n            if (formulaSheet == affectedSheet) {\n                if (operation == 'row' && formulaRow >= start) {\n                    this.row += delta;\n                    formulaMoves = true;\n                }\n                if (operation == 'col' && formulaCol >= start) {\n                    this.col += delta;\n                    formulaMoves = true;\n                }\n            }\n            var newFormulaRow = this.row;\n            var newFormulaCol = this.col;\n            this.absrefs = null;\n            this.refs = this.refs.map(function (ref) {\n                if (ref === NULL) {\n                    return ref;\n                }\n                if (ref.sheet.toLowerCase() != affectedSheet) {\n                    if (formulaMoves) {\n                        if (operation == 'row' && formulaRow >= start) {\n                            ref = ref.relative(delta, 0);\n                        }\n                        if (operation == 'col' && formulaCol >= start) {\n                            ref = ref.relative(0, delta);\n                        }\n                    }\n                    return ref;\n                }\n                return ref.adjust(formulaRow, formulaCol, newFormulaRow, newFormulaCol, operation == 'row', start, delta);\n            }, this);\n        },\n        toString: function () {\n            return this.print(this.row, this.col);\n        }\n    });\n    var FUNCS = Object.create(null);\n    FUNCS['if'] = function (callback, args) {\n        var self = this;\n        var co = args[0], th = args[1], el = args[2];\n        this.resolveCells([co], function () {\n            var comatrix = self.asMatrix(co);\n            if (comatrix) {\n                th(function (th) {\n                    el(function (el) {\n                        var thmatrix = self.asMatrix(th);\n                        var elmatrix = self.asMatrix(el);\n                        callback(comatrix.map(function (val, row, col) {\n                            if (val instanceof CalcError) {\n                                return val;\n                            } else if (self.bool(val)) {\n                                return thmatrix ? thmatrix.get(row, col) : th;\n                            } else {\n                                return elmatrix ? elmatrix.get(row, col) : el;\n                            }\n                        }));\n                    });\n                });\n            } else {\n                co = this.force(co);\n                if (co instanceof CalcError) {\n                    callback(co);\n                } else if (self.bool(co)) {\n                    th(callback);\n                } else {\n                    el(callback);\n                }\n            }\n        });\n    };\n    FUNCS['φ'] = function (callback) {\n        callback((1 + Math.sqrt(5)) / 2);\n    };\n    function compileArgumentChecks(functionName, args) {\n        var arrayArgs = 'function arrayArgs(args) { var xargs = [], width = 0, height = 0, arrays = [], i = 0; ';\n        var resolve = 'function resolve(args, callback) { var toResolve = [], i = 0; ';\n        var name, forced, main = '\\'use strict\\'; function check(args) { var stack = [], tmp, xargs = [], i = 0, m, err = \\'VALUE\\'; ', haveForced = false;\n        var canBeArrayArg = false, hasArrayArgs = false;\n        main += args.map(comp).join('');\n        main += 'if (i < args.length) return new CalcError(\\'N/A\\'); ';\n        main += 'return xargs; } ';\n        arrayArgs += 'return { args: xargs, width: width, height: height, arrays: arrays }; } ';\n        var f;\n        if (haveForced) {\n            resolve += 'this.resolveCells(toResolve, callback); } ';\n            f = new Function('CalcError', 'round', main + resolve + arrayArgs + ' return { resolve: resolve, check: check, arrayArgs: arrayArgs };');\n        } else {\n            f = new Function('CalcError', 'round', main + ' return { check: check };');\n        }\n        f = f(CalcError, roundFloatErrors);\n        if (!hasArrayArgs) {\n            delete f.arrayArgs;\n        }\n        return f;\n        function comp(x) {\n            name = x[0];\n            var code = '{ ';\n            if (Array.isArray(name)) {\n                arrayArgs += 'while (i < args.length) { ';\n                resolve += 'while (i < args.length) { ';\n                code += 'xargs.push(tmp = []); stack.push(xargs); xargs = tmp; ';\n                code += 'while (i < args.length) { ';\n                code += x.map(comp).join('');\n                code += '} ';\n                code += 'xargs = stack.pop(); ';\n                resolve += '} ';\n                arrayArgs += '} ';\n            } else if (name == '+') {\n                arrayArgs += 'while (i < args.length) { ';\n                resolve += 'while (i < args.length) { ';\n                code += 'if (i >= args.length) return new CalcError(\\'N/A\\'); ';\n                code += 'xargs.push(tmp = []); stack.push(xargs); xargs = tmp; ';\n                code += 'do { ';\n                code += x.slice(1).map(comp).join('');\n                code += '} while (i < args.length); ';\n                code += 'xargs = stack.pop(); ';\n                resolve += '} ';\n                arrayArgs += '} ';\n            } else if (name == '?') {\n                code += 'if (!(' + cond(x[1]) + ')) return new CalcError(err); ';\n            } else {\n                var type = x[1];\n                if (Array.isArray(type) && /^#?collect/.test(type[0])) {\n                    var n = type[2];\n                    force();\n                    code += 'try {' + 'var $' + name + ' = this.cellValues(args.slice(i';\n                    if (n) {\n                        code += ', i + ' + n;\n                    }\n                    code += ')).filter(function($' + name + '){ ';\n                    if (type[0] == 'collect') {\n                        code += 'if ($' + name + ' instanceof CalcError) throw $' + name + '; ';\n                    }\n                    code += 'return ' + cond(type[1]) + '; }, this); ';\n                    if (n) {\n                        code += 'i += ' + n + '; ';\n                    } else {\n                        code += 'i = args.length; ';\n                    }\n                    code += 'xargs.push($' + name + ')' + '} catch(ex) { if (ex instanceof CalcError) return ex; throw ex; } ';\n                    resolve += 'toResolve.push(args.slice(i)); ';\n                } else if (type == 'rest') {\n                    code += 'xargs.push(args.slice(i)); i = args.length; ';\n                } else {\n                    if (canBeArrayArg = /^\\*/.test(name)) {\n                        hasArrayArgs = true;\n                        name = name.substr(1);\n                    }\n                    code += 'var $' + name + ' = args[i++]; ';\n                    var allowError = false;\n                    if (/!$/.test(type)) {\n                        type = type.substr(0, type.length - 1);\n                        allowError = true;\n                    } else {\n                        code += 'if ($' + name + ' instanceof CalcError) return $' + name + '; ';\n                    }\n                    code += typeCheck(type, allowError) + 'xargs.push($' + name + '); ';\n                }\n            }\n            code += '} ';\n            return code;\n        }\n        function force() {\n            if (forced) {\n                return '$' + name + '';\n            }\n            haveForced = true;\n            forced = true;\n            resolve += 'toResolve.push(args[i++]); ';\n            return '($' + name + ' = this.force($' + name + '))';\n        }\n        function forceNum(round) {\n            return '(' + (round ? '(typeof ' + force() + ' == \\'number\\' ? ($' + name + ' = round($' + name + '), true) : false) || ' : '(typeof ' + force() + ' == \\'number\\') || ') + '(typeof $' + name + ' == \\'boolean\\') || ' + '(typeof $' + name + ' == \\'string\\' && !/^(?:=|true|false)/i.test($' + name + ') ? (' + 'tmp = kendo.spreadsheet.calc.parse(0, 0, 0, $' + name + '), ' + '/^date|number|percent$/.test(tmp.type) ? ($' + name + ' = +tmp.value, true) : false' + ') : false)' + ')';\n        }\n        function typeCheck(type, allowError) {\n            forced = false;\n            var ret = 'if (!(' + cond(type) + ')) { ';\n            if (forced && !allowError) {\n                ret += ' if ($' + name + ' instanceof CalcError) return $' + name + '; ';\n            }\n            ret += 'return new CalcError(err); } ';\n            if (!forced) {\n                resolve += 'i++; ';\n            }\n            if (canBeArrayArg) {\n                arrayArgs += 'var $' + name + ' = this.asMatrix(args[i]); ' + 'if ($' + name + ') { ' + 'xargs.push($' + name + '); ' + 'width = Math.max(width, $' + name + '.width); ' + 'height = Math.max(height, $' + name + '.height); ' + 'arrays.push(true) } else { ' + 'xargs.push(args[i]); ' + 'arrays.push(false); } i++; ';\n            } else {\n                arrayArgs += 'xargs.push(args[i++]); arrays.push(false); ';\n            }\n            return ret;\n        }\n        function cond(type) {\n            if (Array.isArray(type)) {\n                if (type[0] == 'or') {\n                    return '(' + type.slice(1).map(cond).join(') || (') + ')';\n                }\n                if (type[0] == 'and') {\n                    return '(' + type.slice(1).map(cond).join(') && (') + ')';\n                }\n                if (type[0] == 'values') {\n                    return '(' + type.slice(1).map(function (val) {\n                        return force() + ' === ' + val;\n                    }).join(') || (') + ')';\n                }\n                if (type[0] == 'null') {\n                    return '(' + cond('null') + ' ? (($' + name + ' = ' + type[1] + '), true) : false)';\n                }\n                if (type[0] == 'between' || type[0] == '[between]') {\n                    return '(' + force() + ' >= ' + type[1] + ' && ' + '$' + name + ' <= ' + type[2] + ' ? true : ((err = \\'NUM\\'), false))';\n                }\n                if (type[0] == '(between)') {\n                    return '(' + force() + ' > ' + type[1] + ' && ' + '$' + name + ' < ' + type[2] + ' ? true : ((err = \\'NUM\\'), false))';\n                }\n                if (type[0] == '(between]') {\n                    return '(' + force() + ' > ' + type[1] + ' && ' + '$' + name + ' <= ' + type[2] + ' ? true : ((err = \\'NUM\\'), false))';\n                }\n                if (type[0] == '[between)') {\n                    return '(' + force() + ' >= ' + type[1] + ' && ' + '$' + name + ' < ' + type[2] + ' ? true : ((err = \\'NUM\\'), false))';\n                }\n                if (type[0] == 'assert') {\n                    var err = type[2] || 'N/A';\n                    return '((' + type[1] + ') ? true : (err = ' + JSON.stringify(err) + ', false))';\n                }\n                if (type[0] == 'not') {\n                    return '!(' + cond(type[1]) + ')';\n                }\n                throw new Error('Unknown array type condition: ' + type[0]);\n            }\n            if (type == 'number' || type == 'datetime') {\n                return forceNum(true);\n            }\n            if (type == 'integer' || type == 'date') {\n                return '(' + forceNum() + ' && (($' + name + ' |= 0), true))';\n            }\n            if (type == 'divisor') {\n                return '(' + forceNum(true) + ' && ($' + name + ' == 0 ? ((err = \\'DIV/0\\'), false) : true))';\n            }\n            if (type == 'number+') {\n                return '(' + forceNum(true) + ' && ($' + name + ' >= 0 ? true : ((err = \\'NUM\\'), false)))';\n            }\n            if (type == 'integer+') {\n                return '(' + forceNum() + ' && (($' + name + ' |= 0) >= 0 ? true : ((err = \\'NUM\\'), false)))';\n            }\n            if (type == 'number++') {\n                return '(' + forceNum(true) + ' && ($' + name + ' > 0 ? true : ((err = \\'NUM\\'), false)))';\n            }\n            if (type == 'integer++') {\n                return '(' + forceNum() + ' && (($' + name + ' |= 0) > 0 ? true : ((err = \\'NUM\\'), false)))';\n            }\n            if (type == 'string') {\n                return '((typeof ' + force() + ' == \\'string\\' || typeof $' + name + ' == \\'boolean\\' || typeof $' + name + ' == \\'number\\') ? ($' + name + ' += \\'\\', true) : ($' + name + ' === undefined ? (($' + name + ' = \\'\\'), true) : false))';\n            }\n            if (type == 'boolean') {\n                return '(typeof ' + force() + ' == \\'boolean\\')';\n            }\n            if (type == 'logical') {\n                return '(typeof ' + force() + ' == \\'boolean\\' || (typeof $' + name + ' == \\'number\\' ? ($' + name + ' = !!$' + name + ', true) : false))';\n            }\n            if (type == 'matrix') {\n                force();\n                return '((m = this.asMatrix($' + name + ')) ? ($' + name + ' = m) : false)';\n            }\n            if (type == '#matrix') {\n                return '((m = this.asMatrix($' + name + ')) ? ($' + name + ' = m) : false)';\n            }\n            if (type == 'ref') {\n                return '($' + name + ' instanceof kendo.spreadsheet.Ref)';\n            }\n            if (type == 'area') {\n                return '($' + name + ' instanceof kendo.spreadsheet.CellRef || $' + name + ' instanceof kendo.spreadsheet.RangeRef)';\n            }\n            if (type == 'cell') {\n                return '($' + name + ' instanceof kendo.spreadsheet.CellRef)';\n            }\n            if (type == 'null') {\n                return '(' + force() + ' == null)';\n            }\n            if (type == 'anyvalue') {\n                return '(' + force() + ' != null && i <= args.length)';\n            }\n            if (type == 'forced') {\n                return '(' + force() + ', i <= args.length)';\n            }\n            if (type == 'anything') {\n                return '(i <= args.length)';\n            }\n            if (type == 'blank') {\n                return '(' + force() + ' == null || $' + name + ' === \\'\\')';\n            }\n            throw new Error('Can\\'t check for type: ' + type);\n        }\n    }\n    function roundFloatErrors(num) {\n        var integer = Math.floor(num);\n        var decimal = num - integer;\n        return integer + Math.round(decimal * 1000000000000000) / 1000000000000000;\n    }\n    function maybeRoundFloatErrors(num) {\n        if (typeof num == 'number') {\n            return roundFloatErrors(num);\n        } else {\n            return num;\n        }\n    }\n    function withErrorHandling(obj, f, args) {\n        if (args instanceof CalcError) {\n            return args;\n        }\n        try {\n            return f.apply(obj, args);\n        } catch (ex) {\n            if (ex instanceof CalcError) {\n                return ex;\n            } else {\n                throw ex;\n            }\n        }\n    }\n    function makeSyncFunction(handler, resolve, check, arrayArgs) {\n        return function (callback, args) {\n            function doit() {\n                if (arrayArgs) {\n                    var x = arrayArgs.call(this, args);\n                    args = x.args;\n                    if (x.width > 0 && x.height > 0) {\n                        var result = new Matrix(this);\n                        for (var row = 0; row < x.height; ++row) {\n                            for (var col = 0; col < x.width; ++col) {\n                                var xargs = [];\n                                for (var i = 0; i < args.length; ++i) {\n                                    if (x.arrays[i]) {\n                                        var m = args[i];\n                                        xargs[i] = m.get(row % m.height, col % m.width);\n                                    } else {\n                                        xargs[i] = args[i];\n                                    }\n                                }\n                                xargs = check.call(this, xargs);\n                                result.set(row, col, withErrorHandling(this, handler, xargs));\n                            }\n                        }\n                        return callback(result);\n                    }\n                }\n                var xargs = check.call(this, args);\n                callback(withErrorHandling(this, handler, xargs));\n            }\n            if (resolve) {\n                resolve.call(this, args, doit);\n            } else {\n                doit.call(this);\n            }\n        };\n    }\n    function makeAsyncFunction(handler, resolve, check, arrayArgs) {\n        return function (callback, args) {\n            function doit() {\n                if (arrayArgs) {\n                    var x = arrayArgs.call(this, args);\n                    args = x.args;\n                    if (x.width > 0 && x.height > 0) {\n                        var result = new Matrix(this);\n                        var count = x.width * x.height;\n                        var makeCallback = function (row, col) {\n                            return function (value) {\n                                result.set(row, col, value);\n                                --count;\n                                if (count === 0) {\n                                    return callback(result);\n                                }\n                            };\n                        };\n                        for (var row = 0; row < x.height && count > 0; ++row) {\n                            for (var col = 0; col < x.width && count > 0; ++col) {\n                                var xargs = [];\n                                for (var i = 0; i < args.length; ++i) {\n                                    if (x.arrays[i]) {\n                                        var m = args[i];\n                                        xargs[i] = m.get(row % m.height, col % m.width);\n                                    } else {\n                                        xargs[i] = args[i];\n                                    }\n                                }\n                                xargs = check.call(this, xargs);\n                                if (xargs instanceof CalcError) {\n                                    result.set(row, col, xargs);\n                                    --count;\n                                    if (count === 0) {\n                                        return callback(result);\n                                    }\n                                } else {\n                                    xargs.unshift(makeCallback(row, col));\n                                    handler.apply(this, xargs);\n                                }\n                            }\n                        }\n                        return;\n                    }\n                }\n                var x = check.call(this, args);\n                if (x instanceof CalcError) {\n                    callback(x);\n                } else {\n                    x.unshift(callback);\n                    handler.apply(this, x);\n                }\n            }\n            if (resolve) {\n                resolve.call(this, args, doit);\n            } else {\n                doit.call(this);\n            }\n        };\n    }\n    function defineFunction(name, func) {\n        name = name.toLowerCase();\n        FUNCS[name] = func;\n        return {\n            args: function (args, log) {\n                var code = compileArgumentChecks(name, args);\n                if (log) {\n                    if (code.arrayArgs) {\n                        console.log(code.arrayArgs.toString());\n                    }\n                    if (code.resolve) {\n                        console.log(code.resolve.toString());\n                    }\n                    if (code.check) {\n                        console.log(code.check.toString());\n                    }\n                }\n                var f = FUNCS[name] = makeSyncFunction(func, code.resolve, code.check, code.arrayArgs);\n                f.kendoSpreadsheetArgs = args;\n                return this;\n            },\n            argsAsync: function (args, log) {\n                var code = compileArgumentChecks(name, args);\n                if (log) {\n                    if (code.arrayArgs) {\n                        console.log(code.arrayArgs.toString());\n                    }\n                    if (code.resolve) {\n                        console.log(code.resolve.toString());\n                    }\n                    if (code.check) {\n                        console.log(code.check.toString());\n                    }\n                }\n                var f = FUNCS[name] = makeAsyncFunction(func, code.resolve, code.check, code.arrayArgs);\n                f.kendoSpreadsheetArgs = args;\n                return this;\n            }\n        };\n    }\n    function dateToJulianDays(y, m, d) {\n        m++;\n        return (1461 * (y + 4800 + ((m - 14) / 12 | 0)) / 4 | 0) + (367 * (m - 2 - 12 * ((m - 14) / 12 | 0)) / 12 | 0) - (3 * ((y + 4900 + ((m - 14) / 12 | 0)) / 100 | 0) / 4 | 0) + d - 32075;\n    }\n    function julianDaysToDate(jd) {\n        var l, n, j, i, m, d, y;\n        l = jd + 68569;\n        n = 4 * l / 146097 | 0;\n        l = l - ((146097 * n + 3) / 4 | 0);\n        i = 4000 * (l + 1) / 1461001 | 0;\n        l = l - (1461 * i / 4 | 0) + 31;\n        j = 80 * l / 2447 | 0;\n        d = l - (2447 * j / 80 | 0);\n        l = j / 11 | 0;\n        m = j + 2 - 12 * l;\n        y = 100 * (n - 49) + i + l;\n        m--;\n        return {\n            year: y,\n            month: m,\n            date: d,\n            day: (jd + 1) % 7,\n            ord: ORDINAL_ADD_DAYS[isLeapYear(y)][m] + d\n        };\n    }\n    var BASE_DATE = dateToJulianDays(1900, 0, -1);\n    var DAYS_IN_MONTH = [\n        31,\n        28,\n        31,\n        30,\n        31,\n        30,\n        31,\n        31,\n        30,\n        31,\n        30,\n        31\n    ];\n    var ORDINAL_ADD_DAYS = [\n        [\n            0,\n            31,\n            59,\n            90,\n            120,\n            151,\n            181,\n            212,\n            243,\n            273,\n            304,\n            334\n        ],\n        [\n            0,\n            31,\n            60,\n            91,\n            121,\n            152,\n            182,\n            213,\n            244,\n            274,\n            305,\n            335\n        ]\n    ];\n    function isLeapYear(yr) {\n        if (yr % 4) {\n            return 0;\n        }\n        if (yr % 100) {\n            return 1;\n        }\n        if (yr % 400) {\n            return 0;\n        }\n        return 1;\n    }\n    function daysInYear(yr) {\n        return isLeapYear(yr) ? 366 : 365;\n    }\n    function daysInMonth(yr, mo) {\n        return isLeapYear(yr) && mo == 1 ? 29 : DAYS_IN_MONTH[mo];\n    }\n    function unpackDate(serial) {\n        return julianDaysToDate((serial | 0) + BASE_DATE);\n    }\n    function packDate(year, month, date) {\n        return dateToJulianDays(year, month, date) - BASE_DATE;\n    }\n    var MS_IN_MIN = 60 * 1000;\n    var MS_IN_HOUR = 60 * MS_IN_MIN;\n    var MS_IN_DAY = 24 * MS_IN_HOUR;\n    function unpackTime(serial) {\n        var frac = serial - (serial | 0);\n        if (frac < 0) {\n            frac++;\n        }\n        var ms = Math.round(MS_IN_DAY * frac);\n        var hours = Math.floor(ms / MS_IN_HOUR);\n        ms -= hours * MS_IN_HOUR;\n        var minutes = Math.floor(ms / MS_IN_MIN);\n        ms -= minutes * MS_IN_MIN;\n        var seconds = Math.floor(ms / 1000);\n        ms -= seconds * 1000;\n        return {\n            hours: hours,\n            minutes: minutes,\n            seconds: seconds,\n            milliseconds: ms\n        };\n    }\n    function serialToDate(serial) {\n        var d = unpackDate(serial), t = unpackTime(serial);\n        return new Date(d.year, d.month, d.date, t.hours, t.minutes, t.seconds, t.milliseconds);\n    }\n    function packTime(hh, mm, ss, ms) {\n        return (hh + (mm + (ss + ms / 1000) / 60) / 60) / 24;\n    }\n    function dateToSerial(date) {\n        var time = packTime(date.getHours(), date.getMinutes(), date.getSeconds(), date.getMilliseconds());\n        date = packDate(date.getFullYear(), date.getMonth(), date.getDate());\n        if (date < 0) {\n            return date - 1 + time;\n        } else {\n            return date + time;\n        }\n    }\n    function parseDate(str) {\n        return kendo.parseDate(str) || kendo.parseDate(str, [\n            'MMMM dd yyyy',\n            'MMMM dd yy',\n            'MMM dd yyyy',\n            'MMM dd yy',\n            'dd MMMM yyyy',\n            'dd MMMM yy',\n            'dd MMM yyyy',\n            'dd MMM yy',\n            'MMMM dd, yyyy',\n            'MMMM dd, yy',\n            'MMM dd, yyyy',\n            'MMM dd, yy',\n            'MMMM dd',\n            'MMM dd',\n            'MMMM yyyy',\n            'MMM yyyy',\n            'dd MMMM',\n            'dd MMM'\n        ]);\n    }\n    exports.CalcError = CalcError;\n    exports.Formula = Formula;\n    exports.Matrix = Matrix;\n    exports.packDate = packDate;\n    exports.unpackDate = unpackDate;\n    exports.packTime = packTime;\n    exports.unpackTime = unpackTime;\n    exports.serialToDate = serialToDate;\n    exports.dateToSerial = dateToSerial;\n    exports.daysInMonth = daysInMonth;\n    exports.isLeapYear = isLeapYear;\n    exports.daysInYear = daysInYear;\n    exports.parseDate = parseDate;\n    spreadsheet.dateToNumber = dateToSerial;\n    spreadsheet.numberToDate = serialToDate;\n    spreadsheet.defineFunction = defineFunction;\n    spreadsheet.CalcError = CalcError;\n    exports.defineFunction = defineFunction;\n    exports.defineAlias = function (alias, name) {\n        var orig = FUNCS[name];\n        if (!orig) {\n            throw new Error('Function ' + name + ' is not yet defined');\n        }\n        if (!orig.kendoSpreadsheetAliases) {\n            orig.kendoSpreadsheetAliases = [name];\n        }\n        orig.kendoSpreadsheetAliases.push(alias);\n        FUNCS[alias] = orig;\n    };\n    exports.FUNCS = FUNCS;\n    var NUMBER_OR_ZERO = [\n        'or',\n        'number',\n        [\n            'null',\n            0\n        ]\n    ];\n    var ARGS_NUMERIC = [\n        [\n            '*a',\n            NUMBER_OR_ZERO\n        ],\n        [\n            '*b',\n            NUMBER_OR_ZERO\n        ]\n    ];\n    var ARGS_ANYVALUE = [\n        [\n            '*a',\n            [\n                'or',\n                'anyvalue',\n                [\n                    'null',\n                    0\n                ]\n            ]\n        ],\n        [\n            '*b',\n            [\n                'or',\n                'anyvalue',\n                [\n                    'null',\n                    0\n                ]\n            ]\n        ]\n    ];\n    defineFunction('binary+', function (a, b) {\n        return a + b;\n    }).args(ARGS_NUMERIC);\n    defineFunction('binary-', function (a, b) {\n        return a - b;\n    }).args(ARGS_NUMERIC);\n    defineFunction('binary*', function (a, b) {\n        return a * b;\n    }).args(ARGS_NUMERIC);\n    defineFunction('binary/', function (a, b) {\n        return a / b;\n    }).args([\n        [\n            '*a',\n            NUMBER_OR_ZERO\n        ],\n        [\n            '*b',\n            'divisor'\n        ]\n    ]);\n    defineFunction('binary^', function (a, b) {\n        return Math.pow(a, b);\n    }).args(ARGS_NUMERIC);\n    defineFunction('binary&', function (a, b) {\n        if (a == null) {\n            a = '';\n        }\n        if (b == null) {\n            b = '';\n        }\n        return '' + a + b;\n    }).args([\n        [\n            '*a',\n            [\n                'or',\n                'number',\n                'string',\n                'boolean',\n                'null'\n            ]\n        ],\n        [\n            '*b',\n            [\n                'or',\n                'number',\n                'string',\n                'boolean',\n                'null'\n            ]\n        ]\n    ]);\n    defineFunction('binary=', function (a, b) {\n        return a === b;\n    }).args(ARGS_ANYVALUE);\n    defineFunction('binary<>', function (a, b) {\n        return a !== b;\n    }).args(ARGS_ANYVALUE);\n    defineFunction('binary<', binaryCompare(function (a, b) {\n        return a < b;\n    })).args(ARGS_ANYVALUE);\n    defineFunction('binary<=', binaryCompare(function (a, b) {\n        return a <= b;\n    })).args(ARGS_ANYVALUE);\n    defineFunction('binary>', binaryCompare(function (a, b) {\n        return a > b;\n    })).args(ARGS_ANYVALUE);\n    defineFunction('binary>=', binaryCompare(function (a, b) {\n        return a >= b;\n    })).args(ARGS_ANYVALUE);\n    defineFunction('unary+', function (a) {\n        return a;\n    }).args([[\n            '*a',\n            NUMBER_OR_ZERO\n        ]]);\n    defineFunction('unary-', function (a) {\n        return -a;\n    }).args([[\n            '*a',\n            NUMBER_OR_ZERO\n        ]]);\n    defineFunction('unary%', function (a) {\n        return a / 100;\n    }).args([[\n            '*a',\n            NUMBER_OR_ZERO\n        ]]);\n    defineFunction('binary:', function (a, b) {\n        return new RangeRef(a, b).setSheet(a.sheet || this.formula.sheet, a.hasSheet());\n    }).args([\n        [\n            'a',\n            'cell'\n        ],\n        [\n            'b',\n            'cell'\n        ]\n    ]);\n    defineFunction('binary,', function (a, b) {\n        return new UnionRef([\n            a,\n            b\n        ]);\n    }).args([\n        [\n            'a',\n            'ref'\n        ],\n        [\n            'b',\n            'ref'\n        ]\n    ]);\n    defineFunction('binary ', function (a, b) {\n        return a.intersect(b);\n    }).args([\n        [\n            'a',\n            'ref'\n        ],\n        [\n            'b',\n            'ref'\n        ]\n    ]);\n    defineFunction('not', function (a) {\n        return !this.bool(a);\n    }).args([[\n            '*a',\n            [\n                'or',\n                'anyvalue',\n                [\n                    'null',\n                    0\n                ]\n            ]\n        ]]);\n    defineFunction('isblank', function (val) {\n        if (val instanceof CellRef) {\n            val = this.getRefData(val);\n            return val == null;\n        }\n        return false;\n    }).args([[\n            '*value',\n            'anything!'\n        ]]);\n    defineFunction('iserror', function (val) {\n        return val instanceof CalcError;\n    }).args([[\n            '*value',\n            'forced!'\n        ]]);\n    defineFunction('iserr', function (val) {\n        return val instanceof CalcError && val.code != 'N/A';\n    }).args([[\n            '*value',\n            'forced!'\n        ]]);\n    defineFunction('isna', function (val) {\n        return val instanceof CalcError && val.code == 'N/A';\n    }).args([[\n            '*value',\n            'forced!'\n        ]]);\n    defineFunction('islogical', function (val) {\n        return typeof val == 'boolean';\n    }).args([[\n            '*value',\n            'forced!'\n        ]]);\n    defineFunction('isnontext', function (val) {\n        return typeof val != 'string';\n    }).args([[\n            '*value',\n            'forced!'\n        ]]);\n    defineFunction('istext', function (val) {\n        return typeof val == 'string';\n    }).args([[\n            '*value',\n            'forced!'\n        ]]);\n    defineFunction('isnumber', function (val) {\n        return typeof val == 'number';\n    }).args([[\n            '*value',\n            'forced!'\n        ]]);\n    defineFunction('isref', function (val) {\n        return val instanceof CellRef || val instanceof RangeRef;\n    }).args([[\n            '*value',\n            'anything!'\n        ]]);\n    FUNCS[',getname'] = function (callback, args) {\n        this.fetchName(args[0], callback);\n    };\n    function binaryCompare(func) {\n        return function (left, right) {\n            if (typeof left == 'string' && typeof right != 'string') {\n                right = right == null ? '' : right + '';\n            }\n            if (typeof left != 'string' && typeof right == 'string') {\n                left = left == null ? '' : left + '';\n            }\n            if (typeof left == 'number' && right == null) {\n                right = 0;\n            }\n            if (typeof right == 'number' && left == null) {\n                left = 0;\n            }\n            if (typeof left == 'string' && typeof right == 'string') {\n                left = left.toLowerCase();\n                right = right.toLowerCase();\n            }\n            if (typeof right == typeof left) {\n                return func(left, right);\n            } else {\n                return new CalcError('VALUE');\n            }\n        };\n    }\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('spreadsheet/validation', ['spreadsheet/runtime'], f);\n}(function () {\n    'use strict';\n    var $ = kendo.jQuery;\n    if (kendo.support.browser.msie && kendo.support.browser.version < 9) {\n        return;\n    }\n    var spreadsheet = kendo.spreadsheet;\n    var exports = {};\n    spreadsheet.validation = exports;\n    var calc = spreadsheet.calc;\n    var Class = kendo.Class;\n    var TRANSPOSE_FORMAT = '_matrix({0})';\n    var DATE_FORMAT = 'DATEVALUE(\"{0}\")';\n    calc.runtime.defineFunction('_matrix', function (m) {\n        if (typeof m == 'string') {\n            m = this.asMatrix([m.split(/\\s*,\\s*/)]);\n        }\n        return m;\n    }).args([[\n            'm',\n            [\n                'or',\n                'matrix',\n                'string'\n            ]\n        ]]);\n    function compileValidation(sheet, row, col, validation) {\n        var validationHandler;\n        var comparer;\n        var parsedFromDate;\n        var parsedToDate;\n        if (typeof validation === 'string') {\n            validation = JSON.parse(validation);\n        }\n        if (validation.from) {\n            if (validation.dataType === 'list' && !validation.fromIsListValue) {\n                validation.from = kendo.format(TRANSPOSE_FORMAT, validation.from);\n                validation.fromIsListValue = true;\n            }\n            if (validation.dataType === 'date') {\n                parsedFromDate = calc.runtime.parseDate(validation.from);\n                if (parsedFromDate) {\n                    validation.from = kendo.format(DATE_FORMAT, validation.from);\n                    validation.fromIsDateValue = true;\n                }\n            }\n            validation.from = calc.compile(calc.parseFormula(sheet, row, col, validation.from));\n        }\n        if (validation.to) {\n            if (validation.dataType === 'date') {\n                parsedToDate = calc.runtime.parseDate(validation.to);\n                if (parsedToDate) {\n                    validation.to = kendo.format(DATE_FORMAT, validation.to);\n                    validation.toIsDateValue = true;\n                }\n            }\n            validation.to = calc.compile(calc.parseFormula(sheet, row, col, validation.to));\n        }\n        if (validation.dataType == 'custom') {\n            comparer = exports.validationComparers.custom;\n        } else if (validation.dataType == 'list') {\n            comparer = exports.validationComparers.list;\n        } else {\n            comparer = exports.validationComparers[validation.comparerType];\n        }\n        if (!comparer) {\n            throw kendo.format('\\'{0}\\' comparer is not implemented.', validation.comparerType);\n        }\n        validationHandler = function (valueToCompare) {\n            var toValue = this.to && this.to_value ? this.to_value : undefined;\n            if (valueToCompare === null || valueToCompare === '') {\n                if (this.allowNulls) {\n                    this.value = true;\n                } else {\n                    this.value = false;\n                }\n            } else if (this.dataType == 'custom') {\n                this.value = comparer(valueToCompare, this.from_value, toValue);\n            } else if (this.dataType == 'list') {\n                var data = this._getListData();\n                this.value = comparer(valueToCompare, data, toValue);\n            } else {\n                this.value = comparer(valueToCompare, this.from_value, toValue);\n            }\n            return this.value;\n        };\n        return new kendo.spreadsheet.validation.Validation($.extend(validation, {\n            handler: validationHandler,\n            sheet: sheet,\n            row: row,\n            col: col\n        }));\n    }\n    var Validation = Class.extend({\n        init: function Validation(options) {\n            this.handler = options.handler;\n            this.from = options.from;\n            this.to = options.to;\n            this.dataType = options.dataType;\n            this.comparerType = options.comparerType;\n            this.type = options.type ? options.type : 'warning';\n            this.allowNulls = options.allowNulls ? true : false;\n            this.fromIsDateValue = options.fromIsDateValue ? true : false;\n            this.toIsDateValue = options.toIsDateValue ? true : false;\n            this.showButton = options.showButton;\n            this.fromIsListValue = options.fromIsListValue ? true : false;\n            this.sheet = options.sheet;\n            this.row = options.row;\n            this.col = options.col;\n            if (options.tooltipMessageTemplate) {\n                this.tooltipMessageTemplate = options.tooltipMessageTemplate;\n            }\n            if (options.tooltipTitleTemplate) {\n                this.tooltipTitleTemplate = options.tooltipTitleTemplate;\n            }\n            if (options.messageTemplate) {\n                this.messageTemplate = options.messageTemplate;\n            }\n            if (options.titleTemplate) {\n                this.titleTemplate = options.titleTemplate;\n            }\n        },\n        _formatMessages: function (format) {\n            var from = this.from ? this.from_value : '';\n            var to = this.to ? this.to_value : '';\n            var fromFormula = this.from ? this.from.toString() : '';\n            var toFormula = this.to ? this.to.toString() : '';\n            var dataType = this.dataType;\n            var type = this.type;\n            var comparerType = this.comparerType;\n            return kendo.format(format, from, to, fromFormula, toFormula, dataType, type, comparerType);\n        },\n        _setMessages: function () {\n            this.title = '';\n            this.message = '';\n            if (this.tooltipTitleTemplate) {\n                this.tooltipTitle = this._formatMessages(this.tooltipTitleTemplate);\n            }\n            if (this.tooltipMessageTemplate) {\n                this.tooltipMessage = this._formatMessages(this.tooltipMessageTemplate);\n            }\n            if (this.titleTemplate) {\n                this.title = this._formatMessages(this.titleTemplate);\n            }\n            if (this.messageTemplate) {\n                this.message = this._formatMessages(this.messageTemplate);\n            }\n        },\n        _getListData: function () {\n            if (!this.from_value || !this.from_value.data) {\n                return [];\n            }\n            var cube = this.from_value.data;\n            var i;\n            var y;\n            var data = [];\n            for (i = 0; i < cube.length; i++) {\n                var array = cube[i];\n                if (array) {\n                    for (y = 0; y < array.length; y++) {\n                        data.push(array[y]);\n                    }\n                }\n            }\n            return data;\n        },\n        clone: function (sheet, row, col) {\n            var options = this._getOptions();\n            if (options.from) {\n                options.from = options.from.clone(sheet, row, col);\n            }\n            if (options.to) {\n                options.to = options.to.clone(sheet, row, col);\n            }\n            return new Validation($.extend(options, { handler: this.handler }, {\n                sheet: sheet,\n                row: row,\n                col: col\n            }));\n        },\n        exec: function (ss, compareValue, compareFormat, callback) {\n            var self = this;\n            function getValue(val) {\n                if (val instanceof kendo.spreadsheet.Ref) {\n                    val = ss.getData(val);\n                    if (Array.isArray(val)) {\n                        val = val[0];\n                    }\n                }\n                return val;\n            }\n            var calculateFromCallBack = function (val) {\n                self.from_value = getValue(val);\n                self.value = self.handler.call(self, compareValue, compareFormat);\n                self._setMessages();\n                if (callback) {\n                    callback(self.value);\n                }\n            };\n            if (self.to) {\n                self.to.exec(ss, function (val) {\n                    self.to_value = getValue(val);\n                    self.from.exec(ss, calculateFromCallBack);\n                });\n            } else {\n                self.from.exec(ss, calculateFromCallBack);\n            }\n        },\n        reset: function () {\n            if (this.from) {\n                this.from.reset();\n            }\n            if (this.to) {\n                this.to.reset();\n            }\n            delete this.value;\n        },\n        adjust: function (affectedSheet, operation, start, delta) {\n            if (this.from) {\n                this.from.adjust(affectedSheet, operation, start, delta);\n            }\n            if (this.to) {\n                this.to.adjust(affectedSheet, operation, start, delta);\n            }\n            if (this.sheet.toLowerCase() == affectedSheet.toLowerCase()) {\n                var formulaRow = this.row;\n                var formulaCol = this.col;\n                switch (operation) {\n                case 'row':\n                    if (formulaRow >= start) {\n                        this.row += delta;\n                    }\n                    break;\n                case 'col':\n                    if (formulaCol >= start) {\n                        this.col += delta;\n                    }\n                    break;\n                }\n            }\n        },\n        toJSON: function () {\n            var options = this._getOptions();\n            if (options.from) {\n                options.from = options.from.toString();\n                if (options.dataType === 'list') {\n                    options.from = options.from.replace(/^_matrix\\((.*)\\)$/i, '$1');\n                    delete options.fromIsListValue;\n                }\n                if (options.dataType === 'date') {\n                    if (this.fromIsDateValue) {\n                        options.from = options.from.replace(/^DATEVALUE\\(\"(.*)\"\\)$/i, '$1');\n                        delete options.fromIsDateValue;\n                    }\n                }\n            }\n            if (options.to) {\n                options.to = options.to.toString();\n                if (options.dataType === 'date') {\n                    if (this.toIsDateValue) {\n                        options.to = options.to.replace(/^DATEVALUE\\(\"(.*)\"\\)$/i, '$1');\n                        delete options.toIsDateValue;\n                    }\n                }\n            }\n            return options;\n        },\n        _getOptions: function () {\n            return {\n                from: this.from,\n                to: this.to,\n                dataType: this.dataType,\n                type: this.type,\n                comparerType: this.comparerType,\n                row: this.row,\n                col: this.col,\n                sheet: this.sheet,\n                allowNulls: this.allowNulls,\n                fromIsListValue: this.fromIsListValue,\n                fromIsDateValue: this.fromIsDateValue,\n                toIsDateValue: this.toIsDateValue,\n                tooltipMessageTemplate: this.tooltipMessageTemplate,\n                tooltipTitleTemplate: this.tooltipTitleTemplate,\n                messageTemplate: this.messageTemplate,\n                titleTemplate: this.titleTemplate,\n                showButton: this.showButton\n            };\n        }\n    });\n    exports.compile = compileValidation;\n    exports.validationComparers = {\n        greaterThan: function (valueToCompare, from) {\n            return valueToCompare > from;\n        },\n        lessThan: function (valueToCompare, from) {\n            return valueToCompare < from;\n        },\n        between: function (valueToCompare, from, to) {\n            return valueToCompare >= from && valueToCompare <= to;\n        },\n        equalTo: function (valueToCompare, from) {\n            return valueToCompare == from;\n        },\n        notEqualTo: function (valueToCompare, from) {\n            return valueToCompare != from;\n        },\n        greaterThanOrEqualTo: function (valueToCompare, from) {\n            return valueToCompare >= from;\n        },\n        lessThanOrEqualTo: function (valueToCompare, from) {\n            return valueToCompare <= from;\n        },\n        notBetween: function (valueToCompare, from, to) {\n            return valueToCompare < from || valueToCompare > to;\n        },\n        custom: function (valueToCompare, from) {\n            return from;\n        },\n        list: function (valueToCompare, data) {\n            return data.indexOf(valueToCompare) > -1;\n        }\n    };\n    exports.Validation = Validation;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('spreadsheet/sheet', [\n        'kendo.core',\n        'kendo.color',\n        'spreadsheet/runtime',\n        'spreadsheet/validation',\n        'spreadsheet/references'\n    ], f);\n}(function () {\n    (function (kendo) {\n        if (kendo.support.browser.msie && kendo.support.browser.version < 9) {\n            return;\n        }\n        var RangeRef = kendo.spreadsheet.RangeRef;\n        var CellRef = kendo.spreadsheet.CellRef;\n        var Range = kendo.spreadsheet.Range;\n        var Selection = kendo.Class.extend({\n            init: function (sheet) {\n                this._sheet = sheet;\n                this.selection = kendo.spreadsheet.FIRSTREF.toRangeRef();\n                this.originalSelection = kendo.spreadsheet.FIRSTREF.toRangeRef();\n                this._activeCell = kendo.spreadsheet.FIRSTREF.toRangeRef();\n                this.originalActiveCell = kendo.spreadsheet.FIRSTREF;\n            },\n            currentSelectionRange: function () {\n                return this.selection.rangeAt(this.selectionRangeIndex).toRangeRef();\n            },\n            currentOriginalNavigationRange: function () {\n                return this.originalSelection.rangeAt(this.selectionRangeIndex).toRangeRef();\n            },\n            currentNavigationRange: function () {\n                if (this.singleCellSelection()) {\n                    return this._sheet._sheetRef;\n                } else {\n                    return this.selection.rangeAt(this.selectionRangeIndex).toRangeRef();\n                }\n            },\n            nextNavigationRange: function () {\n                if (!this.singleCellSelection()) {\n                    this.selectionRangeIndex = this.selection.nextRangeIndex(this.selectionRangeIndex);\n                }\n                return this.currentNavigationRange();\n            },\n            previousNavigationRange: function () {\n                if (!this.singleCellSelection()) {\n                    this.selectionRangeIndex = this.selection.previousRangeIndex(this.selectionRangeIndex);\n                }\n                return this.currentNavigationRange();\n            },\n            activeCell: function (ref) {\n                if (ref) {\n                    this.originalActiveCell = ref.first();\n                    this._activeCell = this._sheet.unionWithMerged(ref.toRangeRef());\n                    this._sheet.focus(ref);\n                    this._sheet.triggerChange({\n                        activeCell: true,\n                        selection: true\n                    });\n                }\n                return this._activeCell;\n            },\n            select: function (ref, expanded, changeActiveCell) {\n                if (ref) {\n                    if (ref.eq(this.originalSelection)) {\n                        return;\n                    }\n                    this._sheet.triggerSelect(new Range(ref, this._sheet));\n                    this.originalSelection = ref;\n                    this.selection = expanded;\n                    if (changeActiveCell !== false) {\n                        if (ref.isCell()) {\n                            this.activeCell(ref);\n                        } else {\n                            this.activeCell(this.selection.lastRange().first());\n                        }\n                        this.selectionRangeIndex = this.selection.size() - 1;\n                    } else {\n                        this._sheet.triggerChange({ selection: true });\n                    }\n                }\n                return this.selection;\n            },\n            singleCellSelection: function () {\n                return this._activeCell.eq(this.selection);\n            }\n        });\n        var Sheet = kendo.Observable.extend({\n            init: function () {\n                kendo.Observable.prototype.init.call(this);\n                this._reinit.apply(this, arguments);\n            },\n            events: [\n                'commandRequest',\n                'afterInsertRow',\n                'afterDeleteRow',\n                'insertRow',\n                'insertColumn',\n                'deleteRow',\n                'deleteColumn',\n                'hideRow',\n                'hideColumn',\n                'unhideRow',\n                'unhideColumn',\n                'select'\n            ],\n            _reinit: function (rowCount, columnCount, rowHeight, columnWidth, headerHeight, headerWidth, defaultCellStyle) {\n                defaultCellStyle = defaultCellStyle || {};\n                this._defaultCellStyle = {\n                    background: defaultCellStyle.background,\n                    color: defaultCellStyle.color,\n                    fontFamily: defaultCellStyle.fontFamily,\n                    fontSize: defaultCellStyle.fontSize,\n                    italic: defaultCellStyle.italic,\n                    bold: defaultCellStyle.bold,\n                    underline: defaultCellStyle.underline,\n                    wrap: defaultCellStyle.wrap\n                };\n                this._rows = new kendo.spreadsheet.Axis(rowCount, rowHeight);\n                this._columns = new kendo.spreadsheet.Axis(columnCount, columnWidth);\n                this._mergedCells = [];\n                this._frozenRows = 0;\n                this._frozenColumns = 0;\n                this._suspendChanges = false;\n                this._filter = null;\n                this._showGridLines = true;\n                this._gridLinesColor = null;\n                this._grid = new kendo.spreadsheet.Grid(this._rows, this._columns, rowCount, columnCount, headerHeight, headerWidth);\n                this._sheetRef = this._grid.normalize(kendo.spreadsheet.SHEETREF);\n                this._properties = new kendo.spreadsheet.PropertyBag(rowCount, columnCount, this._defaultCellStyle);\n                this._sorter = new kendo.spreadsheet.Sorter(this._grid, this._properties.sortable());\n                this._viewSelection = new Selection(this);\n                this._editSelection = new Selection(this);\n                this._formulaSelections = [];\n            },\n            _selectionState: function () {\n                return this._inEdit ? this._editSelection : this._viewSelection;\n            },\n            navigator: function () {\n                if (!this._navigator) {\n                    this._navigator = new kendo.spreadsheet.SheetNavigator(this);\n                }\n                return this._navigator;\n            },\n            axisManager: function () {\n                if (!this._axisManager) {\n                    this._axisManager = new kendo.spreadsheet.AxisManager(this);\n                }\n                return this._axisManager;\n            },\n            _name: function (value) {\n                if (!value) {\n                    return this._sheetName;\n                }\n                this._sheetName = value;\n                return this;\n            },\n            name: function () {\n                return this._name();\n            },\n            _property: function (accessor, value, reason) {\n                if (value === undefined) {\n                    return accessor();\n                } else {\n                    accessor(value);\n                    return this.triggerChange(reason);\n                }\n            },\n            _field: function (name, value, reason) {\n                if (value === undefined) {\n                    return this[name];\n                } else {\n                    this[name] = value;\n                    return this.triggerChange(reason);\n                }\n            },\n            suspendChanges: function (value) {\n                if (value === undefined) {\n                    return this._suspendChanges;\n                }\n                this._suspendChanges = value;\n                return this;\n            },\n            triggerChange: function (reason) {\n                if (!this._suspendChanges) {\n                    this.trigger('change', reason);\n                }\n                return this;\n            },\n            triggerSelect: function (range) {\n                this.trigger('select', { range: range });\n            },\n            setDataSource: function (dataSource, columns) {\n                if (this.dataSourceBinder) {\n                    this.dataSourceBinder.destroy();\n                }\n                this.dataSourceBinder = new kendo.spreadsheet.SheetDataSourceBinder({\n                    dataSource: dataSource,\n                    sheet: this,\n                    columns: columns\n                });\n                this.dataSource = this.dataSourceBinder.dataSource;\n            },\n            hideColumn: function (columnIndex) {\n                if (this.trigger('hideColumn', { index: columnIndex })) {\n                    return;\n                }\n                return this._property(this._columns.hide.bind(this._columns), columnIndex, { layout: true });\n            },\n            unhideColumn: function (columnIndex) {\n                if (this.trigger('unhideColumn', { index: columnIndex })) {\n                    return;\n                }\n                return this._property(this._columns.unhide.bind(this._columns), columnIndex, { layout: true });\n            },\n            isHiddenColumn: function (columnIndex) {\n                return this._grid._columns.hidden(columnIndex);\n            },\n            _copyRange: function (sourceRangeRef, targetRef) {\n                var grid = this._grid;\n                var rowCount = grid.rowCount;\n                var nextRefTopLeft = grid.normalize(sourceRangeRef.topLeft);\n                var nextRefBottomRight = grid.normalize(sourceRangeRef.bottomRight);\n                var nextIndex = nextRefTopLeft.col * rowCount + nextRefTopLeft.row;\n                var nextBottomIndex = nextRefBottomRight.col * rowCount + nextRefBottomRight.row;\n                var targetIndex = targetRef.col * rowCount + targetRef.row;\n                this._properties.copy(nextIndex, nextBottomIndex, targetIndex);\n            },\n            _adjustReferences: function (operation, start, delta, mergedCells) {\n                this._mergedCells = mergedCells.reduce(function (a, ref) {\n                    ref = ref.adjust(null, null, null, null, operation == 'row', start, delta);\n                    if (ref instanceof RangeRef) {\n                        a.push(ref);\n                    }\n                    return a;\n                }, []);\n                if (this._workbook) {\n                    var affectedSheet = this._name();\n                    this._workbook._sheets.forEach(function (sheet) {\n                        sheet._forFormulas(function (formula) {\n                            formula.adjust(affectedSheet, operation, start, delta);\n                        });\n                        sheet._forValidations(function (validation) {\n                            validation.adjust(affectedSheet, operation, start, delta);\n                        });\n                    });\n                    this._workbook.adjustNames(affectedSheet, operation == 'row', start, delta);\n                }\n                var selection = this.select();\n                selection = selection.adjust(null, null, null, null, operation == 'row', start, delta);\n                if (selection !== kendo.spreadsheet.NULLREF) {\n                    this.select(selection);\n                }\n                var axis = operation == 'col' ? this._columns : this._rows;\n                axis.adjust(start, delta);\n            },\n            _forFormulas: function (callback) {\n                var props = this._properties;\n                var formulas = props.get('formula').values();\n                var n = formulas.length;\n                formulas.forEach(function (f, i) {\n                    callback.call(this, f.value, i, n);\n                }, this);\n            },\n            _forValidations: function (callback) {\n                var props = this._properties;\n                props.get('validation').values().forEach(function (v) {\n                    callback.call(this, v.value);\n                }, this);\n            },\n            preventInsertRow: function (rowIndex, count) {\n                if (this.selectedHeaders().allRows) {\n                    return {\n                        reason: 'error',\n                        type: 'insertRowWhenColumnIsSelected'\n                    };\n                }\n                count = count || 1;\n                var grid = this._grid;\n                var range = this.range(grid.rowCount - count, 0, count, grid.columnCount);\n                if (range.hasValue()) {\n                    return {\n                        reason: 'error',\n                        type: 'shiftingNonblankCells'\n                    };\n                }\n                return false;\n            },\n            preventInsertColumn: function (colIndex, count) {\n                if (this.selectedHeaders().allCols) {\n                    return {\n                        reason: 'error',\n                        type: 'insertColumnWhenRowIsSelected'\n                    };\n                }\n                count = count || 1;\n                var grid = this._grid;\n                var range = this.range(0, grid.columnCount - count, grid.rowCount, count);\n                if (range.hasValue()) {\n                    return {\n                        reason: 'error',\n                        type: 'shiftingNonblankCells'\n                    };\n                }\n                return false;\n            },\n            insertRow: function (rowIndex) {\n                var result = this.preventInsertRow(rowIndex);\n                if (result) {\n                    throw new Error('Shifting nonblank cells off the worksheet is not supported!');\n                }\n                if (this.trigger('insertRow', { index: rowIndex })) {\n                    return;\n                }\n                this.batch(function () {\n                    var grid = this._grid;\n                    var columnCount = grid.columnCount;\n                    var rowCount = grid.rowCount;\n                    var frozenRows = this.frozenRows();\n                    if (rowIndex < frozenRows) {\n                        this.frozenRows(frozenRows + 1);\n                    }\n                    var mergedCells = this._mergedCells.slice();\n                    for (var ci = 0; ci < columnCount; ci++) {\n                        var ref = new RangeRef(new CellRef(rowIndex, ci), new CellRef(rowIndex, ci));\n                        var topLeft = grid.normalize(ref.topLeft);\n                        var bottomRight = grid.normalize(ref.bottomRight);\n                        var nextRef = new RangeRef(new CellRef(topLeft.row, topLeft.col), new CellRef(rowCount - 2, bottomRight.col));\n                        this._copyRange(nextRef, new CellRef(topLeft.row + 1, topLeft.col));\n                        new Range(ref, this).clear({\n                            clearAll: true,\n                            keepBorders: true\n                        });\n                    }\n                    this._adjustReferences('row', rowIndex, 1, mergedCells);\n                }, {\n                    recalc: true,\n                    layout: true,\n                    insertRow: { index: rowIndex },\n                    ref: new RangeRef(new CellRef(rowIndex, 0), new CellRef(Infinity, Infinity))\n                });\n                this.trigger('afterInsertRow', { index: rowIndex });\n                return this;\n            },\n            isEnabledRow: function (rowIndex) {\n                var ref = new RangeRef(new CellRef(rowIndex, 0), new CellRef(rowIndex, this._grid.columnCount));\n                return new Range(ref, this).enable();\n            },\n            deleteRow: function (rowIndex) {\n                if (!this.isEnabledRow(rowIndex)) {\n                    return this;\n                }\n                if (this.trigger('deleteRow', { index: rowIndex })) {\n                    return;\n                }\n                this.batch(function () {\n                    var grid = this._grid;\n                    var columnCount = grid.columnCount;\n                    var frozenRows = this.frozenRows();\n                    if (rowIndex < frozenRows) {\n                        this.frozenRows(frozenRows - 1);\n                    }\n                    var mergedCells = this._mergedCells.slice();\n                    for (var ci = 0; ci < columnCount; ci++) {\n                        var ref = new RangeRef(new CellRef(rowIndex, ci), new CellRef(rowIndex, ci));\n                        new Range(ref, this).clear({\n                            clearAll: true,\n                            keepBorders: true\n                        });\n                        var topLeft = grid.normalize(ref.topLeft);\n                        var bottomRight = grid.normalize(ref.bottomRight);\n                        var nextRef = new RangeRef(new CellRef(topLeft.row + 1, topLeft.col), new CellRef(Infinity, bottomRight.col));\n                        this._copyRange(nextRef, topLeft);\n                        var nextRefBottomRight = grid.normalize(nextRef.bottomRight);\n                        new Range(new RangeRef(nextRefBottomRight, nextRefBottomRight), this).clear();\n                    }\n                    this._adjustReferences('row', rowIndex, -1, mergedCells);\n                }, {\n                    recalc: true,\n                    layout: true,\n                    deleteRow: { index: rowIndex },\n                    ref: new RangeRef(new CellRef(rowIndex, 0), new CellRef(Infinity, Infinity))\n                });\n                this.trigger('afterDeleteRow', { index: rowIndex });\n                return this;\n            },\n            insertColumn: function (columnIndex) {\n                if (this.trigger('insertColumn', { index: columnIndex })) {\n                    return;\n                }\n                this.batch(function () {\n                    var grid = this._grid;\n                    var columnCount = grid.columnCount;\n                    var frozenColumns = this.frozenColumns();\n                    if (columnIndex < frozenColumns) {\n                        this.frozenColumns(frozenColumns + 1);\n                    }\n                    var mergedCells = this._mergedCells.slice();\n                    for (var ci = columnCount; ci >= columnIndex; ci--) {\n                        var ref = new RangeRef(new CellRef(0, ci), new CellRef(Infinity, ci));\n                        new Range(ref, this).clear({\n                            clearAll: true,\n                            keepBorders: true\n                        });\n                        if (ci == columnIndex) {\n                            break;\n                        }\n                        var topLeft = grid.normalize(ref.topLeft);\n                        var bottomRight = grid.normalize(ref.bottomRight);\n                        var nextRef = new RangeRef(new CellRef(topLeft.row, topLeft.col - 1), new CellRef(bottomRight.row, bottomRight.col - 1));\n                        this._copyRange(nextRef, topLeft);\n                    }\n                    this._adjustReferences('col', columnIndex, 1, mergedCells);\n                }, {\n                    recalc: true,\n                    layout: true,\n                    insertColumn: { index: columnIndex },\n                    ref: new RangeRef(new CellRef(0, columnIndex), new CellRef(Infinity, Infinity))\n                });\n                return this;\n            },\n            isEnabledColumn: function (columnIndex) {\n                var ref = new RangeRef(new CellRef(0, columnIndex), new CellRef(Infinity, columnIndex));\n                return new Range(ref, this).enable();\n            },\n            deleteColumn: function (columnIndex) {\n                if (!this.isEnabledColumn(columnIndex)) {\n                    return this;\n                }\n                if (this.trigger('deleteColumn', { index: columnIndex })) {\n                    return;\n                }\n                this.batch(function () {\n                    var grid = this._grid;\n                    var columnCount = grid.columnCount;\n                    var frozenColumns = this.frozenColumns();\n                    if (columnIndex < frozenColumns) {\n                        this.frozenColumns(frozenColumns - 1);\n                    }\n                    var mergedCells = this._mergedCells.slice();\n                    for (var ci = columnIndex; ci < columnCount; ci++) {\n                        var ref = new RangeRef(new CellRef(0, ci), new CellRef(Infinity, ci));\n                        new Range(ref, this).clear({\n                            clearAll: true,\n                            keepBorders: true\n                        });\n                        if (ci == columnCount - 1) {\n                            break;\n                        }\n                        var topLeft = grid.normalize(ref.topLeft);\n                        var bottomRight = grid.normalize(ref.bottomRight);\n                        var nextRef = new RangeRef(new CellRef(topLeft.row, topLeft.col + 1), new CellRef(bottomRight.row, bottomRight.col + 1));\n                        this._copyRange(nextRef, topLeft);\n                    }\n                    this._adjustReferences('col', columnIndex, -1, mergedCells);\n                }, {\n                    recalc: true,\n                    layout: true,\n                    deleteColumn: { index: columnIndex },\n                    ref: new RangeRef(new CellRef(0, columnIndex), new CellRef(Infinity, Infinity))\n                });\n                return this;\n            },\n            hideRow: function (rowIndex) {\n                if (this.trigger('hideRow', { index: rowIndex })) {\n                    return;\n                }\n                return this._property(this._rows.hide.bind(this._rows), rowIndex, { layout: true });\n            },\n            unhideRow: function (rowIndex) {\n                if (this.trigger('unhideRow', { index: rowIndex })) {\n                    return;\n                }\n                return this._property(this._rows.unhide.bind(this._rows), rowIndex, { layout: true });\n            },\n            isHiddenRow: function (rowIndex) {\n                return this._grid._rows.hidden(rowIndex);\n            },\n            columnWidth: function (columnIndex, width) {\n                return this._property(this._columns.value.bind(this._columns, columnIndex, columnIndex), width, { layout: true });\n            },\n            rowHeight: function (rowIndex, height) {\n                return this._property(this._rows.value.bind(this._rows, rowIndex, rowIndex), height, { layout: true });\n            },\n            frozenRows: function (value) {\n                return this._field('_frozenRows', value, { layout: true });\n            },\n            frozenColumns: function (value) {\n                return this._field('_frozenColumns', value, { layout: true });\n            },\n            showGridLines: function (value) {\n                return this._field('_showGridLines', value, { layout: true });\n            },\n            gridLinesColor: function (value) {\n                return this._field('_gridLinesColor', value, { layout: true });\n            },\n            _ref: function (row, column, numRows, numColumns) {\n                var ref = null;\n                if (row instanceof kendo.spreadsheet.Ref) {\n                    return row;\n                }\n                if (row instanceof kendo.spreadsheet.Range) {\n                    return row._ref.toRangeRef();\n                }\n                if (typeof row === 'string') {\n                    ref = kendo.spreadsheet.calc.parseReference(row);\n                } else {\n                    if (!numRows) {\n                        numRows = 1;\n                    }\n                    if (!numColumns) {\n                        numColumns = 1;\n                    }\n                    ref = new RangeRef(new CellRef(row, column), new CellRef(row + numRows - 1, column + numColumns - 1));\n                }\n                return ref;\n            },\n            range: function (row, column, numRows, numColumns) {\n                return new Range(this._ref(row, column, numRows, numColumns), this);\n            },\n            _getMergedCells: function (range) {\n                var grid = this._grid;\n                var primary = {};\n                var secondary = {};\n                var hasMerged = false;\n                this.forEachMergedCell(range, function (ref) {\n                    var topLeft = ref.topLeft;\n                    grid.forEach(ref, function (cellRef) {\n                        if (topLeft.eq(cellRef)) {\n                            primary[cellRef.print()] = ref;\n                            hasMerged = true;\n                        } else if (range.contains(cellRef)) {\n                            secondary[cellRef.print()] = topLeft;\n                            hasMerged = true;\n                        }\n                    });\n                });\n                return {\n                    primary: primary,\n                    secondary: secondary,\n                    hasMerged: hasMerged\n                };\n            },\n            forEachMergedCell: function (ref, callback) {\n                var selectAll = false;\n                if (typeof callback === 'undefined') {\n                    callback = ref;\n                    selectAll = true;\n                }\n                this._mergedCells.forEach(function (merged) {\n                    if (selectAll || merged.intersects(ref)) {\n                        callback(merged);\n                    }\n                });\n            },\n            forEachFilterHeader: function (ref, callback) {\n                var selectAll = false;\n                if (typeof callback === 'undefined') {\n                    callback = ref;\n                    selectAll = true;\n                }\n                if (this._filter) {\n                    var refs = [];\n                    this._filter.ref.forEachColumn(function (columnRef) {\n                        if (selectAll || columnRef.intersects(ref)) {\n                            refs.push(columnRef.topLeft);\n                        }\n                    });\n                    this._mergedCells.forEach(function (merged) {\n                        refs = refs.map(function (ref) {\n                            if (merged.intersects(ref)) {\n                                return merged;\n                            }\n                            return ref;\n                        });\n                    });\n                    refs.reduce(function unique(result, element) {\n                        if (result.indexOf(element) < 0) {\n                            result.push(element);\n                        }\n                        return result;\n                    }, []).forEach(callback);\n                }\n            },\n            forEach: function (ref, callback) {\n                if (!(ref instanceof RangeRef)) {\n                    ref = this._ref(ref);\n                }\n                var topLeft = this._grid.normalize(ref.topLeft);\n                var bottomRight = this._grid.normalize(ref.bottomRight);\n                function doIt(value) {\n                    callback(ri++, ci, value);\n                }\n                for (var ci = topLeft.col; ci <= bottomRight.col; ci++) {\n                    var ri = topLeft.row;\n                    var startCellIndex = this._grid.index(ri, ci);\n                    var endCellIndex = this._grid.index(bottomRight.row, ci);\n                    this._properties.forEach(startCellIndex, endCellIndex, doIt);\n                }\n            },\n            startResizing: function (initialPosition) {\n                this._initialPosition = initialPosition;\n                this._resizeInProgress = true;\n            },\n            startAutoFill: function () {\n                this._autoFillInProgress = true;\n                var selection = this.select();\n                this._autoFillOrigin = selection;\n                this._autoFillDest = selection;\n                this.triggerChange({ selection: true });\n            },\n            updateAutoFill: function (dest, punch, hint, direction) {\n                this._autoFillDest = dest;\n                this._autoFillPunch = punch;\n                this._autoFillHint = hint;\n                this._autoFillDirection = direction;\n                this.triggerChange({ selection: true });\n            },\n            autoFillRef: function () {\n                return this._autoFillDest;\n            },\n            autoFillPunch: function () {\n                return this._autoFillPunch;\n            },\n            autoFillInProgress: function () {\n                return this._autoFillInProgress;\n            },\n            resizingInProgress: function () {\n                return this._resizeInProgress;\n            },\n            completeResizing: function () {\n                if (this._resizeInProgress) {\n                    this._resizeInProgress = false;\n                    var hintPosition = this.resizeHintPosition();\n                    if (this._initialPosition && hintPosition) {\n                        var handlePosition = this.resizeHandlePosition();\n                        if (handlePosition.col !== -Infinity) {\n                            this.trigger('commandRequest', {\n                                command: 'ColumnWidthCommand',\n                                options: {\n                                    target: handlePosition.col,\n                                    value: this.columnWidth(handlePosition.col) - (this._initialPosition.x - hintPosition.x)\n                                }\n                            });\n                        } else {\n                            this.trigger('commandRequest', {\n                                command: 'RowHeightCommand',\n                                options: {\n                                    target: handlePosition.row,\n                                    value: this.rowHeight(handlePosition.row) - (this._initialPosition.y - hintPosition.y)\n                                }\n                            });\n                        }\n                    } else {\n                        this.trigger('change', { resize: true });\n                    }\n                }\n            },\n            resizeHandlePosition: function () {\n                return this._resizeHandlePosition;\n            },\n            resizeHintPosition: function (location) {\n                if (location !== undefined) {\n                    this._resizeHintPosition = location;\n                    this.trigger('change', { resize: true });\n                }\n                return this._resizeHintPosition;\n            },\n            removeResizeHandle: function () {\n                if (this._resizeHandlePosition) {\n                    this._resizeHintPosition = undefined;\n                    this._resizeHandlePosition = undefined;\n                    this._initialPosition = undefined;\n                    this.trigger('change', { resize: true });\n                }\n            },\n            positionResizeHandle: function (ref) {\n                this._resizeHandlePosition = ref;\n                this.trigger('change', { resize: true });\n            },\n            startSelection: function () {\n                this._selectionInProgress = true;\n            },\n            completeSelection: function () {\n                if (this._selectionInProgress) {\n                    this._selectionInProgress = false;\n                    this._resizeHintPosition = undefined;\n                    this.trigger('change', { selection: true });\n                }\n                if (this._autoFillInProgress) {\n                    this._autoFillInProgress = false;\n                    var dest = this._autoFillDest;\n                    var origin = this._autoFillOrigin;\n                    if (this._autoFillPunch) {\n                        this.trigger('commandRequest', {\n                            command: 'ClearContentCommand',\n                            options: { operatingRange: this.range(this._autoFillPunch) }\n                        });\n                    } else {\n                        if (!dest.eq(origin)) {\n                            this.trigger('commandRequest', {\n                                command: 'AutoFillCommand',\n                                options: {\n                                    operatingRange: this.range(dest),\n                                    origin: this.range(origin)\n                                }\n                            });\n                        } else {\n                            this.triggerChange({ selection: true });\n                        }\n                    }\n                    this._autoFillDest = null;\n                    this._autoFillPunch = null;\n                    this._autoFillOrigin = null;\n                    this.select(dest);\n                }\n            },\n            selectionInProgress: function () {\n                return this._selectionInProgress;\n            },\n            select: function (ref, changeActiveCell) {\n                var selectionState = this._selectionState();\n                var expandedRef;\n                if (ref) {\n                    ref = this._ref(ref);\n                    ref = this._grid.normalize(ref);\n                    expandedRef = this._grid.isAxis(ref) ? ref : this.unionWithMerged(ref);\n                }\n                return selectionState.select(ref, expandedRef, changeActiveCell);\n            },\n            originalSelect: function () {\n                return this._selectionState().originalSelection;\n            },\n            currentSelectionRange: function () {\n                return this._selectionState().currentSelectionRange();\n            },\n            currentOriginalSelectionRange: function () {\n                return this._selectionState().currentOriginalNavigationRange();\n            },\n            currentNavigationRange: function () {\n                return this._selectionState().currentNavigationRange();\n            },\n            nextNavigationRange: function () {\n                return this._selectionState().nextNavigationRange();\n            },\n            previousNavigationRange: function () {\n                return this._selectionState().previousNavigationRange();\n            },\n            selectionRangeIndex: function () {\n                return this._selectionState().selectionRangeIndex;\n            },\n            activeCell: function (ref) {\n                return this._selectionState().activeCell(ref);\n            },\n            originalActiveCell: function () {\n                return this._selectionState().originalActiveCell;\n            },\n            singleCellSelection: function () {\n                return this._selectionState().singleCellSelection();\n            },\n            unionWithMerged: function (ref) {\n                var mergedCells = this._mergedCells;\n                return ref.map(function (ref) {\n                    return ref.toRangeRef().union(mergedCells);\n                });\n            },\n            trim: function (ref) {\n                var trims = [];\n                var grid = this._grid;\n                this._properties.forEachProperty(function (property) {\n                    trims.push(grid.trim(ref, property.list));\n                });\n                return this.unionWithMerged(ref.topLeft.toRangeRef().union(trims));\n            },\n            focus: function (ref) {\n                if (ref) {\n                    this._focus = ref.toRangeRef();\n                } else {\n                    var focus = this._focus;\n                    this._focus = null;\n                    return focus;\n                }\n            },\n            activeCellSelection: function () {\n                return new Range(this._grid.normalize(this.activeCell()), this);\n            },\n            selection: function () {\n                return new Range(this._grid.normalize(this._selectionState().selection), this);\n            },\n            selectedHeaders: function () {\n                var selection = this.select();\n                var rows = {};\n                var cols = {};\n                var allCols = false;\n                var allRows = false;\n                var maxRow = this._grid.rowCount - 1;\n                var maxCol = this._grid.columnCount - 1;\n                selection.forEach(function (ref) {\n                    var i;\n                    var rowState = 'partial';\n                    var colState = 'partial';\n                    ref = ref.toRangeRef();\n                    var bottomRight = ref.bottomRight;\n                    var topLeft = ref.topLeft;\n                    var rowSelection = topLeft.col <= 0 && bottomRight.col >= maxCol;\n                    var colSelection = topLeft.row <= 0 && bottomRight.row >= maxRow;\n                    if (colSelection) {\n                        allRows = true;\n                        colState = 'full';\n                    }\n                    if (rowSelection) {\n                        allCols = true;\n                        rowState = 'full';\n                    }\n                    if (!colSelection) {\n                        for (i = topLeft.row; i <= bottomRight.row; i++) {\n                            if (rows[i] !== 'full') {\n                                rows[i] = rowState;\n                            }\n                        }\n                    }\n                    if (!rowSelection) {\n                        for (i = topLeft.col; i <= bottomRight.col; i++) {\n                            if (cols[i] !== 'full') {\n                                cols[i] = colState;\n                            }\n                        }\n                    }\n                });\n                return {\n                    rows: rows,\n                    cols: cols,\n                    allRows: allRows,\n                    allCols: allCols,\n                    all: allRows && allCols\n                };\n            },\n            isInEditMode: function (isInEdit) {\n                if (isInEdit === undefined) {\n                    return this._inEdit;\n                }\n                this._inEdit = isInEdit;\n                if (isInEdit) {\n                    this._editSelection.selection = this._viewSelection.selection.clone();\n                    this._editSelection.originalSelection = this._viewSelection.originalSelection.clone();\n                    this._editSelection._activeCell = this._viewSelection._activeCell.clone();\n                    this._editSelection.originalActiveCell = this._viewSelection.originalActiveCell.clone();\n                }\n            },\n            _setFormulaSelections: function (selection) {\n                this._formulaSelections = (selection || []).slice();\n                this.triggerChange({ selection: true });\n            },\n            _viewActiveCell: function () {\n                return this._viewSelection._activeCell.toRangeRef();\n            },\n            toJSON: function () {\n                var positions = {};\n                var rows = this._rows.toJSON('height', positions);\n                var columns = this._columns.toJSON('width', {});\n                var viewSelection = this._viewSelection;\n                var hyperlinks = [];\n                var defaultCellStyle = this._defaultCellStyle || {};\n                function clearDefaultStyle(cell) {\n                    Object.keys(defaultCellStyle).forEach(function (key) {\n                        if (cell[key] === defaultCellStyle[key]) {\n                            delete cell[key];\n                        }\n                    });\n                }\n                this.forEach(kendo.spreadsheet.SHEETREF, function (row, col, cell) {\n                    clearDefaultStyle(cell);\n                    if (Object.keys(cell).length === 0) {\n                        return;\n                    }\n                    if (cell.link) {\n                        hyperlinks.push({\n                            ref: kendo.spreadsheet.Ref.display(null, row, col),\n                            target: cell.link\n                        });\n                    }\n                    var position = positions[row];\n                    if (position === undefined) {\n                        position = rows.length;\n                        rows.push({ index: row });\n                        positions[row] = position;\n                    }\n                    row = rows[position];\n                    cell.index = col;\n                    if (row.cells === undefined) {\n                        row.cells = [];\n                    }\n                    if (cell.formula) {\n                        cell.formula = cell.formula.toString();\n                    }\n                    if (cell.validation) {\n                        cell.validation = cell.validation.toJSON();\n                    }\n                    if (cell.color) {\n                        cell.color = kendo.parseColor(cell.color).toCss();\n                    }\n                    if (cell.background) {\n                        cell.background = kendo.parseColor(cell.background).toCss();\n                    }\n                    if (cell.borderTop && cell.borderTop.color) {\n                        cell.borderTop.color = kendo.parseColor(cell.borderTop.color).toCss();\n                    }\n                    if (cell.borderBottom && cell.borderBottom.color) {\n                        cell.borderBottom.color = kendo.parseColor(cell.borderBottom.color).toCss();\n                    }\n                    if (cell.borderRight && cell.borderRight.color) {\n                        cell.borderRight.color = kendo.parseColor(cell.borderRight.color).toCss();\n                    }\n                    if (cell.borderLeft && cell.borderLeft.color) {\n                        cell.borderLeft.color = kendo.parseColor(cell.borderLeft.color).toCss();\n                    }\n                    row.cells.push(cell);\n                });\n                var json = {\n                    name: this._name(),\n                    rows: rows,\n                    columns: columns,\n                    selection: viewSelection.selection.toString(),\n                    activeCell: viewSelection.activeCell().toString(),\n                    frozenRows: this.frozenRows(),\n                    frozenColumns: this.frozenColumns(),\n                    showGridLines: this.showGridLines(),\n                    gridLinesColor: this.gridLinesColor(),\n                    mergedCells: this._mergedCells.map(function (ref) {\n                        return ref.toString();\n                    }),\n                    hyperlinks: hyperlinks,\n                    defaultCellStyle: defaultCellStyle\n                };\n                if (this._sort) {\n                    json.sort = {\n                        ref: this._sort.ref.toString(),\n                        columns: this._sort.columns.map(function (column) {\n                            return {\n                                index: column.index,\n                                ascending: column.ascending\n                            };\n                        })\n                    };\n                }\n                if (this._filter) {\n                    json.filter = {\n                        ref: this._filter.ref.toString(),\n                        columns: this._filter.columns.map(function (column) {\n                            var filter = column.filter.toJSON();\n                            filter.index = column.index;\n                            return filter;\n                        })\n                    };\n                }\n                return json;\n            },\n            fromJSON: function (json) {\n                this.batch(function () {\n                    if (json.name !== undefined) {\n                        this._name(json.name);\n                    }\n                    if (json.frozenColumns !== undefined) {\n                        this.frozenColumns(json.frozenColumns);\n                    }\n                    if (json.frozenRows !== undefined) {\n                        this.frozenRows(json.frozenRows);\n                    }\n                    if (json.columns !== undefined) {\n                        this._columns.fromJSON('width', json.columns);\n                    }\n                    if (json.rows !== undefined) {\n                        this._rows.fromJSON('height', json.rows);\n                        for (var ri = 0; ri < json.rows.length; ri++) {\n                            var row = json.rows[ri];\n                            var rowIndex = row.index;\n                            if (rowIndex === undefined) {\n                                rowIndex = ri;\n                            }\n                            if (row.cells) {\n                                for (var ci = 0; ci < row.cells.length; ci++) {\n                                    var cell = row.cells[ci];\n                                    var columnIndex = cell.index;\n                                    if (columnIndex === undefined) {\n                                        columnIndex = ci;\n                                    }\n                                    if (cell.formula) {\n                                        cell.formula = this._compileFormula(rowIndex, columnIndex, cell.formula);\n                                    }\n                                    if (cell.validation) {\n                                        cell.validation = this._compileValidation(rowIndex, columnIndex, cell.validation);\n                                    }\n                                    this._properties.fromJSON(this._grid.index(rowIndex, columnIndex), cell);\n                                }\n                            }\n                        }\n                    }\n                    if (json.selection) {\n                        this._viewSelection.selection = this._viewSelection.originalSelection = this._ref(json.selection);\n                    }\n                    if (json.activeCell) {\n                        var activeCellRef = this._ref(json.activeCell);\n                        this._viewSelection._activeCell = activeCellRef.toRangeRef();\n                        this._viewSelection.originalActiveCell = activeCellRef;\n                    }\n                    if (json.mergedCells) {\n                        json.mergedCells.forEach(function (ref) {\n                            this.range(ref).merge();\n                        }, this);\n                    }\n                    if (json.sort) {\n                        this._sort = {\n                            ref: this._ref(json.sort.ref),\n                            columns: json.sort.columns.slice(0)\n                        };\n                    }\n                    if (json.filter) {\n                        var ref = json.filter.ref;\n                        var columns = json.filter.columns === undefined ? [] : json.filter.columns;\n                        if (!ref) {\n                            kendo.logToConsole('Dropping filter for sheet \\'' + json.name + '\\' due to missing ref');\n                        } else {\n                            this._filter = {\n                                ref: this._ref(ref),\n                                columns: columns.map(function (column) {\n                                    return {\n                                        index: column.index,\n                                        filter: kendo.spreadsheet.Filter.create(column)\n                                    };\n                                })\n                            };\n                            this._refreshFilter();\n                        }\n                    }\n                    if (json.showGridLines !== undefined) {\n                        this._showGridLines = json.showGridLines;\n                    }\n                    this._gridLinesColor = json.gridLinesColor;\n                });\n                this._rows._refresh();\n                this._columns._refresh();\n            },\n            formula: function (ref) {\n                return this._properties.get('formula', this._grid.cellRefIndex(ref));\n            },\n            validation: function (ref) {\n                return this._properties.get('validation', this._grid.cellRefIndex(ref));\n            },\n            resetFormulas: function () {\n                this._forFormulas(function (formula) {\n                    formula.reset();\n                });\n            },\n            resetValidations: function () {\n                this._forValidations(function (validation) {\n                    validation.reset();\n                });\n            },\n            recalc: function (context, callback) {\n                var formulas = this._properties.get('formula').values();\n                var count = formulas.length, pending = 0, i = 0;\n                if (!count && callback) {\n                    return callback();\n                }\n                function next() {\n                    pending--;\n                    if (i == count && !pending) {\n                        callback();\n                    }\n                }\n                while (i < count) {\n                    pending++;\n                    formulas[i++].value.exec(context, callback ? next : null);\n                }\n            },\n            revalidate: function (context) {\n                var self = this;\n                this._forValidations(function (validation) {\n                    var cellRef = new CellRef(validation.row, validation.col);\n                    var ref = new RangeRef(cellRef, cellRef);\n                    validation.exec(context, self._get(ref, 'value'), self._get(ref, 'format'));\n                });\n            },\n            _value: function (row, col, value) {\n                var index = this._grid.index(row, col);\n                if (value !== undefined) {\n                    this._properties.set('value', index, index, value);\n                } else {\n                    return this._properties.get('value', index);\n                }\n            },\n            _validation: function (row, col) {\n                var index = this._grid.index(row, col);\n                return this._properties.get('validation', index);\n            },\n            _compileValidation: function (row, col, validation) {\n                if (validation instanceof kendo.spreadsheet.validation.Validation) {\n                    return validation.clone(this._name(), row, col);\n                }\n                if (validation.from != null) {\n                    validation.from = (validation.from + '').replace(/^=/, '');\n                }\n                if (validation.to != null) {\n                    validation.to = (validation.to + '').replace(/^=/, '');\n                }\n                return kendo.spreadsheet.validation.compile(this._name(), row, col, validation);\n            },\n            _compileFormula: function (row, col, f) {\n                f = f.replace(/^=/, '');\n                f = kendo.spreadsheet.calc.parseFormula(this._name(), row, col, f);\n                return kendo.spreadsheet.calc.compile(f);\n            },\n            _copyValuesInRange: function (topLeft, bottomRight, value, property) {\n                var ci, start, end;\n                for (ci = topLeft.col; ci <= bottomRight.col; ci++) {\n                    start = this._grid.index(topLeft.row, ci);\n                    end = this._grid.index(bottomRight.row, ci);\n                    for (var index = start, row = topLeft.row; index <= end; ++index, ++row) {\n                        value = value.clone(this._name(), row, ci);\n                        this._properties.set(property, index, index, value);\n                    }\n                }\n                return value;\n            },\n            _set: function (ref, name, value) {\n                var topLeft = this._grid.normalize(ref.topLeft);\n                var bottomRight = this._grid.normalize(ref.bottomRight);\n                var ci, start, end;\n                if (value && name == 'formula') {\n                    if (typeof value == 'string') {\n                        value = this._compileFormula(topLeft.row, topLeft.col, value);\n                    }\n                    value = this._copyValuesInRange(topLeft, bottomRight, value, 'formula');\n                } else if (value && name == 'validation') {\n                    value = this._compileValidation(topLeft.row, topLeft.col, value);\n                    value = this._copyValuesInRange(topLeft, bottomRight, value, 'validation');\n                } else {\n                    for (ci = topLeft.col; ci <= bottomRight.col; ci++) {\n                        start = this._grid.index(topLeft.row, ci);\n                        end = this._grid.index(bottomRight.row, ci);\n                        this._properties.set(name, start, end, value);\n                        if (name == 'formula') {\n                            this._properties.set('value', start, end, null);\n                        }\n                    }\n                }\n            },\n            _get: function (ref, name) {\n                var topLeft = this._grid.normalize(ref.topLeft);\n                var index = this._grid.index(topLeft.row, topLeft.col);\n                return this._properties.get(name, index);\n            },\n            batch: function (callback, reason) {\n                var suspended = this.suspendChanges();\n                this.suspendChanges(true);\n                callback.call(this);\n                return this.suspendChanges(suspended).triggerChange(reason || { recalc: true });\n            },\n            _sortBy: function (ref, columns) {\n                var indices = null;\n                columns.forEach(function (column) {\n                    indices = this._sorter.sortBy(ref, column.index, this._properties.get('value'), column.ascending, indices);\n                }, this);\n                this._sort = {\n                    ref: ref,\n                    columns: columns\n                };\n                this._refreshFilter();\n                this.triggerChange({ recalc: true });\n            },\n            _refreshFilter: function () {\n                if (this._filter) {\n                    this._filterBy(this._filter.ref, this._filter.columns);\n                }\n            },\n            _filterBy: function (ref, columns) {\n                this.batch(function () {\n                    for (var ri = ref.topLeft.row; ri <= ref.bottomRight.row; ri++) {\n                        if (this._rows.hidden(ri)) {\n                            this._rows.unhide(ri);\n                        }\n                    }\n                    columns.forEach(function (column) {\n                        var columnRef = ref.resize({ top: 1 }).toColumn(column.index);\n                        var cells = [];\n                        if (columnRef === kendo.spreadsheet.NULLREF) {\n                            return;\n                        }\n                        this.forEach(columnRef, function (row, col, cell) {\n                            cell.row = row;\n                            cells.push(cell);\n                        });\n                        column.filter.prepare(cells);\n                        for (var ci = 0; ci < cells.length; ci++) {\n                            var cell = cells[ci];\n                            var value = column.filter.value(cell);\n                            if (column.filter.matches(value) === false) {\n                                this.hideRow(cell.row);\n                            }\n                        }\n                    }, this);\n                    this._filter = {\n                        ref: ref,\n                        columns: columns\n                    };\n                }, {\n                    layout: true,\n                    filter: true\n                });\n            },\n            filterColumn: function (ref) {\n                var filterRef = this.filter().ref;\n                return ref.toRangeRef().topLeft.col - filterRef.topLeft.col;\n            },\n            filter: function () {\n                return this._filter;\n            },\n            clearFilter: function (spec) {\n                this._clearFilter(spec instanceof Array ? spec : [spec]);\n            },\n            _clearFilter: function (indices) {\n                if (this._filter) {\n                    this.batch(function () {\n                        this._filter.columns = this._filter.columns.filter(function (column) {\n                            return indices.indexOf(column.index) < 0;\n                        });\n                        this._refreshFilter();\n                    }, {\n                        layout: true,\n                        filter: true\n                    });\n                }\n            },\n            getAxisState: function () {\n                return {\n                    rows: this._rows.getState(),\n                    columns: this._columns.getState()\n                };\n            },\n            setAxisState: function (state) {\n                this._rows.setState(state.rows);\n                this._columns.setState(state.columns);\n                this.triggerChange({ layout: true });\n            },\n            getState: function () {\n                return {\n                    rows: this._rows.getState(),\n                    columns: this._columns.getState(),\n                    mergedCells: this._mergedCells.map(function (cell) {\n                        return cell.clone();\n                    }),\n                    properties: this._properties.getState()\n                };\n            },\n            setState: function (state) {\n                this._rows.setState(state.rows);\n                this._columns.setState(state.columns);\n                this._mergedCells = state.mergedCells;\n                this._properties.setState(state.properties);\n                this.triggerChange(kendo.spreadsheet.ALL_REASONS);\n            },\n            _merge: function (ref) {\n                var mergedCells = this._mergedCells;\n                var sheet = this;\n                var mergedRef;\n                this.batch(function () {\n                    mergedRef = ref.map(function (ref) {\n                        if (ref instanceof kendo.spreadsheet.CellRef) {\n                            return ref;\n                        }\n                        var currentRef = ref.toRangeRef().union(mergedCells, function (ref) {\n                            mergedCells.splice(mergedCells.indexOf(ref), 1);\n                        });\n                        var range = new Range(currentRef, sheet);\n                        var formula = range._get('formula');\n                        var value = range.value();\n                        var format = range.format();\n                        var background = range.background();\n                        range.value(null);\n                        range.format(null);\n                        range.background(null);\n                        var topLeft = new Range(currentRef.collapse(), sheet);\n                        if (formula) {\n                            topLeft._set('formula', formula);\n                        } else {\n                            topLeft.value(value);\n                        }\n                        topLeft.format(format);\n                        topLeft.background(background);\n                        mergedCells.push(currentRef);\n                        return currentRef;\n                    });\n                    var viewSelection = sheet._viewSelection;\n                    viewSelection.selection = sheet.unionWithMerged(viewSelection.originalSelection);\n                    viewSelection._activeCell = sheet.unionWithMerged(viewSelection.originalActiveCell);\n                }, {\n                    activeCell: true,\n                    selection: true\n                });\n                return mergedRef;\n            }\n        });\n        kendo.spreadsheet.Sheet = Sheet;\n    }(kendo));\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('spreadsheet/sheetsbar', [\n        'kendo.core',\n        'kendo.sortable'\n    ], f);\n}(function () {\n    (function (kendo) {\n        if (kendo.support.browser.msie && kendo.support.browser.version < 9) {\n            return;\n        }\n        var $ = kendo.jQuery;\n        var outerWidth = kendo._outerWidth;\n        var DOT = '.';\n        var EMPTYCHAR = ' ';\n        var sheetsBarClassNames = {\n            sheetsBarWrapper: 'k-widget k-header',\n            sheetsBarSheetsWrapper: 'k-tabstrip k-floatwrap k-tabstrip-bottom',\n            sheetsBarActive: 'k-spreadsheet-sheets-bar-active',\n            sheetsBarInactive: 'k-spreadsheet-sheets-bar-inactive',\n            sheetsBarAdd: 'k-spreadsheet-sheets-bar-add',\n            sheetsBarRemove: 'k-spreadsheet-sheets-remove',\n            sheetsBarItems: 'k-spreadsheet-sheets-items',\n            sheetsBarEditor: 'k-spreadsheet-sheets-editor',\n            sheetsBarScrollable: 'k-tabstrip-scrollable',\n            sheetsBarNext: 'k-tabstrip-next',\n            sheetsBarPrev: 'k-tabstrip-prev',\n            sheetsBarKItem: 'k-item k-state-default',\n            sheetsBarKActive: 'k-state-active k-state-tab-on-top',\n            sheetsBarKTextbox: 'k-textbox',\n            sheetsBarKLink: 'k-link',\n            sheetsBarKIcon: 'k-icon',\n            sheetsBarKFontIcon: 'k-icon',\n            sheetsBarKButton: 'k-button k-button-icon',\n            sheetsBarKButtonBare: 'k-bare',\n            sheetsBarKArrowW: 'k-i-arrow-60-left',\n            sheetsBarKArrowE: 'k-i-arrow-60-right',\n            sheetsBarKReset: 'k-reset k-tabstrip-items',\n            sheetsBarKIconX: 'k-i-close',\n            sheetsBarKSprite: 'k-sprite',\n            sheetsBarKIconPlus: 'k-i-plus',\n            sheetsBarHintWrapper: 'k-widget k-tabstrip k-tabstrip-bottom k-spreadsheet-sheets-items-hint',\n            sheetsBarKResetItems: 'k-reset k-tabstrip-items'\n        };\n        var SheetsBar = kendo.ui.Widget.extend({\n            init: function (element, options) {\n                var classNames = SheetsBar.classNames;\n                kendo.ui.Widget.call(this, element, options);\n                element = this.element;\n                element.addClass(classNames.sheetsBarWrapper);\n                this._openDialog = options.openDialog;\n                this._tree = new kendo.dom.Tree(element[0]);\n                this._tree.render([\n                    this._addButton(),\n                    this._createSheetsWrapper([])\n                ]);\n                this._toggleScrollEvents(true);\n                this._createSortable();\n                this._sortable.bind('start', this._onSheetReorderStart.bind(this));\n                this._sortable.bind('end', this._onSheetReorderEnd.bind(this));\n                element.on('click', DOT + classNames.sheetsBarRemove, this._onSheetRemove.bind(this));\n                element.on('click', 'li', this._onSheetSelect.bind(this));\n                element.on('dblclick', 'li' + DOT + classNames.sheetsBarActive, this._createEditor.bind(this));\n                element.on('click', DOT + classNames.sheetsBarAdd, this._onAddSelect.bind(this));\n            },\n            options: {\n                name: 'SheetsBar',\n                scrollable: { distance: 200 }\n            },\n            events: [\n                'select',\n                'reorder',\n                'rename'\n            ],\n            _createEditor: function () {\n                if (this._editor) {\n                    return;\n                }\n                this._renderSheets(this._sheets, this._selectedIndex, true);\n                this._editor = this.element.find(kendo.format('input{0}{1}', DOT, SheetsBar.classNames.sheetsBarEditor)).focus().on('keydown', this._onEditorKeydown.bind(this)).on('blur', this._onEditorBlur.bind(this));\n            },\n            _destroyEditor: function (canceled) {\n                var newSheetName = canceled ? null : this._editor.val();\n                this._editor.off();\n                this._editor = null;\n                this._renderSheets(this._sheets, this._selectedIndex, false);\n                this._onSheetRename(newSheetName);\n            },\n            renderSheets: function (sheets, selectedIndex) {\n                if (!sheets || selectedIndex < 0) {\n                    return;\n                }\n                this._renderSheets(sheets, selectedIndex, false);\n            },\n            _renderSheets: function (sheets, selectedIndex, isInEditMode) {\n                var that = this;\n                var wrapperOffsetWidth;\n                var sheetsGroupScrollWidth;\n                var classNames = SheetsBar.classNames;\n                that._isRtl = kendo.support.isRtl(that.element);\n                that._sheets = sheets;\n                that._selectedIndex = selectedIndex;\n                that._renderHtml(isInEditMode, true);\n                if (!that._scrollableAllowed()) {\n                    return;\n                }\n                var sheetsWrapper = that._sheetsWrapper();\n                var scrollPrevButton = sheetsWrapper.children(DOT + classNames.sheetsBarPrev);\n                var scrollNextButton = sheetsWrapper.children(DOT + classNames.sheetsBarNext);\n                var gapWidth = 2;\n                var addButton = that.element.find(DOT + classNames.sheetsBarAdd);\n                var addButtonWidth = outerWidth(addButton) + addButton.position().left + gapWidth;\n                var scrollPrevButtonWidth = outerWidth(scrollPrevButton) + gapWidth;\n                var sheetsGroup = that._sheetsGroup();\n                scrollPrevButton.css({ left: addButtonWidth });\n                sheetsWrapper.addClass(classNames.sheetsBarScrollable + EMPTYCHAR + classNames.sheetsBarSheetsWrapper);\n                sheetsGroup.css({ marginLeft: addButtonWidth });\n                wrapperOffsetWidth = sheetsWrapper[0].offsetWidth;\n                sheetsGroupScrollWidth = sheetsGroup[0].scrollWidth;\n                if (sheetsGroupScrollWidth + addButtonWidth > wrapperOffsetWidth) {\n                    var scrollNextButtonRight = Math.ceil(kendo.parseFloat(scrollNextButton.css('right')));\n                    if (!that._scrollableModeActive) {\n                        that._nowScrollingSheets = false;\n                        that._scrollableModeActive = true;\n                    }\n                    sheetsGroup.css({\n                        marginLeft: scrollPrevButtonWidth + addButtonWidth,\n                        marginRight: outerWidth(scrollNextButton) + scrollNextButtonRight + gapWidth\n                    });\n                } else {\n                    if (that._scrollableModeActive && sheetsGroupScrollWidth <= wrapperOffsetWidth) {\n                        that._scrollableModeActive = false;\n                        sheetsGroup.css({\n                            marginLeft: addButtonWidth,\n                            marginRight: ''\n                        });\n                    } else {\n                        sheetsGroup.css({ marginLeft: addButtonWidth });\n                    }\n                }\n                that._toggleScrollButtons();\n            },\n            _toggleScrollButtons: function (toggle) {\n                var that = this;\n                var ul = that._sheetsGroup();\n                var wrapper = that._sheetsWrapper();\n                var scrollLeft = ul.scrollLeft();\n                var prev = wrapper.find(DOT + SheetsBar.classNames.sheetsBarPrev);\n                var next = wrapper.find(DOT + SheetsBar.classNames.sheetsBarNext);\n                if (toggle === false) {\n                    prev.toggle(false);\n                    next.toggle(false);\n                } else {\n                    prev.toggle(that._isRtl ? scrollLeft < ul[0].scrollWidth - ul[0].offsetWidth - 1 : scrollLeft !== 0);\n                    next.toggle(that._isRtl ? scrollLeft !== 0 : scrollLeft < ul[0].scrollWidth - ul[0].offsetWidth - 1);\n                }\n            },\n            _toggleScrollEvents: function (toggle) {\n                var that = this;\n                var classNames = SheetsBar.classNames;\n                var options = that.options;\n                var scrollPrevButton;\n                var scrollNextButton;\n                var sheetsWrapper = that._sheetsWrapper();\n                scrollPrevButton = sheetsWrapper.children(DOT + classNames.sheetsBarPrev);\n                scrollNextButton = sheetsWrapper.children(DOT + classNames.sheetsBarNext);\n                if (toggle) {\n                    scrollPrevButton.on('mousedown', function () {\n                        that._nowScrollingSheets = true;\n                        that._scrollSheetsByDelta(options.scrollable.distance * (that._isRtl ? 1 : -1));\n                    });\n                    scrollNextButton.on('mousedown', function () {\n                        that._nowScrollingSheets = true;\n                        that._scrollSheetsByDelta(options.scrollable.distance * (that._isRtl ? -1 : 1));\n                    });\n                    scrollPrevButton.add(scrollNextButton).on('mouseup', function () {\n                        that._nowScrollingSheets = false;\n                    });\n                } else {\n                    scrollPrevButton.off();\n                    scrollNextButton.off();\n                }\n            },\n            _renderHtml: function (isInEditMode, renderScrollButtons) {\n                var idx;\n                var sheetElements = [];\n                var dom = kendo.dom;\n                var element = dom.element;\n                var sheets = this._sheets;\n                var selectedIndex = this._selectedIndex;\n                var classNames = SheetsBar.classNames;\n                for (idx = 0; idx < sheets.length; idx++) {\n                    var sheet = sheets[idx];\n                    var isSelectedSheet = idx === selectedIndex;\n                    var attr = { className: classNames.sheetsBarKItem + EMPTYCHAR };\n                    var elementContent = [];\n                    if (isSelectedSheet) {\n                        attr.className += classNames.sheetsBarKActive + EMPTYCHAR + classNames.sheetsBarActive;\n                    } else {\n                        attr.className += classNames.sheetsBarInactive;\n                    }\n                    if (isSelectedSheet && isInEditMode) {\n                        elementContent.push(element('input', {\n                            type: 'text',\n                            value: sheet.name(),\n                            className: classNames.sheetsBarKTextbox + EMPTYCHAR + classNames.sheetsBarEditor,\n                            maxlength: 50\n                        }, []));\n                    } else {\n                        elementContent.push(element('span', {\n                            className: classNames.sheetsBarKLink,\n                            title: sheet.name()\n                        }, [dom.text(sheet.name())]));\n                        if (sheets.length > 1) {\n                            var deleteIcon = element('span', { className: classNames.sheetsBarKIcon + EMPTYCHAR + classNames.sheetsBarKFontIcon + EMPTYCHAR + classNames.sheetsBarKIconX }, []);\n                            elementContent.push(element('span', { className: classNames.sheetsBarKLink + EMPTYCHAR + classNames.sheetsBarRemove }, [deleteIcon]));\n                        }\n                    }\n                    sheetElements.push(element('li', attr, elementContent));\n                }\n                this._tree.render([\n                    this._addButton(),\n                    this._createSheetsWrapper(sheetElements, renderScrollButtons)\n                ]);\n            },\n            _createSheetsWrapper: function (sheetElements, renderScrollButtons) {\n                var element = kendo.dom.element;\n                var classNames = SheetsBar.classNames;\n                var childrenElements = [element('ul', { className: classNames.sheetsBarKReset }, sheetElements)];\n                renderScrollButtons = true;\n                if (renderScrollButtons) {\n                    var baseButtonClass = classNames.sheetsBarKButton + EMPTYCHAR + classNames.sheetsBarKButtonBare + EMPTYCHAR;\n                    childrenElements.push(element('span', { className: baseButtonClass + classNames.sheetsBarPrev }, [element('span', { className: classNames.sheetsBarKIcon + EMPTYCHAR + classNames.sheetsBarKArrowW }, [])]));\n                    childrenElements.push(element('span', { className: baseButtonClass + classNames.sheetsBarNext }, [element('span', { className: classNames.sheetsBarKIcon + EMPTYCHAR + classNames.sheetsBarKArrowE }, [])]));\n                }\n                return element('div', { className: classNames.sheetsBarItems }, childrenElements);\n            },\n            _createSortable: function () {\n                var classNames = SheetsBar.classNames;\n                this._sortable = new kendo.ui.Sortable(this.element, {\n                    filter: kendo.format('ul li.{0},ul li.{1}', classNames.sheetsBarActive, classNames.sheetsBarInactive),\n                    container: DOT + classNames.sheetsBarItems,\n                    axis: 'x',\n                    animation: false,\n                    ignore: 'input',\n                    end: function () {\n                        if (this.draggable.hint) {\n                            this.draggable.hint.remove();\n                        }\n                    },\n                    hint: function (element) {\n                        var hint = $(element).clone();\n                        return hint.wrap('<div class=\\'' + classNames.sheetsBarHintWrapper + '\\'><ul class=\\'' + classNames.sheetsBarKResetItems + '\\'></ul></div>').closest('div');\n                    }\n                });\n            },\n            _onEditorKeydown: function (e) {\n                if (this._editor) {\n                    if (e.which === 13) {\n                        this._destroyEditor();\n                    }\n                    if (e.which === 27) {\n                        this._destroyEditor(true);\n                    }\n                }\n            },\n            _onEditorBlur: function () {\n                if (this._editor) {\n                    this._destroyEditor();\n                }\n            },\n            _onSheetReorderEnd: function (e) {\n                e.preventDefault();\n                this.trigger('reorder', {\n                    oldIndex: e.oldIndex,\n                    newIndex: e.newIndex\n                });\n            },\n            _onSheetReorderStart: function (e) {\n                if (this._editor) {\n                    e.preventDefault();\n                }\n            },\n            _onSheetRemove: function (e) {\n                var removedSheetName = $(e.target).closest('li').text();\n                if (this._editor) {\n                    this._destroyEditor();\n                }\n                var closeCallback = function (e) {\n                    var dlg = e.sender;\n                    if (dlg.isConfirmed()) {\n                        this.trigger('remove', {\n                            name: removedSheetName,\n                            confirmation: true\n                        });\n                    }\n                }.bind(this);\n                this._openDialog('confirmation', { close: closeCallback });\n            },\n            _onSheetSelect: function (e) {\n                var selectedSheetText = $(e.target).text();\n                if ($(e.target).is(DOT + SheetsBar.classNames.sheetsBarEditor) || !selectedSheetText) {\n                    e.preventDefault();\n                    return;\n                }\n                if (this._editor) {\n                    this._destroyEditor();\n                }\n                this._scrollSheetsToItem($(e.target).closest('li'));\n                this.trigger('select', {\n                    name: selectedSheetText,\n                    isAddButton: false\n                });\n            },\n            _onSheetRename: function (newSheetName) {\n                if (this._sheets[this._selectedIndex].name() === newSheetName || newSheetName === null) {\n                    return;\n                }\n                this.trigger('rename', {\n                    name: newSheetName,\n                    sheetIndex: this._selectedIndex\n                });\n            },\n            _onAddSelect: function () {\n                this.trigger('select', { isAddButton: true });\n            },\n            _addButton: function () {\n                var element = kendo.dom.element;\n                var classNames = SheetsBar.classNames;\n                return element('a', { className: classNames.sheetsBarAdd + EMPTYCHAR + classNames.sheetsBarKButton }, [element('span', { className: classNames.sheetsBarKIcon + EMPTYCHAR + classNames.sheetsBarKFontIcon + EMPTYCHAR + classNames.sheetsBarKIconPlus }, [])]);\n            },\n            destroy: function () {\n                this._sortable.destroy();\n            },\n            _scrollableAllowed: function () {\n                var options = this.options;\n                return options.scrollable && !isNaN(options.scrollable.distance);\n            },\n            _scrollSheetsToItem: function (item) {\n                var that = this;\n                if (!that._scrollableModeActive) {\n                    return;\n                }\n                var sheetsGroup = that._sheetsGroup();\n                var currentScrollOffset = sheetsGroup.scrollLeft();\n                var itemWidth = outerWidth(item);\n                var itemOffset = that._isRtl ? item.position().left : item.position().left - sheetsGroup.children().first().position().left;\n                var sheetsGroupWidth = sheetsGroup[0].offsetWidth;\n                var sheetsGroupPadding = Math.ceil(parseFloat(sheetsGroup.css('padding-left')));\n                var itemPosition;\n                if (that._isRtl) {\n                    if (itemOffset < 0) {\n                        itemPosition = currentScrollOffset + itemOffset - (sheetsGroupWidth - currentScrollOffset) - sheetsGroupPadding;\n                    } else if (itemOffset + itemWidth > sheetsGroupWidth) {\n                        itemPosition = currentScrollOffset + itemOffset - itemWidth + sheetsGroupPadding * 2;\n                    }\n                } else {\n                    if (currentScrollOffset + sheetsGroupWidth < itemOffset + itemWidth) {\n                        itemPosition = itemOffset + itemWidth - sheetsGroupWidth + sheetsGroupPadding * 2;\n                    } else if (currentScrollOffset > itemOffset) {\n                        itemPosition = itemOffset - sheetsGroupPadding;\n                    }\n                }\n                sheetsGroup.finish().animate({ 'scrollLeft': itemPosition }, 'fast', 'linear', function () {\n                    that._toggleScrollButtons();\n                });\n            },\n            _sheetsGroup: function () {\n                return this._sheetsWrapper().children('ul');\n            },\n            _sheetsWrapper: function () {\n                return this.element.find(DOT + SheetsBar.classNames.sheetsBarItems);\n            },\n            _scrollSheetsByDelta: function (delta) {\n                var that = this;\n                var sheetsGroup = that._sheetsGroup();\n                var scrLeft = sheetsGroup.scrollLeft();\n                sheetsGroup.finish().animate({ 'scrollLeft': scrLeft + delta }, 'fast', 'linear', function () {\n                    if (that._nowScrollingSheets) {\n                        that._scrollSheetsByDelta(delta);\n                    } else {\n                        that._toggleScrollButtons();\n                    }\n                });\n            }\n        });\n        kendo.spreadsheet.SheetsBar = SheetsBar;\n        $.extend(true, SheetsBar, { classNames: sheetsBarClassNames });\n    }(window.kendo));\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('spreadsheet/calc', ['spreadsheet/runtime'], f);\n}(function () {\n    'use strict';\n    if (kendo.support.browser.msie && kendo.support.browser.version < 9) {\n        return;\n    }\n    var util = kendo.util;\n    var spreadsheet = kendo.spreadsheet;\n    var Ref = spreadsheet.Ref;\n    var RangeRef = spreadsheet.RangeRef;\n    var CellRef = spreadsheet.CellRef;\n    var NameRef = spreadsheet.NameRef;\n    var exports = spreadsheet.calc;\n    var runtime = exports.runtime;\n    var OPERATORS = Object.create(null);\n    var ParseError = kendo.Class.extend({\n        init: function ParseError(message, pos) {\n            this.message = message;\n            this.pos = pos;\n        },\n        toString: function () {\n            return this.message;\n        }\n    });\n    (function (ops) {\n        ops.forEach(function (cls, i) {\n            cls.forEach(function (op) {\n                OPERATORS[op] = ops.length - i;\n            });\n        });\n    }([\n        [':'],\n        [' '],\n        [','],\n        ['%'],\n        ['^'],\n        [\n            '*',\n            '/'\n        ],\n        [\n            '+',\n            '-'\n        ],\n        ['&'],\n        [\n            '=',\n            '<',\n            '>',\n            '<=',\n            '>=',\n            '<>'\n        ]\n    ]));\n    var TRUE = {\n        type: 'bool',\n        value: true\n    };\n    var FALSE = {\n        type: 'bool',\n        value: false\n    };\n    function getcol(str) {\n        str = str.toUpperCase();\n        for (var col = 0, i = 0; i < str.length; ++i) {\n            col = col * 26 + str.charCodeAt(i) - 64;\n        }\n        return col - 1;\n    }\n    function getrow(str) {\n        return parseInt(str, 10) - 1;\n    }\n    function parseReference(name, noThrow) {\n        if (name.toLowerCase() == '#sheet') {\n            return spreadsheet.SHEETREF;\n        }\n        OUT: {\n            var m;\n            if (m = /^(\\$)?([a-z]+)(\\$)?(\\d+)$/i.exec(name)) {\n                var row = getrow(m[4]), col = getcol(m[2]);\n                if (row < 1048576 && col < 16384) {\n                    return new CellRef(getrow(m[4]), getcol(m[2]));\n                }\n                break OUT;\n            }\n            var stream = TokenStream(name, {});\n            var a = [];\n            while (true) {\n                var ref = stream.next();\n                if (ref instanceof CellRef) {\n                    ref.rel = 0;\n                } else if (ref instanceof RangeRef) {\n                    ref.topLeft.rel = 0;\n                    ref.bottomRight.rel = 0;\n                } else {\n                    break OUT;\n                }\n                a.push(ref);\n                if (stream.eof()) {\n                    break;\n                }\n                if (!stream.is('op', ',')) {\n                    break OUT;\n                }\n                stream.next();\n            }\n            return a.length == 1 ? a[0] : new spreadsheet.UnionRef(a);\n        }\n        if (!noThrow) {\n            throw new Error('Cannot parse reference: ' + name);\n        }\n    }\n    function parseFormula(sheet, row, col, input) {\n        var refs = [];\n        input = TokenStream(input, {\n            row: row,\n            col: col\n        });\n        var is = input.is;\n        return {\n            type: 'exp',\n            ast: parseExpression(true),\n            refs: refs,\n            sheet: sheet,\n            row: row,\n            col: col\n        };\n        function addReference(ref) {\n            ref.index = refs.length;\n            refs.push(ref);\n            return ref;\n        }\n        function skip(type, value, allowEOF) {\n            if (is(type, value)) {\n                return input.next();\n            } else {\n                var tok = input.peek();\n                if (tok) {\n                    input.croak('Expected ' + type + ' \\xAB' + value + '\\xBB but found ' + tok.type + ' \\xAB' + tok.value + '\\xBB');\n                } else if (!allowEOF) {\n                    input.croak('Expected ' + type + ' \\xAB' + value + '\\xBB');\n                }\n            }\n        }\n        function parseExpression(commas) {\n            return maybeBinary(maybeIntersect(parseAtom(commas)), 0, commas);\n        }\n        function parseSymbol(tok) {\n            if (tok.upper == 'TRUE' || tok.upper == 'FALSE') {\n                return tok.upper == 'TRUE' ? TRUE : FALSE;\n            }\n            return addReference(new NameRef(tok.value));\n        }\n        function parseFuncall() {\n            var fname = input.next();\n            fname = fname.value;\n            skip('punc', '(');\n            var args = [];\n            while (1) {\n                if (is('punc', ')')) {\n                    break;\n                }\n                if (is('op', ',')) {\n                    args.push({ type: 'null' });\n                    input.next();\n                    continue;\n                }\n                args.push(parseExpression(false));\n                if (input.eof() || is('punc', ')')) {\n                    break;\n                }\n                skip('op', ',');\n            }\n            skip('punc', ')', true);\n            return {\n                type: 'func',\n                func: fname,\n                args: args\n            };\n        }\n        function fixReference(ref) {\n            if (!ref.hasSheet()) {\n                ref.setSheet(sheet);\n            }\n            return addReference(ref);\n        }\n        function parseAtom(commas) {\n            var exp;\n            if (is('ref')) {\n                exp = fixReference(input.next());\n            } else if (is('func')) {\n                exp = parseFuncall();\n            } else if (is('punc', '(')) {\n                input.next();\n                exp = parseExpression(true);\n                skip('punc', ')', true);\n            } else if (is('punc', '{')) {\n                input.next();\n                exp = parseArray();\n                skip('punc', '}', true);\n            } else if (is('num') || is('str') || is('error')) {\n                exp = input.next();\n            } else if (is('sym')) {\n                exp = parseSymbol(input.next());\n            } else if (is('op', '+') || is('op', '-')) {\n                exp = {\n                    type: 'prefix',\n                    op: input.next().value,\n                    exp: parseAtom(commas)\n                };\n            } else if (!input.peek()) {\n                input.croak('Incomplete expression');\n            } else if (is('punc', '[')) {\n                input.croak('External reference not supported');\n            } else {\n                input.croak('Parse error');\n            }\n            return maybePercent(exp);\n        }\n        function parseArray() {\n            var row = [], value = [row], first = true;\n            while (!input.eof() && !is('punc', '}')) {\n                if (first) {\n                    first = false;\n                } else if (is('punc', ';')) {\n                    value.push(row = []);\n                    input.next();\n                } else {\n                    skip('op', ',');\n                }\n                row.push(parseExpression(false));\n            }\n            return {\n                type: 'matrix',\n                value: value\n            };\n        }\n        function maybeIntersect(exp) {\n            if (is('punc', '(') || is('ref') || is('num') || is('func')) {\n                return {\n                    type: 'binary',\n                    op: ' ',\n                    left: exp,\n                    right: parseExpression(false)\n                };\n            } else {\n                return exp;\n            }\n        }\n        function maybePercent(exp) {\n            if (is('op', '%')) {\n                input.next();\n                return maybePercent({\n                    type: 'postfix',\n                    op: '%',\n                    exp: exp\n                });\n            } else {\n                return exp;\n            }\n        }\n        function maybeBinary(left, my_prec, commas) {\n            var tok = is('op');\n            if (tok && (commas || tok.value != ',')) {\n                var his_prec = OPERATORS[tok.value];\n                if (his_prec > my_prec) {\n                    input.next();\n                    var right = maybeBinary(parseAtom(commas), his_prec, commas);\n                    return maybeBinary({\n                        type: 'binary',\n                        op: tok.value,\n                        left: left,\n                        right: right\n                    }, my_prec, commas);\n                }\n            }\n            return left;\n        }\n    }\n    function parseNameDefinition(name, def) {\n        var nameRef = parseFormula(null, 0, 0, name);\n        if (!(nameRef.ast instanceof NameRef)) {\n            throw new ParseError('Invalid name: ' + name);\n        }\n        nameRef = nameRef.ast;\n        if (!(def instanceof Ref)) {\n            var defAST = parseFormula(nameRef.sheet, 0, 0, def);\n            if (defAST.ast instanceof Ref) {\n                def = defAST.ast;\n            } else if (/^(?:str|num|bool|error)$/.test(defAST.ast.type)) {\n                def = defAST.ast.value;\n            } else {\n                def = makeFormula(defAST);\n            }\n        }\n        return {\n            name: nameRef,\n            value: def\n        };\n    }\n    function makePrinter(exp) {\n        return makeClosure('function(row, col, mod){return(' + print(exp.ast, exp, 0) + ')}');\n        function print(node, parent, prec) {\n            switch (node.type) {\n            case 'num':\n            case 'bool':\n                return JSON.stringify(node.value);\n            case 'error':\n                return JSON.stringify('#' + node.value);\n            case 'str':\n                return JSON.stringify(JSON.stringify(node.value));\n            case 'ref':\n                return 'this.refs[' + node.index + '].print(row, col, mod)';\n            case 'prefix':\n                return withParens(function () {\n                    return JSON.stringify(node.op) + ' + ' + print(node.exp, node, OPERATORS[node.op]);\n                });\n            case 'postfix':\n                return withParens(function () {\n                    return print(node.exp, node, OPERATORS[node.op]) + ' + ' + JSON.stringify(node.op);\n                });\n            case 'binary':\n                return withParens(function () {\n                    var left = parenthesize(print(node.left, node, OPERATORS[node.op]), node.left instanceof NameRef && node.op == ':');\n                    var right = parenthesize(print(node.right, node, OPERATORS[node.op]), node.right instanceof NameRef && node.op == ':');\n                    return left + ' + ' + JSON.stringify(node.op) + ' + ' + right;\n                });\n            case 'func':\n                return JSON.stringify(node.func + '(') + ' + ' + (node.args.length > 0 ? node.args.map(function (arg) {\n                    return print(arg, node, 0);\n                }).join(' + \\', \\' + ') : '\\'\\'') + ' + \\')\\'';\n            case 'matrix':\n                return '\\'{ \\' + ' + node.value.map(function (el) {\n                    return el.map(function (el) {\n                        return print(el, node, 0);\n                    }).join(' + \\', \\' + ');\n                }).join(' + \\'; \\' + ') + '+ \\' }\\'';\n            case 'null':\n                return '\\'\\'';\n            }\n            throw new Error('Cannot make printer for node ' + node.type);\n            function withParens(f) {\n                var op = node.op;\n                var needParens = OPERATORS[op] < prec || !prec && op == ',' || parent.type == 'prefix' && prec == OPERATORS[op] && parent.op == '-' || parent.type == 'binary' && prec == OPERATORS[op] && node === parent.right;\n                return parenthesize(f(), needParens);\n            }\n        }\n        function parenthesize(code, cond) {\n            return cond ? '\\'(\\' + ' + code + ' + \\')\\'' : code;\n        }\n    }\n    function toCPS(ast, k) {\n        var GENSYM = 0;\n        return cps(ast, k);\n        function cps(node, k) {\n            switch (node.type) {\n            case 'ref':\n                return cpsRef(node, k);\n            case 'num':\n            case 'str':\n            case 'null':\n            case 'error':\n            case 'bool':\n                return cpsAtom(node, k);\n            case 'prefix':\n            case 'postfix':\n                return cpsUnary(node, k);\n            case 'binary':\n                return cpsBinary(node, k);\n            case 'func':\n                return cpsFunc(node, k);\n            case 'lambda':\n                return cpsLambda(node, k);\n            case 'matrix':\n                return cpsMatrix(node.value, k, true);\n            }\n            throw new Error('Cannot CPS ' + node.type);\n        }\n        function cpsRef(node, k) {\n            return node.ref == 'name' ? cpsNameRef(node, k) : cpsAtom(node, k);\n        }\n        function cpsAtom(node, k) {\n            return k(node);\n        }\n        function cpsNameRef(node, k) {\n            return {\n                type: 'func',\n                func: ',getname',\n                args: [\n                    makeContinuation(k),\n                    node\n                ]\n            };\n        }\n        function cpsUnary(node, k) {\n            return cps({\n                type: 'func',\n                func: 'unary' + node.op,\n                args: [node.exp]\n            }, k);\n        }\n        function cpsBinary(node, k) {\n            return cps({\n                type: 'func',\n                func: 'binary' + node.op,\n                args: [\n                    node.left,\n                    node.right\n                ]\n            }, k);\n        }\n        function cpsIf(co, th, el, k) {\n            return cps(co, function (co) {\n                var rest = makeContinuation(k);\n                var thenK = gensym('T');\n                var elseK = gensym('E');\n                return {\n                    type: 'func',\n                    func: 'if',\n                    args: [\n                        rest,\n                        co,\n                        {\n                            type: 'lambda',\n                            vars: [thenK],\n                            body: cps(th || TRUE, function (th) {\n                                return {\n                                    type: 'call',\n                                    func: {\n                                        type: 'var',\n                                        name: thenK\n                                    },\n                                    args: [th]\n                                };\n                            })\n                        },\n                        {\n                            type: 'lambda',\n                            vars: [elseK],\n                            body: cps(el || FALSE, function (el) {\n                                return {\n                                    type: 'call',\n                                    func: {\n                                        type: 'var',\n                                        name: elseK\n                                    },\n                                    args: [el]\n                                };\n                            })\n                        }\n                    ]\n                };\n            });\n        }\n        function cpsAnd(args, k) {\n            if (args.length === 0) {\n                return cpsAtom(TRUE, k);\n            }\n            return cps({\n                type: 'func',\n                func: 'IF',\n                args: [\n                    args[0],\n                    {\n                        type: 'func',\n                        func: 'AND',\n                        args: args.slice(1)\n                    },\n                    FALSE\n                ]\n            }, k);\n        }\n        function cpsOr(args, k) {\n            if (args.length === 0) {\n                return cpsAtom(FALSE, k);\n            }\n            return cps({\n                type: 'func',\n                func: 'IF',\n                args: [\n                    args[0],\n                    TRUE,\n                    {\n                        type: 'func',\n                        func: 'OR',\n                        args: args.slice(1)\n                    }\n                ]\n            }, k);\n        }\n        function cpsFunc(node, k) {\n            switch (node.func.toLowerCase()) {\n            case 'if':\n                return cpsIf(node.args[0], node.args[1], node.args[2], k);\n            case 'and':\n                return cpsAnd(node.args, k);\n            case 'or':\n                return cpsOr(node.args, k);\n            case 'true':\n                return k(TRUE);\n            case 'false':\n                return k(FALSE);\n            }\n            return function loop(args, i) {\n                if (i == node.args.length) {\n                    return {\n                        type: 'func',\n                        func: node.func,\n                        args: args\n                    };\n                } else {\n                    return cps(node.args[i], function (value) {\n                        return loop(args.concat([value]), i + 1);\n                    });\n                }\n            }([makeContinuation(k)], 0);\n        }\n        function cpsLambda(node, k) {\n            var cont = gensym('K');\n            var body = cps(node.body, function (body) {\n                return {\n                    type: 'call',\n                    func: {\n                        type: 'var',\n                        value: cont\n                    },\n                    args: [body]\n                };\n            });\n            return k({\n                type: 'lambda',\n                vars: [cont].concat(node.vars),\n                body: body\n            });\n        }\n        function cpsMatrix(elements, k, isMatrix) {\n            var a = [];\n            return function loop(i) {\n                if (i == elements.length) {\n                    return k({\n                        type: 'matrix',\n                        value: a\n                    });\n                } else {\n                    return (isMatrix ? cpsMatrix : cps)(elements[i], function (val) {\n                        a[i] = val;\n                        return loop(i + 1);\n                    });\n                }\n            }(0);\n        }\n        function makeContinuation(k) {\n            var cont = gensym('R');\n            return {\n                type: 'lambda',\n                vars: [cont],\n                body: k({\n                    type: 'var',\n                    name: cont\n                })\n            };\n        }\n        function gensym(name) {\n            if (!name) {\n                name = '';\n            }\n            name = '_' + name;\n            return name + ++GENSYM;\n        }\n    }\n    var makeClosure = function (cache) {\n        return function (code) {\n            var f = cache[code];\n            if (!f) {\n                f = cache[code] = new Function('\\'use strict\\';return(' + code + ')')();\n            }\n            return f;\n        };\n    }(Object.create(null));\n    var FORMULA_CACHE = Object.create(null);\n    function makeFormula(exp) {\n        var printer = makePrinter(exp);\n        var hash = printer.call(exp);\n        var formula = FORMULA_CACHE[hash];\n        if (formula) {\n            return formula.clone(exp.sheet, exp.row, exp.col);\n        }\n        var code = js(toCPS(exp.ast, function (ret) {\n            return {\n                type: 'return',\n                value: ret\n            };\n        }));\n        code = [\n            'function(){',\n            'var context = this, refs = context.formula.absrefs',\n            code,\n            '}'\n        ].join(';\\n');\n        formula = new runtime.Formula(exp.refs, makeClosure(code), printer, exp.sheet, exp.row, exp.col);\n        FORMULA_CACHE[hash] = formula.clone(exp.sheet, exp.row, exp.col);\n        return formula;\n        function js(node) {\n            var type = node.type;\n            if (type == 'num') {\n                return node.value + '';\n            } else if (type == 'str') {\n                return JSON.stringify(node.value);\n            } else if (type == 'error') {\n                return 'context.error(' + JSON.stringify(node.value) + ')';\n            } else if (type == 'return') {\n                return 'context.resolve(' + js(node.value) + ')';\n            } else if (type == 'func') {\n                return 'context.func(' + JSON.stringify(node.func) + ', ' + js(node.args[0]) + ', ' + jsArray(node.args.slice(1)) + ')';\n            } else if (type == 'call') {\n                return js(node.func) + '(' + node.args.map(js).join(', ') + ')';\n            } else if (type == 'ref') {\n                return 'refs[' + node.index + ']';\n            } else if (type == 'bool') {\n                return '' + node.value;\n            } else if (type == 'if') {\n                return '(context.bool(' + js(node.co) + ') ? ' + js(node.th) + ' : ' + js(node.el) + ')';\n            } else if (type == 'lambda') {\n                return '(function(' + node.vars.join(', ') + '){ return(' + js(node.body) + ') })';\n            } else if (type == 'var') {\n                return node.name;\n            } else if (type == 'matrix') {\n                return jsArray(node.value);\n            } else if (type == 'null') {\n                return 'null';\n            } else {\n                throw new Error('Cannot compile expression ' + type);\n            }\n        }\n        function jsArray(a) {\n            return '[ ' + a.map(js).join(', ') + ' ]';\n        }\n    }\n    function identity(x) {\n        return x;\n    }\n    function TokenStream(input, options) {\n        input = RawTokenStream(InputStream(input), options);\n        var ahead = input.ahead;\n        var skip = input.skip;\n        var token = null;\n        var fixCell = options.row != null && options.col != null ? function (cell) {\n            if (cell.rel & 1) {\n                cell.col -= options.col;\n            }\n            if (cell.rel & 2) {\n                cell.row -= options.row;\n            }\n            return cell;\n        } : identity;\n        var addPos = options.forEditor ? function (thing, startToken, endToken) {\n            thing.begin = startToken.begin;\n            thing.end = endToken.end;\n            return thing;\n        } : identity;\n        return {\n            peek: peek,\n            next: next,\n            croak: input.croak,\n            eof: input.eof,\n            is: is\n        };\n        function is(type, value) {\n            var tok = peek();\n            return tok != null && (type == null || tok.type === type) && (value == null || tok.value === value) ? tok : null;\n        }\n        function peek() {\n            if (token == null) {\n                token = readNext();\n            }\n            return token;\n        }\n        function next() {\n            if (token != null) {\n                var tmp = token;\n                token = null;\n                return tmp;\n            }\n            return readNext();\n        }\n        function readNext() {\n            var ret;\n            var t = input.peek();\n            if (t) {\n                if (t.type == 'sym' || t.type == 'rc' || t.type == 'num') {\n                    ret = ahead(8, refRange3D) || ahead(6, refCell3D) || ahead(6, refSheetRange) || ahead(4, refSheetCell) || ahead(4, refRange) || ahead(2, refCell) || ahead(2, funcall);\n                }\n                if (!ret) {\n                    ret = input.next();\n                }\n            }\n            return ret;\n        }\n        function toCell(tok, isFirst) {\n            if (tok.type == 'rc') {\n                if (tok.rel && !options.forEditor && (options.row == null || options.col == null)) {\n                    input.croak('Cannot read relative cell in RC notation');\n                }\n                return new CellRef(tok.row, tok.col, tok.rel);\n            }\n            if (tok.type == 'num') {\n                if (tok.value <= 1048577) {\n                    return fixCell(new CellRef(getrow(tok.value), isFirst ? -Infinity : +Infinity, 2));\n                } else {\n                    return null;\n                }\n            }\n            var name = tok.value;\n            var m = /^(\\$)?([a-z]+)(\\$)?(\\d+)$/i.exec(name);\n            if (m) {\n                var row = getrow(m[4]), col = getcol(m[2]);\n                if (row <= 1048576 && col <= 16383) {\n                    return fixCell(new CellRef(getrow(m[4]), getcol(m[2]), (m[1] ? 0 : 1) | (m[3] ? 0 : 2)));\n                } else {\n                    return null;\n                }\n            }\n            var abs = name.charAt(0) == '$';\n            if (abs) {\n                name = name.substr(1);\n            }\n            if (/^\\d+$/.test(name)) {\n                var row = getrow(name);\n                if (row <= 1048576) {\n                    return fixCell(new CellRef(getrow(name), isFirst ? -Infinity : +Infinity, abs ? 0 : 2));\n                }\n            } else {\n                var col = getcol(name);\n                if (col <= 16383) {\n                    return fixCell(new CellRef(isFirst ? -Infinity : +Infinity, getcol(name), abs ? 0 : 1));\n                }\n            }\n        }\n        function refRange3D(a, b, c, d, e, f, g, h) {\n            if (a.type == 'sym' && b.type == 'op' && b.value == ':' && c.type == 'sym' && d.type == 'punc' && d.value == '!' && (e.type == 'sym' || e.type == 'rc' || e.type == 'num' && e.value == e.value | 0) && f.type == 'op' && f.value == ':' && (g.type == 'sym' || g.type == 'rc' || g.type == 'num' && g.value == g.value | 0) && g.type == e.type && !(h.type == 'punc' && h.value == '(' && !g.space)) {\n                var tl = toCell(e, true), br = toCell(g, false);\n                if (tl && br) {\n                    skip(7);\n                    return addPos(new RangeRef(tl.setSheet(a.value, true), br.setSheet(c.value, true)).setSheet(a.value, true), a, g);\n                }\n            }\n        }\n        function refCell3D(a, b, c, d, e, f) {\n            if (a.type == 'sym' && b.type == 'op' && b.value == ':' && c.type == 'sym' && d.type == 'punc' && d.value == '!' && (e.type == 'sym' || e.type == 'rc' || e.type == 'num' && e.value == e.value | 0) && !(f.type == 'punc' && f.value == '(' && !e.space)) {\n                var tl = toCell(e);\n                if (tl) {\n                    skip(5);\n                    var br = tl.clone();\n                    return addPos(new RangeRef(tl.setSheet(a.value, true), br.setSheet(c.value, true)).setSheet(a.value, true), a, e);\n                }\n            }\n        }\n        function refSheetRange(a, b, c, d, e, f) {\n            if (a.type == 'sym' && b.type == 'punc' && b.value == '!' && (c.type == 'sym' || c.type == 'rc' || c.type == 'num' && c.value == c.value | 0) && d.type == 'op' && d.value == ':' && (e.type == 'sym' || e.type == 'rc' || e.type == 'num' && e.value == e.value | 0) && !(f.type == 'punc' && f.value == '(' && !e.space)) {\n                var tl = toCell(c, true), br = toCell(e, false);\n                if (tl && br) {\n                    skip(5);\n                    return addPos(new RangeRef(tl, br).setSheet(a.value, true), a, e);\n                }\n            }\n        }\n        function refSheetCell(a, b, c, d) {\n            if (a.type == 'sym' && b.type == 'punc' && b.value == '!' && (c.type == 'sym' || c.type == 'rc' || c.type == 'num' && c.value == c.value | 0) && !(d.type == 'punc' && d.value == '(' && !c.space)) {\n                skip(3);\n                var x = toCell(c);\n                if (!x || !isFinite(x.row)) {\n                    x = new NameRef(c.value);\n                }\n                return addPos(x.setSheet(a.value, true), a, c);\n            }\n        }\n        function refRange(a, b, c, d) {\n            if ((a.type == 'sym' || a.type == 'rc' || a.type == 'num' && a.value == a.value | 0) && (b.type == 'op' && b.value == ':') && (c.type == 'sym' || c.type == 'rc' || c.type == 'num' && c.value == c.value | 0) && !(d.type == 'punc' && d.value == '(' && !c.space)) {\n                var tl = toCell(a, true), br = toCell(c, false);\n                if (tl && br) {\n                    skip(3);\n                    return addPos(new RangeRef(tl, br), a, c);\n                }\n            }\n        }\n        function refCell(a, b) {\n            if ((a.type == 'sym' || a.type == 'rc') && !(b.type == 'punc' && b.value == '(' && !a.space)) {\n                var x = toCell(a);\n                if (x && isFinite(x.row) && isFinite(x.col)) {\n                    skip(1);\n                    return addPos(x, a, a);\n                }\n            }\n        }\n        function funcall(a, b) {\n            if (a.type == 'sym' && b.type == 'punc' && b.value == '(' && !a.space) {\n                a.type = 'func';\n                skip(1);\n                return a;\n            }\n        }\n    }\n    function isWhitespace(ch) {\n        return ' \\t\\n\\xA0\\u200B'.indexOf(ch) >= 0;\n    }\n    function RawTokenStream(input, options) {\n        var tokens = [], index = 0;\n        var readWhile = input.readWhile;\n        return {\n            next: next,\n            peek: peek,\n            eof: eof,\n            croak: input.croak,\n            ahead: ahead,\n            skip: skip\n        };\n        function isDigit(ch) {\n            return /[0-9]/i.test(ch);\n        }\n        function isIdStart(ch) {\n            return /[a-z$_]/i.test(ch) || util.isUnicodeLetter(ch);\n        }\n        function isId(ch) {\n            return isIdStart(ch) || isDigit(ch) || ch == '.';\n        }\n        function isOpChar(ch) {\n            return ch in OPERATORS;\n        }\n        function isPunc(ch) {\n            return '!;(){}[]'.indexOf(ch) >= 0;\n        }\n        function readNumber() {\n            var has_dot = false;\n            var number = readWhile(function (ch) {\n                if (ch == '.') {\n                    if (has_dot) {\n                        return false;\n                    }\n                    has_dot = true;\n                    return true;\n                }\n                return isDigit(ch);\n            });\n            return {\n                type: 'num',\n                value: parseFloat(number)\n            };\n        }\n        function symbol(id, quote) {\n            return {\n                type: 'sym',\n                value: id,\n                upper: id.toUpperCase(),\n                space: isWhitespace(input.peek()),\n                quote: quote\n            };\n        }\n        function getRC(a, b, c) {\n            if (!a && !b && !c) {\n                return null;\n            }\n            if (!a && !c || a && c) {\n                var num = b ? parseInt(b, 10) : 0;\n                return a ? num : num - 1;\n            }\n        }\n        function readSymbol() {\n            var m = input.lookingAt(/^R(\\[)?(-?[0-9]+)?(\\])?C(\\[)?(-?[0-9]+)?(\\])?/i);\n            if (m) {\n                var row = getRC(m[1], m[2], m[3]);\n                var col = getRC(m[4], m[5], m[6]);\n                if (row != null && col != null) {\n                    input.skip(m);\n                    return {\n                        type: 'rc',\n                        row: row,\n                        col: col,\n                        rel: (m[4] || !(m[4] || m[5] || m[6]) ? 1 : 0) | (m[1] || !(m[1] || m[2] || m[3]) ? 2 : 0)\n                    };\n                }\n            }\n            return symbol(readWhile(isId));\n        }\n        function readString() {\n            input.next();\n            return {\n                type: 'str',\n                value: input.readEscaped('\"')\n            };\n        }\n        function readSheetName() {\n            input.next();\n            return symbol(input.readEscaped('\\''), true);\n        }\n        function readOperator() {\n            return {\n                type: 'op',\n                value: readWhile(function (ch, op) {\n                    return op + ch in OPERATORS;\n                })\n            };\n        }\n        function readPunc() {\n            return {\n                type: 'punc',\n                value: input.next()\n            };\n        }\n        function readNext() {\n            if (input.eof()) {\n                return null;\n            }\n            var ch = input.peek(), m;\n            if (ch == '\"') {\n                return readString();\n            }\n            if (ch == '\\'') {\n                return readSheetName();\n            }\n            if (isDigit(ch) || ch == '.') {\n                return readNumber();\n            }\n            if (isIdStart(ch)) {\n                return readSymbol();\n            }\n            if (isOpChar(ch)) {\n                return readOperator();\n            }\n            if (isPunc(ch)) {\n                return readPunc();\n            }\n            if (m = input.lookingAt(/^#([a-z\\/]+)[?!]?/i)) {\n                input.skip(m);\n                return {\n                    type: 'error',\n                    value: m[1]\n                };\n            }\n            if (!options.forEditor) {\n                input.croak('Can\\'t handle character: ' + ch);\n            }\n            return {\n                type: 'error',\n                value: input.next()\n            };\n        }\n        function peek() {\n            while (tokens.length <= index) {\n                readWhile(isWhitespace);\n                var begin = input.pos();\n                var tok = readNext();\n                if (options.forEditor && tok) {\n                    tok.begin = begin;\n                    tok.end = input.pos();\n                }\n                tokens.push(tok);\n            }\n            return tokens[index];\n        }\n        function next() {\n            var tok = peek();\n            if (tok) {\n                index++;\n            }\n            return tok;\n        }\n        function ahead(n, f) {\n            var pos = index, a = [];\n            while (n-- > 0) {\n                a.push(next() || EOF);\n            }\n            index = pos;\n            return f.apply(a, a);\n        }\n        function skip(n) {\n            index += n;\n        }\n        function eof() {\n            return peek() == null;\n        }\n    }\n    var EOF = { type: 'eof' };\n    function InputStream(input) {\n        var pos = 0, line = 1, col = 0;\n        return {\n            next: next,\n            peek: peek,\n            eof: eof,\n            croak: croak,\n            readWhile: readWhile,\n            readEscaped: readEscaped,\n            lookingAt: lookingAt,\n            skip: skip,\n            forward: forward,\n            pos: location\n        };\n        function location() {\n            return pos;\n        }\n        function next() {\n            var ch = input.charAt(pos++);\n            if (ch == '\\n') {\n                line++;\n                col = 0;\n            } else {\n                col++;\n            }\n            return ch;\n        }\n        function peek() {\n            return input.charAt(pos);\n        }\n        function eof() {\n            return peek() === '';\n        }\n        function croak(msg) {\n            throw new ParseError(msg + ' (input: ' + input + ')', pos);\n        }\n        function skip(ch) {\n            if (typeof ch == 'string') {\n                if (input.substr(pos, ch.length) != ch) {\n                    croak('Expected ' + ch);\n                }\n                forward(ch.length);\n            } else if (ch instanceof RegExp) {\n                var m = ch.exec(input.substr(pos));\n                if (m) {\n                    forward(m[0].length);\n                    return m;\n                }\n            } else {\n                forward(ch[0].length);\n            }\n        }\n        function forward(n) {\n            while (n-- > 0) {\n                next();\n            }\n        }\n        function readEscaped(end) {\n            var escaped = false, str = '';\n            while (!eof()) {\n                var ch = next();\n                if (escaped) {\n                    str += ch;\n                    escaped = false;\n                } else if (ch == '\\\\') {\n                    escaped = true;\n                } else if (ch == end) {\n                    break;\n                } else {\n                    str += ch;\n                }\n            }\n            return str;\n        }\n        function readWhile(predicate) {\n            var str = '';\n            while (!eof() && predicate(peek(), str)) {\n                str += next();\n            }\n            return str;\n        }\n        function lookingAt(rx) {\n            return rx.exec(input.substr(pos));\n        }\n    }\n    var FORMAT_PARSERS = [];\n    var registerFormatParser = exports.registerFormatParser = function (p) {\n        FORMAT_PARSERS.push(p);\n    };\n    exports.parse = function (sheet, row, col, input) {\n        if (input instanceof Date) {\n            return {\n                type: 'date',\n                value: runtime.dateToSerial(input)\n            };\n        }\n        if (typeof input == 'number') {\n            return {\n                type: 'number',\n                value: input\n            };\n        }\n        if (typeof input == 'boolean') {\n            return {\n                type: 'boolean',\n                value: input\n            };\n        }\n        input += '';\n        if (/^'/.test(input)) {\n            return {\n                type: 'string',\n                value: input.substr(1)\n            };\n        }\n        if (/^[0-9.]+%$/.test(input)) {\n            var str = input.substr(0, input.length - 1);\n            var num = parseFloat(str);\n            if (!isNaN(num) && num == str) {\n                return {\n                    type: 'percent',\n                    value: num / 100\n                };\n            }\n        }\n        if (/^=/.test(input)) {\n            input = input.substr(1);\n            if (/\\S/.test(input)) {\n                return parseFormula(sheet, row, col, input);\n            } else {\n                return {\n                    type: 'string',\n                    value: '=' + input\n                };\n            }\n        }\n        for (var i = 0; i < FORMAT_PARSERS.length; ++i) {\n            var result = FORMAT_PARSERS[i](input);\n            if (result) {\n                return result;\n            }\n        }\n        if (input.toLowerCase() == 'true') {\n            return {\n                type: 'boolean',\n                value: true\n            };\n        }\n        if (input.toLowerCase() == 'false') {\n            return {\n                type: 'boolean',\n                value: false\n            };\n        }\n        var date = runtime.parseDate(input);\n        if (date) {\n            return {\n                type: 'date',\n                value: runtime.dateToSerial(date)\n            };\n        }\n        var num = parseFloat(input);\n        if (!isNaN(num) && input.length > 0 && num == input) {\n            return {\n                type: 'number',\n                value: num\n            };\n        }\n        return {\n            type: 'string',\n            value: input\n        };\n    };\n    function tokenize(input, row, col) {\n        var tokens = [];\n        input = TokenStream(input, {\n            forEditor: true,\n            row: row,\n            col: col\n        });\n        while (!input.eof()) {\n            tokens.push(next());\n        }\n        var tok = tokens[0];\n        if (tok.type == 'op' && tok.value == '=') {\n            tok.type = 'startexp';\n        }\n        return tokens;\n        function next() {\n            var tok = input.next();\n            if (tok.type == 'sym') {\n                if (tok.upper == 'TRUE') {\n                    tok.type = 'bool';\n                    tok.value = true;\n                } else if (tok.upper == 'FALSE') {\n                    tok.type = 'bool';\n                    tok.value = false;\n                }\n            } else if (tok.type == 'ref') {\n                tok = {\n                    type: 'ref',\n                    ref: row != null && col != null ? tok.absolute(row, col) : tok,\n                    begin: tok.begin,\n                    end: tok.end\n                };\n            }\n            return tok;\n        }\n    }\n    function parseSqref(input, row, col) {\n        row = row || 0;\n        col = col || 0;\n        input = TokenStream(input, {\n            row: row,\n            col: col\n        });\n        var refs = [];\n        while (!input.eof()) {\n            var ref = input.next();\n            if (ref.type != 'ref') {\n                throw new ParseError('Expecting a reference but got: ' + JSON.stringify(ref));\n            }\n            refs.push(ref.absolute(row, col));\n        }\n        return refs;\n    }\n    exports.parseNameDefinition = parseNameDefinition;\n    exports.parseFormula = parseFormula;\n    exports.parseReference = parseReference;\n    exports.compile = makeFormula;\n    exports.parseSqref = parseSqref;\n    exports.InputStream = InputStream;\n    exports.ParseError = ParseError;\n    exports.tokenize = tokenize;\n    registerFormatParser(function (input) {\n        var m;\n        if (m = /^(\\d+):(\\d+)$/.exec(input)) {\n            var hh = parseInt(m[1], 10);\n            var mm = parseInt(m[2], 10);\n            return {\n                type: 'date',\n                format: 'hh:mm',\n                value: runtime.packTime(hh, mm, 0, 0)\n            };\n        }\n        if (m = /^(\\d+):(\\d+)(\\.\\d+)$/.exec(input)) {\n            var mm = parseInt(m[1], 10);\n            var ss = parseInt(m[2], 10);\n            var ms = parseFloat(m[3]) * 1000;\n            return {\n                type: 'date',\n                format: 'mm:ss.00',\n                value: runtime.packTime(0, mm, ss, ms)\n            };\n        }\n        if (m = /^(\\d+):(\\d+):(\\d+)$/.exec(input)) {\n            var hh = parseInt(m[1], 10);\n            var mm = parseInt(m[2], 10);\n            var ss = parseInt(m[3], 10);\n            return {\n                type: 'date',\n                format: 'hh:mm:ss',\n                value: runtime.packTime(hh, mm, ss, 0)\n            };\n        }\n        if (m = /^(\\d+):(\\d+):(\\d+)(\\.\\d+)$/.exec(input)) {\n            var hh = parseInt(m[1], 10);\n            var mm = parseInt(m[2], 10);\n            var ss = parseInt(m[3], 10);\n            var ms = parseFloat(m[4]) * 1000;\n            return {\n                type: 'date',\n                format: 'hh:mm:ss.00',\n                value: runtime.packTime(hh, mm, ss, ms)\n            };\n        }\n    });\n    registerFormatParser(function (input) {\n        var m, n;\n        var culture = kendo.culture();\n        var comma = culture.numberFormat[','];\n        var dot = culture.numberFormat['.'];\n        var currency = culture.numberFormat.currency.symbol;\n        var rxnum = getNumberRegexp(comma, dot);\n        var rxcur = new RegExp('^\\\\s*\\\\' + currency + '\\\\s*');\n        var sign = 1;\n        var format = '';\n        var suffix = '';\n        var has_currency = false;\n        input = InputStream(input.replace(/^\\s+|\\s+$/g, ''));\n        if (input.skip(/^-\\s*/)) {\n            sign = -1;\n        }\n        if (m = input.skip(rxcur)) {\n            has_currency = true;\n            format += '\"' + m[0] + '\"';\n        }\n        if (input.skip(/^-\\s*/)) {\n            if (sign < 0) {\n                return null;\n            }\n            sign = -1;\n        }\n        if (!(n = input.skip(rxnum))) {\n            return null;\n        }\n        format += '#';\n        if (m = input.skip(rxcur)) {\n            if (has_currency) {\n                return null;\n            }\n            has_currency = true;\n            suffix = '\"' + m[0] + '\"';\n        }\n        if (!input.eof()) {\n            return null;\n        }\n        if (n[2] || has_currency) {\n            format += ',#';\n        }\n        if (n[3]) {\n            format += '.' + repeat('0', n[3].length - 1);\n        }\n        var value = n[0].replace(new RegExp('\\\\' + comma, 'g'), '').replace(new RegExp('\\\\' + dot, 'g'), '.');\n        format += suffix;\n        if (has_currency) {\n            format += ';-' + format;\n        }\n        return {\n            type: 'number',\n            format: format,\n            value: sign * parseFloat(value)\n        };\n    });\n    var NUMBER_FORMAT_RX = {};\n    function getNumberRegexp(comma, dot) {\n        var id = comma + dot;\n        var rx = NUMBER_FORMAT_RX[id];\n        if (!rx) {\n            rx = '^(\\\\d+(COM\\\\d{3})*(DOT\\\\d+)?)';\n            rx = rx.replace(/DOT/g, '\\\\' + dot).replace(/COM/g, '\\\\' + comma);\n            rx = new RegExp(rx);\n            NUMBER_FORMAT_RX[id] = rx;\n        }\n        return rx;\n    }\n    function repeat(str, len) {\n        var out = '';\n        while (len-- > 0) {\n            out += str;\n        }\n        return out;\n    }\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('spreadsheet/excel-reader', [\n        'kendo.core',\n        'kendo.color',\n        'util/parse-xml',\n        'spreadsheet/calc'\n    ], f);\n}(function () {\n    'use strict';\n    if (kendo.support.browser.msie && kendo.support.browser.version < 9) {\n        return;\n    }\n    var $ = kendo.jQuery;\n    var parseXML = kendo.util.parseXML;\n    var parseReference = kendo.spreadsheet.calc.parseReference;\n    var MAP_EXCEL_OPERATOR = {\n        greaterThanOrEqual: 'greaterThanOrEqualTo',\n        lessThanOrEqual: 'lessThanOrEqualTo'\n    };\n    var ERROR_LOG = null;\n    function readExcel(file, workbook, deferred) {\n        var reader = new FileReader();\n        reader.onload = function (e) {\n            var zip = new JSZip(e.target.result);\n            readWorkbook(zip, workbook, deferred);\n        };\n        reader.readAsArrayBuffer(file);\n    }\n    var SEL_CELL = [\n        'sheetData',\n        'row',\n        'c'\n    ];\n    var SEL_COL = [\n        'cols',\n        'col'\n    ];\n    var SEL_DEFINED_NAME = [\n        'definedNames',\n        'definedName'\n    ];\n    var SEL_FORMULA = [\n        'sheetData',\n        'row',\n        'c',\n        'f'\n    ];\n    var SEL_MERGE = [\n        'mergeCells',\n        'mergeCell'\n    ];\n    var SEL_PANE = [\n        'sheetViews',\n        'sheetView',\n        'pane'\n    ];\n    var SEL_ROW = [\n        'sheetData',\n        'row'\n    ];\n    var SEL_SELECTION = [\n        'sheetViews',\n        'sheetView',\n        'selection'\n    ];\n    var SEL_SHEET = [\n        'sheets',\n        'sheet'\n    ];\n    var SEL_STRING = [\n        'sheetData',\n        'row',\n        'c',\n        'is'\n    ];\n    var SEL_TEXT = ['t'];\n    var SEL_SHARED_STRING = ['si'];\n    var SEL_VALUE = [\n        'sheetData',\n        'row',\n        'c',\n        'v'\n    ];\n    var SEL_VIEW = [\n        'bookViews',\n        'workbookView'\n    ];\n    var SEL_SHEET_VIEW = [\n        'sheetViews',\n        'sheetView'\n    ];\n    var SEL_HYPERLINK = [\n        'hyperlinks',\n        'hyperlink'\n    ];\n    var SEL_VALIDATION = [\n        'dataValidations',\n        'dataValidation'\n    ];\n    var SEL_VALIDATION_FORMULA1 = [\n        'dataValidations',\n        'dataValidation',\n        'formula1'\n    ];\n    var SEL_VALIDATION_FORMULA2 = [\n        'dataValidations',\n        'dataValidation',\n        'formula2'\n    ];\n    function xl(file) {\n        if (!/^\\//.test(file)) {\n            file = 'xl/' + file;\n        } else {\n            file = file.substr(1);\n        }\n        return file;\n    }\n    function readWorkbook(zip, workbook, progress) {\n        ERROR_LOG = workbook.excelImportErrors = [];\n        var strings = readStrings(zip);\n        var relationships = readRelationships(zip, '_rels/workbook.xml');\n        var theme = readTheme(zip, relationships.byType.theme[0]);\n        var styles = readStyles(zip, theme);\n        var items = [];\n        var activeSheet = 0;\n        parse(zip, 'xl/workbook.xml', {\n            enter: function (tag, attrs) {\n                if (this.is(SEL_SHEET)) {\n                    var relId = attrs['r:id'];\n                    var file = relationships.byId[relId];\n                    var name = attrs.name;\n                    var dim = sheetDimensions(zip, file);\n                    items.push({\n                        workbook: workbook,\n                        zip: zip,\n                        strings: strings,\n                        styles: styles,\n                        file: file,\n                        options: {\n                            name: name,\n                            rows: Math.max(workbook.options.rows || 0, dim.rows),\n                            columns: Math.max(workbook.options.columns || 0, dim.cols),\n                            columnWidth: dim.columnWidth,\n                            rowHeight: dim.rowHeight\n                        }\n                    });\n                } else if (this.is(SEL_VIEW)) {\n                    if (attrs.activeTab) {\n                        activeSheet = integer(attrs.activeTab);\n                    }\n                }\n            },\n            text: function (text) {\n                var attrs = this.is(SEL_DEFINED_NAME);\n                if (attrs && !(bool(attrs['function']) || bool(attrs.vbProcedure))) {\n                    var localSheetId = attrs.localSheetId;\n                    var sheet = null;\n                    if (localSheetId != null) {\n                        sheet = items[localSheetId].options.name;\n                    }\n                    var name = attrs.name;\n                    if (sheet) {\n                        name = '\\'' + sheet.replace(/\\'/g, '\\\\\\'') + '\\'!' + name;\n                    }\n                    withErrorLog(sheet, null, function () {\n                        workbook.defineName(name, text, bool(attrs.hidden));\n                    }, 'reading user-defined name: ' + name);\n                }\n            }\n        });\n        var loading = new $.Deferred();\n        loading.progress(function (args) {\n            if (progress) {\n                progress.notify(args);\n            }\n        }).then(function () {\n            var sheets = workbook.sheets();\n            recalcSheets(sheets);\n            workbook.activeSheet(sheets[activeSheet]);\n            if (progress) {\n                progress.resolve();\n            }\n        });\n        loadSheets(items, workbook, loading);\n    }\n    function loadSheets(items, workbook, progress) {\n        var ready = new $.Deferred().resolve();\n        for (var i = 0; i < items.length; i++) {\n            (function (entry, i) {\n                ready = ready.then(function () {\n                    var sheet = workbook.insertSheet(entry.options);\n                    sheet.suspendChanges(true);\n                    var promise = queueSheet(sheet, entry);\n                    var args = {\n                        sheet: sheet,\n                        progress: i / (items.length - 1)\n                    };\n                    promise.then(function () {\n                        progress.notify(args);\n                    });\n                    return promise;\n                });\n            }(items[i], i));\n        }\n        ready.then(function () {\n            progress.resolve();\n        });\n    }\n    function queueSheet(sheet, ctx) {\n        var deferred = new $.Deferred();\n        setTimeout(function () {\n            readSheet(ctx.zip, ctx.file, sheet, ctx.strings, ctx.styles);\n            deferred.resolve();\n        }, 0);\n        return deferred;\n    }\n    function recalcSheets(sheets) {\n        for (var i = 0; i < sheets.length; i++) {\n            sheets[i].suspendChanges(false).triggerChange({ recalc: true });\n        }\n    }\n    function sheetDimensions(zip, file) {\n        var dim = {\n            rows: 0,\n            cols: 0\n        };\n        parse(zip, xl(file), {\n            enter: function (tag, attrs) {\n                if (tag == 'dimension') {\n                    var ref = parseReference(attrs.ref);\n                    if (ref.bottomRight) {\n                        dim.cols = ref.bottomRight.col + 1;\n                        dim.rows = ref.bottomRight.row + 1;\n                    }\n                } else if (tag === 'sheetFormatPr') {\n                    if (attrs.defaultColWidth) {\n                        dim.columnWidth = toColWidth(parseFloat(attrs.defaultColWidth));\n                    }\n                    if (attrs.defaultRowHeight) {\n                        dim.rowHeight = toRowHeight(parseFloat(attrs.defaultRowHeight));\n                    }\n                } else if (this.is(SEL_ROW)) {\n                    this.exit();\n                }\n            }\n        });\n        return dim;\n    }\n    function toColWidth(size) {\n        var maximumDigitWidth = 7;\n        var fraction = (256 * size + Math.floor(128 / maximumDigitWidth)) / 256;\n        return Math.floor(fraction) * maximumDigitWidth;\n    }\n    function toRowHeight(pts) {\n        return pts * 1.5625;\n    }\n    function readSheet(zip, file, sheet, strings, styles) {\n        var ref, type, value, formula, formulaRange;\n        var nCols = sheet._columns._count;\n        var prevCellRef = null;\n        var relsFile = file.replace(/worksheets\\//, 'worksheets/_rels/');\n        var relationships = readRelationships(zip, relsFile);\n        var formula1, formula2;\n        var filterRef;\n        var filterColumn;\n        var customFilterLogic;\n        var customFilterCriteria;\n        var valueFilterBlanks;\n        var valueFilterValues;\n        var filters = [];\n        ERROR_LOG = sheet._workbook.excelImportErrors;\n        parse(zip, xl(file), {\n            enter: function (tag, attrs) {\n                var tmp;\n                if (this.is(SEL_CELL)) {\n                    value = null;\n                    formula = null;\n                    formulaRange = null;\n                    ref = attrs.r;\n                    if (ref == null) {\n                        ref = parseReference(prevCellRef);\n                        ref.col++;\n                        ref = ref.toString();\n                    }\n                    prevCellRef = ref;\n                    type = attrs.t;\n                    var styleIndex = attrs.s;\n                    if (styleIndex != null) {\n                        applyStyle(sheet, ref, styles, styleIndex);\n                    }\n                } else if (this.is(SEL_MERGE)) {\n                    sheet.range(attrs.ref).merge();\n                } else if (this.is(SEL_COL)) {\n                    var start = integer(attrs.min) - 1;\n                    var stop = Math.min(nCols, integer(attrs.max)) - 1;\n                    var width;\n                    if (attrs.width) {\n                        width = toColWidth(parseFloat(attrs.width));\n                        if (width !== 0) {\n                            sheet._columns.values.value(start, stop, width);\n                        }\n                    }\n                    if (attrs.hidden === '1' || width === 0) {\n                        for (var ci = start; ci <= stop; ci++) {\n                            sheet.hideColumn(ci);\n                        }\n                    }\n                    if (attrs.style != null) {\n                        applyStyle(sheet, new kendo.spreadsheet.RangeRef(new kendo.spreadsheet.CellRef(-Infinity, start), new kendo.spreadsheet.CellRef(+Infinity, stop)), styles, attrs.style);\n                    }\n                } else if (this.is(SEL_ROW)) {\n                    var row = integer(attrs.r) - 1;\n                    var height;\n                    if (attrs.ht) {\n                        height = toRowHeight(parseFloat(attrs.ht));\n                        if (height !== 0) {\n                            sheet._rows.values.value(row, row, height);\n                        }\n                    }\n                    if (attrs.hidden === '1' || height === 0) {\n                        sheet.hideRow(row);\n                    }\n                } else if (this.is(SEL_SELECTION)) {\n                    if (attrs.activeCell) {\n                        var acRef = parseReference(attrs.activeCell);\n                        sheet.select(acRef, true);\n                    }\n                } else if (this.is(SEL_PANE)) {\n                    if (attrs.state == 'frozen') {\n                        if (attrs.xSplit) {\n                            sheet.frozenColumns(integer(attrs.xSplit));\n                        }\n                        if (attrs.ySplit) {\n                            sheet.frozenRows(integer(attrs.ySplit));\n                        }\n                    }\n                } else if (this.is(SEL_SHEET_VIEW)) {\n                    sheet.showGridLines(bool(attrs.showGridLines, true));\n                } else if (this.is(SEL_HYPERLINK)) {\n                    var relId = attrs['r:id'];\n                    var target = relationships.byId[relId];\n                    if (target) {\n                        sheet.range(attrs.ref).link(target);\n                    }\n                } else if (this.is(['autoFilter'])) {\n                    filterRef = attrs.ref;\n                } else if (filterRef) {\n                    if (this.is(['filterColumn'])) {\n                        filterColumn = parseInt(attrs.colId, 10);\n                    } else if (this.is(['customFilters'])) {\n                        customFilterLogic = bool(attrs.and) ? 'and' : 'or';\n                        customFilterCriteria = [];\n                    } else if (this.is(['customFilter'])) {\n                        tmp = getCustomFilter(attrs.operator, attrs.val);\n                        if (tmp) {\n                            customFilterCriteria.push({\n                                operator: tmp.operator,\n                                value: tmp.value\n                            });\n                        }\n                    } else if (this.is(['dynamicFilter'])) {\n                        filters.push({\n                            column: filterColumn,\n                            filter: new kendo.spreadsheet.DynamicFilter({ type: dynamicFilterType(attrs.type) })\n                        });\n                    } else if (this.is(['top10'])) {\n                        filters.push({\n                            column: filterColumn,\n                            filter: new kendo.spreadsheet.TopFilter({\n                                value: getFilterVal(attrs.val),\n                                type: function (percent, top) {\n                                    return percent && top ? 'topPercent' : top ? 'topNumber' : percent ? 'bottomPercent' : 'bottomNumber';\n                                }(bool(attrs.percent), bool(attrs.top))\n                            })\n                        });\n                    } else if (this.is(['filters'])) {\n                        valueFilterBlanks = bool(attrs.blank);\n                        valueFilterValues = [];\n                    } else if (this.is(['filter'])) {\n                        valueFilterValues.push(getFilterVal(attrs.val));\n                    }\n                }\n            },\n            leave: function (tag, attrs) {\n                if (this.is(SEL_CELL)) {\n                    if (formula != null) {\n                        var failed = withErrorLog(sheet, formulaRange || ref, function () {\n                            sheet.range(formulaRange || ref).formula(formula);\n                        }, 'parsing formula');\n                        if (failed) {\n                            sheet.range(formulaRange || ref).value(formula).background('#ffaaaa');\n                        }\n                    } else if (value != null) {\n                        var range = sheet.range(ref);\n                        if (!range._get('formula')) {\n                            if (!type || type == 'n') {\n                                value = parseFloat(value);\n                            } else if (type == 's') {\n                                value = strings[integer(value)];\n                            } else if (type == 'b') {\n                                value = value === '1';\n                            } else if (type == 'd') {\n                                value = kendo.parseDate(value);\n                            }\n                            if (value != null) {\n                                range.value(value);\n                            }\n                        }\n                    }\n                } else if (this.is(SEL_VALIDATION)) {\n                    (function () {\n                        var refs = kendo.spreadsheet.calc.parseSqref(attrs.sqref);\n                        var type = attrs.type.toLowerCase();\n                        var operator = attrs.operator;\n                        if (/^(?:whole|decimal)$/.test(type)) {\n                            type = 'number';\n                        } else if (type == 'list') {\n                            operator = 'list';\n                        }\n                        if (!operator && /^(?:number|date)$/.test(type)) {\n                            operator = 'between';\n                        }\n                        refs.forEach(function (ref) {\n                            withErrorLog(sheet, ref, function () {\n                                sheet.range(ref).validation({\n                                    type: bool(attrs.showErrorMessage, true) ? 'reject' : 'warning',\n                                    from: formula1,\n                                    to: formula2,\n                                    dataType: type,\n                                    comparerType: MAP_EXCEL_OPERATOR[operator] || operator,\n                                    allowNulls: bool(attrs.allowBlank),\n                                    showButton: bool(attrs.showDropDown) || type == 'date' || type == 'list',\n                                    messageTemplate: attrs.error,\n                                    titleTemplate: attrs.errorTitle\n                                });\n                            }, 'parsing validation');\n                        });\n                    }());\n                } else if (tag == 'cols') {\n                    sheet._columns._refresh();\n                } else if (tag == 'sheetData') {\n                    sheet._rows._refresh();\n                } else if (tag == 'autoFilter') {\n                    sheet.range(filterRef).filter(filters);\n                    filterRef = null;\n                } else if (filterRef) {\n                    if (tag == 'customFilters') {\n                        filters.push({\n                            column: filterColumn,\n                            filter: new kendo.spreadsheet.CustomFilter({\n                                logic: customFilterLogic,\n                                criteria: customFilterCriteria\n                            })\n                        });\n                    } else if (tag == 'filters') {\n                        filters.push({\n                            column: filterColumn,\n                            filter: new kendo.spreadsheet.ValueFilter({\n                                values: valueFilterValues,\n                                blanks: valueFilterBlanks\n                            })\n                        });\n                    }\n                }\n            },\n            text: function (text) {\n                var attrs;\n                if (this.is(SEL_VALUE) || this.is(SEL_STRING)) {\n                    value = text;\n                } else if (attrs = this.is(SEL_FORMULA)) {\n                    formula = text;\n                    if (attrs.t == 'shared') {\n                        formulaRange = attrs.ref;\n                    }\n                } else if (this.is(SEL_VALIDATION_FORMULA1)) {\n                    formula1 = text;\n                } else if (this.is(SEL_VALIDATION_FORMULA2)) {\n                    formula2 = text;\n                }\n            }\n        });\n    }\n    function getCustomFilter(op, value) {\n        var ourOp = {\n            equal: 'eq',\n            notEqual: 'ne',\n            greaterThan: 'gt',\n            greaterThanOrEqual: 'gte',\n            lessThan: 'lt',\n            lessThanOrEqual: 'lte'\n        }[op];\n        value = getFilterVal(value);\n        if (ourOp && typeof value == 'number') {\n            return {\n                operator: ourOp,\n                value: value\n            };\n        }\n        if ((op == 'notEqual' || !op) && typeof value == 'string') {\n            return {\n                operator: op ? 'doesnotmatch' : 'matches',\n                value: value\n            };\n        }\n    }\n    function dynamicFilterType(type) {\n        return {\n            Q1: 'quarter1',\n            Q2: 'quarter2',\n            Q3: 'quarter3',\n            Q4: 'quarter4',\n            M1: 'january',\n            M2: 'february',\n            M3: 'march',\n            M4: 'april',\n            M5: 'may',\n            M6: 'june',\n            M7: 'july',\n            M8: 'august',\n            M9: 'september',\n            M10: 'october',\n            M11: 'november',\n            M12: 'december'\n        }[type.toUpperCase()] || type;\n    }\n    function getFilterVal(val) {\n        var tmp = parseFloat(val);\n        if (!isNaN(tmp) && tmp == val) {\n            return tmp;\n        }\n        return val;\n    }\n    function withErrorLog(sheet, ref, func, context) {\n        try {\n            func();\n            return false;\n        } catch (ex) {\n            var err = {\n                context: context,\n                error: String(ex)\n            };\n            if (sheet) {\n                err.sheet = sheet.name();\n            }\n            if (ref) {\n                err.location = String(ref);\n            }\n            ERROR_LOG.push(err);\n            return true;\n        }\n    }\n    var BORDER_WIDTHS = {\n        'none': 0,\n        'thin': 1,\n        'medium': 2,\n        'dashed': 1,\n        'dotted': 1,\n        'thick': 3,\n        'double': 3,\n        'hair': 1,\n        'mediumDashed': 2,\n        'dashDot': 1,\n        'mediumDashDot': 2,\n        'dashDotDot': 1,\n        'mediumDashDotDot': 2,\n        'slantDashDot': 1\n    };\n    var DEFAULT_FORMATS = {\n        0: 'General',\n        1: '0',\n        2: '0.00',\n        3: '#,##0',\n        4: '#,##0.00',\n        9: '0%',\n        10: '0.00%',\n        11: '0.00E+00',\n        12: '# ?/?',\n        13: '# ??/??',\n        14: 'mm-dd-yy',\n        15: 'd-mmm-yy',\n        16: 'd-mmm',\n        17: 'mmm-yy',\n        18: 'h:mm AM/PM',\n        19: 'h:mm:ss AM/PM',\n        20: 'h:mm',\n        21: 'h:mm:ss',\n        22: 'm/d/yy h:mm',\n        37: '#,##0 ;(#,##0)',\n        38: '#,##0 ;[Red](#,##0)',\n        39: '#,##0.00;(#,##0.00)',\n        40: '#,##0.00;[Red](#,##0.00)',\n        45: 'mm:ss',\n        46: '[h]:mm:ss',\n        47: 'mmss.0',\n        48: '##0.0E+0',\n        49: '@'\n    };\n    function applyStyle(sheet, ref, styles, styleIndex) {\n        var range = sheet.range(ref);\n        var xf = styles.inlineStyles[styleIndex], base, value;\n        if (xf.xfId) {\n            base = styles.namedStyles[xf.xfId];\n        }\n        if (shouldSet('applyBorder', 'borderId')) {\n            setBorder(styles.borders[value]);\n        }\n        if (shouldSet('applyFont', 'fontId')) {\n            setFont(styles.fonts[value]);\n        }\n        if (shouldSet('applyAlignment', 'textAlign')) {\n            range.textAlign(value);\n        }\n        if (shouldSet('applyAlignment', 'verticalAlign')) {\n            range.verticalAlign(value);\n        }\n        if (shouldSet('applyAlignment', 'wrapText')) {\n            range._property('wrap', value);\n        }\n        if (shouldSet('applyFill', 'fillId')) {\n            setFill(styles.fills[value]);\n        }\n        if (shouldSet('applyNumberFormat', 'numFmtId')) {\n            setFormat(styles.numFmts[value] || DEFAULT_FORMATS[value]);\n        }\n        function setFormat(f) {\n            var format = typeof f == 'string' ? f : f.formatCode;\n            if (format != null && !/^general$/i.test(format)) {\n                format = format.replace(/^\\[\\$-[0-9]+\\]/, '');\n                range.format(format);\n            }\n        }\n        function setFill(f) {\n            if (f.type == 'solid') {\n                range.background(f.color);\n            }\n        }\n        function setFont(f) {\n            range.fontFamily(f.name);\n            range._property('fontSize', f.size);\n            if (f.bold) {\n                range.bold(true);\n            }\n            if (f.italic) {\n                range.italic(true);\n            }\n        }\n        function setBorder(b) {\n            function set(side, prop) {\n                var border = b[side];\n                if (!border) {\n                    return;\n                }\n                var width = BORDER_WIDTHS[border.style];\n                if (width === 0) {\n                    return;\n                }\n                var color = border.color;\n                if (color == null) {\n                    color = '#000';\n                }\n                range._property(prop, {\n                    size: width,\n                    color: color\n                });\n            }\n            set('left', 'borderLeft');\n            set('top', 'borderTop');\n            set('right', 'borderRight');\n            set('bottom', 'borderBottom');\n        }\n        function shouldSet(applyName, propName) {\n            var t = xf[applyName];\n            if (t != null && !t) {\n                return false;\n            }\n            value = xf[propName];\n            if (base && value == null) {\n                t = base[applyName];\n                if (t != null && !t) {\n                    return false;\n                }\n                value = base[propName];\n            }\n            return value != null;\n        }\n    }\n    function parse(zip, file, callbacks) {\n        var part = zip.files[file];\n        if (part) {\n            parseXML(part.asUint8Array(), callbacks);\n        }\n    }\n    function readStrings(zip) {\n        var strings = [];\n        var current = null;\n        parse(zip, 'xl/sharedStrings.xml', {\n            leave: function () {\n                if (this.is(SEL_SHARED_STRING)) {\n                    strings.push(current);\n                    current = null;\n                }\n            },\n            text: function (text) {\n                if (this.is(SEL_TEXT)) {\n                    if (current == null) {\n                        current = '';\n                    }\n                    current += text;\n                }\n            }\n        });\n        return strings;\n    }\n    function readRelationships(zip, file) {\n        var map = {\n            byId: {},\n            byType: { theme: [] }\n        };\n        parse(zip, xl(file) + '.rels', {\n            enter: function (tag, attrs) {\n                if (tag == 'Relationship') {\n                    map.byId[attrs.Id] = attrs.Target;\n                    var type = attrs.Type.match(/\\w+$/)[0];\n                    var entries = map.byType[type] || [];\n                    entries.push(attrs.Target);\n                    map.byType[type] = entries;\n                }\n            }\n        });\n        return map;\n    }\n    var SEL_BORDER = [\n        'borders',\n        'border'\n    ];\n    var SEL_FILL = [\n        'fills',\n        'fill'\n    ];\n    var SEL_FONT = [\n        'fonts',\n        'font'\n    ];\n    var SEL_INLINE_STYLE = [\n        'cellXfs',\n        'xf'\n    ];\n    var SEL_NAMED_STYLE = [\n        'cellStyleXfs',\n        'xf'\n    ];\n    var SEL_NUM_FMT = [\n        'numFmts',\n        'numFmt'\n    ];\n    var INDEXED_COLORS = [\n        toCSSColor('FF000000'),\n        toCSSColor('FFFFFFFF'),\n        toCSSColor('FFFF0000'),\n        toCSSColor('FF00FF00'),\n        toCSSColor('FF0000FF'),\n        toCSSColor('FFFFFF00'),\n        toCSSColor('FFFF00FF'),\n        toCSSColor('FF00FFFF'),\n        toCSSColor('FF000000'),\n        toCSSColor('FFFFFFFF'),\n        toCSSColor('FFFF0000'),\n        toCSSColor('FF00FF00'),\n        toCSSColor('FF0000FF'),\n        toCSSColor('FFFFFF00'),\n        toCSSColor('FFFF00FF'),\n        toCSSColor('FF00FFFF'),\n        toCSSColor('FF800000'),\n        toCSSColor('FF008000'),\n        toCSSColor('FF000080'),\n        toCSSColor('FF808000'),\n        toCSSColor('FF800080'),\n        toCSSColor('FF008080'),\n        toCSSColor('FFC0C0C0'),\n        toCSSColor('FF808080'),\n        toCSSColor('FF9999FF'),\n        toCSSColor('FF993366'),\n        toCSSColor('FFFFFFCC'),\n        toCSSColor('FFCCFFFF'),\n        toCSSColor('FF660066'),\n        toCSSColor('FFFF8080'),\n        toCSSColor('FF0066CC'),\n        toCSSColor('FFCCCCFF'),\n        toCSSColor('FF000080'),\n        toCSSColor('FFFF00FF'),\n        toCSSColor('FFFFFF00'),\n        toCSSColor('FF00FFFF'),\n        toCSSColor('FF800080'),\n        toCSSColor('FF800000'),\n        toCSSColor('FF008080'),\n        toCSSColor('FF0000FF'),\n        toCSSColor('FF00CCFF'),\n        toCSSColor('FFCCFFFF'),\n        toCSSColor('FFCCFFCC'),\n        toCSSColor('FFFFFF99'),\n        toCSSColor('FF99CCFF'),\n        toCSSColor('FFFF99CC'),\n        toCSSColor('FFCC99FF'),\n        toCSSColor('FFFFCC99'),\n        toCSSColor('FF3366FF'),\n        toCSSColor('FF33CCCC'),\n        toCSSColor('FF99CC00'),\n        toCSSColor('FFFFCC00'),\n        toCSSColor('FFFF9900'),\n        toCSSColor('FFFF6600'),\n        toCSSColor('FF666699'),\n        toCSSColor('FF969696'),\n        toCSSColor('FF003366'),\n        toCSSColor('FF339966'),\n        toCSSColor('FF003300'),\n        toCSSColor('FF333300'),\n        toCSSColor('FF993300'),\n        toCSSColor('FF993366'),\n        toCSSColor('FF333399'),\n        toCSSColor('FF333333'),\n        toCSSColor('FF000000'),\n        toCSSColor('FFFFFFFF')\n    ];\n    function readStyles(zip, theme) {\n        var styles = {\n            fonts: [],\n            numFmts: {},\n            fills: [],\n            borders: [],\n            namedStyles: [],\n            inlineStyles: []\n        };\n        var font = null;\n        var fill = null;\n        var border = null;\n        var xf = null;\n        parse(zip, 'xl/styles.xml', {\n            enter: function (tag, attrs, closed) {\n                if (this.is(SEL_NUM_FMT)) {\n                    styles.numFmts[attrs.numFmtId] = attrs;\n                } else if (this.is(SEL_FONT)) {\n                    styles.fonts.push(font = {});\n                } else if (font) {\n                    if (tag == 'sz') {\n                        font.size = parseFloat(attrs.val);\n                    } else if (tag == 'name') {\n                        font.name = attrs.val;\n                    } else if (tag == 'b') {\n                        font.bold = bool(attrs.val, true);\n                    } else if (tag == 'i') {\n                        font.italic = bool(attrs.val, true);\n                    }\n                } else if (this.is(SEL_FILL)) {\n                    styles.fills.push(fill = {});\n                } else if (fill) {\n                    if (tag == 'patternFill') {\n                        fill.type = attrs.patternType;\n                    } else if (tag == 'fgColor' && fill.type === 'solid') {\n                        fill.color = getColor(attrs);\n                    } else if (tag == 'bgColor' && fill.type !== 'solid') {\n                        fill.color = getColor(attrs);\n                    }\n                } else if (this.is(SEL_BORDER)) {\n                    styles.borders.push(border = {});\n                } else if (border) {\n                    if (/^(?:left|top|right|bottom)$/.test(tag) && attrs.style) {\n                        border[tag] = { style: attrs.style };\n                    }\n                    if (tag == 'color') {\n                        var side = this.stack[this.stack.length - 2].$tag;\n                        border[side].color = getColor(attrs);\n                    }\n                } else if (this.is(SEL_NAMED_STYLE)) {\n                    xf = getXf(attrs);\n                    styles.namedStyles.push(xf);\n                    if (closed) {\n                        xf = null;\n                    }\n                } else if (this.is(SEL_INLINE_STYLE)) {\n                    xf = getXf(attrs);\n                    styles.inlineStyles.push(xf);\n                    if (closed) {\n                        xf = null;\n                    }\n                } else if (xf) {\n                    if (tag == 'alignment') {\n                        if (/^(?:left|center|right|justify)$/.test(attrs.horizontal)) {\n                            xf.textAlign = attrs.horizontal;\n                        }\n                        if (/^(?:top|center|bottom)$/.test(attrs.vertical)) {\n                            xf.verticalAlign = attrs.vertical;\n                        }\n                        if (attrs.wrapText != null) {\n                            xf.wrapText = bool(attrs.wrapText);\n                        }\n                    }\n                }\n            },\n            leave: function (tag) {\n                if (this.is(SEL_FONT)) {\n                    font = null;\n                } else if (this.is(SEL_FILL)) {\n                    fill = null;\n                } else if (this.is(SEL_BORDER)) {\n                    border = null;\n                } else if (tag == 'xf') {\n                    xf = null;\n                }\n            }\n        });\n        function getXf(attrs) {\n            var xf = {\n                borderId: integer(attrs.borderId),\n                fillId: integer(attrs.fillId),\n                fontId: integer(attrs.fontId),\n                numFmtId: integer(attrs.numFmtId),\n                pivotButton: bool(attrs.pivotButton),\n                quotePrefix: bool(attrs.quotePrefix),\n                xfId: integer(attrs.xfId)\n            };\n            addBool('applyAlignment');\n            addBool('applyBorder');\n            addBool('applyFill');\n            addBool('applyFont');\n            addBool('applyNumberFormat');\n            addBool('applyProtection');\n            function addBool(name) {\n                if (attrs[name] != null) {\n                    xf[name] = bool(attrs[name]);\n                }\n            }\n            return xf;\n        }\n        function getColor(attrs) {\n            if (attrs.rgb) {\n                return toCSSColor(attrs.rgb);\n            } else if (attrs.indexed) {\n                return INDEXED_COLORS[integer(attrs.indexed)];\n            } else if (attrs.theme) {\n                var themeColor = theme.colorScheme[integer(attrs.theme)];\n                if (!themeColor) {\n                    return INDEXED_COLORS[0];\n                }\n                var color = kendo.parseColor(themeColor);\n                if (attrs.tint) {\n                    color = color.toHSL();\n                    var tint = parseFloat(attrs.tint);\n                    if (tint < 0) {\n                        color.l = color.l * (1 + tint);\n                    } else {\n                        color.l = color.l * (1 - tint) + (100 - 100 * (1 - tint));\n                    }\n                }\n                return color.toCssRgba();\n            }\n        }\n        return styles;\n    }\n    var SEL_SCHEME_RGBCLR = [\n        'a:clrScheme',\n        '*',\n        'a:srgbClr'\n    ];\n    var SEL_SCHEME_SYSCLR = [\n        'a:clrScheme',\n        '*',\n        'a:sysClr'\n    ];\n    function readTheme(zip, rel) {\n        var scheme = [];\n        var theme = { colorScheme: scheme };\n        var file = xl(rel);\n        if (zip.files[file]) {\n            parse(zip, file, {\n                enter: function (tag, attrs) {\n                    if (this.is(SEL_SCHEME_SYSCLR)) {\n                        scheme.push(toCSSColor(attrs.val == 'window' ? 'FFFFFFFF' : 'FF000000'));\n                    } else if (this.is(SEL_SCHEME_RGBCLR)) {\n                        scheme.push(toCSSColor('FF' + attrs.val));\n                    }\n                }\n            });\n            if (scheme.length > 3) {\n                swap(scheme, 0, 1);\n                swap(scheme, 2, 3);\n            }\n        }\n        function swap(arr, a, b) {\n            var tmp = arr[a];\n            arr[a] = arr[b];\n            arr[b] = tmp;\n        }\n        return theme;\n    }\n    function integer(val) {\n        return val == null ? null : parseInt(val, 10);\n    }\n    function bool(val, def) {\n        if (val == null) {\n            return def;\n        }\n        return val == 'true' || val === true || val == 1;\n    }\n    function toCSSColor(rgb) {\n        var m = /^([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})$/i.exec(rgb);\n        return 'rgba(' + parseInt(m[2], 16) + ', ' + parseInt(m[3], 16) + ', ' + parseInt(m[4], 16) + ', ' + parseInt(m[1], 16) / 255 + ')';\n    }\n    kendo.spreadsheet.readExcel = readExcel;\n    kendo.spreadsheet._readSheet = readSheet;\n    kendo.spreadsheet._readStrings = readStrings;\n    kendo.spreadsheet._readStyles = readStyles;\n    kendo.spreadsheet._readTheme = readTheme;\n    kendo.spreadsheet._readWorkbook = readWorkbook;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('spreadsheet/workbook', [\n        'kendo.core',\n        'spreadsheet/runtime',\n        'spreadsheet/references',\n        'spreadsheet/excel-reader'\n    ], f);\n}(function () {\n    (function (kendo) {\n        if (kendo.support.browser.msie && kendo.support.browser.version < 9) {\n            return;\n        }\n        var $ = kendo.jQuery;\n        var Formula = kendo.spreadsheet.calc.runtime.Formula;\n        var Ref = kendo.spreadsheet.Ref;\n        var CalcError = kendo.spreadsheet.CalcError;\n        var Workbook = kendo.Observable.extend({\n            init: function (options, view) {\n                kendo.Observable.fn.init.call(this);\n                this.options = options;\n                this._view = view;\n                this._sheets = [];\n                this._sheetsSearchCache = {};\n                this._sheet = this.insertSheet({\n                    rows: this.options.rows,\n                    columns: this.options.columns,\n                    rowHeight: this.options.rowHeight,\n                    columnWidth: this.options.columnWidth,\n                    headerHeight: this.options.headerHeight,\n                    headerWidth: this.options.headerWidth,\n                    dataSource: this.options.dataSource\n                });\n                this.undoRedoStack = new kendo.util.UndoRedoStack();\n                this.undoRedoStack.bind([\n                    'undo',\n                    'redo'\n                ], this._onUndoRedo.bind(this));\n                this._context = new kendo.spreadsheet.FormulaContext(this);\n                this._validationContext = new kendo.spreadsheet.ValidationFormulaContext(this);\n                this._names = Object.create(null);\n                this.fromJSON(this.options);\n            },\n            clipboard: function () {\n                if (!this._clipboard) {\n                    this._clipboard = new kendo.spreadsheet.Clipboard(this);\n                }\n                return this._clipboard;\n            },\n            destroy: function () {\n                this.unbind();\n                if (this._clipboard) {\n                    this._clipboard.destroy();\n                }\n            },\n            events: [\n                'cut',\n                'copy',\n                'paste',\n                'change',\n                'excelImport',\n                'excelExport',\n                'insertSheet',\n                'removeSheet',\n                'selectSheet',\n                'renameSheet',\n                'insertRow',\n                'insertColumn',\n                'deleteRow',\n                'deleteColumn',\n                'hideRow',\n                'hideColumn',\n                'unhideRow',\n                'unhideColumn',\n                'select',\n                'changeFormat'\n            ],\n            _sheetChange: function (e) {\n                this.trigger('change', e);\n            },\n            _sheetInsertRow: function (e) {\n                if (this.trigger('insertRow', {\n                        sheet: e.sender,\n                        index: e.index\n                    })) {\n                    e.preventDefault();\n                }\n            },\n            _sheetInsertColumn: function (e) {\n                if (this.trigger('insertColumn', {\n                        sheet: e.sender,\n                        index: e.index\n                    })) {\n                    e.preventDefault();\n                }\n            },\n            _sheetDeleteRow: function (e) {\n                if (this.trigger('deleteRow', {\n                        sheet: e.sender,\n                        index: e.index\n                    })) {\n                    e.preventDefault();\n                }\n            },\n            _sheetDeleteColumn: function (e) {\n                if (this.trigger('deleteColumn', {\n                        sheet: e.sender,\n                        index: e.index\n                    })) {\n                    e.preventDefault();\n                }\n            },\n            _sheetHideRow: function (e) {\n                if (this.trigger('hideRow', {\n                        sheet: e.sender,\n                        index: e.index\n                    })) {\n                    e.preventDefault();\n                }\n            },\n            _sheetHideColumn: function (e) {\n                if (this.trigger('hideColumn', {\n                        sheet: e.sender,\n                        index: e.index\n                    })) {\n                    e.preventDefault();\n                }\n            },\n            _sheetUnhideRow: function (e) {\n                if (this.trigger('unhideRow', {\n                        sheet: e.sender,\n                        index: e.index\n                    })) {\n                    e.preventDefault();\n                }\n            },\n            _sheetUnhideColumn: function (e) {\n                if (this.trigger('unhideColumn', {\n                        sheet: e.sender,\n                        index: e.index\n                    })) {\n                    e.preventDefault();\n                }\n            },\n            _sheetSelect: function (e) {\n                this.trigger('select', e);\n            },\n            _sheetCommandRequest: function (e) {\n                this.trigger('commandRequest', e);\n            },\n            _inputForRef: function (ref) {\n                return new kendo.spreadsheet.Range(ref, this._sheet).input();\n            },\n            _onUndoRedo: function (e) {\n                e.command.range().select();\n            },\n            execute: function (options) {\n                var commandOptions = $.extend({ workbook: this }, options.options);\n                var command = new kendo.spreadsheet[options.command](commandOptions);\n                var sheet = this.activeSheet();\n                if (commandOptions.origin) {\n                    command.origin(commandOptions.origin);\n                }\n                if (commandOptions.operatingRange) {\n                    command.range(commandOptions.operatingRange);\n                } else if (commandOptions.editActiveCell) {\n                    command.range(sheet.activeCellSelection());\n                } else {\n                    command.range(sheet.selection());\n                }\n                var result = command.exec();\n                if (!result || result.reason !== 'error') {\n                    if (command.cannotUndo) {\n                        this.undoRedoStack.clear();\n                    } else {\n                        this.undoRedoStack.push(command);\n                    }\n                }\n                return result;\n            },\n            resetFormulas: function () {\n                this._sheets.forEach(function (sheet) {\n                    sheet.resetFormulas();\n                });\n            },\n            resetValidations: function () {\n                this._sheets.forEach(function (sheet) {\n                    sheet.resetValidations();\n                });\n            },\n            refresh: function (reason) {\n                if (reason.recalc) {\n                    this.resetFormulas();\n                    this.resetValidations();\n                    this._sheet.recalc(this._context);\n                    this._sheet.revalidate(this._validationContext);\n                }\n            },\n            activeSheet: function (sheet) {\n                if (sheet === undefined) {\n                    return this._sheet;\n                }\n                if (!this.sheetByName(sheet.name())) {\n                    return;\n                }\n                this._sheet = sheet;\n                sheet.triggerChange(kendo.spreadsheet.ALL_REASONS);\n            },\n            moveSheetToIndex: function (sheet, toIndex) {\n                var fromIndex = this.sheetIndex(sheet);\n                var sheets = this._sheets;\n                if (fromIndex === -1) {\n                    return;\n                }\n                this._sheetsSearchCache = {};\n                sheets.splice(toIndex, 0, sheets.splice(fromIndex, 1)[0]);\n                this.trigger('change', { sheetSelection: true });\n            },\n            insertSheet: function (options) {\n                options = options || {};\n                var that = this;\n                var insertIndex = typeof options.index === 'number' ? options.index : that._sheets.length;\n                var sheetName;\n                var sheets = that._sheets;\n                var getUniqueSheetName = function (sheetNameSuffix) {\n                    sheetNameSuffix = sheetNameSuffix ? sheetNameSuffix : 1;\n                    var name = 'Sheet' + sheetNameSuffix;\n                    if (!that.sheetByName(name)) {\n                        return name;\n                    }\n                    return getUniqueSheetName(sheetNameSuffix + 1);\n                };\n                if (options.name && that.sheetByName(options.name)) {\n                    return;\n                }\n                this._sheetsSearchCache = {};\n                sheetName = options.name || getUniqueSheetName();\n                var sheet = new kendo.spreadsheet.Sheet(options.rows || this.options.rows, options.columns || this.options.columns, options.rowHeight || this.options.rowHeight, options.columnWidth || this.options.columnWidth, options.headerHeight || this.options.headerHeight, options.headerWidth || this.options.headerWidth, options.defaultCellStyle || this.options.defaultCellStyle);\n                sheet._workbook = this;\n                sheet._name(sheetName);\n                this._bindSheetEvents(sheet);\n                sheets.splice(insertIndex, 0, sheet);\n                if (options.data) {\n                    sheet.fromJSON(options.data);\n                }\n                if (options.dataSource) {\n                    sheet.setDataSource(options.dataSource);\n                }\n                this.trigger('change', { sheetSelection: true });\n                return sheet;\n            },\n            _bindSheetEvents: function (sheet) {\n                sheet.bind('change', this._sheetChange.bind(this));\n                sheet.bind('insertRow', this._sheetInsertRow.bind(this));\n                sheet.bind('insertColumn', this._sheetInsertColumn.bind(this));\n                sheet.bind('deleteRow', this._sheetDeleteRow.bind(this));\n                sheet.bind('deleteColumn', this._sheetDeleteColumn.bind(this));\n                sheet.bind('hideRow', this._sheetHideRow.bind(this));\n                sheet.bind('hideColumn', this._sheetHideColumn.bind(this));\n                sheet.bind('unhideRow', this._sheetUnhideRow.bind(this));\n                sheet.bind('unhideColumn', this._sheetUnhideColumn.bind(this));\n                sheet.bind('select', this._sheetSelect.bind(this));\n                sheet.bind('commandRequest', this._sheetCommandRequest.bind(this));\n            },\n            sheets: function () {\n                return this._sheets.slice();\n            },\n            sheetByName: function (sheetName) {\n                return this._sheets[this.sheetIndex(sheetName)];\n            },\n            sheetByIndex: function (index) {\n                return this._sheets[index];\n            },\n            sheetIndex: function (sheet) {\n                var sheets = this._sheets;\n                var sheetName = (typeof sheet == 'string' ? sheet : sheet.name()).toLowerCase();\n                var idx = this._sheetsSearchCache[sheetName];\n                if (idx >= 0) {\n                    return idx;\n                }\n                for (idx = 0; idx < sheets.length; idx++) {\n                    var name = sheets[idx].name().toLowerCase();\n                    this._sheetsSearchCache[name] = idx;\n                    if (name === sheetName) {\n                        return idx;\n                    }\n                }\n                return -1;\n            },\n            renameSheet: function (sheet, newSheetName) {\n                var oldSheetName = sheet.name().toLowerCase();\n                if (!newSheetName || oldSheetName === newSheetName.toLowerCase() || this.sheetByName(newSheetName)) {\n                    return;\n                }\n                sheet = this.sheetByName(oldSheetName);\n                if (!sheet) {\n                    return;\n                }\n                this._sheetsSearchCache = {};\n                if (this.trigger('renameSheet', {\n                        sheet: sheet,\n                        newSheetName: newSheetName\n                    })) {\n                    return;\n                }\n                this._sheets.forEach(function (sheet) {\n                    sheet._forFormulas(function (formula) {\n                        formula.renameSheet(oldSheetName, newSheetName);\n                    });\n                });\n                this.forEachName(function (def, name) {\n                    if (def.nameref.renameSheet(oldSheetName, newSheetName)) {\n                        this.undefineName(name);\n                        def.name = def.nameref.print();\n                        this.nameDefinition(def.name, def);\n                    }\n                    if (def.value instanceof Ref || def.value instanceof Formula) {\n                        def.value.renameSheet(oldSheetName, newSheetName);\n                    }\n                }.bind(this));\n                sheet._name(newSheetName);\n                this.trigger('change', { sheetSelection: true });\n                return sheet;\n            },\n            removeSheet: function (sheet) {\n                var that = this;\n                var sheets = that._sheets;\n                var name = sheet.name();\n                var index = that.sheetIndex(sheet);\n                if (sheets.length === 1) {\n                    return;\n                }\n                if (this.trigger('removeSheet', { sheet: sheet })) {\n                    return;\n                }\n                this._sheetsSearchCache = {};\n                if (index > -1) {\n                    sheet.unbind();\n                    sheets.splice(index, 1);\n                    if (that.activeSheet().name() === name) {\n                        var newSheet = sheets[index === sheets.length ? index - 1 : index];\n                        that.activeSheet(newSheet);\n                    } else {\n                        this.trigger('change', {\n                            recalc: true,\n                            sheetSelection: true\n                        });\n                    }\n                }\n            },\n            _clearSheets: function () {\n                for (var i = 0; i < this._sheets.length; i++) {\n                    this._sheets[i].unbind();\n                }\n                this._sheets = [];\n                this._sheetsSearchCache = {};\n                this._names = {};\n            },\n            fromJSON: function (json) {\n                if (json.sheets) {\n                    this._clearSheets();\n                    for (var idx = 0; idx < json.sheets.length; idx++) {\n                        var data = json.sheets[idx];\n                        var args = sheetParamsFromJSON(data, this.options);\n                        var sheet = this.insertSheet({\n                            rows: args.rowCount,\n                            columns: args.columnCount,\n                            rowHeight: args.rowHeight,\n                            columnWidth: args.columnWidth,\n                            headerHeight: args.headerHeight,\n                            headerWidth: args.headerWidth,\n                            data: data\n                        });\n                        if (data.dataSource) {\n                            sheet.setDataSource(data.dataSource);\n                        }\n                    }\n                }\n                if (json.activeSheet) {\n                    this.activeSheet(this.sheetByName(json.activeSheet));\n                } else {\n                    this.activeSheet(this._sheets[0]);\n                }\n                if (json.names) {\n                    json.names.forEach(function (def) {\n                        this.defineName(def.name, def.value, def.hidden);\n                    }, this);\n                }\n            },\n            toJSON: function () {\n                this.resetFormulas();\n                this.resetValidations();\n                var names = Object.keys(this._names).map(function (name) {\n                    var def = this._names[name];\n                    var val = def.value;\n                    if (val instanceof Ref || val instanceof Formula) {\n                        val = val.print(0, 0, true);\n                    } else if (val instanceof CalcError) {\n                        val = val + '';\n                    } else {\n                        val = JSON.stringify(val);\n                    }\n                    return {\n                        value: val,\n                        hidden: def.hidden,\n                        name: def.name,\n                        sheet: def.nameref.sheet,\n                        localName: def.nameref.name\n                    };\n                }, this);\n                return {\n                    activeSheet: this.activeSheet().name(),\n                    sheets: this._sheets.map(function (sheet) {\n                        sheet.recalc(this._context);\n                        sheet.revalidate(this._validationContext);\n                        return sheet.toJSON();\n                    }, this),\n                    names: names,\n                    columnWidth: this.options.columnWidth,\n                    rowHeight: this.options.rowHeight\n                };\n            },\n            fromFile: function (file) {\n                var deferred = new $.Deferred();\n                var promise = deferred.promise();\n                var args = {\n                    file: file,\n                    promise: promise\n                };\n                if (file && !this.trigger('excelImport', args)) {\n                    this._clearSheets();\n                    kendo.spreadsheet.readExcel(file, this, deferred);\n                } else {\n                    deferred.reject();\n                }\n                return promise;\n            },\n            saveAsExcel: function (options) {\n                options = $.extend({}, this.options.excel, options);\n                var data = this.toJSON();\n                if (!this.trigger('excelExport', { workbook: data })) {\n                    var workbook = new kendo.ooxml.Workbook(data);\n                    kendo.saveAs({\n                        dataURI: workbook.toDataURL(),\n                        fileName: data.fileName || options.fileName,\n                        proxyURL: options.proxyURL,\n                        forceProxy: options.forceProxy\n                    });\n                }\n            },\n            draw: function (options, callback) {\n                if (typeof options == 'function' && !callback) {\n                    callback = options;\n                    options = {};\n                }\n                var parts = [], sheets = this._sheets;\n                (function loop(i) {\n                    if (i < sheets.length) {\n                        sheets[i].draw(kendo.spreadsheet.SHEETREF, options, function (group) {\n                            parts.push(group);\n                            loop(i + 1);\n                        });\n                    } else {\n                        var group = parts[0];\n                        for (i = 1; i < parts.length; ++i) {\n                            group.children = group.children.concat(parts[i].children);\n                        }\n                        callback(group);\n                    }\n                }(0));\n            },\n            nameForRef: function (ref, sheet) {\n                if (sheet === undefined) {\n                    sheet = ref.sheet;\n                }\n                sheet = sheet.toLowerCase();\n                var str = ref + '';\n                for (var name in this._names) {\n                    var def = this._names[name];\n                    var val = def.value;\n                    if (val instanceof Ref) {\n                        if (!val.sheet || val.sheet && sheet == val.sheet.toLowerCase()) {\n                            if (val + '' == str) {\n                                return def;\n                            }\n                        }\n                    }\n                }\n                return { name: str };\n            },\n            defineName: function (name, value, hidden) {\n                var x = kendo.spreadsheet.calc.parseNameDefinition(name, value);\n                name = x.name.print();\n                this._names[name.toLowerCase()] = {\n                    value: x.value,\n                    hidden: hidden,\n                    name: name,\n                    nameref: x.name\n                };\n            },\n            undefineName: function (name) {\n                delete this._names[name.toLowerCase()];\n            },\n            nameValue: function (name) {\n                name = name.toLowerCase();\n                if (name in this._names) {\n                    return this._names[name].value;\n                }\n                return null;\n            },\n            nameDefinition: function (name, def) {\n                name = name.toLowerCase();\n                if (arguments.length > 1) {\n                    if (def === undefined) {\n                        delete this._names[name];\n                    } else {\n                        this._names[name] = def;\n                    }\n                }\n                return this._names[name];\n            },\n            forEachName: function (func) {\n                Object.keys(this._names).forEach(function (name) {\n                    func(this._names[name], name);\n                }, this);\n            },\n            adjustNames: function (affectedSheet, forRow, start, delta) {\n                affectedSheet = affectedSheet.toLowerCase();\n                Object.keys(this._names).forEach(function (name) {\n                    var def = this._names[name];\n                    var x = def.value;\n                    if (x instanceof Ref && x.sheet.toLowerCase() == affectedSheet) {\n                        def.value = x.adjust(null, null, null, null, forRow, start, delta);\n                    } else if (x instanceof Formula) {\n                        x.adjust(affectedSheet, forRow ? 'row' : 'col', start, delta);\n                    }\n                }, this);\n            },\n            options: {}\n        });\n        function sheetParamsFromJSON(data, options) {\n            function or(a, b, c) {\n                return a !== undefined ? a : b !== undefined ? b : c;\n            }\n            var rowCount = or(data.rowCount, options.rows, 200), columnCount = or(data.columnCount, options.columns, 50), rowHeight = or(data.rowHeight, options.rowHeight, 20), columnWidth = or(data.columnWidth, options.columnWidth, 64), headerHeight = or(data.headerHeight, options.headerHeight, 20), headerWidth = or(data.headerWidth, options.headerWidth, 32);\n            if (data.rows !== undefined) {\n                for (var i = 0; i < data.rows.length; ++i) {\n                    var row = data.rows[i];\n                    var ri = or(row.index, i);\n                    if (ri >= rowCount) {\n                        rowCount = ri + 1;\n                    }\n                    if (row.cells) {\n                        for (var j = 0; j < row.cells.length; ++j) {\n                            var cell = row.cells[j];\n                            var ci = or(cell.index, j);\n                            if (ci >= columnCount) {\n                                columnCount = ci + 1;\n                            }\n                        }\n                    }\n                }\n            }\n            return {\n                rowCount: rowCount,\n                columnCount: columnCount,\n                rowHeight: rowHeight,\n                columnWidth: columnWidth,\n                headerHeight: headerHeight,\n                headerWidth: headerWidth\n            };\n        }\n        kendo.spreadsheet.Workbook = Workbook;\n        if (kendo.PDFMixin) {\n            kendo.PDFMixin.extend(Workbook.prototype);\n            Workbook.prototype.saveAsPDF = function (options) {\n                var progress = new $.Deferred();\n                var promise = progress.promise();\n                var args = { promise: promise };\n                if (this.trigger('pdfExport', args)) {\n                    return;\n                }\n                this._drawPDF(options, progress).then(function (root) {\n                    return kendo.drawing.exportPDF(root);\n                }).done(function (dataURI) {\n                    kendo.saveAs({\n                        dataURI: dataURI,\n                        fileName: options.fileName,\n                        proxyURL: options.proxyURL,\n                        forceProxy: options.forceProxy,\n                        proxyTarget: options.proxyTarget\n                    });\n                    progress.resolve();\n                }).fail(function (err) {\n                    progress.reject(err);\n                });\n                return promise;\n            };\n            Workbook.prototype._drawPDF = function (options) {\n                var result = new $.Deferred();\n                var callback = function (group) {\n                    result.resolve(group);\n                };\n                switch (options.area) {\n                case 'workbook':\n                    options.workbook.draw(options, callback);\n                    break;\n                case 'sheet':\n                    options.workbook.activeSheet().draw(options, callback);\n                    break;\n                case 'selection':\n                    options.workbook.activeSheet().selection().draw(options, callback);\n                    break;\n                }\n                return result.promise();\n            };\n        }\n    }(kendo));\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('spreadsheet/formulacontext', ['kendo.core'], f);\n}(function () {\n    if (kendo.support.browser.msie && kendo.support.browser.version < 9) {\n        return;\n    }\n    var spreadsheet = kendo.spreadsheet;\n    var CellRef = spreadsheet.CellRef;\n    var RangeRef = spreadsheet.RangeRef;\n    var UnionRef = spreadsheet.UnionRef;\n    var NameRef = spreadsheet.NameRef;\n    var Ref = spreadsheet.Ref;\n    var FormulaContext = kendo.Class.extend({\n        init: function (workbook) {\n            this.workbook = workbook;\n        },\n        getRefCells: function (ref, hiddenInfo, fsheet, frow, fcol) {\n            var sheet, formula, value, i;\n            if (ref instanceof CellRef) {\n                sheet = this.workbook.sheetByName(ref.sheet);\n                if (!sheet || !ref.valid()) {\n                    return [{ value: new kendo.spreadsheet.calc.runtime.CalcError('REF') }];\n                }\n                formula = sheet.formula(ref);\n                value = sheet.range(ref.row, ref.col).value();\n                if (formula != null || value != null) {\n                    return [{\n                            formula: formula,\n                            value: value,\n                            row: ref.row,\n                            col: ref.col,\n                            sheet: ref.sheet,\n                            hidden: hiddenInfo ? sheet.columnWidth(ref.col) === 0 || sheet.rowHeight(ref.row) === 0 : false\n                        }];\n                } else {\n                    return [];\n                }\n            }\n            if (ref instanceof RangeRef) {\n                i = this.workbook.sheetIndex(ref.sheet);\n                var states = [], n = i;\n                if (ref.endSheet) {\n                    n = this.workbook.sheetIndex(ref.endSheet);\n                    if (i > n) {\n                        var tmp = i;\n                        i = n;\n                        n = tmp;\n                    }\n                }\n                if (i < 0 || n < 0 || !ref.valid()) {\n                    return [{ value: new kendo.spreadsheet.calc.runtime.CalcError('REF') }];\n                }\n                while (i <= n) {\n                    sheet = this.workbook.sheetByIndex(i++);\n                    var tl = sheet._grid.normalize(ref.topLeft);\n                    var br = sheet._grid.normalize(ref.bottomRight);\n                    var startCellIndex = sheet._grid.cellRefIndex(tl);\n                    var endCellIndex = sheet._grid.cellRefIndex(br);\n                    var values = sheet._properties.iterator('value', startCellIndex, endCellIndex);\n                    for (var col = tl.col; col <= br.col; ++col) {\n                        for (var row = tl.row; row <= br.row; ++row) {\n                            var index = sheet._grid.index(row, col);\n                            formula = sheet._properties.get('formula', index);\n                            value = values.at(index);\n                            if (formula != null || value != null) {\n                                states.push({\n                                    formula: formula,\n                                    value: value,\n                                    row: row,\n                                    col: col,\n                                    sheet: sheet.name(),\n                                    hidden: hiddenInfo ? sheet.columnWidth(col) === 0 || sheet.rowHeight(row) === 0 : false\n                                });\n                            }\n                        }\n                    }\n                }\n                return states;\n            }\n            if (ref instanceof UnionRef) {\n                var a = [];\n                for (i = 0; i < ref.refs.length; ++i) {\n                    a = a.concat(this.getRefCells(ref.refs[i], hiddenInfo, fsheet, frow, fcol));\n                }\n                return a;\n            }\n            if (ref instanceof NameRef) {\n                var val = this.nameValue(ref, fsheet, frow, fcol);\n                if (val instanceof Ref) {\n                    return this.getRefCells(val, hiddenInfo, fsheet, frow, fcol);\n                }\n                return [{ value: val == null ? new kendo.spreadsheet.calc.runtime.CalcError('NAME') : val }];\n            }\n            return [];\n        },\n        nameValue: function (ref, fsheet, frow, fcol) {\n            var val;\n            if (ref.hasSheet()) {\n                val = this.workbook.nameValue(ref.print());\n            } else {\n                ref = ref.clone().setSheet(fsheet, true);\n                val = this.workbook.nameValue(ref.print());\n                if (val == null) {\n                    val = this.workbook.nameValue(ref.name);\n                }\n            }\n            if (val instanceof Ref) {\n                val = val.absolute(frow, fcol);\n            }\n            return val;\n        },\n        getData: function (ref, fsheet, frow, fcol) {\n            var single = ref instanceof CellRef;\n            if (ref instanceof NameRef) {\n                single = this.workbook.nameValue(ref.name) instanceof CellRef;\n            }\n            var data = this.getRefCells(ref, false, fsheet, frow, fcol).map(function (cell) {\n                var val = cell.value;\n                if (val instanceof kendo.spreadsheet.calc.runtime.Formula) {\n                    val = val.value;\n                }\n                return val;\n            });\n            return single ? data[0] : data;\n        },\n        onFormula: function (f) {\n            var sheet = this.workbook.sheetByName(f.sheet);\n            var row = f.row, col = f.col, value = f.value;\n            var currentFormula = sheet.formula({\n                row: row,\n                col: col\n            });\n            if (currentFormula !== f) {\n                return false;\n            }\n            if (value instanceof Ref) {\n                value = this.getData(value, f.sheet, row, col);\n                if (Array.isArray(value)) {\n                    value = value[0];\n                }\n                if (value === undefined) {\n                    value = null;\n                }\n            }\n            if (value instanceof kendo.spreadsheet.calc.runtime.Matrix) {\n                value.each(function (value, r, c) {\n                    sheet._value(row + r, col + c, value);\n                });\n            } else {\n                sheet._value(row, col, value);\n            }\n            clearTimeout(sheet._formulaContextRefresh);\n            sheet._formulaContextRefresh = setTimeout(function () {\n                sheet.batch(function () {\n                }, { layout: true });\n            }, 50);\n            return true;\n        }\n    });\n    var ValidationFormulaContext = FormulaContext.extend({\n        onFormula: function () {\n            return true;\n        }\n    });\n    spreadsheet.FormulaContext = FormulaContext;\n    spreadsheet.ValidationFormulaContext = ValidationFormulaContext;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('spreadsheet/controller', ['kendo.core'], f);\n}(function () {\n    (function (kendo) {\n        'use strict';\n        if (kendo.support.browser.msie && kendo.support.browser.version < 9) {\n            return;\n        }\n        var $ = kendo.jQuery;\n        var alphaNumRegExp = /:alphanum$/;\n        var ACTIONS = {\n            'up': 'up',\n            'down': 'down',\n            'left': 'left',\n            'right': 'right',\n            'home': 'first-col',\n            'ctrl+left': 'first-col',\n            'end': 'last-col',\n            'ctrl+right': 'last-col',\n            'ctrl+up': 'first-row',\n            'ctrl+down': 'last-row',\n            'ctrl+home': 'first',\n            'ctrl+end': 'last',\n            'pageup': 'prev-page',\n            'pagedown': 'next-page'\n        };\n        var ENTRY_ACTIONS = {\n            'tab': 'next',\n            'shift+tab': 'previous',\n            'enter': 'lower',\n            'shift+enter': 'upper',\n            'delete': 'clearContents',\n            'backspace': 'clearContents',\n            'shift+:alphanum': 'edit',\n            ':alphanum': 'edit',\n            'ctrl+:alphanum': 'ctrl',\n            'alt+ctrl+:alphanum': 'edit',\n            ':edit': 'edit'\n        };\n        var CONTAINER_EVENTS = {\n            'wheel': 'onWheel',\n            '*+mousedown': 'onMouseDown',\n            'contextmenu': 'onContextMenu',\n            '*+mousedrag': 'onMouseDrag',\n            '*+mouseup': 'onMouseUp',\n            '*+dblclick': 'onDblClick',\n            'mousemove': 'onMouseMove'\n        };\n        var CLIPBOARD_EVENTS = {\n            '*+pageup': 'onPageUp',\n            '*+pagedown': 'onPageDown',\n            'mouseup': 'onMouseUp',\n            '*+cut': 'onCut',\n            '*+paste': 'onPaste',\n            '*+copy': 'onCopy'\n        };\n        var EDITOR_EVENTS = {\n            'esc': 'onEditorEsc',\n            'enter': 'onEditorBlur',\n            'alt+enter': 'insertNewline',\n            'shift+enter': 'onEditorBlur',\n            'tab': 'onEditorBlur',\n            'shift+tab': 'onEditorBlur'\n        };\n        var FORMULABAR_EVENTS = $.extend({ focus: 'onEditorBarFocus' }, EDITOR_EVENTS);\n        var FORMULAINPUT_EVENTS = $.extend({ focus: 'onEditorCellFocus' }, EDITOR_EVENTS);\n        var SELECTION_MODES = {\n            cell: 'range',\n            rowheader: 'row',\n            columnheader: 'column',\n            topcorner: 'sheet',\n            autofill: 'autofill'\n        };\n        function toActionSelector(selectors) {\n            return selectors.map(function (action) {\n                return '[data-action=\"' + action + '\"]';\n            }).join(',');\n        }\n        var COMPOSITE_UNAVAILABLE_ACTION_SELECTORS = toActionSelector([\n            'cut',\n            'copy',\n            'paste',\n            'insert-left',\n            'insert-right',\n            'insert-above',\n            'insert-below'\n        ]);\n        var UNHIDE_ACTION_SELECTORS = toActionSelector([\n            'unhide-row',\n            'unhide-column'\n        ]);\n        var ACTION_KEYS = [];\n        var SHIFT_ACTION_KEYS = [];\n        var ENTRY_ACTION_KEYS = [];\n        for (var key in ACTIONS) {\n            ACTION_KEYS.push(key);\n            SHIFT_ACTION_KEYS.push('shift+' + key);\n        }\n        for (key in ENTRY_ACTIONS) {\n            ENTRY_ACTION_KEYS.push(key);\n        }\n        CLIPBOARD_EVENTS[ACTION_KEYS] = 'onAction';\n        CLIPBOARD_EVENTS[SHIFT_ACTION_KEYS] = 'onShiftAction';\n        CLIPBOARD_EVENTS[ENTRY_ACTION_KEYS] = 'onEntryAction';\n        FORMULAINPUT_EVENTS[ACTION_KEYS] = 'onEditorAction';\n        FORMULAINPUT_EVENTS[SHIFT_ACTION_KEYS] = 'onEditorShiftAction';\n        var Controller = kendo.Class.extend({\n            init: function (view, workbook) {\n                this.view = view;\n                this.workbook(workbook);\n                this.container = $(view.container);\n                this.clipboardElement = $(view.clipboard);\n                this.cellContextMenu = view.cellContextMenu;\n                this.rowHeaderContextMenu = view.rowHeaderContextMenu;\n                this.colHeaderContextMenu = view.colHeaderContextMenu;\n                this.scroller = view.scroller;\n                this.tabstrip = view.tabstrip;\n                this.sheetsbar = view.sheetsbar;\n                view.nameEditor.bind('enter', this.onNameEditorEnter.bind(this));\n                view.nameEditor.bind('cancel', this.onNameEditorCancel.bind(this));\n                view.nameEditor.bind('select', this.onNameEditorSelect.bind(this));\n                view.nameEditor.bind('delete', this.onNameEditorDelete.bind(this));\n                this.editor = view.editor;\n                this.editor.bind('change', this.onEditorChange.bind(this));\n                this.editor.bind('activate', this.onEditorActivate.bind(this));\n                this.editor.bind('deactivate', this.onEditorDeactivate.bind(this));\n                this.editor.bind('update', this.onEditorUpdate.bind(this));\n                $(view.scroller).on('scroll', this.onScroll.bind(this));\n                this.listener = new kendo.spreadsheet.EventListener(this.container, this, CONTAINER_EVENTS);\n                this._enableEditorEvents();\n                if (this.sheetsbar) {\n                    this.sheetsbar.bind('select', this.onSheetBarSelect.bind(this));\n                    this.sheetsbar.bind('reorder', this.onSheetBarReorder.bind(this));\n                    this.sheetsbar.bind('rename', this.onSheetBarRename.bind(this));\n                    this.sheetsbar.bind('remove', this.onSheetBarRemove.bind(this));\n                }\n                this.cellContextMenu.bind('select', this.onContextMenuSelect.bind(this));\n                this.rowHeaderContextMenu.bind('select', this.onContextMenuSelect.bind(this));\n                this.colHeaderContextMenu.bind('select', this.onContextMenuSelect.bind(this));\n                this.cellContextMenu.element.add(this.rowHeaderContextMenu.element).add(this.colHeaderContextMenu.element).on('contextmenu', false);\n                if (this.tabstrip) {\n                    this.tabstrip.bind('action', this.onCommandRequest.bind(this));\n                    this.tabstrip.bind('dialog', this.onDialogRequest.bind(this));\n                }\n            },\n            _enableEditorEvents: function (enable) {\n                if (enable === undefined || enable) {\n                    this.keyListener = new kendo.spreadsheet.EventListener(this.clipboardElement, this, CLIPBOARD_EVENTS);\n                    this.barKeyListener = new kendo.spreadsheet.EventListener(this.editor.barElement(), this, FORMULABAR_EVENTS);\n                    this.inputKeyListener = new kendo.spreadsheet.EventListener(this.editor.cellElement(), this, FORMULAINPUT_EVENTS);\n                } else {\n                    this.keyListener.destroy();\n                    this.barKeyListener.destroy();\n                    this.inputKeyListener.destroy();\n                }\n            },\n            _execute: function (options) {\n                var result = this._workbook.execute(options);\n                if (options.command === 'EditCommand' && !result) {\n                    this._workbook.trigger('change', { editorClose: true });\n                }\n                if (result) {\n                    this._preventNavigation = true;\n                    if (result.reason === 'error') {\n                        this.view.showError(result, function () {\n                            this.activateEditor();\n                            this.editor.value(this._lastEditorValue);\n                            this.editor._value = this._workbook._inputForRef(this._workbook.activeSheet()._viewActiveCell());\n                            this.editor.select();\n                        }.bind(this));\n                    } else {\n                        this.view.openDialog(result.reason);\n                    }\n                }\n                return result;\n            },\n            _activeTooltip: function () {\n                return this._workbook.activeSheet().activeCell().simplify().toString();\n            },\n            onContextMenuSelect: function (e) {\n                var action = $(e.item).data('action');\n                var command;\n                switch (action) {\n                case 'cut':\n                    command = {\n                        command: 'ToolbarCutCommand',\n                        options: { workbook: this._workbook }\n                    };\n                    break;\n                case 'copy':\n                    command = {\n                        command: 'ToolbarCopyCommand',\n                        options: { workbook: this._workbook }\n                    };\n                    break;\n                case 'paste':\n                    command = {\n                        command: 'ToolbarPasteCommand',\n                        options: { workbook: this._workbook }\n                    };\n                    break;\n                case 'unmerge':\n                    command = {\n                        command: 'MergeCellCommand',\n                        options: { value: 'unmerge' }\n                    };\n                    break;\n                case 'merge':\n                    this.view.openDialog('merge');\n                    break;\n                case 'hide-row':\n                    command = {\n                        command: 'HideLineCommand',\n                        options: { axis: 'row' }\n                    };\n                    break;\n                case 'hide-column':\n                    command = {\n                        command: 'HideLineCommand',\n                        options: { axis: 'column' }\n                    };\n                    break;\n                case 'unhide-row':\n                    command = {\n                        command: 'UnHideLineCommand',\n                        options: { axis: 'row' }\n                    };\n                    break;\n                case 'unhide-column':\n                    command = {\n                        command: 'UnHideLineCommand',\n                        options: { axis: 'column' }\n                    };\n                    break;\n                case 'delete-row':\n                    command = { command: 'DeleteRowCommand' };\n                    break;\n                case 'delete-column':\n                    command = { command: 'DeleteColumnCommand' };\n                    break;\n                }\n                if (command) {\n                    this._execute(command);\n                }\n            },\n            onSheetBarRemove: function (e) {\n                var sheet = this._workbook.sheetByName(e.name);\n                if (!sheet) {\n                    return;\n                }\n                this._workbook.removeSheet(sheet);\n            },\n            destroy: function () {\n                this.listener.destroy();\n                this._enableEditorEvents(false);\n                this.keyListener.destroy();\n                this.inputKeyListener.destroy();\n            },\n            onSheetBarSelect: function (e) {\n                var sheet;\n                var workbook = this._workbook;\n                if (e.isAddButton) {\n                    if (this._workbook.trigger('insertSheet')) {\n                        return;\n                    }\n                    sheet = workbook.insertSheet();\n                } else {\n                    sheet = workbook.sheetByName(e.name);\n                }\n                if (workbook.activeSheet().name() !== sheet.name()) {\n                    if (this._workbook.trigger('selectSheet', { sheet: sheet })) {\n                        return;\n                    }\n                    workbook.activeSheet(sheet);\n                }\n            },\n            onSheetBarReorder: function (e) {\n                var sheet = this._workbook.sheetByIndex(e.oldIndex);\n                this._workbook.moveSheetToIndex(sheet, e.newIndex);\n                this._workbook.activeSheet(sheet);\n            },\n            onSheetBarRename: function (e) {\n                var sheet = this._workbook.sheetByIndex(e.sheetIndex);\n                if (this._workbook.sheetByName(e.name)) {\n                    this.view.showError({\n                        reason: 'error',\n                        type: 'duplicateSheetName'\n                    });\n                    return;\n                }\n                this._workbook.renameSheet(sheet, e.name);\n                this.clipboardElement.focus();\n            },\n            sheet: function (sheet) {\n                this.navigator = sheet.navigator();\n                this.axisManager = sheet.axisManager();\n            },\n            workbook: function (workbook) {\n                this._workbook = workbook;\n                this.clipboard = workbook.clipboard();\n                workbook.bind('commandRequest', this.onCommandRequest.bind(this));\n            },\n            refresh: function () {\n                var editor = this.editor;\n                var workbook = this._workbook;\n                var sheet = workbook.activeSheet();\n                this._viewPortHeight = this.view.scroller.clientHeight;\n                this.navigator.height(this._viewPortHeight);\n                if (!editor.isActive() && !this.isEditorDisabled) {\n                    editor.enable(sheet.selection().enable() !== false);\n                    editor.value(workbook._inputForRef(sheet.activeCell()));\n                }\n                var ref = sheet.selection()._ref.simplify();\n                var def = this._workbook.nameForRef(ref, sheet.name());\n                this.view.nameEditor.value(def.name);\n            },\n            onScroll: function () {\n                this.view.render();\n            },\n            onWheel: function (event) {\n                var deltaX = event.originalEvent.deltaX;\n                var deltaY = event.originalEvent.deltaY;\n                if (event.originalEvent.deltaMode === 1) {\n                    deltaX *= 10;\n                    deltaY *= 10;\n                }\n                this.scrollWith(deltaX, deltaY);\n                event.preventDefault();\n            },\n            onAction: function (event, action) {\n                this.navigator.moveActiveCell(ACTIONS[action]);\n                event.preventDefault();\n            },\n            onPageUp: function () {\n                this.scrollDown(-this._viewPortHeight);\n            },\n            onPageDown: function () {\n                this.scrollDown(this._viewPortHeight);\n            },\n            onEntryAction: function (event, action) {\n                if (event.mod) {\n                    var shouldPrevent = true;\n                    var key = String.fromCharCode(event.keyCode);\n                    switch (key) {\n                    case 'A':\n                        this.navigator.selectAll();\n                        break;\n                    case 'Y':\n                        this._workbook.undoRedoStack.redo();\n                        break;\n                    case 'Z':\n                        this._workbook.undoRedoStack.undo();\n                        break;\n                    default:\n                        shouldPrevent = false;\n                        break;\n                    }\n                    if (shouldPrevent) {\n                        event.preventDefault();\n                    }\n                } else {\n                    var disabled = this._workbook.activeSheet().selection().enable() === false;\n                    if (action == 'delete' || action == 'backspace') {\n                        if (!disabled) {\n                            this._execute({ command: 'ClearContentCommand' });\n                        }\n                        event.preventDefault();\n                    } else if (alphaNumRegExp.test(action) || action === ':edit') {\n                        if (disabled) {\n                            event.preventDefault();\n                            return;\n                        }\n                        if (action !== ':edit') {\n                            this.editor.value('');\n                        }\n                        this.activateEditor();\n                    } else {\n                        this.navigator.navigateInSelection(ENTRY_ACTIONS[action]);\n                        event.preventDefault();\n                    }\n                }\n            },\n            onShiftAction: function (event, action) {\n                this.navigator.modifySelection(ACTIONS[action.replace('shift+', '')], this.appendSelection);\n                event.preventDefault();\n            },\n            onMouseMove: function (event) {\n                var sheet = this._workbook.activeSheet();\n                if (sheet.resizingInProgress() || sheet.selectionInProgress()) {\n                    return;\n                }\n                var object = this.objectAt(event);\n                if (object.type === 'columnresizehandle' || object.type === 'rowresizehandle') {\n                    sheet.positionResizeHandle(object.ref);\n                } else {\n                    sheet.removeResizeHandle();\n                }\n            },\n            onMouseDown: function (event) {\n                var object = this.objectAt(event);\n                if (object.pane) {\n                    this.originFrame = object.pane;\n                }\n                if (object.type === 'editor') {\n                    this.onEditorEsc();\n                    this.openCustomEditor();\n                    event.preventDefault();\n                    return;\n                }\n                if (this.editor.canInsertRef(false) && object.ref) {\n                    this._workbook.activeSheet()._setFormulaSelections(this.editor.highlightedRefs());\n                    this.navigator.startSelection(object.ref, this._selectionMode, this.appendSelection, event.shiftKey);\n                    event.preventDefault();\n                    return;\n                } else {\n                    this._preventNavigation = false;\n                    this.editor.deactivate();\n                    if (this._preventNavigation) {\n                        return;\n                    }\n                }\n                var sheet = this._workbook.activeSheet();\n                if (object.type === 'columnresizehandle' || object.type === 'rowresizehandle') {\n                    sheet.startResizing({\n                        x: object.x,\n                        y: object.y\n                    });\n                    event.preventDefault();\n                    return;\n                }\n                if (object.type === 'filtericon') {\n                    this.openFilterMenu(event);\n                    event.preventDefault();\n                    return;\n                }\n                this._selectionMode = SELECTION_MODES[object.type];\n                this.appendSelection = event.mod;\n                this.navigator.startSelection(object.ref, this._selectionMode, this.appendSelection, event.shiftKey);\n            },\n            onContextMenu: function (event) {\n                var sheet = this._workbook.activeSheet();\n                if (sheet.resizingInProgress()) {\n                    return;\n                }\n                event.preventDefault();\n                this.cellContextMenu.close();\n                this.colHeaderContextMenu.close();\n                this.rowHeaderContextMenu.close();\n                var menu;\n                var object = this.objectAt(event);\n                if (object.type === 'columnresizehandle' || object.type === 'rowresizehandle') {\n                    return;\n                }\n                this.navigator.selectForContextMenu(object.ref, SELECTION_MODES[object.type]);\n                var isComposite = this.navigator._sheet.select() instanceof kendo.spreadsheet.UnionRef;\n                var showUnhide = false;\n                var showUnmerge = false;\n                if (object.type == 'columnheader') {\n                    menu = this.colHeaderContextMenu;\n                    showUnhide = !isComposite && this.axisManager.selectionIncludesHiddenColumns();\n                } else if (object.type == 'rowheader') {\n                    menu = this.rowHeaderContextMenu;\n                    showUnhide = !isComposite && this.axisManager.selectionIncludesHiddenRows();\n                } else {\n                    menu = this.cellContextMenu;\n                    showUnmerge = this.navigator.selectionIncludesMergedCells();\n                }\n                menu.element.find(COMPOSITE_UNAVAILABLE_ACTION_SELECTORS).toggle(!isComposite);\n                menu.element.find(UNHIDE_ACTION_SELECTORS).toggle(showUnhide);\n                menu.element.find('[data-action=unmerge]').toggle(showUnmerge);\n                setTimeout(function () {\n                    menu.open(event.pageX, event.pageY);\n                });\n            },\n            prevent: function (event) {\n                event.preventDefault();\n            },\n            constrainResize: function (type, ref) {\n                var sheet = this._workbook.activeSheet();\n                var resizeHandle = sheet.resizeHandlePosition();\n                return !resizeHandle || type === 'outside' || type === 'topcorner' || ref.col < resizeHandle.col || ref.row < resizeHandle.row;\n            },\n            onMouseDrag: function (event) {\n                if (this._selectionMode === 'sheet') {\n                    return;\n                }\n                var location = {\n                    clientX: event.clientX,\n                    clientY: event.clientY\n                };\n                var object = this.objectAt(location);\n                var sheet = this._workbook.activeSheet();\n                if (sheet.resizingInProgress()) {\n                    if (!this.constrainResize(object.type, object.ref)) {\n                        sheet.resizeHintPosition({\n                            x: object.x,\n                            y: object.y\n                        });\n                    }\n                    return;\n                }\n                if (object.type === 'outside') {\n                    this.startAutoScroll(object);\n                    return;\n                }\n                if (this.originFrame === object.pane) {\n                    this.selectToLocation(location);\n                } else {\n                    var frame = this.originFrame._grid;\n                    if (object.x > frame.right) {\n                        this.scrollLeft();\n                    }\n                    if (object.y > frame.bottom) {\n                        this.scrollTop();\n                    }\n                    if (object.y < frame.top || object.x < frame.left) {\n                        this.startAutoScroll(object, location);\n                    } else {\n                        this.selectToLocation(location);\n                    }\n                }\n                event.preventDefault();\n            },\n            onMouseUp: function (event) {\n                var sheet = this._workbook.activeSheet();\n                sheet.completeResizing();\n                this.navigator.completeSelection();\n                this.stopAutoScroll();\n                var editor = this.editor.activeEditor();\n                if (!editor) {\n                    return;\n                }\n                var el = event.target;\n                while (el) {\n                    if (el === editor.element[0]) {\n                        return;\n                    }\n                    el = el.parentNode;\n                }\n                var object = this.objectAt(event);\n                if (object && object.ref && editor.canInsertRef(false)) {\n                    editor.refAtPoint(sheet);\n                    sheet._setFormulaSelections(editor.highlightedRefs());\n                }\n            },\n            onDblClick: function (event) {\n                var object = this.objectAt(event);\n                var disabled = this._workbook.activeSheet().selection().enable() === false;\n                if (object.type !== 'cell' || disabled) {\n                    return;\n                }\n                this.editor.activate({\n                    range: this._workbook.activeSheet().selection(),\n                    rect: this.view.activeCellRectangle(),\n                    tooltip: this._activeTooltip()\n                }).focus();\n                this.onEditorUpdate();\n            },\n            onCut: function (e) {\n                if (e) {\n                    var table = this.clipboardElement.find('table.kendo-clipboard-' + this.clipboard._uid).detach();\n                    this.clipboardElement.append(table.clone(false));\n                    setTimeout(function () {\n                        this.clipboardElement.empty().append(table);\n                    }.bind(this));\n                }\n                this._execute({\n                    command: 'CutCommand',\n                    options: {\n                        workbook: this.view._workbook,\n                        event: e.originalEvent || e\n                    }\n                });\n            },\n            clipBoardValue: function () {\n                return this.clipboardElement.html();\n            },\n            onPaste: function (e) {\n                var html = '';\n                var plain = '';\n                this.clipboard.menuInvoked = e === undefined;\n                if (e) {\n                    if (e.originalEvent.clipboardData && e.originalEvent.clipboardData.getData) {\n                        e.preventDefault();\n                        var hasHTML = false;\n                        var hasPlainText = false;\n                        if (window.DOMStringList && e.originalEvent.clipboardData.types instanceof window.DOMStringList) {\n                            hasHTML = e.originalEvent.clipboardData.types.contains('text/html');\n                            hasPlainText = e.originalEvent.clipboardData.types.contains('text/plain');\n                        } else {\n                            hasHTML = /text\\/html/.test(e.originalEvent.clipboardData.types);\n                            hasPlainText = /text\\/plain/.test(e.originalEvent.clipboardData.types);\n                        }\n                        if (hasHTML) {\n                            html = e.originalEvent.clipboardData.getData('text/html');\n                        }\n                        if (hasPlainText) {\n                            plain = e.originalEvent.clipboardData.getData('text/plain').trim();\n                        }\n                    } else {\n                        var table = this.clipboardElement.find('table.kendo-clipboard-' + this.clipboard._uid).detach();\n                        this.clipboardElement.empty();\n                        setTimeout(function () {\n                            var html = this.clipboardElement.html();\n                            var plain = window.clipboardData.getData('Text').trim();\n                            if (!html && !plain) {\n                                return;\n                            }\n                            this.clipboard.external({\n                                html: html,\n                                plain: plain\n                            });\n                            this.clipboardElement.empty().append(table);\n                            this._execute({\n                                command: 'PasteCommand',\n                                options: {\n                                    workbook: this.view._workbook,\n                                    event: e.originalEvent || e\n                                }\n                            });\n                            this.clipboard.menuInvoked = true;\n                        }.bind(this));\n                        return;\n                    }\n                } else {\n                    if (kendo.support.browser.msie) {\n                        this.clipboardElement.focus().select();\n                        document.execCommand('paste');\n                        return;\n                    } else {\n                        this.clipboard.menuInvoked = true;\n                    }\n                }\n                if (!html && !plain) {\n                    return;\n                }\n                this.clipboard.external({\n                    html: html,\n                    plain: plain\n                });\n                this._execute({\n                    command: 'PasteCommand',\n                    options: {\n                        workbook: this.view._workbook,\n                        event: e.originalEvent || e\n                    }\n                });\n            },\n            onCopy: function (e) {\n                this.clipboard.menuInvoked = e === undefined;\n                this._execute({\n                    command: 'CopyCommand',\n                    options: {\n                        workbook: this.view._workbook,\n                        event: e.originalEvent || e\n                    }\n                });\n            },\n            scrollTop: function () {\n                this.scroller.scrollTop = 0;\n            },\n            scrollLeft: function () {\n                this.scroller.scrollLeft = 0;\n            },\n            scrollDown: function (value) {\n                this.scroller.scrollTop += value;\n            },\n            scrollRight: function (value) {\n                this.scroller.scrollLeft += value;\n            },\n            scrollWith: function (right, down) {\n                this.scroller.scrollTop += down;\n                this.scroller.scrollLeft += right;\n            },\n            objectAt: function (location) {\n                var box = this.container[0].getBoundingClientRect();\n                return this.view.objectAt(location.clientX - box.left, location.clientY - box.top);\n            },\n            selectToLocation: function (cellLocation) {\n                var object = this.objectAt(cellLocation);\n                if (object.pane) {\n                    this.extendSelection(object);\n                    this.lastKnownCellLocation = cellLocation;\n                    this.originFrame = object.pane;\n                }\n                this.stopAutoScroll();\n            },\n            extendSelection: function (object) {\n                this.navigator.extendSelection(object.ref, this._selectionMode, this.appendSelection);\n            },\n            autoScroll: function () {\n                var x = this._autoScrollTarget.x;\n                var y = this._autoScrollTarget.y;\n                var boundaries = this.originFrame._grid;\n                var scroller = this.view.scroller;\n                var scrollStep = 8;\n                var scrollLeft = scroller.scrollLeft;\n                var scrollTop = scroller.scrollTop;\n                if (x < boundaries.left) {\n                    this.scrollRight(-scrollStep);\n                }\n                if (x > boundaries.right) {\n                    this.scrollRight(scrollStep);\n                }\n                if (y < boundaries.top) {\n                    this.scrollDown(-scrollStep);\n                }\n                if (y > boundaries.bottom) {\n                    this.scrollDown(scrollStep);\n                }\n                if (scrollTop === scroller.scrollTop && scrollLeft === scroller.scrollLeft) {\n                    this.selectToLocation(this.finalLocation);\n                } else {\n                    this.extendSelection(this.objectAt(this.lastKnownCellLocation));\n                }\n            },\n            startAutoScroll: function (viewObject, location) {\n                if (!this._scrollInterval) {\n                    this._scrollInterval = setInterval(this.autoScroll.bind(this), 50);\n                }\n                this.finalLocation = location || this.lastKnownCellLocation;\n                this._autoScrollTarget = viewObject;\n            },\n            stopAutoScroll: function () {\n                clearInterval(this._scrollInterval);\n                this._scrollInterval = null;\n            },\n            openCustomEditor: function () {\n                this.view.openCustomEditor();\n            },\n            openFilterMenu: function (event) {\n                var object = this.objectAt(event);\n                var sheet = this._workbook.activeSheet();\n                var column = sheet.filterColumn(object.ref);\n                var filterMenu = this.view.createFilterMenu(column);\n                filterMenu.bind('action', this.onCommandRequest.bind(this));\n                filterMenu.bind('action', filterMenu.close.bind(filterMenu));\n                filterMenu.openFor(event.target);\n            },\n            onEditorChange: function (e) {\n                var sheet = e.range._sheet;\n                if (this._workbook.activeSheet() !== sheet) {\n                    this._workbook.activeSheet()._setFormulaSelections();\n                    this._workbook.activeSheet(sheet);\n                }\n                sheet.isInEditMode(false);\n                this._lastEditorValue = e.value;\n                this._execute({\n                    command: 'EditCommand',\n                    options: {\n                        operatingRange: e.range,\n                        value: e.value\n                    }\n                });\n            },\n            onEditorActivate: function () {\n                var workbook = this._workbook;\n                var sheet = workbook.activeSheet();\n                sheet._setFormulaSelections(this.editor.highlightedRefs());\n                sheet.isInEditMode(true);\n            },\n            onEditorDeactivate: function () {\n                var sheet = this._workbook.activeSheet();\n                sheet.isInEditMode(false);\n                sheet._setFormulaSelections([]);\n            },\n            onEditorUpdate: function () {\n                this._workbook.activeSheet()._setFormulaSelections(this.editor.highlightedRefs());\n            },\n            onEditorBarFocus: function () {\n                var disabled = this._workbook.activeSheet().selection().enable() === false;\n                if (disabled) {\n                    return;\n                }\n                this.editor.activate({\n                    range: this._workbook.activeSheet().selection(),\n                    rect: this.view.activeCellRectangle(),\n                    tooltip: this._activeTooltip()\n                });\n            },\n            onEditorCellFocus: function () {\n                this.editor.scale();\n            },\n            onEditorEsc: function () {\n                this.resetEditorValue();\n                this.editor.deactivate();\n                this.clipboardElement.focus();\n            },\n            insertNewline: function (e) {\n                e.preventDefault();\n                this.editor.insertNewline();\n            },\n            onEditorBlur: function (_, action) {\n                if (this.editor.isFiltered()) {\n                    return;\n                }\n                this._preventNavigation = false;\n                this.editor.deactivate();\n                if (!this._preventNavigation) {\n                    this.clipboardElement.focus();\n                    this.navigator.navigateInSelection(ENTRY_ACTIONS[action]);\n                }\n            },\n            onEditorAction: function (event, action) {\n                var editor = this.editor;\n                var sheet = this._workbook.activeSheet();\n                if (editor.canInsertRef(true)) {\n                    this.navigator.moveActiveCell(ACTIONS[action]);\n                    editor.activeEditor().refAtPoint(sheet);\n                    sheet._setFormulaSelections(editor.highlightedRefs());\n                    event.preventDefault();\n                }\n            },\n            onEditorShiftAction: function (event, action) {\n                var editor = this.editor;\n                var sheet = this._workbook.activeSheet();\n                if (editor.canInsertRef(true)) {\n                    this.navigator.modifySelection(ACTIONS[action.replace('shift+', '')], this.appendSelection);\n                    editor.activeEditor().refAtPoint(sheet);\n                    sheet._setFormulaSelections(editor.highlightedRefs());\n                    event.preventDefault();\n                }\n            },\n            resetEditorValue: function () {\n                this.editor.value(this._workbook._inputForRef(this._workbook.activeSheet()._viewActiveCell()));\n            },\n            activateEditor: function () {\n                this.editor.activate({\n                    range: this._workbook.activeSheet().selection(),\n                    rect: this.view.activeCellRectangle(),\n                    tooltip: this._activeTooltip()\n                }).focus();\n            },\n            deactivateEditor: function () {\n                this.view.editor.deactivate();\n            },\n            onCommandRequest: function (e) {\n                if (e.command) {\n                    this._execute(e);\n                } else {\n                    this._workbook.undoRedoStack[e.action]();\n                }\n            },\n            onDialogRequest: function (e) {\n                var additionalOptions = {\n                    pdfExport: this._workbook.options.pdf,\n                    excelExport: this._workbook.options.excel\n                };\n                if (e.options) {\n                    $.extend(true, e.options, additionalOptions);\n                } else {\n                    e.options = additionalOptions;\n                }\n                this.view.openDialog(e.name, e.options);\n            },\n            onNameEditorEnter: function () {\n                var ref;\n                var workbook = this._workbook;\n                var sheet = workbook.activeSheet();\n                var name = this.view.nameEditor.value();\n                ref = kendo.spreadsheet.calc.parseReference(name, true) || workbook.nameValue(name);\n                if (ref instanceof kendo.spreadsheet.Ref) {\n                    if (ref.sheet && ref.sheet.toLowerCase() != sheet.name().toLowerCase()) {\n                        var tmp = workbook.sheetByName(ref.sheet);\n                        if (tmp) {\n                            workbook.activeSheet(tmp);\n                            sheet = tmp;\n                        }\n                    }\n                    sheet.range(ref).select();\n                    return;\n                }\n                ref = sheet.selection()._ref.clone().simplify().setSheet(sheet.name(), true);\n                this._execute({\n                    command: 'DefineNameCommand',\n                    options: {\n                        name: name,\n                        value: ref\n                    }\n                });\n                this.clipboardElement.focus();\n            },\n            onNameEditorCancel: function () {\n                this.clipboardElement.focus();\n            },\n            onNameEditorSelect: function (ev) {\n                var name = ev.name;\n                var workbook = this._workbook;\n                var sheet = workbook.activeSheet();\n                var ref = workbook.nameValue(name);\n                if (ref instanceof kendo.spreadsheet.Ref) {\n                    if (ref.sheet && ref.sheet.toLowerCase() != sheet.name().toLowerCase()) {\n                        var tmp = workbook.sheetByName(ref.sheet);\n                        if (tmp) {\n                            workbook.activeSheet(tmp);\n                            sheet = tmp;\n                        }\n                    }\n                    sheet.range(ref).select();\n                    return;\n                }\n                this.clipboardElement.focus();\n            },\n            onNameEditorDelete: function (ev) {\n                this._execute({\n                    command: 'DeleteNameCommand',\n                    options: { name: ev.name }\n                });\n                this.clipboardElement.focus();\n            }\n        });\n        kendo.spreadsheet.Controller = Controller;\n    }(window.kendo));\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('spreadsheet/view', [\n        'kendo.core',\n        'kendo.menu',\n        'spreadsheet/sheetsbar'\n    ], f);\n}(function () {\n    (function (kendo) {\n        if (kendo.support.browser.msie && kendo.support.browser.version < 9) {\n            return;\n        }\n        var $ = kendo.jQuery;\n        var CellRef = kendo.spreadsheet.CellRef;\n        var DOT = '.';\n        var RESIZE_HANDLE_WIDTH = 7;\n        var viewClassNames = {\n            view: 'k-spreadsheet-view',\n            fixedContainer: 'k-spreadsheet-fixed-container',\n            editContainer: 'k-spreadsheet-edit-container',\n            scroller: 'k-spreadsheet-scroller',\n            viewSize: 'k-spreadsheet-view-size',\n            clipboard: 'k-spreadsheet-clipboard',\n            cellEditor: 'k-spreadsheet-cell-editor',\n            barEditor: 'k-spreadsheet-editor',\n            topCorner: 'k-spreadsheet-top-corner',\n            filterHeadersWrapper: 'k-filter-wrapper',\n            filterRange: 'k-filter-range',\n            filterButton: 'k-spreadsheet-filter',\n            filterButtonActive: 'k-state-active',\n            horizontalResize: 'k-horizontal-resize',\n            verticalResize: 'k-vertical-resize',\n            icon: 'k-icon',\n            iconFilterDefault: 'k-i-arrow-60-down',\n            sheetsBar: 'k-spreadsheet-sheets-bar',\n            sheetsBarActive: 'k-spreadsheet-sheets-bar-active',\n            sheetsBarInactive: 'k-spreadsheet-sheets-bar-inactive',\n            cellContextMenu: 'k-spreadsheet-cell-context-menu',\n            rowHeaderContextMenu: 'k-spreadsheet-row-header-context-menu',\n            colHeaderContextMenu: 'k-spreadsheet-col-header-context-menu'\n        };\n        kendo.spreadsheet.messages.view = {\n            nameBox: 'Name Box',\n            errors: {\n                openUnsupported: 'Unsupported format. Please select an .xlsx file.',\n                shiftingNonblankCells: 'Cannot insert cells due to data loss possibility. Select another insert location or delete the data from the end of your worksheet.',\n                insertColumnWhenRowIsSelected: 'Cannot insert column when all columns are selected.',\n                insertRowWhenColumnIsSelected: 'Cannot insert row when all rows are selected.',\n                filterRangeContainingMerges: 'Cannot create a filter within a range containing merges',\n                sortRangeContainingMerges: 'Cannot sort a range containing merges',\n                cantSortMultipleSelection: 'Cannot sort multiple selection',\n                cantSortNullRef: 'Cannot sort empty selection',\n                cantSortMixedCells: 'Cannot sort range containing cells of mixed shapes',\n                validationError: 'The value that you entered violates the validation rules set on the cell.',\n                cannotModifyDisabled: 'Cannot modify disabled cells.'\n            },\n            tabs: {\n                home: 'Home',\n                insert: 'Insert',\n                data: 'Data'\n            }\n        };\n        function selectElementContents(el) {\n            var sel = window.getSelection();\n            sel.removeAllRanges();\n            var range = document.createRange();\n            range.selectNodeContents(el);\n            sel.addRange(range);\n        }\n        function cellBefore(table, row) {\n            var cells = table.trs[row].children;\n            return cells[cells.length - 2];\n        }\n        function cellAbove(table, row) {\n            var prevRow = table.trs[row - 1];\n            var index = table.trs[row].children.length - 1;\n            if (prevRow && index >= 0) {\n                return prevRow.children[index];\n            }\n        }\n        function cellBorder(value) {\n            return (value.size || 1) + 'px solid ' + (value.color || '#000');\n        }\n        function asURL(link) {\n            if (!/:\\/\\//.test(link)) {\n                link = 'http://' + link;\n            }\n            return link;\n        }\n        function drawCell(collection, cell, cls, showGrid) {\n            function maybeLink(el) {\n                var link = cell.link;\n                if (!link) {\n                    if (typeof cell.value == 'object') {\n                        link = cell.value.link;\n                    }\n                }\n                if (link) {\n                    var style = { textDecoration: 'none' };\n                    if (cell.color) {\n                        style.color = cell.color;\n                    }\n                    if (cell.underline) {\n                        style.textDecoration = 'underline';\n                    }\n                    return kendo.dom.element('a', {\n                        href: asURL(link),\n                        style: style,\n                        target: '_blank'\n                    }, el ? [el] : []);\n                }\n                return el;\n            }\n            var shouldDraw = cell.value != null || cell.validation != null && !cell.validation.value || cell.background || cell.merged;\n            if (!cls && !shouldDraw) {\n                return;\n            }\n            var style = {};\n            var background = cell.background;\n            if (background) {\n                var defaultBorder = background;\n                if (showGrid) {\n                    defaultBorder = kendo.parseColor(defaultBorder).toHSV();\n                    defaultBorder.v *= 0.9;\n                    defaultBorder = defaultBorder.toCssRgba();\n                }\n                defaultBorder = cellBorder({ color: defaultBorder });\n                style.outline = defaultBorder;\n            }\n            if (background) {\n                style.backgroundColor = background;\n            }\n            if (cell.color) {\n                style.color = cell.color;\n            }\n            if (cell.fontFamily) {\n                style.fontFamily = cell.fontFamily;\n            }\n            if (cell.underline) {\n                style.textDecoration = 'underline';\n            }\n            if (cell.italic) {\n                style.fontStyle = 'italic';\n            }\n            if (cell.textAlign) {\n                style.textAlign = cell.textAlign;\n            }\n            if (cell.bold) {\n                style.fontWeight = 'bold';\n            }\n            if (cell.fontSize) {\n                style.fontSize = cell.fontSize + 'px';\n            }\n            if (cell.wrap === true) {\n                style.whiteSpace = 'pre-wrap';\n                style.overflowWrap = 'break-word';\n                style.wordWrap = 'break-word';\n            }\n            style.left = cell.left + 1 + 'px';\n            style.top = cell.top + 1 + 'px';\n            style.width = cell.width - 1 + 'px';\n            style.height = cell.height - 1 + 'px';\n            var data = cell.value, type = typeof data;\n            if (cell.format && data != null) {\n                data = kendo.spreadsheet.formatting.format(data, cell.format);\n                if (data.__dataType) {\n                    type = data.__dataType;\n                }\n            } else if (data !== null && data !== undefined) {\n                data = kendo.dom.text(data);\n            }\n            if (!style.textAlign) {\n                switch (type) {\n                case 'number':\n                case 'date':\n                case 'percent':\n                    style.textAlign = 'right';\n                    break;\n                case 'boolean':\n                    style.textAlign = 'center';\n                    break;\n                }\n            }\n            var classNames = [paneClassNames.cell];\n            if (cls) {\n                classNames.push(cls);\n            }\n            if (cell.enable === false) {\n                classNames.push('k-state-disabled');\n            }\n            if (cell.merged) {\n                classNames.push('k-spreadsheet-merged-cell');\n            }\n            var verticalAlign = cell.verticalAlign || 'bottom';\n            if (verticalAlign && data) {\n                data = kendo.dom.element('div', { className: 'k-vertical-align-' + verticalAlign }, [maybeLink(data)]);\n            } else {\n                data = maybeLink(data);\n            }\n            var children = data ? [data] : [];\n            var properties = { style: style };\n            var validation = cell.validation;\n            if (validation && !validation.value) {\n                children.push(kendo.dom.element('span', { className: 'k-dirty' }));\n                classNames.push('k-dirty-cell');\n                properties.title = validation.message;\n            }\n            properties.className = classNames.join(' ');\n            var div = kendo.dom.element('div', properties, children);\n            collection.push(div);\n            return div;\n        }\n        function addCell(table, row, cell) {\n            var style = {};\n            if (cell.background) {\n                style.backgroundColor = cell.background;\n            }\n            if (cell.color) {\n                style.color = cell.color;\n            }\n            if (cell.fontFamily) {\n                style.fontFamily = cell.fontFamily;\n            }\n            if (cell.underline) {\n                style.textDecoration = 'underline';\n            }\n            if (cell.italic) {\n                style.fontStyle = 'italic';\n            }\n            if (cell.textAlign) {\n                style.textAlign = cell.textAlign;\n            }\n            if (cell.verticalAlign) {\n                style.verticalAlign = cell.verticalAlign === 'center' ? 'middle' : cell.verticalAlign;\n            }\n            if (cell.bold) {\n                style.fontWeight = 'bold';\n            }\n            if (cell.fontSize) {\n                style.fontSize = cell.fontSize + 'px';\n            }\n            if (cell.wrap === true) {\n                style.whiteSpace = 'pre-wrap';\n                style.wordBreak = 'break-all';\n            }\n            if (cell.borderRight) {\n                style.borderRight = cellBorder(cell.borderRight);\n            } else if (cell.background) {\n                style.borderRightColor = cell.background;\n            }\n            if (cell.borderBottom) {\n                style.borderBottom = cellBorder(cell.borderBottom);\n            } else if (cell.background) {\n                style.borderBottomColor = cell.background;\n            }\n            var data = cell.value, type = typeof data;\n            if (cell.format && data != null) {\n                data = kendo.spreadsheet.formatting.format(data, cell.format);\n                if (data.__dataType) {\n                    type = data.__dataType;\n                }\n            }\n            if (!style.textAlign) {\n                switch (type) {\n                case 'number':\n                case 'date':\n                case 'percent':\n                    style.textAlign = 'right';\n                    break;\n                case 'boolean':\n                    style.textAlign = 'center';\n                    break;\n                }\n            }\n            var className = null;\n            if (cell.enable === false) {\n                className = 'k-state-disabled';\n            }\n            var td = table.addCell(row, data, style, className, cell.validation);\n            var border, sibling;\n            if (cell.borderLeft) {\n                sibling = cellBefore(table, row);\n                border = cellBorder(cell.borderLeft);\n                if (sibling && border) {\n                    sibling.attr.style.borderRight = border;\n                }\n            } else if (cell.background) {\n                style.borderLeftColor = cell.background;\n            }\n            if (cell.borderTop) {\n                sibling = cellAbove(table, row);\n                border = cellBorder(cell.borderTop);\n                if (sibling && border) {\n                    sibling.attr.style.borderBottom = border;\n                }\n            } else if (cell.background) {\n                style.borderTopColor = cell.background;\n            }\n            return td;\n        }\n        var HtmlTable = kendo.Class.extend({\n            init: function () {\n                this.cols = [];\n                this.trs = [];\n                this._height = 0;\n                this._width = 0;\n            },\n            addColumn: function (width) {\n                this._width += width;\n                var col = kendo.dom.element('col', { style: { width: width + 'px' } });\n                col.visible = width > 0;\n                this.cols.push(col);\n            },\n            addRow: function (height) {\n                var attr = null;\n                attr = { style: { height: height + 'px' } };\n                this._height += height;\n                var tr = kendo.dom.element('tr', attr);\n                tr.visible = height > 0;\n                this.trs.push(tr);\n            },\n            addCell: function (rowIndex, text, style, className, validation) {\n                if (text === null || text === undefined) {\n                    text = '';\n                }\n                if (!(text instanceof kendo.dom.Node)) {\n                    text = kendo.dom.text(text);\n                }\n                var children = [text];\n                var properties = { style: style };\n                if (validation && !validation.value) {\n                    children.push(kendo.dom.element('span', { className: 'k-dirty' }));\n                    className = (className || '') + (className ? ' ' : '') + 'k-dirty-cell';\n                    properties.title = validation.message;\n                }\n                if (className) {\n                    properties.className = className;\n                }\n                var td = kendo.dom.element('td', properties, children);\n                this.trs[rowIndex].children.push(td);\n                return td;\n            },\n            toDomTree: function (x, y, className) {\n                this.trs = this.trs.filter(function (tr) {\n                    return tr.visible;\n                });\n                var offset = 0;\n                this.cols = this.cols.filter(function (col, ci) {\n                    if (!col.visible) {\n                        this.trs.forEach(function (tr) {\n                            tr.children.splice(ci - offset, 1);\n                        });\n                        offset++;\n                    }\n                    return col.visible;\n                }, this);\n                return kendo.dom.element('table', {\n                    style: {\n                        left: x + 'px',\n                        top: y + 'px',\n                        height: this._height + 'px',\n                        width: this._width + 'px'\n                    },\n                    className: className\n                }, [\n                    kendo.dom.element('colgroup', null, this.cols),\n                    kendo.dom.element('tbody', null, this.trs)\n                ]);\n            }\n        });\n        var CELL_CONTEXT_MENU = '<ul class=\"#=classNames.cellContextMenu#\">' + '<li data-action=cut>Cut</li>' + '<li data-action=copy>Copy</li>' + '<li data-action=paste>Paste</li>' + '<li class=\"k-separator\"></li>' + '<li data-action=merge>Merge</li>' + '<li data-action=unmerge>Unmerge</li>' + '</ul>';\n        var ROW_HEADER_CONTEXT_MENU = '<ul class=\"#=classNames.rowHeaderContextMenu#\">' + '<li data-action=cut>Cut</li>' + '<li data-action=copy>Copy</li>' + '<li data-action=paste>Paste</li>' + '<li class=\"k-separator\"></li>' + '<li data-action=\"delete-row\">Delete</li>' + '<li data-action=\"hide-row\">Hide</li>' + '<li data-action=\"unhide-row\">Unhide</li>' + '</ul>';\n        var COL_HEADER_CONTEXT_MENU = '<ul class=\"#=classNames.colHeaderContextMenu#\">' + '<li data-action=cut>Cut</li>' + '<li data-action=copy>Copy</li>' + '<li data-action=paste>Paste</li>' + '<li class=\"k-separator\"></li>' + '<li data-action=\"delete-column\">Delete</li>' + '<li data-action=\"hide-column\">Hide</li>' + '<li data-action=\"unhide-column\">Unhide</li>' + '</ul>';\n        kendo.spreadsheet.ContextMenu = kendo.ui.ContextMenu;\n        var VIEW_CONTENTS = kendo.template('<div class=\"#=classNames.view#\"><div class=\"#=classNames.fixedContainer#\"></div><div class=\"#=classNames.scroller#\"><div class=\"#=classNames.viewSize#\"></div></div>' + '<div tabindex=\"0\" class=\"#=classNames.clipboard#\" contenteditable=true></div><div class=\"#=classNames.cellEditor#\"></div></div><div class=\"#=classNames.sheetsBar#\"></div>' + CELL_CONTEXT_MENU + ROW_HEADER_CONTEXT_MENU + COL_HEADER_CONTEXT_MENU);\n        function within(value, min, max) {\n            return value >= min && value <= max;\n        }\n        var View = kendo.Class.extend({\n            init: function (element, options) {\n                var classNames = View.classNames;\n                this.element = element;\n                this.options = $.extend(true, { messages: kendo.spreadsheet.messages.view }, this.options, options);\n                this._chrome();\n                this._dialogs = [];\n                element.append(VIEW_CONTENTS({ classNames: classNames }));\n                this._formulaInput();\n                this.wrapper = element.find(DOT + classNames.view);\n                this.container = element.find(DOT + classNames.fixedContainer)[0];\n                this.scroller = element.find(DOT + classNames.scroller)[0];\n                this.clipboard = element.find(DOT + classNames.clipboard);\n                this.viewSize = $(this.scroller.firstChild);\n                this.tree = new kendo.dom.Tree(this.container);\n                this.clipboardContents = new kendo.dom.Tree(this.clipboard[0]);\n                this.editor = new kendo.spreadsheet.SheetEditor(this);\n                this._sheetsbar();\n                var contextMenuConfig = {\n                    target: element,\n                    animation: false,\n                    showOn: 'never'\n                };\n                this.cellContextMenu = new kendo.spreadsheet.ContextMenu(element.find(DOT + classNames.cellContextMenu), contextMenuConfig);\n                this.colHeaderContextMenu = new kendo.spreadsheet.ContextMenu(element.find(DOT + classNames.colHeaderContextMenu), contextMenuConfig);\n                this.rowHeaderContextMenu = new kendo.spreadsheet.ContextMenu(element.find(DOT + classNames.rowHeaderContextMenu), contextMenuConfig);\n                var scrollbar = kendo.support.scrollbar();\n                $(this.container).css({\n                    width: this.wrapper[0].clientWidth - scrollbar,\n                    height: this.wrapper[0].clientHeight - scrollbar\n                });\n            },\n            enableClipboard: function (enable) {\n                this.isClipboardDeactivated = !enable;\n                if (enable) {\n                    this.clipboard.attr('contenteditable', enable);\n                } else {\n                    this.clipboard.removeAttr('contenteditable');\n                }\n            },\n            _resize: function () {\n                var outerHeight = kendo._outerHeight;\n                var tabstripHeight = this.tabstrip ? outerHeight(this.tabstrip.element) : 0;\n                var formulaBarHeight = this.formulaBar ? outerHeight(this.formulaBar.element) : 0;\n                var sheetsBarHeight = this.sheetsbar ? outerHeight(this.sheetsbar.element) : 0;\n                this.wrapper.height(this.element.height() - (tabstripHeight + formulaBarHeight + sheetsBarHeight));\n                if (this.tabstrip) {\n                    this.tabstrip.quickAccessAdjust();\n                }\n            },\n            _chrome: function () {\n                var wrapper = $('<div class=\\'k-spreadsheet-action-bar\\' />').prependTo(this.element);\n                var nameEditor = $('<div class=\\'k-spreadsheet-name-editor\\' />').appendTo(wrapper);\n                this.nameEditor = new kendo.spreadsheet.NameEditor(nameEditor, this.options);\n                var formulaBar = $('<div />').appendTo(wrapper);\n                this.formulaBar = new kendo.spreadsheet.FormulaBar(formulaBar);\n                if (this.options.toolbar) {\n                    this._tabstrip();\n                }\n            },\n            _formulaInput: function () {\n                var editor = this.element.find(DOT + View.classNames.cellEditor);\n                this.formulaInput = new kendo.spreadsheet.FormulaInput(editor, { autoScale: true });\n            },\n            _sheetsbar: function () {\n                if (this.options.sheetsbar) {\n                    var options = $.extend(true, { openDialog: this.openDialog.bind(this) }, this.options.sheetsbar);\n                    this.sheetsbar = new kendo.spreadsheet.SheetsBar(this.element.find(DOT + View.classNames.sheetsBar), options);\n                }\n            },\n            _tabstrip: function () {\n                var messages = this.options.messages.tabs;\n                var options = $.extend(true, {\n                    home: true,\n                    insert: true,\n                    data: true\n                }, this.options.toolbar);\n                var tabs = [];\n                if (this.tabstrip) {\n                    this.tabstrip.destroy();\n                    this.element.children('.k-tabstrip').remove();\n                }\n                for (var name in options) {\n                    if (options[name] === true || options[name] instanceof Array) {\n                        tabs.push({\n                            id: name,\n                            text: messages[name],\n                            content: ''\n                        });\n                    }\n                }\n                this.tabstrip = new kendo.spreadsheet.TabStrip($('<div />').prependTo(this.element), {\n                    animation: false,\n                    dataTextField: 'text',\n                    dataContentField: 'content',\n                    dataSource: tabs,\n                    toolbarOptions: options,\n                    view: this\n                });\n                this.tabstrip.select(0);\n            },\n            _executeCommand: function (e) {\n                this._sheet.trigger('commandRequest', e);\n            },\n            workbook: function (workbook) {\n                this._workbook = workbook;\n                this.nameEditor._workbook = workbook;\n            },\n            sheet: function (sheet) {\n                this._sheet = sheet;\n            },\n            activeCellRectangle: function () {\n                return this.cellRectangle(this._sheet._viewActiveCell());\n            },\n            _rectangle: function (pane, ref) {\n                return pane._grid.boundingRectangle(ref.toRangeRef());\n            },\n            isColumnResizer: function (x, pane, ref) {\n                var rectangle = this._rectangle(pane, ref);\n                x -= this._sheet._grid._headerWidth;\n                var handleWidth = RESIZE_HANDLE_WIDTH / 2;\n                var right = rectangle.right - this.scroller.scrollLeft;\n                return right - handleWidth <= x && x <= right + handleWidth;\n            },\n            isRowResizer: function (y, pane, ref) {\n                var rectangle = this._rectangle(pane, ref);\n                y -= this._sheet._grid._headerHeight;\n                var handleWidth = RESIZE_HANDLE_WIDTH / 2;\n                var bottom = rectangle.bottom - this.scroller.scrollTop;\n                return bottom - handleWidth <= y && y <= bottom + handleWidth;\n            },\n            isFilterIcon: function (x, y, pane, ref) {\n                var theGrid = pane._grid;\n                var scrollTop = theGrid.rows.frozen ? 0 : this.scroller.scrollTop;\n                var scrollLeft = theGrid.columns.frozen ? 0 : this.scroller.scrollLeft;\n                x -= this._sheet._grid._headerWidth - scrollLeft;\n                y -= this._sheet._grid._headerHeight - scrollTop;\n                var result = false;\n                this._sheet.forEachFilterHeader(ref, function (ref) {\n                    if (!result) {\n                        var rect = this._rectangle(pane, ref);\n                        result = pane.filterIconRect(rect).intersects(x, y);\n                    }\n                }.bind(this));\n                return result;\n            },\n            isAutoFill: function (x, y, pane) {\n                var selection = this._sheet.select();\n                if (selection.size > 1) {\n                    return false;\n                }\n                x -= this._sheet._grid._headerWidth;\n                y -= this._sheet._grid._headerHeight;\n                if (!pane._grid.columns.frozen) {\n                    x += this.scroller.scrollLeft;\n                }\n                if (!pane._grid.rows.frozen) {\n                    y += this.scroller.scrollTop;\n                }\n                var rectangle = this._rectangle(pane, selection);\n                return Math.abs(rectangle.right - x) < 8 && Math.abs(rectangle.bottom - y) < 8;\n            },\n            isEditButton: function (x, y) {\n                var ed = this._sheet.activeCellCustomEditor();\n                if (ed) {\n                    var r = this.activeCellRectangle();\n                    if (x > r.right && x <= r.right + 20 && y >= r.top && y <= r.bottom) {\n                        return true;\n                    }\n                }\n            },\n            objectAt: function (x, y) {\n                var grid = this._sheet._grid;\n                var object, pane;\n                if (x < 0 || y < 0 || x > this.scroller.clientWidth || y > this.scroller.clientHeight) {\n                    object = { type: 'outside' };\n                } else if (x < grid._headerWidth && y < grid._headerHeight) {\n                    object = { type: 'topcorner' };\n                } else {\n                    pane = this.paneAt(x, y);\n                    if (!pane) {\n                        object = { type: 'outside' };\n                    } else {\n                        var row = pane._grid.rows.indexVisible(y, this.scroller.scrollTop);\n                        var column = pane._grid.columns.indexVisible(x, this.scroller.scrollLeft);\n                        var type = 'cell';\n                        var ref = new CellRef(row, column);\n                        var selecting = this._sheet.selectionInProgress();\n                        if (this.isAutoFill(x, y, pane)) {\n                            type = 'autofill';\n                        } else if (this.isFilterIcon(x, y, pane, ref)) {\n                            type = 'filtericon';\n                        } else if (!selecting && x < grid._headerWidth) {\n                            ref = new CellRef(row, -Infinity);\n                            type = this.isRowResizer(y, pane, ref) ? 'rowresizehandle' : 'rowheader';\n                        } else if (!selecting && y < grid._headerHeight) {\n                            ref = new CellRef(-Infinity, column);\n                            type = this.isColumnResizer(x, pane, ref) ? 'columnresizehandle' : 'columnheader';\n                        } else if (this.isEditButton(x, y)) {\n                            type = 'editor';\n                        }\n                        object = {\n                            type: type,\n                            ref: ref\n                        };\n                    }\n                }\n                object.pane = pane;\n                object.x = x;\n                object.y = y;\n                return object;\n            },\n            paneAt: function (x, y) {\n                return this.panes.filter(function paneLocationWithin(pane) {\n                    var grid = pane._grid;\n                    return within(y, grid.top, grid.bottom) && within(x, grid.left, grid.right);\n                })[0];\n            },\n            containingPane: function (cell) {\n                return this.panes.filter(function (pane) {\n                    if (pane._grid.contains(cell)) {\n                        return true;\n                    }\n                    return false;\n                })[0];\n            },\n            cellRectangle: function (cell) {\n                var theGrid = this.containingPane(cell)._grid;\n                var rectangle = this._sheet._grid.rectangle(cell);\n                return rectangle.offset(theGrid.headerWidth - (theGrid.columns.frozen ? 0 : this.scroller.scrollLeft), theGrid.headerHeight - (theGrid.rows.frozen ? 0 : this.scroller.scrollTop));\n            },\n            refresh: function (reason) {\n                var sheet = this._sheet;\n                if (this.tabstrip) {\n                    this.tabstrip.refreshTools(sheet.range(sheet.activeCell()));\n                }\n                if (reason.sheetSelection && this.sheetsbar) {\n                    this.sheetsbar.renderSheets(this._workbook.sheets(), this._workbook.sheetIndex(this._sheet));\n                }\n                this._resize();\n                this.viewSize[0].style.height = sheet._grid.totalHeight() + 'px';\n                this.viewSize[0].style.width = sheet._grid.totalWidth() + 'px';\n                if (reason.layout) {\n                    var frozenColumns = sheet.frozenColumns();\n                    var frozenRows = sheet.frozenRows();\n                    this.panes = [this._pane(frozenRows, frozenColumns)];\n                    if (frozenColumns > 0) {\n                        this.panes.push(this._pane(frozenRows, 0, null, frozenColumns));\n                    }\n                    if (frozenRows > 0) {\n                        this.panes.push(this._pane(0, frozenColumns, frozenRows, null));\n                    }\n                    if (frozenRows > 0 && frozenColumns > 0) {\n                        this.panes.push(this._pane(0, 0, frozenRows, frozenColumns));\n                    }\n                }\n                if (reason.filter) {\n                    this._destroyFilterMenu();\n                }\n                if (reason.activeCell) {\n                    this._focus = sheet.activeCell().toRangeRef();\n                }\n            },\n            createFilterMenu: function (column) {\n                if (this._filterMenu && this._filterMenu.options.column == column) {\n                    return this._filterMenu;\n                }\n                this._destroyFilterMenu();\n                var sheet = this._sheet;\n                var ref = sheet.filter().ref;\n                var range = new kendo.spreadsheet.Range(ref, sheet);\n                var element = $('<div />').appendTo(this.element);\n                var options = {\n                    column: column,\n                    range: range\n                };\n                var filterMenu = new kendo.spreadsheet.FilterMenu(element, options);\n                this._filterMenu = filterMenu;\n                return filterMenu;\n            },\n            selectClipBoardContents: function () {\n                if (!this.isClipboardDeactivated) {\n                    this.clipboard.focus();\n                    selectElementContents(this.clipboard[0]);\n                }\n            },\n            scrollIntoView: function (cell) {\n                var willScroll = false;\n                var theGrid = this.containingPane(cell)._grid;\n                var boundaries = theGrid.scrollBoundaries(cell);\n                var scroller = this.scroller;\n                var scrollTop = theGrid.rows.frozen ? 0 : scroller.scrollTop;\n                var scrollLeft = theGrid.columns.frozen ? 0 : scroller.scrollLeft;\n                if (boundaries.top < scrollTop) {\n                    willScroll = true;\n                    scroller.scrollTop = boundaries.scrollTop;\n                }\n                if (boundaries.bottom > scrollTop) {\n                    willScroll = true;\n                    scroller.scrollTop = boundaries.scrollBottom;\n                }\n                if (boundaries.left < scrollLeft) {\n                    willScroll = true;\n                    scroller.scrollLeft = boundaries.scrollLeft;\n                }\n                if (boundaries.right > scrollLeft) {\n                    willScroll = true;\n                    scroller.scrollLeft = boundaries.scrollRight;\n                }\n                return willScroll;\n            },\n            _destroyDialog: function () {\n                this._dialogs.pop();\n            },\n            openCustomEditor: function () {\n                var self = this;\n                var cell = self._sheet.activeCell().first();\n                var editor = self._sheet.activeCellCustomEditor();\n                var range = self._sheet.range(cell);\n                editor.edit({\n                    range: range,\n                    rect: self.activeCellRectangle(),\n                    view: this,\n                    validation: this._sheet.validation(cell),\n                    callback: function (value, parse) {\n                        self._executeCommand({\n                            command: 'EditCommand',\n                            options: {\n                                operatingRange: range,\n                                property: parse ? 'input' : 'value',\n                                value: value\n                            }\n                        });\n                    }\n                });\n            },\n            openDialog: function (name, options) {\n                var dialog = kendo.spreadsheet.dialogs.create(name, options);\n                if (dialog) {\n                    dialog.bind('action', this._executeCommand.bind(this));\n                    dialog.bind('deactivate', this._destroyDialog.bind(this));\n                    this._dialogs.push(dialog);\n                    var sheet = this._sheet;\n                    var ref = sheet.activeCell();\n                    var range = new kendo.spreadsheet.Range(ref, sheet);\n                    dialog.open(range);\n                    return dialog;\n                }\n            },\n            showError: function (options, reopenEditor) {\n                var errorMessages = this.options.messages.errors;\n                var focusButton = function (e) {\n                    var cont = e.sender.dialog().element;\n                    cont.find('.k-button:first').focus();\n                    cont.find('.k-button, input').on('keydown', function (ev) {\n                        if (ev.keyCode == kendo.keys.ESC) {\n                            e.sender.close();\n                        }\n                    });\n                };\n                var onClose = function (e) {\n                    var dlg = e.sender;\n                    this.selectClipBoardContents();\n                    if (dlg._retry && reopenEditor) {\n                        reopenEditor();\n                    }\n                }.bind(this);\n                if (kendo.spreadsheet.dialogs.registered(options.type)) {\n                    var dialogOptions = { close: onClose };\n                    if (options.type === 'validationError') {\n                        dialogOptions = $.extend(dialogOptions, {\n                            title: options.title || 'Error',\n                            text: options.body ? options.body : errorMessages[options.type],\n                            activate: focusButton\n                        });\n                    }\n                    this.openDialog(options.type, dialogOptions);\n                } else {\n                    this.openDialog('message', {\n                        title: options.title || 'Error',\n                        text: options.body ? options.body : errorMessages[options.type],\n                        activate: focusButton,\n                        close: onClose\n                    });\n                }\n            },\n            destroy: function () {\n                this._dialogs.forEach(function (dialog) {\n                    dialog.destroy();\n                });\n                this.cellContextMenu.destroy();\n                this.rowHeaderContextMenu.destroy();\n                this.colHeaderContextMenu.destroy();\n                if (this.tabstrip) {\n                    this.tabstrip.destroy();\n                }\n                this._destroyFilterMenu();\n            },\n            _destroyFilterMenu: function () {\n                if (this._filterMenu) {\n                    this._filterMenu.destroy();\n                    this._filterMenu = undefined;\n                    this._filterMenuColumn = undefined;\n                }\n            },\n            render: function () {\n                if (!this.element.is(':visible')) {\n                    return;\n                }\n                var sheet = this._sheet;\n                var focus = sheet.focus();\n                if (focus && this.scrollIntoView(focus)) {\n                    return;\n                }\n                var resizeDirection = !sheet.resizingInProgress() ? 'none' : sheet.resizeHandlePosition().col === -Infinity ? 'column' : 'row';\n                this.wrapper.toggleClass(viewClassNames.editContainer, this.editor.isActive()).toggleClass(viewClassNames.horizontalResize, resizeDirection == 'row').toggleClass(viewClassNames.verticalResize, resizeDirection == 'column');\n                var grid = sheet._grid;\n                var scrollTop = this.scroller.scrollTop;\n                var scrollLeft = this.scroller.scrollLeft;\n                if (scrollTop < 0) {\n                    scrollTop = 0;\n                }\n                if (scrollLeft < 0) {\n                    scrollLeft = 0;\n                }\n                var result = this.panes.map(function (pane) {\n                    return pane.render(scrollLeft, scrollTop);\n                });\n                var topCorner = kendo.dom.element('div', {\n                    style: {\n                        width: grid._headerWidth + 'px',\n                        height: grid._headerHeight + 'px'\n                    },\n                    className: View.classNames.topCorner\n                });\n                result.push(topCorner);\n                if (sheet.resizeHandlePosition() && sheet.resizeHintPosition()) {\n                    result.push(this.renderResizeHint());\n                }\n                this.tree.render(result);\n                if (this.editor.isActive()) {\n                    this.editor.toggleTooltip(this.activeCellRectangle());\n                } else if (!sheet.selectionInProgress() && !sheet.resizingInProgress() && !sheet.isInEditMode()) {\n                    this.renderClipboardContents();\n                }\n            },\n            renderResizeHint: function () {\n                var sheet = this._sheet;\n                var ref = sheet.resizeHandlePosition();\n                var horizontal = ref.col !== -Infinity;\n                var style;\n                if (horizontal) {\n                    style = {\n                        height: this.scroller.clientHeight + 'px',\n                        width: RESIZE_HANDLE_WIDTH + 'px',\n                        left: sheet.resizeHintPosition().x + 'px',\n                        top: '0px'\n                    };\n                } else {\n                    style = {\n                        height: RESIZE_HANDLE_WIDTH + 'px',\n                        width: this.scroller.clientWidth + 'px',\n                        top: sheet.resizeHintPosition().y + 'px',\n                        left: '0px'\n                    };\n                }\n                var classNames = Pane.classNames;\n                return kendo.dom.element('div', {\n                    className: classNames.resizeHint + (!horizontal ? ' ' + classNames.resizeHintVertical : ''),\n                    style: style\n                }, [\n                    kendo.dom.element('div', { className: classNames.resizeHintHandle }),\n                    kendo.dom.element('div', { className: classNames.resizeHintMarker })\n                ]);\n            },\n            renderClipboardContents: function () {\n                var sheet = this._sheet;\n                var grid = sheet._grid;\n                var selection = sheet.select().toRangeRef();\n                var status = this._workbook.clipboard().canCopy();\n                if (status.canCopy === false && status.multiSelection) {\n                    this.clipboardContents.render([]);\n                    this.selectClipBoardContents();\n                    return;\n                }\n                selection = sheet.trim(selection);\n                var table = new HtmlTable();\n                var selectionView = grid.rangeDimensions(selection);\n                selectionView.rows.forEach(function (height) {\n                    table.addRow(height);\n                });\n                selectionView.columns.forEach(function (width) {\n                    table.addColumn(width);\n                });\n                var tmp = sheet._getMergedCells(selection);\n                var primaryMergedCells = tmp.primary;\n                var secondaryMergedCells = tmp.secondary;\n                sheet.forEach(selection, function (row, col, cell) {\n                    var location = new CellRef(row, col).print();\n                    if (!secondaryMergedCells[location]) {\n                        var td = addCell(table, row - selection.topLeft.row, cell);\n                        var mergedCell = primaryMergedCells[location];\n                        if (mergedCell) {\n                            td.attr.colspan = mergedCell.width();\n                            td.attr.rowspan = mergedCell.height();\n                        }\n                    }\n                });\n                this.clipboardContents.render([table.toDomTree(0, 0, 'kendo-clipboard-' + this._workbook.clipboard()._uid)]);\n                this.selectClipBoardContents();\n            },\n            _pane: function (row, column, rowCount, columnCount) {\n                var pane = new Pane(this._sheet, this._sheet._grid.pane({\n                    row: row,\n                    column: column,\n                    rowCount: rowCount,\n                    columnCount: columnCount\n                }));\n                pane.refresh(this.scroller.clientWidth, this.scroller.clientHeight);\n                return pane;\n            }\n        });\n        var paneClassNames = {\n            cell: 'k-spreadsheet-cell',\n            vaxis: 'k-spreadsheet-vaxis',\n            haxis: 'k-spreadsheet-haxis',\n            vborder: 'k-spreadsheet-vborder',\n            hborder: 'k-spreadsheet-hborder',\n            rowHeader: 'k-spreadsheet-row-header',\n            columnHeader: 'k-spreadsheet-column-header',\n            pane: 'k-spreadsheet-pane',\n            data: 'k-spreadsheet-data',\n            mergedCell: 'k-spreadsheet-merged-cell',\n            mergedCellsWrapper: 'k-merged-cells-wrapper',\n            activeCell: 'k-spreadsheet-active-cell',\n            selection: 'k-spreadsheet-selection',\n            selectionWrapper: 'k-selection-wrapper',\n            autoFillWrapper: 'k-auto-fill-wrapper',\n            single: 'k-single',\n            top: 'k-top',\n            right: 'k-right',\n            bottom: 'k-bottom',\n            left: 'k-left',\n            resizeHandle: 'k-resize-handle',\n            columnResizeHandle: 'k-column-resize-handle',\n            rowResizeHandle: 'k-row-resize-handle',\n            resizeHint: 'k-resize-hint',\n            resizeHintHandle: 'k-resize-hint-handle',\n            resizeHintMarker: 'k-resize-hint-marker',\n            resizeHintVertical: 'k-resize-hint-vertical',\n            selectionHighlight: 'k-spreadsheet-selection-highlight',\n            series: [\n                'k-series-a',\n                'k-series-b',\n                'k-series-c',\n                'k-series-d',\n                'k-series-e',\n                'k-series-f'\n            ]\n        };\n        var Pane = kendo.Class.extend({\n            init: function (sheet, grid) {\n                this._sheet = sheet;\n                this._grid = grid;\n            },\n            refresh: function (width, height) {\n                this._grid.refresh(width, height);\n            },\n            isVisible: function (scrollLeft, scrollTop, ref) {\n                return this._grid.view(scrollLeft, scrollTop).ref.intersects(ref);\n            },\n            render: function (scrollLeft, scrollTop) {\n                var classNames = Pane.classNames;\n                var sheet = this._sheet;\n                var grid = this._grid;\n                var view = grid.view(scrollLeft, scrollTop);\n                this._currentView = view;\n                this._currentRect = this._rectangle(view.ref);\n                this._selectedHeaders = sheet.selectedHeaders();\n                var children = [];\n                children.push(this.renderData());\n                children.push(this.renderSelection());\n                children.push(this.renderAutoFill());\n                children.push(this.renderEditorSelection());\n                children.push(this.renderFilterHeaders());\n                if (grid.hasRowHeader) {\n                    var rowHeader = kendo.dom.element('div', {\n                        className: classNames.rowHeader,\n                        style: {\n                            width: grid.headerWidth + 'px',\n                            top: view.rowOffset + 'px'\n                        }\n                    });\n                    children.push(rowHeader);\n                    sheet.forEach(view.ref.leftColumn(), function (row) {\n                        if (!sheet.isHiddenRow(row)) {\n                            var text = row + 1, height = sheet.rowHeight(row);\n                            rowHeader.children.push(kendo.dom.element('div', {\n                                className: this.headerClassName(row, 'row'),\n                                style: {\n                                    width: grid.headerWidth + 'px',\n                                    height: height + 'px'\n                                }\n                            }, [kendo.dom.element('div', { className: 'k-vertical-align-center' }, [kendo.dom.text(text + '')])]));\n                        }\n                    }.bind(this));\n                }\n                if (grid.hasColumnHeader) {\n                    var columnHeader = kendo.dom.element('div', {\n                        className: classNames.columnHeader,\n                        style: {\n                            top: '0px',\n                            left: view.columnOffset + 'px',\n                            width: this._currentRect.width + 'px',\n                            height: grid.headerHeight + 'px'\n                        }\n                    });\n                    children.push(columnHeader);\n                    var left = 0;\n                    sheet.forEach(view.ref.topRow(), function (row, col) {\n                        if (!sheet.isHiddenColumn(col)) {\n                            var text = kendo.spreadsheet.Ref.display(null, Infinity, col), width = sheet.columnWidth(col);\n                            columnHeader.children.push(kendo.dom.element('div', {\n                                className: this.headerClassName(col, 'col'),\n                                style: {\n                                    position: 'absolute',\n                                    left: left + 'px',\n                                    width: width + 'px',\n                                    height: grid.headerHeight + 'px'\n                                }\n                            }, [kendo.dom.element('div', { className: 'k-vertical-align-center' }, [kendo.dom.text(text + '')])]));\n                            left += width;\n                        }\n                    }.bind(this));\n                }\n                if (sheet.resizeHandlePosition() && (grid.hasColumnHeader || grid.hasRowHeader)) {\n                    var ref = sheet._grid.normalize(sheet.resizeHandlePosition());\n                    if (view.ref.intersects(ref)) {\n                        if (!sheet.resizeHintPosition()) {\n                            children.push(this.renderResizeHandle());\n                        }\n                    }\n                }\n                var paneClasses = [classNames.pane];\n                if (grid.hasColumnHeader) {\n                    paneClasses.push(classNames.top);\n                }\n                if (grid.hasRowHeader) {\n                    paneClasses.push(classNames.left);\n                }\n                return kendo.dom.element('div', {\n                    style: grid.style,\n                    className: paneClasses.join(' ')\n                }, children);\n            },\n            headerClassName: function (index, type) {\n                var selectedHeaders = this._selectedHeaders;\n                var itemSelection;\n                var allHeaders;\n                if (type === 'row') {\n                    itemSelection = selectedHeaders.rows[index];\n                    allHeaders = selectedHeaders.allRows;\n                } else {\n                    itemSelection = selectedHeaders.cols[index];\n                    allHeaders = selectedHeaders.allCols;\n                }\n                var className = itemSelection || (selectedHeaders.all ? 'full' : allHeaders ? 'partial' : 'none');\n                if (className) {\n                    className = 'k-selection-' + className;\n                }\n                return className;\n            },\n            renderData: function () {\n                var sheet = this._sheet;\n                var view = this._currentView;\n                var cont = kendo.dom.element('div', {\n                    className: Pane.classNames.data,\n                    style: {\n                        position: 'relative',\n                        left: view.columnOffset + 'px',\n                        top: view.rowOffset + 'px'\n                    }\n                });\n                var rect = this._currentRect;\n                var layout = kendo.spreadsheet.draw.doLayout(sheet, view.ref, { forScreen: true }), prev;\n                var showGridLines = sheet._showGridLines;\n                if (showGridLines) {\n                    prev = null;\n                    layout.xCoords.forEach(function (x) {\n                        if (x !== prev) {\n                            prev = x;\n                            cont.children.push(kendo.dom.element('div', {\n                                className: paneClassNames.vaxis,\n                                style: {\n                                    left: x + 'px',\n                                    height: rect.height + 'px',\n                                    borderColor: sheet.gridLinesColor()\n                                }\n                            }));\n                        }\n                    });\n                    prev = null;\n                    layout.yCoords.forEach(function (y) {\n                        if (y !== prev) {\n                            prev = y;\n                            cont.children.push(kendo.dom.element('div', {\n                                className: paneClassNames.haxis,\n                                style: {\n                                    top: y + 'px',\n                                    width: rect.width + 'px',\n                                    borderColor: sheet.gridLinesColor()\n                                }\n                            }));\n                        }\n                    });\n                }\n                var borders = kendo.spreadsheet.draw.Borders();\n                layout.cells.forEach(function (cell) {\n                    borders.add(cell);\n                    drawCell(cont.children, cell, null, showGridLines);\n                });\n                borders.vert.forEach(function (a) {\n                    a.forEach(function (b) {\n                        if (!b.rendered) {\n                            b.rendered = true;\n                            var style = {\n                                left: b.x + 'px',\n                                top: b.top + 'px',\n                                height: b.bottom - b.top + 1 + 'px',\n                                borderWidth: b.size + 'px',\n                                borderColor: b.color\n                            };\n                            if (b.size != 1) {\n                                style.transform = 'translateX(-' + (b.size - 1) / 2 + 'px)';\n                            }\n                            cont.children.push(kendo.dom.element('div', {\n                                className: paneClassNames.vborder,\n                                style: style\n                            }));\n                        }\n                    });\n                });\n                borders.horiz.forEach(function (a) {\n                    a.forEach(function (b) {\n                        if (!b.rendered) {\n                            b.rendered = true;\n                            var style = {\n                                top: b.y + 'px',\n                                left: b.left + 'px',\n                                width: b.right - b.left + 'px',\n                                borderWidth: b.size + 'px',\n                                borderColor: b.color\n                            };\n                            if (b.size != 1) {\n                                style.transform = 'translateY(-' + (b.size - 1) / 2 + 'px)';\n                            }\n                            cont.children.push(kendo.dom.element('div', {\n                                className: paneClassNames.hborder,\n                                style: style\n                            }));\n                        }\n                    });\n                });\n                return cont;\n            },\n            renderResizeHandle: function () {\n                var sheet = this._sheet;\n                var ref = sheet.resizeHandlePosition();\n                var rectangle = this._rectangle(ref);\n                var classNames = [Pane.classNames.resizeHandle];\n                var style;\n                if (ref.col !== -Infinity) {\n                    style = {\n                        height: this._grid.headerHeight + 'px',\n                        width: RESIZE_HANDLE_WIDTH + 'px',\n                        left: rectangle.right - RESIZE_HANDLE_WIDTH / 2 + 'px',\n                        top: '0px'\n                    };\n                    classNames.push(viewClassNames.horizontalResize);\n                } else {\n                    style = {\n                        height: RESIZE_HANDLE_WIDTH + 'px',\n                        width: this._grid.headerWidth + 'px',\n                        top: rectangle.bottom - RESIZE_HANDLE_WIDTH / 2 + 'px',\n                        left: '0px'\n                    };\n                    classNames.push(viewClassNames.verticalResize);\n                }\n                return kendo.dom.element('div', {\n                    className: classNames.join(' '),\n                    style: style\n                });\n            },\n            filterIconRect: function (rect) {\n                var BUTTON_SIZE = 16;\n                var BUTTON_OFFSET = 3;\n                return new kendo.spreadsheet.Rectangle(rect.right - BUTTON_SIZE - BUTTON_OFFSET, rect.top + BUTTON_OFFSET, BUTTON_SIZE, BUTTON_SIZE);\n            },\n            renderFilterHeaders: function () {\n                var sheet = this._sheet;\n                var children = [];\n                var classNames = View.classNames;\n                var filter = sheet.filter();\n                function icon(className) {\n                    return kendo.dom.element('span', { className: classNames.icon + ' ' + className });\n                }\n                function filterButton(classNames, position, index) {\n                    var style = {\n                        left: position.left + 'px',\n                        top: position.top + 'px'\n                    };\n                    var filtered = filter && filter.columns.some(function (c) {\n                        return c.index === index;\n                    });\n                    var classes = classNames.filterButton;\n                    if (filtered) {\n                        classes += ' ' + classNames.filterButtonActive;\n                    }\n                    var button = kendo.dom.element('span', {\n                        className: classes,\n                        style: style\n                    }, [icon(classNames.iconFilterDefault)]);\n                    return button;\n                }\n                if (filter) {\n                    this._addDiv(children, filter.ref, classNames.filterRange);\n                }\n                sheet.forEachFilterHeader(this._currentView.ref, function (ref) {\n                    var rect = this._rectangle(ref);\n                    var position = this.filterIconRect(rect);\n                    var column = this._sheet.filterColumn(ref);\n                    var button = filterButton(classNames, position, column);\n                    children.push(button);\n                }.bind(this));\n                return kendo.dom.element('div', { className: classNames.filterHeadersWrapper }, children);\n            },\n            renderEditorSelection: function () {\n                var classNames = Pane.classNames;\n                var sheet = this._sheet;\n                var selections = [];\n                sheet._formulaSelections.forEach(function (range) {\n                    var ref = range.ref;\n                    if (ref === kendo.spreadsheet.NULLREF) {\n                        return;\n                    }\n                    this._addDiv(selections, ref, classNames.selectionHighlight + ' ' + range.colorClass);\n                }.bind(this));\n                return kendo.dom.element('div', { className: classNames.selectionWrapper }, selections);\n            },\n            renderSelection: function () {\n                var classNames = Pane.classNames;\n                var selections = [];\n                var activeCellClasses = [classNames.activeCell];\n                var selectionClasses = [classNames.selection];\n                var sheet = this._sheet;\n                var activeCell = sheet.activeCell().toRangeRef();\n                var activeFormulaColor = this._activeFormulaColor();\n                var selection = sheet.select();\n                activeCellClasses = activeCellClasses.concat(activeFormulaColor, this._directionClasses(activeCell));\n                selectionClasses = selectionClasses.concat(activeFormulaColor);\n                if (sheet.singleCellSelection()) {\n                    activeCellClasses.push(classNames.single);\n                }\n                if (selection.size() === 1) {\n                    selectionClasses.push('k-single-selection');\n                }\n                if (this._sheet.autoFillPunch()) {\n                    selectionClasses.push('k-dim-auto-fill-handle');\n                }\n                selection.forEach(function (ref) {\n                    if (ref !== kendo.spreadsheet.NULLREF) {\n                        this._addDiv(selections, ref, selectionClasses.join(' '));\n                    }\n                }.bind(this));\n                this._addTable(selections, activeCell, activeCellClasses.join(' '));\n                return kendo.dom.element('div', { className: classNames.selectionWrapper }, selections);\n            },\n            renderAutoFill: function () {\n                var autoFillRectangle = [];\n                if (this._sheet.autoFillInProgress()) {\n                    var autoFillRef = this._sheet.autoFillRef();\n                    var punch = this._sheet.autoFillPunch();\n                    var direction = this._sheet._autoFillDirection;\n                    this._addDiv(autoFillRectangle, autoFillRef, 'k-auto-fill');\n                    if (punch) {\n                        this._addDiv(autoFillRectangle, punch, 'k-auto-fill-punch');\n                    } else if (direction !== undefined) {\n                        var ref, cssClass;\n                        switch (direction) {\n                        case 0:\n                            ref = autoFillRef.bottomRight;\n                            cssClass = 'k-auto-fill-br-hint';\n                            break;\n                        case 1:\n                            ref = autoFillRef.bottomRight;\n                            cssClass = 'k-auto-fill-br-hint';\n                            break;\n                        case 2:\n                            ref = new CellRef(autoFillRef.topLeft.row, autoFillRef.bottomRight.col);\n                            cssClass = 'k-auto-fill-tr-hint';\n                            break;\n                        case 3:\n                            ref = new CellRef(autoFillRef.bottomRight.row, autoFillRef.topLeft.col);\n                            cssClass = 'k-auto-fill-bl-hint';\n                            break;\n                        }\n                        var hint = kendo.dom.element('span', { className: 'k-tooltip' }, [kendo.dom.text(this._sheet._autoFillHint)]);\n                        var rectangle = this._addDiv(autoFillRectangle, ref, cssClass);\n                        if (rectangle) {\n                            rectangle.children.push(hint);\n                        }\n                    }\n                }\n                return kendo.dom.element('div', { className: Pane.classNames.autoFillWrapper }, autoFillRectangle);\n            },\n            _addDiv: function (collection, ref, className) {\n                var view = this._currentView, div;\n                if (view.ref.intersects(ref)) {\n                    div = this._rectangle(ref).resize(1, 1).toDiv(className);\n                    collection.push(div);\n                }\n                return div;\n            },\n            _addTable: function (collection, ref, className) {\n                var self = this;\n                var sheet = self._sheet;\n                var view = self._currentView;\n                if (view.ref.intersects(ref)) {\n                    var rectangle = self._rectangle(ref);\n                    var ed = self._sheet.activeCellCustomEditor();\n                    sheet.forEach(ref.collapse(), function (row, col, cell) {\n                        cell.left = rectangle.left;\n                        cell.top = rectangle.top;\n                        cell.width = rectangle.width;\n                        cell.height = rectangle.height;\n                        drawCell(collection, cell, className, true);\n                        if (ed) {\n                            var btn = kendo.dom.element('div', {\n                                className: 'k-button k-spreadsheet-editor-button',\n                                style: {\n                                    left: cell.left + cell.width + 'px',\n                                    top: cell.top + 'px',\n                                    height: cell.height + 'px'\n                                }\n                            });\n                            if (ed.icon) {\n                                btn.children.push(kendo.dom.element('span', { className: 'k-icon ' + ed.icon }));\n                            }\n                            collection.push(btn);\n                        }\n                    });\n                }\n            },\n            _activeFormulaColor: function () {\n                var activeFormulaSelection;\n                var colorClasses = [];\n                if (this._sheet.isInEditMode()) {\n                    activeFormulaSelection = this._sheet._formulaSelections.filter(function (sel) {\n                        return sel.active && sel.type == 'ref';\n                    })[0];\n                    if (activeFormulaSelection) {\n                        colorClasses.push(activeFormulaSelection.colorClass);\n                    }\n                }\n                return colorClasses;\n            },\n            _directionClasses: function (cell) {\n                var cellClasses = [];\n                var classNames = Pane.classNames;\n                var view = this._currentView.ref;\n                if (!cell.move(0, -1).intersects(view)) {\n                    cellClasses.push(classNames.left);\n                }\n                if (!cell.move(-1, 0).intersects(view)) {\n                    cellClasses.push(classNames.top);\n                }\n                if (!cell.move(0, 1).intersects(view)) {\n                    cellClasses.push(classNames.right);\n                }\n                if (!cell.move(1, 0).intersects(view)) {\n                    cellClasses.push(classNames.bottom);\n                }\n                return cellClasses;\n            },\n            _rectangle: function (ref) {\n                return this._grid.boundingRectangle(ref.toRangeRef()).offset(-this._currentView.mergedCellLeft, -this._currentView.mergedCellTop);\n            }\n        });\n        kendo.spreadsheet.View = View;\n        kendo.spreadsheet.Pane = Pane;\n        kendo.spreadsheet.drawCell = drawCell;\n        $.extend(true, View, { classNames: viewClassNames });\n        $.extend(true, Pane, { classNames: paneClassNames });\n    }(window.kendo));\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('spreadsheet/customeditors', [\n        'kendo.core',\n        'kendo.popup',\n        'kendo.calendar',\n        'kendo.listview',\n        'spreadsheet/sheet'\n    ], f);\n}(function () {\n    (function (kendo) {\n        'use strict';\n        if (kendo.support.browser.msie && kendo.support.browser.version < 9) {\n            return;\n        }\n        var EDITORS = {};\n        var registerEditor = kendo.spreadsheet.registerEditor = function (name, editor) {\n            EDITORS[name] = editor;\n        };\n        kendo.spreadsheet.Sheet.prototype.activeCellCustomEditor = function () {\n            var cell = this.activeCell().first();\n            if (this.range(cell).enable()) {\n                var val = this.validation(cell);\n                var key = this._properties.get('editor', this._grid.cellRefIndex(cell));\n                var editor;\n                if (key != null) {\n                    editor = EDITORS[key];\n                } else if (val && val.showButton) {\n                    key = '_validation_' + val.dataType;\n                    editor = EDITORS[key];\n                }\n                if (typeof editor == 'function') {\n                    editor = EDITORS[key] = editor();\n                }\n                return editor;\n            }\n        };\n        registerEditor('_validation_date', function () {\n            var context, calendar, popup;\n            function create() {\n                if (!calendar) {\n                    calendar = $('<div>').kendoCalendar();\n                    popup = $('<div>').kendoPopup();\n                    calendar.appendTo(popup);\n                    calendar = calendar.getKendoCalendar();\n                    popup = popup.getKendoPopup();\n                    calendar.bind('change', function () {\n                        popup.close();\n                        var date = calendar.value();\n                        if (!context.range.format()) {\n                            context.range.format('yyyy-mm-dd');\n                        }\n                        context.callback(kendo.spreadsheet.dateToNumber(date));\n                    });\n                }\n                popup.setOptions({ anchor: context.view.element.find('.k-spreadsheet-editor-button') });\n            }\n            function open() {\n                create();\n                var date = context.range.value();\n                if (date != null) {\n                    calendar.value(kendo.spreadsheet.numberToDate(date));\n                } else {\n                    calendar.value(null);\n                }\n                var val = context.validation;\n                if (val) {\n                    var min = kendo.ui.Calendar.fn.options.min;\n                    var max = kendo.ui.Calendar.fn.options.max;\n                    if (/^(?:greaterThan|between)/.test(val.comparerType)) {\n                        min = kendo.spreadsheet.numberToDate(val.from.value);\n                    }\n                    if (val.comparerType == 'between') {\n                        max = kendo.spreadsheet.numberToDate(val.to.value);\n                    }\n                    if (val.comparerType == 'lessThan') {\n                        max = kendo.spreadsheet.numberToDate(val.from.value);\n                    }\n                    calendar.setOptions({\n                        disableDates: function (date) {\n                            var from = val.from ? val.from.value | 0 : 0;\n                            var to = val.to ? val.to.value | 0 : 0;\n                            date = kendo.spreadsheet.dateToNumber(date) | 0;\n                            return !kendo.spreadsheet.validation.validationComparers[val.comparerType](date, from, to);\n                        },\n                        min: min,\n                        max: max\n                    });\n                } else {\n                    calendar.setOptions({\n                        disableDates: null,\n                        min: null,\n                        max: null\n                    });\n                }\n                popup.open();\n            }\n            return {\n                edit: function (options) {\n                    context = options;\n                    open();\n                },\n                icon: 'k-i-calendar'\n            };\n        });\n        registerEditor('_validation_list', function () {\n            var context, list, popup;\n            function create() {\n                if (!list) {\n                    list = $('<ul class=\\'k-list k-reset\\'/>').kendoStaticList({\n                        template: '#:value#',\n                        selectable: true,\n                        autoBind: false\n                    });\n                    popup = $('<div>').kendoPopup();\n                    list.appendTo(popup);\n                    popup = popup.getKendoPopup();\n                    list = list.getKendoStaticList();\n                    list.bind('change', function () {\n                        popup.close();\n                        var item = list.value()[0];\n                        if (item) {\n                            context.callback(item.value);\n                        }\n                    });\n                }\n                popup.setOptions({ anchor: context.view.element.find('.k-spreadsheet-editor-button') });\n            }\n            function open() {\n                create();\n                var matrix = context.validation.from.value;\n                var data = [];\n                if (matrix) {\n                    matrix.each(function (el) {\n                        data.push({ value: el });\n                    });\n                }\n                var dataSource = new kendo.data.DataSource({ data: data });\n                list.setDataSource(dataSource);\n                dataSource.read();\n                popup.open();\n            }\n            return {\n                edit: function (options) {\n                    context = options;\n                    open();\n                },\n                icon: 'k-i-arrow-60-down'\n            };\n        });\n    }(window.kendo));\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('spreadsheet/grid', [\n        'kendo.core',\n        'spreadsheet/references'\n    ], f);\n}(function () {\n    (function (kendo) {\n        if (kendo.support.browser.msie && kendo.support.browser.version < 9) {\n            return;\n        }\n        var CellRef = kendo.spreadsheet.CellRef;\n        var RangeRef = kendo.spreadsheet.RangeRef;\n        var UnionRef = kendo.spreadsheet.UnionRef;\n        var Rectangle = kendo.Class.extend({\n            init: function (left, top, width, height) {\n                this.left = left;\n                this.width = width;\n                this.right = left + width;\n                this.top = top;\n                this.height = height;\n                this.bottom = top + height;\n            },\n            offset: function (left, top) {\n                return new Rectangle(this.left + left, this.top + top, this.width, this.height);\n            },\n            resize: function (width, height) {\n                return new Rectangle(this.left, this.top, this.width + width, this.height + height);\n            },\n            intersects: function (x, y) {\n                return this.left < x && x < this.left + this.width && this.top < y && y < this.top + this.height;\n            },\n            toDiv: function (className) {\n                return kendo.dom.element('div', {\n                    className: className,\n                    style: {\n                        width: this.width + 'px',\n                        height: this.height + 'px',\n                        top: this.top + 'px',\n                        left: this.left + 'px'\n                    }\n                });\n            }\n        });\n        var Grid = kendo.Class.extend({\n            init: function (rows, columns, rowCount, columnCount, headerHeight, headerWidth) {\n                this.rowCount = rowCount;\n                this.columnCount = columnCount;\n                this._columns = columns;\n                this._rows = rows;\n                this._headerHeight = headerHeight;\n                this._headerWidth = headerWidth;\n            },\n            isAxis: function (ref) {\n                ref = ref.toRangeRef();\n                var topLeft = ref.topLeft;\n                var bottomRight = ref.bottomRight;\n                return topLeft.row === 0 && bottomRight.row === this.rowCount - 1 || topLeft.col === 0 && bottomRight.col === this.columnCount - 1;\n            },\n            width: function (start, end) {\n                return this._columns.sum(start, end);\n            },\n            height: function (start, end) {\n                return this._rows.sum(start, end);\n            },\n            totalHeight: function () {\n                return this._rows.total + this._headerHeight;\n            },\n            totalWidth: function () {\n                return this._columns.total + this._headerWidth;\n            },\n            index: function (row, column) {\n                return column * this.rowCount + row;\n            },\n            cellRef: function (index) {\n                return new CellRef(index % this.rowCount, index / this.rowCount >> 0);\n            },\n            rowRef: function (row) {\n                return new RangeRef(new CellRef(row, 0), new CellRef(row, this.columnCount - 1));\n            },\n            colRef: function (col) {\n                return new RangeRef(new CellRef(0, col), new CellRef(this.rowCount - 1, col));\n            },\n            cellRefIndex: function (ref) {\n                return this.index(ref.row, ref.col);\n            },\n            normalize: function (ref) {\n                if (ref instanceof RangeRef) {\n                    return new RangeRef(this.normalize(ref.topLeft), this.normalize(ref.bottomRight)).setSheet(ref.sheet, ref.hasSheet());\n                }\n                if (ref instanceof UnionRef) {\n                    return ref.map(function (ref) {\n                        return this.normalize(ref);\n                    }, this);\n                }\n                if (ref instanceof CellRef) {\n                    ref = ref.clone();\n                    ref.col = Math.max(0, Math.min(this.columnCount - 1, ref.col));\n                    ref.row = Math.max(0, Math.min(this.rowCount - 1, ref.row));\n                }\n                return ref;\n            },\n            rectangle: function (ref) {\n                var topLeft = this.normalize(ref.topLeft);\n                var bottomRight = this.normalize(ref.bottomRight);\n                return new Rectangle(this.width(0, topLeft.col - 1), this.height(0, topLeft.row - 1), this.width(topLeft.col, bottomRight.col), this.height(topLeft.row, bottomRight.row));\n            },\n            pane: function (options) {\n                return new PaneGrid(new kendo.spreadsheet.PaneAxis(this._rows, options.row, options.rowCount, this._headerHeight), new kendo.spreadsheet.PaneAxis(this._columns, options.column, options.columnCount, this._headerWidth), this);\n            },\n            rangeDimensions: function (rangeRef) {\n                return {\n                    rows: this._rows.values.iterator(rangeRef.topLeft.row, rangeRef.bottomRight.row),\n                    columns: this._columns.values.iterator(rangeRef.topLeft.col, rangeRef.bottomRight.col)\n                };\n            },\n            forEach: function (ref, callback) {\n                var topLeft = this.normalize(ref.topLeft);\n                var bottomRight = this.normalize(ref.bottomRight);\n                for (var ci = topLeft.col; ci <= bottomRight.col; ci++) {\n                    for (var ri = topLeft.row; ri <= bottomRight.row; ri++) {\n                        callback(new CellRef(ri, ci));\n                    }\n                }\n            },\n            trim: function (ref, property) {\n                var topLeft = ref.topLeft;\n                var bottomRight = ref.bottomRight;\n                var bottomRightRow = topLeft.row;\n                var bottomRightCol = topLeft.col;\n                for (var ci = topLeft.col; ci <= bottomRight.col; ci++) {\n                    var start = this.index(topLeft.row, ci);\n                    var end = this.index(bottomRight.row, ci);\n                    var values = property.tree.intersecting(start, end);\n                    if (values.length) {\n                        var cell = this.cellRef(values[values.length - 1].end);\n                        bottomRightRow = Math.max(bottomRightRow, cell.row);\n                        bottomRightCol = ci;\n                    }\n                }\n                return new RangeRef(ref.topLeft, new CellRef(Math.min(bottomRightRow, ref.bottomRight.row), bottomRightCol));\n            }\n        });\n        var PaneGrid = kendo.Class.extend({\n            init: function (rows, columns, grid) {\n                this.rows = rows;\n                this.columns = columns;\n                this._grid = grid;\n                this.headerHeight = rows.headerSize;\n                this.headerWidth = columns.headerSize;\n                this.hasRowHeader = columns.hasHeader;\n                this.hasColumnHeader = rows.hasHeader;\n            },\n            refresh: function (width, height) {\n                this.columns.viewSize(width);\n                this.rows.viewSize(height);\n                var x = this.columns.paneSegment();\n                var y = this.rows.paneSegment();\n                this.left = x.offset;\n                this.top = y.offset;\n                this.right = x.offset + x.length;\n                this.bottom = y.offset + y.length;\n                this.style = {\n                    top: y.offset + 'px',\n                    left: x.offset + 'px',\n                    height: y.length + 'px',\n                    width: x.length + 'px'\n                };\n            },\n            view: function (left, top) {\n                var rows = this.rows.visible(top);\n                var columns = this.columns.visible(left);\n                return {\n                    rows: rows,\n                    columns: columns,\n                    rowOffset: rows.offset,\n                    columnOffset: columns.offset,\n                    mergedCellLeft: columns.start,\n                    mergedCellTop: rows.start,\n                    ref: new RangeRef(new CellRef(rows.values.start, columns.values.start), new CellRef(rows.values.end, columns.values.end))\n                };\n            },\n            contains: function (ref) {\n                return this.rows.contains(ref.topLeft.row, ref.bottomRight.row) && this.columns.contains(ref.topLeft.col, ref.bottomRight.col);\n            },\n            index: function (row, column) {\n                return this._grid.index(row, column);\n            },\n            boundingRectangle: function (ref) {\n                return this._grid.rectangle(ref);\n            },\n            cellRefIndex: function (ref) {\n                return this._grid.cellRefIndex(ref);\n            },\n            scrollBoundaries: function (cell) {\n                var position = this.boundingRectangle(cell);\n                var boundaries = {\n                    top: Math.max(0, position.top - this.top + (this.hasColumnHeader ? 0 : this.headerHeight)),\n                    left: Math.max(0, position.left - this.left + (this.hasRowHeader ? 0 : this.headerWidth)),\n                    right: position.right - this.columns._viewSize + this.headerWidth,\n                    bottom: position.bottom - this.rows._viewSize + this.headerHeight\n                };\n                var widthCompensation = this.columns.defaultValue / 2;\n                var heightCompensation = this.rows.defaultValue / 2;\n                boundaries.scrollTop = boundaries.top - heightCompensation;\n                boundaries.scrollBottom = boundaries.bottom + heightCompensation;\n                boundaries.scrollLeft = boundaries.left - widthCompensation;\n                boundaries.scrollRight = boundaries.right + widthCompensation;\n                return boundaries;\n            }\n        });\n        kendo.spreadsheet.Grid = Grid;\n        kendo.spreadsheet.PaneGrid = PaneGrid;\n        kendo.spreadsheet.Rectangle = Rectangle;\n    }(kendo));\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('spreadsheet/axis', ['kendo.core'], f);\n}(function () {\n    (function (kendo) {\n        if (kendo.support.browser.msie && kendo.support.browser.version < 9) {\n            return;\n        }\n        var Axis = kendo.Class.extend({\n            init: function (count, value) {\n                this._value = value;\n                this._count = count;\n                this.values = new kendo.spreadsheet.RangeList(0, count - 1, value);\n                this._hidden = new kendo.spreadsheet.RangeList(0, count - 1, 0);\n                this.scrollBarSize = kendo.support.scrollbar();\n                this._refresh();\n            },\n            adjust: function (start, delta) {\n                if (delta < 0) {\n                    this.values.copy(start - delta, this._count - 1, start);\n                    this._hidden.copy(start - delta, this._count - 1, start);\n                } else {\n                    this.values.copy(start, this._count, start + delta);\n                    this._hidden.copy(start, this._count, start + delta);\n                    this.values.value(start, start + delta - 1, this._value);\n                    this._hidden.value(start, start + delta - 1, 0);\n                }\n                this._refresh();\n            },\n            toJSON: function (field, positions) {\n                var values = [];\n                var iterator = this.values.iterator(0, this._count - 1);\n                for (var idx = 0; idx < this._count; idx++) {\n                    var value = iterator.at(idx);\n                    if (value === this._value) {\n                        continue;\n                    }\n                    var position = positions[idx];\n                    if (position === undefined) {\n                        position = values.length;\n                        var item = { index: idx };\n                        item[field] = value;\n                        values.push(item);\n                        positions[idx] = position;\n                    }\n                }\n                return values;\n            },\n            fromJSON: function (field, values) {\n                for (var idx = 0; idx < values.length; idx++) {\n                    var value = values[idx][field];\n                    var index = values[idx].index;\n                    if (index === undefined) {\n                        index = idx;\n                    }\n                    this.value(index, index, value);\n                }\n            },\n            hide: function (index) {\n                if (!this.hidden(index)) {\n                    var value = this.value(index, index);\n                    this._hidden.value(index, index, value);\n                    this.value(index, index, 0);\n                }\n            },\n            hidden: function (index) {\n                return this._hidden.value(index, index) !== 0;\n            },\n            includesHidden: function (start, end) {\n                return this._hidden.intersecting(start, end).length > 1;\n            },\n            nextVisible: function (index, overflow) {\n                var end = this._count - 1;\n                if (index === end) {\n                    return overflow ? index + 1 : index;\n                }\n                index += 1;\n                var range = this._hidden.intersecting(index, index)[0];\n                if (range.value !== 0) {\n                    if (range.end === end) {\n                        return index - 1;\n                    } else {\n                        return range.end + 1;\n                    }\n                } else {\n                    return index;\n                }\n            },\n            nextPage: function (index, pageSize) {\n                return this.index(this.sum(0, index - 1) + pageSize);\n            },\n            prevPage: function (index, pageSize) {\n                return this.index(this.sum(0, index) - pageSize);\n            },\n            firstVisible: function () {\n                var firstHidden = this._hidden.first();\n                if (firstHidden.value === 0) {\n                    return 0;\n                } else {\n                    return firstHidden.end + 1;\n                }\n            },\n            lastVisible: function () {\n                var lastHidden = this._hidden.last();\n                if (lastHidden.value === 0) {\n                    return this._count - 1;\n                } else {\n                    return lastHidden.start - 1;\n                }\n            },\n            prevVisible: function (index, overflow) {\n                if (index === 0) {\n                    return overflow ? -1 : 0;\n                }\n                index -= 1;\n                var range = this._hidden.intersecting(index, index)[0];\n                if (range.value !== 0) {\n                    if (range.start === 0) {\n                        return index + 1;\n                    } else {\n                        return range.start - 1;\n                    }\n                } else {\n                    return index;\n                }\n            },\n            unhide: function (index) {\n                if (this.hidden(index)) {\n                    var value = this._hidden.value(index, index);\n                    this._hidden.value(index, index, 0);\n                    this.value(index, index, value);\n                }\n            },\n            value: function (start, end, value) {\n                if (value !== undefined) {\n                    this.values.value(start, end, value);\n                    this._refresh();\n                } else {\n                    return this.values.iterator(start, end).at(0);\n                }\n            },\n            sum: function (start, end) {\n                var values = this.values.iterator(start, end);\n                var sum = 0;\n                for (var idx = start; idx <= end; idx++) {\n                    sum += values.at(idx);\n                }\n                return sum;\n            },\n            visible: function (start, end) {\n                var startSegment = null;\n                var endSegment = null;\n                var lastPage = false;\n                if (end >= this.total + this.scrollBarSize) {\n                    lastPage = true;\n                }\n                var ranges = this._pixelValues.intersecting(start, end);\n                startSegment = ranges[0];\n                endSegment = ranges[ranges.length - 1];\n                if (!startSegment) {\n                    return {\n                        values: this.values.iterator(0, 0),\n                        offset: 0\n                    };\n                }\n                var startOffset = start - startSegment.start;\n                var startIndex = (startOffset / startSegment.value.value >> 0) + startSegment.value.start;\n                var offset = startOffset - (startIndex - startSegment.value.start) * startSegment.value.value;\n                var endOffset = end - endSegment.start;\n                var endIndex = (endOffset / endSegment.value.value >> 0) + endSegment.value.start;\n                if (endIndex > endSegment.value.end) {\n                    endIndex = endSegment.value.end;\n                }\n                if (lastPage) {\n                    offset += endSegment.value.value - (endOffset - (endIndex - endSegment.value.start) * endSegment.value.value);\n                }\n                offset = Math.min(-offset, 0);\n                return {\n                    values: this.values.iterator(startIndex, endIndex),\n                    offset: offset\n                };\n            },\n            index: function (value) {\n                var index = 0;\n                var iterator = this.values.iterator(0, this._count - 1);\n                var current = iterator.at(0);\n                while (current < value && index < this._count - 1) {\n                    current += iterator.at(++index);\n                }\n                return index;\n            },\n            indexVisible: function (value) {\n                var index = this.index(value);\n                if (this.hidden(index)) {\n                    index = this.prevVisible(index);\n                }\n                return index;\n            },\n            _refresh: function () {\n                var current = 0;\n                this._pixelValues = this.values.map(function (range) {\n                    var start = current;\n                    current += (range.end - range.start + 1) * range.value;\n                    var end = current - 1;\n                    return new kendo.spreadsheet.ValueRange(start, end, range);\n                });\n                this.total = current;\n            },\n            getState: function () {\n                return {\n                    values: this.values.getState(),\n                    hidden: this._hidden.getState()\n                };\n            },\n            setState: function (state) {\n                this.values.setState(state.values);\n                this._hidden.setState(state.hidden);\n                this._refresh();\n            }\n        });\n        var PaneAxis = kendo.Class.extend({\n            init: function (axis, start, count, headerSize) {\n                this._axis = axis;\n                this._start = start;\n                this._count = count;\n                this.hasHeader = start === 0;\n                this.headerSize = headerSize;\n                this.defaultValue = axis._value;\n                this.frozen = count > 0;\n            },\n            viewSize: function (viewSize) {\n                this._viewSize = viewSize;\n            },\n            sum: function (start, end) {\n                return this._axis.sum(start, end - 1);\n            },\n            start: function () {\n                return this.sum(0, this._start);\n            },\n            size: function () {\n                return this.sum(this._start, this._start + this._count);\n            },\n            index: function (value, offset) {\n                return this._axis.index(value + (this.frozen ? 0 : offset) - this.headerSize);\n            },\n            indexVisible: function (value, offset) {\n                return this._axis.indexVisible(value + (this.frozen ? 0 : offset) - this.headerSize);\n            },\n            paneSegment: function () {\n                var offset = this.start();\n                var length;\n                if (!this.hasHeader) {\n                    offset += this.headerSize;\n                }\n                if (this.frozen) {\n                    length = this.size();\n                    if (this.hasHeader) {\n                        length += this.headerSize;\n                    } else {\n                        length -= this.headerSize;\n                    }\n                } else {\n                    length = this._viewSize - offset;\n                }\n                return {\n                    offset: offset,\n                    length: length\n                };\n            },\n            visible: function (offset) {\n                var start = this.start();\n                var size;\n                if (this.frozen) {\n                    size = this.size();\n                    if (!this.hasHeader) {\n                        size -= this.headerSize;\n                    }\n                } else {\n                    size = this._viewSize - start - this.headerSize;\n                    start += offset;\n                }\n                var result = this._axis.visible(start, start + size - 1);\n                if (this.frozen) {\n                    result.offset = 0;\n                }\n                result.start = start;\n                if (this.hasHeader) {\n                    result.offset += this.headerSize;\n                    result.start -= this.headerSize;\n                }\n                return result;\n            },\n            contains: function (start, end) {\n                if (this.frozen) {\n                    if (start > this._start + this._count) {\n                        return false;\n                    }\n                    if (end < this._start) {\n                        return false;\n                    }\n                    return true;\n                } else {\n                    return end >= this._start;\n                }\n            }\n        });\n        kendo.spreadsheet.Axis = Axis;\n        kendo.spreadsheet.PaneAxis = PaneAxis;\n    }(kendo));\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('spreadsheet/filter', [\n        'kendo.core',\n        'kendo.data'\n    ], f);\n}(function () {\n    (function (kendo) {\n        if (kendo.support.browser.msie && kendo.support.browser.version < 9) {\n            return;\n        }\n        var Filter = kendo.spreadsheet.Filter = kendo.Class.extend({\n            prepare: function () {\n            },\n            value: function (cell) {\n                return cell.value;\n            },\n            matches: function () {\n                throw new Error('The \\'matches\\' method is not implemented.');\n            },\n            toJSON: function () {\n                throw new Error('The \\'toJSON\\' method is not implemented.');\n            }\n        });\n        Filter.create = function (options) {\n            var filter = options.filter;\n            if (!filter) {\n                throw new Error('Filter type not specified.');\n            }\n            var constructor = kendo.spreadsheet[filter.charAt(0).toUpperCase() + filter.substring(1) + 'Filter'];\n            if (!constructor) {\n                throw new Error('Filter type not recognized.');\n            }\n            return new constructor(options);\n        };\n        kendo.spreadsheet.ValueFilter = Filter.extend({\n            _values: [],\n            _dates: [],\n            _blanks: false,\n            init: function ValueFilter(options) {\n                if (options.values !== undefined) {\n                    this._values = options.values;\n                }\n                if (options.blanks !== undefined) {\n                    this._blanks = options.blanks;\n                }\n                if (options.dates !== undefined) {\n                    this._dates = options.dates;\n                }\n            },\n            value: function (cell) {\n                var value = cell.value;\n                if (this._dates.length > 0 && cell.format && typeof value === 'number') {\n                    var type = kendo.spreadsheet.formatting.type(value, cell.format);\n                    if (type === 'date') {\n                        value = kendo.spreadsheet.numberToDate(value);\n                    }\n                }\n                return value;\n            },\n            matches: function (value) {\n                if (value === null || value === undefined) {\n                    return this._blanks;\n                }\n                if (value instanceof Date) {\n                    return this._dates.some(function (date) {\n                        return date.year === value.getFullYear() && (date.month === undefined || date.month === value.getMonth()) && (date.day === undefined || date.day === value.getDate()) && (date.hours === undefined || date.hours === value.getHours()) && (date.minutes === undefined || date.minutes === value.getMinutes()) && (date.seconds === undefined || date.seconds === value.getSeconds());\n                    });\n                }\n                return this._values.indexOf(value) >= 0;\n            },\n            toJSON: function () {\n                return {\n                    filter: 'value',\n                    blanks: this._blanks,\n                    values: this._values.slice(0)\n                };\n            }\n        });\n        kendo.spreadsheet.CustomFilter = Filter.extend({\n            _logic: 'and',\n            init: function CustomFilter(options) {\n                if (options.logic !== undefined) {\n                    this._logic = options.logic;\n                }\n                if (options.criteria === undefined) {\n                    throw new Error('Must specify criteria.');\n                }\n                this._criteria = options.criteria;\n                var expression = kendo.data.Query.filterExpr({\n                    logic: this._logic,\n                    filters: this._criteria\n                }).expression;\n                this._matches = new Function('d', 'return ' + expression);\n            },\n            matches: function (value) {\n                if (value === null) {\n                    return false;\n                }\n                return this._matches(value);\n            },\n            value: function (cell) {\n                var value = cell.value;\n                var criterionValue = this._criteria[0].value;\n                var criterionType = criterionValue instanceof Date ? 'date' : typeof criterionValue;\n                var valueType = typeof value;\n                if (cell.format) {\n                    valueType = kendo.spreadsheet.formatting.type(value, cell.format);\n                }\n                if (valueType != criterionType) {\n                    if (criterionType == 'string') {\n                        if (cell.format) {\n                            value = kendo.spreadsheet.formatting.text(value, cell.format);\n                        }\n                        value = value + '';\n                    }\n                } else if (valueType == 'date') {\n                    value = kendo.spreadsheet.numberToDate(value);\n                }\n                return value;\n            },\n            toJSON: function () {\n                return {\n                    filter: 'custom',\n                    logic: this._logic,\n                    criteria: this._criteria\n                };\n            }\n        });\n        kendo.spreadsheet.TopFilter = Filter.extend({\n            init: function TopFilter(options) {\n                this._type = options.type;\n                this._value = options.value;\n                this._values = [];\n            },\n            prepare: function (cells) {\n                var values = cells.map(this.value).sort().filter(function (value, index, array) {\n                    return index === 0 || value !== array[index - 1];\n                });\n                if (this._type === 'topNumber' || this._type == 'topPercent') {\n                    values.sort(function (x, y) {\n                        return y - x;\n                    });\n                } else {\n                    values.sort(function (x, y) {\n                        return x - y;\n                    });\n                }\n                var count = this._value;\n                if (this._type === 'topPercent' || this._type === 'bottomPercent') {\n                    count = values.length * count / 100 >> 0;\n                }\n                this._values = values.slice(0, count);\n            },\n            matches: function (value) {\n                return this._values.indexOf(value) >= 0;\n            },\n            toJSON: function () {\n                return {\n                    filter: 'top',\n                    type: this._type,\n                    value: this._value\n                };\n            }\n        });\n        kendo.spreadsheet.DynamicFilter = Filter.extend({\n            init: function DynamicFilter(options) {\n                this._type = options.type;\n                this._predicate = this[options.type];\n                if (typeof this._predicate !== 'function') {\n                    throw new Error('DynamicFilter type \\'' + options.type + '\\' not recognized.');\n                }\n            },\n            value: function (cell) {\n                var value = cell.value;\n                if (cell.format) {\n                    var type = kendo.spreadsheet.formatting.type(value, cell.format);\n                    if (type === 'date') {\n                        value = kendo.spreadsheet.numberToDate(value);\n                    }\n                }\n                return value;\n            },\n            prepare: function (cells) {\n                var sum = 0;\n                var count = 0;\n                for (var ci = 0; ci < cells.length; ci++) {\n                    var value = this.value(cells[ci]);\n                    if (typeof value === 'number') {\n                        sum += value;\n                        count++;\n                    }\n                }\n                if (count > 0) {\n                    this._average = sum / count;\n                } else {\n                    this._average = 0;\n                }\n            },\n            matches: function (value) {\n                return this._predicate(value);\n            },\n            aboveAverage: function (value) {\n                if (value instanceof Date) {\n                    value = kendo.spreadsheet.dateToNumber(value);\n                }\n                if (typeof value !== 'number') {\n                    return false;\n                }\n                return value > this._average;\n            },\n            belowAverage: function (value) {\n                if (value instanceof Date) {\n                    value = kendo.spreadsheet.dateToNumber(value);\n                }\n                if (typeof value !== 'number') {\n                    return false;\n                }\n                return value < this._average;\n            },\n            tomorrow: function (value) {\n                if (value instanceof Date) {\n                    var tomorrow = kendo.date.addDays(kendo.date.today(), 1);\n                    return kendo.date.getDate(value).getTime() === tomorrow.getTime();\n                }\n                return false;\n            },\n            today: function (value) {\n                if (value instanceof Date) {\n                    return kendo.date.isToday(value);\n                }\n                return false;\n            },\n            yesterday: function (value) {\n                if (value instanceof Date) {\n                    var yesterday = kendo.date.addDays(kendo.date.today(), -1);\n                    return kendo.date.getDate(value).getTime() === yesterday.getTime();\n                }\n                return false;\n            },\n            nextWeek: function (value) {\n                return sameWeek(kendo.date.addDays(kendo.date.today(), 7), value);\n            },\n            thisWeek: function (value) {\n                return sameWeek(kendo.date.today(), value);\n            },\n            lastWeek: function (value) {\n                return sameWeek(kendo.date.addDays(kendo.date.today(), -7), value);\n            },\n            nextMonth: function (value) {\n                return sameMonth(value, 1);\n            },\n            thisMonth: function (value) {\n                return sameMonth(value, 0);\n            },\n            lastMonth: function (value) {\n                return sameMonth(value, -1);\n            },\n            nextQuarter: function (value) {\n                if (value instanceof Date) {\n                    var today = kendo.date.today();\n                    var diff = quarter(value) - quarter(today);\n                    return diff === 1 && today.getFullYear() === value.getFullYear() || diff == -3 && today.getFullYear() + 1 === value.getFullYear();\n                }\n                return false;\n            },\n            thisQuarter: function (value) {\n                if (value instanceof Date) {\n                    var today = kendo.date.today();\n                    var diff = quarter(value) - quarter(today);\n                    return diff === 0 && today.getFullYear() === value.getFullYear();\n                }\n                return false;\n            },\n            lastQuarter: function (value) {\n                if (value instanceof Date) {\n                    var today = kendo.date.today();\n                    var diff = quarter(today) - quarter(value);\n                    return diff === 1 && today.getFullYear() === value.getFullYear() || diff == -3 && today.getFullYear() - 1 === value.getFullYear();\n                }\n                return false;\n            },\n            nextYear: function (value) {\n                return sameYear(value, 1);\n            },\n            thisYear: function (value) {\n                return sameYear(value, 0);\n            },\n            lastYear: function (value) {\n                return sameYear(value, -1);\n            },\n            yearToDate: function (value) {\n                if (value instanceof Date) {\n                    var today = kendo.date.today();\n                    return value.getFullYear() === today.getFullYear() && value <= today;\n                }\n                return false;\n            },\n            toJSON: function () {\n                return {\n                    filter: 'dynamic',\n                    type: this._type\n                };\n            }\n        });\n        [\n            1,\n            2,\n            3,\n            4\n        ].forEach(function (target) {\n            kendo.spreadsheet.DynamicFilter.prototype['quarter' + target] = function (value) {\n                if (value instanceof Date) {\n                    return quarter(value) === target;\n                }\n                return false;\n            };\n        });\n        kendo.cultures['en-US'].calendar.months.names.forEach(function (month, index) {\n            kendo.spreadsheet.DynamicFilter.prototype[month.toLowerCase()] = function (value) {\n                if (value instanceof Date) {\n                    return value.getMonth() === index;\n                }\n                return false;\n            };\n        });\n        function quarter(value) {\n            var month = value.getMonth() + 1;\n            if (month >= 1 && month <= 3) {\n                return 1;\n            } else if (month >= 4 && month <= 6) {\n                return 2;\n            } else if (month >= 7 && month <= 9) {\n                return 3;\n            } else {\n                return 4;\n            }\n        }\n        function sameYear(value, offset) {\n            if (value instanceof Date) {\n                var today = kendo.date.today();\n                today.setFullYear(today.getFullYear() + offset);\n                return today.getFullYear() === value.getFullYear();\n            }\n            return false;\n        }\n        function sameMonth(value, offset) {\n            if (value instanceof Date) {\n                var today = kendo.date.firstDayOfMonth(kendo.date.today());\n                today.setMonth(today.getMonth() + offset, 1);\n                return today.getTime() === kendo.date.firstDayOfMonth(value).getTime();\n            }\n            return false;\n        }\n        function sameWeek(a, b) {\n            if (b instanceof Date) {\n                var firstWeek = kendo.date.dayOfWeek(kendo.date.getDate(a), 1);\n                var secondWeek = kendo.date.dayOfWeek(kendo.date.getDate(b), 1);\n                return firstWeek.getTime() === secondWeek.getTime();\n            }\n            return false;\n        }\n    }(kendo));\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('spreadsheet/sorter', ['kendo.core'], f);\n}(function () {\n    (function (kendo) {\n        if (kendo.support.browser.msie && kendo.support.browser.version < 9) {\n            return;\n        }\n        var Sorter = kendo.Class.extend({\n            init: function (grid, lists) {\n                this._grid = grid;\n                this._lists = lists;\n            },\n            indices: function (rangeRef, list, ascending, indices) {\n                var comparer = Sorter.ascendingComparer;\n                if (ascending === false) {\n                    comparer = Sorter.descendingComparer;\n                }\n                return list.sortedIndices(this._grid.cellRefIndex(rangeRef.topLeft), this._grid.cellRefIndex(rangeRef.bottomRight), comparer, indices);\n            },\n            sortBy: function (ref, column, list, ascending, indices) {\n                var sortedIndices = this.indices(ref.toColumn(column), list, ascending, indices);\n                for (var ci = ref.topLeft.col; ci <= ref.bottomRight.col; ci++) {\n                    var start = this._grid.index(ref.topLeft.row, ci);\n                    var end = this._grid.index(ref.bottomRight.row, ci);\n                    for (var li = 0; li < this._lists.length; li++) {\n                        if (start < this._lists[li].lastRangeStart()) {\n                            this._lists[li].sort(start, end, sortedIndices);\n                        }\n                    }\n                }\n                return sortedIndices;\n            }\n        });\n        Sorter.ascendingComparer = function (a, b) {\n            if (a === null && b === null) {\n                return 0;\n            }\n            if (a === null) {\n                return 1;\n            }\n            if (b === null) {\n                return -1;\n            }\n            var typeA = typeof a;\n            var typeB = typeof b;\n            if (typeA === 'number') {\n                if (typeB === 'number') {\n                    return a - b;\n                } else {\n                    return -1;\n                }\n            }\n            if (typeA === 'string') {\n                switch (typeB) {\n                case 'number':\n                    return 1;\n                case 'string':\n                    return a.localeCompare(b);\n                default:\n                    return -1;\n                }\n            }\n            if (typeA === 'boolean') {\n                switch (typeB) {\n                case 'number':\n                    return 1;\n                case 'string':\n                    return 1;\n                case 'boolean':\n                    return a - b;\n                default:\n                    return -1;\n                }\n            }\n            if (a instanceof kendo.spreadsheet.calc.runtime.CalcError) {\n                if (b instanceof kendo.spreadsheet.calc.runtime.CalcError) {\n                    return 0;\n                } else {\n                    return 1;\n                }\n            }\n            throw new Error('Cannot compare ' + a + ' and ' + b);\n        };\n        Sorter.descendingComparer = function (a, b) {\n            if (a === null && b === null) {\n                return 0;\n            }\n            if (a === null) {\n                return 1;\n            }\n            if (b === null) {\n                return -1;\n            }\n            return Sorter.ascendingComparer(b, a);\n        };\n        kendo.spreadsheet.Sorter = Sorter;\n    }(kendo));\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('spreadsheet/numformat', [\n        'spreadsheet/calc',\n        'kendo.dom'\n    ], f);\n}(function () {\n    'use strict';\n    if (kendo.support.browser.msie && kendo.support.browser.version < 9) {\n        return;\n    }\n    var calc = kendo.spreadsheet.calc;\n    var dom = kendo.dom;\n    var RX_COLORS = /^\\[(black|green|white|blue|magenta|yellow|cyan|red)\\]/i;\n    var RX_CONDITION = /^\\[(<=|>=|<>|<|>|=)(-?[0-9.]+)\\]/;\n    function parse(input) {\n        input = calc.InputStream(input);\n        var sections = [], haveConditional = false, decimalPart;\n        while (!input.eof()) {\n            var sec = readSection();\n            sections.push(sec);\n            if (sec.cond) {\n                haveConditional = true;\n            }\n        }\n        if (!haveConditional) {\n            if (sections.length == 1) {\n                sections[0].cond = 'num';\n            } else if (sections.length == 2) {\n                sections[0].cond = {\n                    op: '>=',\n                    value: 0\n                };\n                sections[1].cond = {\n                    op: '<',\n                    value: 0\n                };\n            } else if (sections.length >= 3) {\n                sections[0].cond = {\n                    op: '>',\n                    value: 0\n                };\n                sections[1].cond = {\n                    op: '<',\n                    value: 0\n                };\n                sections[2].cond = {\n                    op: '=',\n                    value: 0\n                };\n                if (sections.length > 3) {\n                    sections[3].cond = 'text';\n                    sections = sections.slice(0, 4);\n                }\n            }\n        }\n        return sections;\n        function maybeColor() {\n            var m = input.skip(RX_COLORS);\n            if (m) {\n                return m[1].toLowerCase();\n            }\n        }\n        function maybeCondition() {\n            var m = input.skip(RX_CONDITION);\n            if (m) {\n                var val = parseFloat(m[2]);\n                if (!isNaN(val)) {\n                    return {\n                        op: m[1],\n                        value: val\n                    };\n                }\n            }\n        }\n        function readFormat() {\n            var format = [], tok, prev = null;\n            while (!input.eof() && (tok = readNext())) {\n                if (tok.type == 'date') {\n                    if (prev && /^(el)?time$/.test(prev.type) && prev.part == 'h' && tok.part == 'm' && tok.format < 3) {\n                        tok.type = 'time';\n                    }\n                } else if (/^(el)?time$/.test(tok.type) && tok.part == 's') {\n                    if (prev && prev.type == 'date' && prev.part == 'm' && prev.format < 3) {\n                        prev.type = 'time';\n                    }\n                }\n                if (!/^(?:str|space|fill)$/.test(tok.type)) {\n                    prev = tok;\n                }\n                format.push(tok);\n            }\n            return format;\n        }\n        function maybeFraction(tok) {\n            if (tok.type != 'date' || tok.part == 'm' && tok.format < 3) {\n                var m = input.skip(/^\\.(0+)/);\n                if (m) {\n                    tok.fraction = m[1].length;\n                    if (tok.type == 'date') {\n                        tok.type = 'time';\n                    }\n                }\n            }\n            return tok;\n        }\n        function readNext() {\n            var ch, m;\n            if (m = input.skip(/^([#0?]+)(?:,([#0?]+))+/)) {\n                return {\n                    type: 'digit',\n                    sep: true,\n                    format: m[1] + m[2],\n                    decimal: decimalPart\n                };\n            }\n            if (m = input.skip(/^[#0?]+/)) {\n                return {\n                    type: 'digit',\n                    sep: false,\n                    format: m[0],\n                    decimal: decimalPart\n                };\n            }\n            if (m = input.skip(/^(e)([+-])/i)) {\n                return {\n                    type: 'exp',\n                    ch: m[1],\n                    sign: m[2]\n                };\n            }\n            if (m = input.skip(/^(d{1,4}|m{1,5}|yyyy|yy)/i)) {\n                m = m[1].toLowerCase();\n                return maybeFraction({\n                    type: 'date',\n                    part: m.charAt(0),\n                    format: m.length\n                });\n            }\n            if (m = input.skip(/^(hh?|ss?)/i)) {\n                m = m[1].toLowerCase();\n                return maybeFraction({\n                    type: 'time',\n                    part: m.charAt(0),\n                    format: m.length\n                });\n            }\n            if (m = input.skip(/^\\[(hh?|mm?|ss?)\\]/i)) {\n                m = m[1].toLowerCase();\n                return maybeFraction({\n                    type: 'eltime',\n                    part: m.charAt(0),\n                    format: m.length\n                });\n            }\n            if (m = input.skip(/^(am\\/pm|a\\/p)/i)) {\n                m = m[1].split('/');\n                return {\n                    type: 'ampm',\n                    am: m[0],\n                    pm: m[1]\n                };\n            }\n            switch (ch = input.next()) {\n            case ';':\n                return null;\n            case '\\\\':\n                return {\n                    type: 'str',\n                    value: input.next()\n                };\n            case '\"':\n                return {\n                    type: 'str',\n                    value: input.readEscaped(ch)\n                };\n            case '@':\n                return { type: 'text' };\n            case '_':\n                return {\n                    type: 'space',\n                    value: input.next()\n                };\n            case '*':\n                return {\n                    type: 'fill',\n                    value: input.next()\n                };\n            case '.':\n                if (input.lookingAt(/^\\s*[#0?]/)) {\n                    decimalPart = true;\n                    return { type: 'dec' };\n                }\n                return {\n                    type: 'str',\n                    value: '.'\n                };\n            case '%':\n                return { type: 'percent' };\n            case ',':\n                return { type: 'comma' };\n            }\n            return {\n                type: 'str',\n                value: ch\n            };\n        }\n        function readSection() {\n            decimalPart = false;\n            var color = maybeColor(), cond = maybeCondition();\n            if (!color && cond) {\n                color = maybeColor();\n            }\n            return {\n                color: color,\n                cond: cond,\n                body: readFormat()\n            };\n        }\n    }\n    function print(sections) {\n        return sections.map(printSection).join(';');\n        function printSection(sec) {\n            var out = '';\n            if (sec.color) {\n                out += '[' + sec.color + ']';\n            }\n            if (sec.cond) {\n                if (!(sec.cond == 'text' || sec.cond == 'num')) {\n                    out += '[' + sec.cond.op + sec.cond.value + ']';\n                }\n            }\n            out += sec.body.map(printToken).join('');\n            return out;\n        }\n        function maybeFraction(fmt, tok) {\n            if (tok.fraction) {\n                fmt += '.' + padLeft('', tok.fraction, '0');\n            }\n            return fmt;\n        }\n        function printToken(tok) {\n            if (tok.type == 'digit') {\n                if (tok.sep) {\n                    return tok.format.charAt(0) + ',' + tok.format.substr(1);\n                } else {\n                    return tok.format;\n                }\n            } else if (tok.type == 'exp') {\n                return tok.ch + tok.sign;\n            } else if (tok.type == 'date' || tok.type == 'time') {\n                return maybeFraction(padLeft('', tok.format, tok.part), tok);\n            } else if (tok.type == 'eltime') {\n                return maybeFraction('[' + padLeft('', tok.format, tok.part) + ']', tok);\n            } else if (tok.type == 'ampm') {\n                return tok.am + '/' + tok.pm;\n            } else if (tok.type == 'str') {\n                return JSON.stringify(tok.value);\n            } else if (tok.type == 'text') {\n                return '@';\n            } else if (tok.type == 'space') {\n                return '_' + tok.value;\n            } else if (tok.type == 'fill') {\n                return '*' + tok.value;\n            } else if (tok.type == 'dec') {\n                return '.';\n            } else if (tok.type == 'percent') {\n                return '%';\n            } else if (tok.type == 'comma') {\n                return ',';\n            }\n        }\n    }\n    function adjustDecimals(sections, x) {\n        sections.forEach(function (sec) {\n            var diff = x;\n            if (sec.cond == 'text') {\n                return;\n            }\n            var body = sec.body, adjusted = false, i = body.length;\n            while (diff !== 0 && --i >= 0) {\n                var tok = body[i];\n                if (tok.type == 'digit') {\n                    if (tok.decimal) {\n                        adjusted = true;\n                        if (diff > 0) {\n                            tok.format += padLeft('', diff, '0');\n                        } else if (diff < 0) {\n                            var tmp = tok.format.length;\n                            tok.format = tok.format.substr(0, tmp + diff);\n                            diff += tmp - tok.format.length;\n                        }\n                        if (tok.format.length === 0) {\n                            body.splice(i, 1);\n                            while (--i >= 0) {\n                                tok = body[i];\n                                if (tok.type == 'digit' && tok.decimal) {\n                                    ++i;\n                                    break;\n                                }\n                                if (tok.type == 'dec') {\n                                    body.splice(i, 1);\n                                    break;\n                                }\n                            }\n                        }\n                    }\n                    if (diff > 0) {\n                        break;\n                    }\n                }\n            }\n            if (!adjusted && diff > 0) {\n                body.splice(i + 1, 0, { type: 'dec' }, {\n                    type: 'digit',\n                    sep: false,\n                    decimal: true,\n                    format: padLeft('', diff, '0')\n                });\n            }\n        });\n    }\n    function TokenStream(parts) {\n        var index = 0;\n        return {\n            next: function () {\n                return parts[index++];\n            },\n            eof: function () {\n                return index >= parts.length;\n            },\n            ahead: function (n, f) {\n                if (index + n <= parts.length) {\n                    var val = f.apply(null, parts.slice(index, index + n));\n                    if (val) {\n                        index += n;\n                    }\n                    return val;\n                }\n            },\n            restart: function () {\n                index = 0;\n            }\n        };\n    }\n    function compileFormatPart(format) {\n        var input = TokenStream(format.body);\n        var hasDate = false;\n        var hasTime = false;\n        var hasAmpm = false;\n        var percentCount = 0;\n        var scaleCount = 0;\n        var code = '';\n        var separeThousands = false;\n        var declen = 0;\n        var intFormat = [], decFormat = [];\n        var condition = format.cond;\n        var preamble = '';\n        if (condition == 'text') {\n            preamble = 'if (typeof value == \\'string\\' || value instanceof kendo.spreadsheet.CalcError) { ';\n        } else if (condition == 'num') {\n            preamble = 'if (typeof value == \\'number\\') { ';\n        } else if (condition) {\n            var op = condition.op == '=' ? '==' : condition.op;\n            preamble = 'if (typeof value == \\'number\\' && value ' + op + ' ' + condition.value + ') { ';\n            code += 'value = Math.abs(value); ';\n        }\n        if (format.color) {\n            code += 'result.color = ' + JSON.stringify(format.color) + '; ';\n        }\n        function checkComma(a, b) {\n            if (a.type == 'digit' && b.type == 'comma' || a.type == 'comma' && a.hidden && b.type == 'comma') {\n                b.hidden = true;\n                scaleCount++;\n            }\n        }\n        while (!input.eof()) {\n            input.ahead(2, checkComma);\n            var tok = input.next();\n            if (tok.type == 'percent') {\n                percentCount++;\n            } else if (tok.type == 'digit') {\n                if (tok.decimal) {\n                    declen += tok.format.length;\n                    decFormat.push(tok.format);\n                } else {\n                    intFormat.push(tok.format);\n                    if (tok.sep) {\n                        separeThousands = true;\n                    }\n                }\n            } else if (tok.type == 'time') {\n                hasTime = true;\n            } else if (tok.type == 'date') {\n                hasDate = true;\n            } else if (tok.type == 'ampm') {\n                hasAmpm = hasTime = true;\n            }\n        }\n        if (percentCount > 0) {\n            code += 'value *= ' + Math.pow(100, percentCount) + '; ';\n        }\n        if (scaleCount > 0) {\n            code += 'value /= ' + Math.pow(1000, scaleCount) + '; ';\n        }\n        if (intFormat.length) {\n            code += 'var intPart = runtime.formatInt(culture, value, ' + JSON.stringify(intFormat) + ', ' + declen + ', ' + separeThousands + '); ';\n        }\n        if (decFormat.length) {\n            code += 'var decPart = runtime.formatDec(value, ' + JSON.stringify(decFormat) + ', ' + declen + '); ';\n        }\n        if (intFormat.length || decFormat.length) {\n            code += 'type = \\'number\\'; ';\n        }\n        if (hasDate) {\n            code += 'var date = runtime.unpackDate(value); ';\n        }\n        if (hasTime) {\n            code += 'var time = runtime.unpackTime(value); ';\n        }\n        if (hasDate || hasTime) {\n            code += 'type = \\'date\\'; ';\n        }\n        if (percentCount > 0 || scaleCount > 0 || intFormat.length || decFormat.length || hasDate || hasTime) {\n            if (!preamble) {\n                preamble = 'if (typeof value == \\'number\\') { ';\n            }\n        }\n        input.restart();\n        while (!input.eof()) {\n            var tok = input.next();\n            if (tok.type == 'dec') {\n                code += 'output += culture.numberFormat[\\'.\\']; ';\n            } else if (tok.type == 'comma' && !tok.hidden) {\n                code += 'output += \\',\\'; ';\n            } else if (tok.type == 'percent') {\n                code += 'type = \\'percent\\'; ';\n                code += 'output += culture.numberFormat.percent.symbol; ';\n            } else if (tok.type == 'str') {\n                code += 'output += ' + JSON.stringify(tok.value) + '; ';\n            } else if (tok.type == 'text') {\n                code += 'type = \\'text\\'; ';\n                code += 'output += value; ';\n            } else if (tok.type == 'space') {\n                code += 'if (output) result.body.push(output); ';\n                code += 'output = \\'\\'; ';\n                code += 'result.body.push({ type: \\'space\\', value: ' + JSON.stringify(tok.value) + ' }); ';\n            } else if (tok.type == 'fill') {\n                code += 'output += runtime.fill(' + JSON.stringify(tok.value) + '); ';\n            } else if (tok.type == 'digit') {\n                code += 'output += ' + (tok.decimal ? 'decPart' : 'intPart') + '.shift(); ';\n            } else if (tok.type == 'date') {\n                code += 'output += runtime.date(culture, date, ' + JSON.stringify(tok.part) + ', ' + tok.format + '); ';\n            } else if (tok.type == 'time') {\n                code += 'output += runtime.time(time, ' + JSON.stringify(tok.part) + ', ' + tok.format + ', ' + hasAmpm + ', ' + tok.fraction + '); ';\n            } else if (tok.type == 'eltime') {\n                code += 'output += runtime.eltime(value, ' + JSON.stringify(tok.part) + ', ' + tok.format + ', ' + tok.fraction + '); ';\n            } else if (tok.type == 'ampm') {\n                code += 'output += time.hours < 12 ? ' + JSON.stringify(tok.am) + ' : ' + JSON.stringify(tok.pm) + '; ';\n            }\n        }\n        code += 'if (output) result.body.push(output); ';\n        code += 'result.type = type; ';\n        code += 'return result; ';\n        if (preamble) {\n            code = preamble + code + '}';\n        }\n        return code;\n    }\n    var CACHE = Object.create(null);\n    var TEXT = compileFormatPart({\n        cond: 'text',\n        body: [{ type: 'text' }]\n    });\n    function compile(format) {\n        var f = CACHE[format];\n        if (!f) {\n            var tree = parse(format);\n            var code = tree.map(compileFormatPart);\n            code.push(TEXT);\n            code = code.join('\\n');\n            code = '\\'use strict\\'; return function(value, culture){ ' + 'if (!culture) culture = kendo.culture(); ' + 'var output = \\'\\', type = null, result = { body: [] }; ' + code + '; return result; };';\n            f = CACHE[format] = new Function('runtime', code)(runtime);\n        }\n        return f;\n    }\n    var runtime = {\n        unpackDate: calc.runtime.unpackDate,\n        unpackTime: calc.runtime.unpackTime,\n        date: function (culture, d, part, length) {\n            switch (part) {\n            case 'd':\n                switch (length) {\n                case 1:\n                    return d.date;\n                case 2:\n                    return padLeft(d.date, 2, '0');\n                case 3:\n                    return culture.calendars.standard.days.namesAbbr[d.day];\n                case 4:\n                    return culture.calendars.standard.days.names[d.day];\n                }\n                break;\n            case 'm':\n                switch (length) {\n                case 1:\n                    return d.month + 1;\n                case 2:\n                    return padLeft(d.month + 1, 2, '0');\n                case 3:\n                    return culture.calendars.standard.months.namesAbbr[d.month];\n                case 4:\n                    return culture.calendars.standard.months.names[d.month];\n                case 5:\n                    return culture.calendars.standard.months.names[d.month].charAt(0);\n                }\n                break;\n            case 'y':\n                switch (length) {\n                case 2:\n                    return d.year % 100;\n                case 4:\n                    return d.year;\n                }\n                break;\n            }\n            return '##';\n        },\n        time: function (t, part, length, ampm, fraclen) {\n            var ret, fraction;\n            switch (part) {\n            case 'h':\n                ret = padLeft(ampm ? t.hours % 12 || 12 : t.hours, length, '0');\n                if (fraclen) {\n                    fraction = (t.minutes + (t.seconds + t.milliseconds / 1000) / 60) / 60;\n                }\n                break;\n            case 'm':\n                ret = padLeft(t.minutes, length, '0');\n                if (fraclen) {\n                    fraction = (t.seconds + t.milliseconds / 1000) / 60;\n                }\n                break;\n            case 's':\n                ret = padLeft(t.seconds, length, '0');\n                if (fraclen) {\n                    fraction = t.milliseconds / 1000;\n                }\n                break;\n            }\n            if (fraction) {\n                ret += fraction.toFixed(fraclen).replace(/^0+/, '');\n            }\n            return ret;\n        },\n        eltime: function (value, part, length, fraclen) {\n            var ret, fraction;\n            switch (part) {\n            case 'h':\n                ret = value * 24;\n                break;\n            case 'm':\n                ret = value * 24 * 60;\n                break;\n            case 's':\n                ret = value * 24 * 60 * 60;\n                break;\n            }\n            if (fraclen) {\n                fraction = ret - (ret | 0);\n            }\n            ret = padLeft(ret | 0, length, '0');\n            if (fraction) {\n                ret += fraction.toFixed(fraclen).replace(/^0+/, '');\n            }\n            return ret;\n        },\n        fill: function (ch) {\n            return ch;\n        },\n        formatInt: function (culture, value, parts, declen, sep) {\n            value = value.toFixed(declen).replace(/\\..*$/, '');\n            if (declen > 0) {\n                if (value === '0') {\n                    value = '';\n                } else if (value === '-0') {\n                    value = '-';\n                }\n            }\n            var iv = value.length - 1;\n            var result = [];\n            var len = 0, str;\n            function add(ch) {\n                if (sep && len && len % 3 === 0 && /^[0-9]$/.test(ch)) {\n                    str = culture.numberFormat[','] + str;\n                }\n                str = ch + str;\n                len++;\n            }\n            for (var j = parts.length; --j >= 0;) {\n                var format = parts[j];\n                str = '';\n                for (var k = format.length; --k >= 0;) {\n                    var chf = format.charAt(k);\n                    if (iv < 0) {\n                        if (chf == '0') {\n                            add('0');\n                        } else if (chf == '?') {\n                            add(' ');\n                        }\n                    } else {\n                        add(value.charAt(iv--));\n                    }\n                }\n                if (j === 0) {\n                    while (iv >= 0) {\n                        add(value.charAt(iv--));\n                    }\n                }\n                result.unshift(str);\n            }\n            return result;\n        },\n        formatDec: function (value, parts, declen) {\n            value = value.toFixed(declen);\n            var pos = value.indexOf('.');\n            if (pos >= 0) {\n                value = value.substr(pos + 1).replace(/0+$/, '');\n            } else {\n                value = '';\n            }\n            var iv = 0;\n            var result = [];\n            for (var j = 0; j < parts.length; ++j) {\n                var format = parts[j];\n                var str = '';\n                for (var k = 0; k < format.length; ++k) {\n                    var chf = format.charAt(k);\n                    if (iv < value.length) {\n                        str += value.charAt(iv++);\n                    } else if (chf == '0') {\n                        str += '0';\n                    } else if (chf == '?') {\n                        str += ' ';\n                    }\n                }\n                result.push(str);\n            }\n            return result;\n        }\n    };\n    function padLeft(val, width, ch) {\n        val += '';\n        while (val.length < width) {\n            val = ch + val;\n        }\n        return val;\n    }\n    function text(f) {\n        var a = f.body;\n        var text = '';\n        for (var i = 0; i < a.length; ++i) {\n            var el = a[i];\n            if (typeof el == 'string') {\n                text += el;\n            } else if (el.type == 'space') {\n                text += ' ';\n            }\n        }\n        return text;\n    }\n    kendo.spreadsheet.formatting = {\n        compile: compile,\n        parse: parse,\n        format: function (value, format, culture) {\n            var f = compile(format)(value, culture);\n            var span = dom.element('span');\n            span.__dataType = f.type;\n            var a = f.body;\n            if (f.color) {\n                span.attr.style = { color: f.color };\n            }\n            for (var i = 0; i < a.length; ++i) {\n                var el = a[i];\n                if (typeof el == 'string') {\n                    span.children.push(dom.text(el));\n                } else if (el.type == 'space') {\n                    span.children.push(dom.element('span', { style: { visibility: 'hidden' } }, [dom.text(el.value)]));\n                }\n            }\n            return span;\n        },\n        text: function (value, format, culture) {\n            var f = compile(format)(value, culture);\n            return text(f);\n        },\n        textAndColor: function (value, format, culture) {\n            var f = compile(format)(value, culture);\n            return {\n                text: text(f),\n                color: f.color,\n                type: f.type\n            };\n        },\n        type: function (value, format) {\n            return compile(format)(value).type;\n        },\n        adjustDecimals: function (format, diff) {\n            var ast = parse(format);\n            adjustDecimals(ast, diff);\n            return print(ast);\n        }\n    };\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('spreadsheet/runtime.functions', [\n        'spreadsheet/runtime',\n        'util/main'\n    ], f);\n}(function () {\n    'use strict';\n    if (kendo.support.browser.msie && kendo.support.browser.version < 9) {\n        return;\n    }\n    var util = kendo.util;\n    var spreadsheet = kendo.spreadsheet;\n    var calc = spreadsheet.calc;\n    var runtime = calc.runtime;\n    var defineFunction = runtime.defineFunction;\n    var defineAlias = runtime.defineAlias;\n    var CalcError = runtime.CalcError;\n    var RangeRef = spreadsheet.RangeRef;\n    var CellRef = spreadsheet.CellRef;\n    var UnionRef = spreadsheet.UnionRef;\n    var Matrix = runtime.Matrix;\n    var Ref = spreadsheet.Ref;\n    var daysInMonth = runtime.daysInMonth;\n    var packDate = runtime.packDate;\n    var unpackDate = runtime.unpackDate;\n    var daysInYear = runtime.daysInYear;\n    [\n        'abs',\n        'cos',\n        'sin',\n        'acos',\n        'asin',\n        'tan',\n        'atan',\n        'exp',\n        'sqrt'\n    ].forEach(function (name) {\n        defineFunction(name, Math[name]).args([[\n                '*n',\n                'number'\n            ]]);\n    });\n    defineFunction('ln', Math.log).args([[\n            '*n',\n            'number'\n        ]]);\n    defineFunction('log', function (num, base) {\n        return Math.log(num) / Math.log(base);\n    }).args([\n        [\n            '*num',\n            'number++'\n        ],\n        [\n            '*base',\n            [\n                'or',\n                'number++',\n                [\n                    'null',\n                    10\n                ]\n            ]\n        ],\n        [\n            '?',\n            [\n                'assert',\n                '$base != 1',\n                'DIV/0'\n            ]\n        ]\n    ]);\n    defineFunction('log10', function (num) {\n        return Math.log(num) / Math.log(10);\n    }).args([[\n            '*num',\n            'number++'\n        ]]);\n    defineFunction('pi', function () {\n        return Math.PI;\n    }).args([]);\n    defineFunction('sqrtpi', function (n) {\n        return Math.sqrt(n * Math.PI);\n    }).args([[\n            '*num',\n            'number+'\n        ]]);\n    defineFunction('degrees', function (rad) {\n        return 180 * rad / Math.PI % 360;\n    }).args([[\n            '*radians',\n            'number'\n        ]]);\n    defineFunction('radians', function (deg) {\n        return Math.PI * deg / 180;\n    }).args([[\n            '*degrees',\n            'number'\n        ]]);\n    function _cosh(n) {\n        return (Math.exp(n) + Math.exp(-n)) / 2;\n    }\n    defineFunction('cosh', _cosh).args([[\n            '*num',\n            'number'\n        ]]);\n    defineFunction('acosh', function (n) {\n        return Math.log(n + Math.sqrt(n - 1) * Math.sqrt(n + 1));\n    }).args([\n        [\n            '*num',\n            'number'\n        ],\n        [\n            '?',\n            [\n                'assert',\n                '$num >= 1'\n            ]\n        ]\n    ]);\n    function _sinh(n) {\n        return (Math.exp(n) - Math.exp(-n)) / 2;\n    }\n    defineFunction('sinh', _sinh).args([[\n            '*num',\n            'number'\n        ]]);\n    defineFunction('asinh', function (n) {\n        return Math.log(n + Math.sqrt(n * n + 1));\n    }).args([[\n            '*num',\n            'number'\n        ]]);\n    defineFunction('sec', function (n) {\n        return 1 / Math.cos(n);\n    }).args([[\n            '*num',\n            'number'\n        ]]);\n    defineFunction('sech', function (n) {\n        return 1 / _cosh(n);\n    }).args([[\n            '*num',\n            'number'\n        ]]);\n    defineFunction('csc', function (n) {\n        return 1 / Math.sin(n);\n    }).args([[\n            '*num',\n            'number'\n        ]]);\n    defineFunction('csch', function (n) {\n        return 1 / _sinh(n);\n    }).args([[\n            '*num',\n            'number'\n        ]]);\n    defineFunction('atan2', function (x, y) {\n        return Math.atan(y / x);\n    }).args([\n        [\n            '*x',\n            'divisor'\n        ],\n        [\n            '*y',\n            'number'\n        ]\n    ]);\n    function _tanh(n) {\n        return _sinh(n) / _cosh(n);\n    }\n    defineFunction('tanh', _tanh).args([[\n            '*num',\n            'number'\n        ]]);\n    defineFunction('atanh', function (n) {\n        return Math.log(Math.sqrt(1 - n * n) / (1 - n));\n    }).args([[\n            '*num',\n            [\n                'and',\n                'number',\n                [\n                    '(between)',\n                    -1,\n                    1\n                ]\n            ]\n        ]]);\n    defineFunction('cot', function (n) {\n        return 1 / Math.tan(n);\n    }).args([[\n            '*num',\n            'divisor'\n        ]]);\n    defineFunction('coth', function (n) {\n        return 1 / _tanh(n);\n    }).args([[\n            '*num',\n            'divisor'\n        ]]);\n    defineFunction('acot', function (n) {\n        return Math.PI / 2 - Math.atan(n);\n    }).args([[\n            '*num',\n            'number'\n        ]]);\n    defineFunction('acoth', function (n) {\n        return Math.log((n + 1) / (n - 1)) / 2;\n    }).args([\n        [\n            '*num',\n            'number'\n        ],\n        [\n            '?',\n            [\n                'or',\n                [\n                    'assert',\n                    '$num < -1'\n                ],\n                [\n                    'assert',\n                    '$num > 1'\n                ]\n            ]\n        ]\n    ]);\n    defineFunction('power', function (a, b) {\n        return Math.pow(a, b);\n    }).args([\n        [\n            '*a',\n            'number'\n        ],\n        [\n            '*b',\n            'number'\n        ]\n    ]);\n    defineFunction('mod', function (a, b) {\n        return a % b;\n    }).args([\n        [\n            '*a',\n            'number'\n        ],\n        [\n            '*b',\n            'divisor'\n        ]\n    ]);\n    defineFunction('quotient', function (a, b) {\n        return Math.floor(a / b);\n    }).args([\n        [\n            '*a',\n            'number'\n        ],\n        [\n            '*b',\n            'divisor'\n        ]\n    ]);\n    defineFunction('ceiling', function (num, s) {\n        return s ? s * Math.ceil(num / s) : 0;\n    }).args([\n        [\n            '*number',\n            'number'\n        ],\n        [\n            '*significance',\n            'number'\n        ],\n        [\n            '?',\n            [\n                'assert',\n                '$significance >= 0 || $number < 0'\n            ]\n        ]\n    ]);\n    defineFunction('ceiling.precise', function (num, s) {\n        s = Math.abs(s);\n        return s ? s * Math.ceil(num / s) : 0;\n    }).args([\n        [\n            '*number',\n            'number'\n        ],\n        [\n            '*significance',\n            [\n                'or',\n                'number',\n                [\n                    'null',\n                    1\n                ]\n            ]\n        ]\n    ]);\n    defineAlias('iso.ceiling', 'ceiling.precise');\n    defineFunction('ceiling.math', function (num, s, mode) {\n        if (!s || !num) {\n            return 0;\n        }\n        if (num < 0 && (!mode && s < 0 || mode && s > 0)) {\n            s = -s;\n        }\n        return s ? s * Math.ceil(num / s) : 0;\n    }).args([\n        [\n            '*number',\n            'number'\n        ],\n        [\n            '*significance',\n            [\n                'or',\n                'number',\n                [\n                    'null',\n                    '$number < 0 ? -1 : 1'\n                ]\n            ]\n        ],\n        [\n            '*mode',\n            [\n                'or',\n                'logical',\n                [\n                    'null',\n                    0\n                ]\n            ]\n        ]\n    ]);\n    defineFunction('floor', function (num, s) {\n        return s ? s * Math.floor(num / s) : 0;\n    }).args([\n        [\n            '*number',\n            'number'\n        ],\n        [\n            '*significance',\n            'number'\n        ],\n        [\n            '?',\n            [\n                'assert',\n                '$significance >= 0 || $number < 0'\n            ]\n        ]\n    ]);\n    defineFunction('floor.precise', function (num, s) {\n        s = Math.abs(s);\n        return s ? s * Math.floor(num / s) : 0;\n    }).args([\n        [\n            '*number',\n            'number'\n        ],\n        [\n            '*significance',\n            [\n                'or',\n                'number',\n                [\n                    'null',\n                    1\n                ]\n            ]\n        ]\n    ]);\n    defineFunction('floor.math', function (num, s, mode) {\n        if (!s || !num) {\n            return 0;\n        }\n        if (num < 0 && (!mode && s < 0 || mode && s > 0)) {\n            s = -s;\n        }\n        return s ? s * Math.floor(num / s) : 0;\n    }).args([\n        [\n            '*number',\n            'number'\n        ],\n        [\n            '*significance',\n            [\n                'or',\n                'number',\n                [\n                    'null',\n                    '$number < 0 ? -1 : 1'\n                ]\n            ]\n        ],\n        [\n            '*mode',\n            [\n                'or',\n                'logical',\n                [\n                    'null',\n                    0\n                ]\n            ]\n        ]\n    ]);\n    defineFunction('int', Math.floor).args([[\n            '*number',\n            'number'\n        ]]);\n    defineFunction('mround', function (num, mult) {\n        return mult ? mult * Math.round(num / mult) : 0;\n    }).args([\n        [\n            '*number',\n            'number'\n        ],\n        [\n            '*multiple',\n            'number'\n        ]\n    ]);\n    defineFunction('round', function (num, digits) {\n        var sign = num < 0 ? -1 : 1;\n        if (sign < 0) {\n            num = -num;\n        }\n        digits = Math.pow(10, digits);\n        num *= digits;\n        num = Math.round(num);\n        return sign * num / digits;\n    }).args([\n        [\n            '*number',\n            'number'\n        ],\n        [\n            '*digits',\n            'number'\n        ]\n    ]);\n    defineFunction('roundup', function (num, digits) {\n        digits = Math.pow(10, digits);\n        num *= digits;\n        num = num < 0 ? Math.floor(num) : Math.ceil(num);\n        return num / digits;\n    }).args([\n        [\n            '*number',\n            'number'\n        ],\n        [\n            '*digits',\n            'number'\n        ]\n    ]);\n    defineFunction('rounddown', function (num, digits) {\n        digits = Math.pow(10, digits);\n        num *= digits;\n        num = num < 0 ? Math.ceil(num) : Math.floor(num);\n        return num / digits;\n    }).args([\n        [\n            '*number',\n            'number'\n        ],\n        [\n            '*digits',\n            'number'\n        ]\n    ]);\n    defineFunction('even', function (num) {\n        var n = num < 0 ? Math.floor(num) : Math.ceil(num);\n        return n % 2 ? n + (n < 0 ? -1 : 1) : n;\n    }).args([[\n            '*number',\n            'number'\n        ]]);\n    defineFunction('odd', function (num) {\n        var n = num < 0 ? Math.floor(num) : Math.ceil(num);\n        return n % 2 ? n : n + (n < 0 ? -1 : 1);\n    }).args([[\n            '*number',\n            'number'\n        ]]);\n    defineFunction('sign', function (num) {\n        return num < 0 ? -1 : num > 0 ? 1 : 0;\n    }).args([[\n            '*number',\n            'number'\n        ]]);\n    function _gcd(a, b) {\n        while (b) {\n            var r = a % b;\n            a = b;\n            b = r;\n        }\n        return a;\n    }\n    function _lcm(a, b) {\n        return Math.abs(a * b) / _gcd(a, b);\n    }\n    defineFunction('gcd', function (args) {\n        var a = args[0];\n        for (var i = 1; i < args.length; ++i) {\n            a = _gcd(a, args[i]);\n        }\n        return a;\n    }).args([[\n            'numbers',\n            [\n                'collect',\n                'number'\n            ]\n        ]]);\n    defineFunction('lcm', function (args) {\n        var a = args[0];\n        for (var i = 1; i < args.length; ++i) {\n            a = _lcm(a, args[i]);\n        }\n        return a;\n    }).args([[\n            'numbers',\n            [\n                'collect',\n                'number'\n            ]\n        ]]);\n    defineFunction('sum', function (numbers) {\n        return numbers.reduce(function (sum, num) {\n            return sum + num;\n        }, 0);\n    }).args([[\n            'numbers',\n            [\n                'collect',\n                'number'\n            ]\n        ]]);\n    defineFunction('product', function (numbers) {\n        return numbers.reduce(function (prod, num) {\n            return prod * num;\n        }, 1);\n    }).args([[\n            'numbers',\n            [\n                'collect',\n                'number'\n            ]\n        ]]);\n    defineFunction('sumproduct', function (first, rest) {\n        var sum = 0;\n        first.each(function (p, row, col) {\n            if (typeof p == 'number') {\n                for (var i = 0; i < rest.length; ++i) {\n                    var v = rest[i].get(row, col);\n                    if (typeof v != 'number') {\n                        return;\n                    }\n                    p *= v;\n                }\n                sum += p;\n            }\n        });\n        return sum;\n    }).args([\n        [\n            'a1',\n            'matrix'\n        ],\n        [\n            '+',\n            [\n                'a2',\n                [\n                    'and',\n                    'matrix',\n                    [\n                        'assert',\n                        '$a2.width == $a1.width'\n                    ],\n                    [\n                        'assert',\n                        '$a2.height == $a1.height'\n                    ]\n                ]\n            ]\n        ]\n    ]);\n    defineFunction('sumsq', function (numbers) {\n        return numbers.reduce(function (sum, num) {\n            return sum + num * num;\n        }, 0);\n    }).args([[\n            'numbers',\n            [\n                'collect',\n                'number'\n            ]\n        ]]);\n    defineFunction('sumx2my2', function (a, b) {\n        var sum = 0;\n        a.each(function (x, row, col) {\n            var y = b.get(row, col);\n            if (typeof x == 'number' && typeof y == 'number') {\n                sum += x * x - y * y;\n            }\n        });\n        return sum;\n    }).args([\n        [\n            'a',\n            'matrix'\n        ],\n        [\n            'b',\n            [\n                'and',\n                'matrix',\n                [\n                    'assert',\n                    '$b.width == $a.width'\n                ],\n                [\n                    'assert',\n                    '$b.height == $a.height'\n                ]\n            ]\n        ]\n    ]);\n    defineFunction('sumx2py2', function (a, b) {\n        var sum = 0;\n        a.each(function (x, row, col) {\n            var y = b.get(row, col);\n            if (typeof x == 'number' && typeof y == 'number') {\n                sum += x * x + y * y;\n            }\n        });\n        return sum;\n    }).args([\n        [\n            'a',\n            'matrix'\n        ],\n        [\n            'b',\n            [\n                'and',\n                'matrix',\n                [\n                    'assert',\n                    '$b.width == $a.width'\n                ],\n                [\n                    'assert',\n                    '$b.height == $a.height'\n                ]\n            ]\n        ]\n    ]);\n    defineFunction('sumxmy2', function (a, b) {\n        var sum = 0;\n        a.each(function (x, row, col) {\n            var y = b.get(row, col);\n            if (typeof x == 'number' && typeof y == 'number') {\n                sum += (x - y) * (x - y);\n            }\n        });\n        return sum;\n    }).args([\n        [\n            'a',\n            'matrix'\n        ],\n        [\n            'b',\n            [\n                'and',\n                'matrix',\n                [\n                    'assert',\n                    '$b.width == $a.width'\n                ],\n                [\n                    'assert',\n                    '$b.height == $a.height'\n                ]\n            ]\n        ]\n    ]);\n    defineFunction('seriessum', function (x, n, m, a) {\n        var sum = 0;\n        a.each(function (coef) {\n            if (typeof coef != 'number') {\n                throw new CalcError('VALUE');\n            }\n            sum += coef * Math.pow(x, n);\n            n += m;\n        });\n        return sum;\n    }).args([\n        [\n            'x',\n            'number'\n        ],\n        [\n            'y',\n            'number'\n        ],\n        [\n            'm',\n            'number'\n        ],\n        [\n            'a',\n            'matrix'\n        ]\n    ]);\n    defineFunction('min', function (numbers) {\n        return Math.min.apply(Math, numbers);\n    }).args([\n        [\n            'numbers',\n            [\n                'collect',\n                'number'\n            ]\n        ],\n        [\n            '?',\n            [\n                'assert',\n                '$numbers.length > 0',\n                'N/A'\n            ]\n        ]\n    ]);\n    defineFunction('max', function (numbers) {\n        return Math.max.apply(Math, numbers);\n    }).args([\n        [\n            'numbers',\n            [\n                'collect',\n                'number'\n            ]\n        ],\n        [\n            '?',\n            [\n                'assert',\n                '$numbers.length > 0',\n                'N/A'\n            ]\n        ]\n    ]);\n    defineFunction('counta', function (values) {\n        return values.length;\n    }).args([[\n            'values',\n            [\n                '#collect',\n                'anyvalue'\n            ]\n        ]]);\n    defineFunction('count', function (numbers) {\n        return numbers.length;\n    }).args([[\n            'numbers',\n            [\n                '#collect',\n                'number'\n            ]\n        ]]);\n    defineFunction('countunique', function (values) {\n        var count = 0, seen = [];\n        values.forEach(function (val) {\n            if (seen.indexOf(val) < 0) {\n                count++;\n                seen.push(val);\n            }\n        });\n        return count;\n    }).args([[\n            'values',\n            [\n                '#collect',\n                'anyvalue'\n            ]\n        ]]);\n    defineFunction('countblank', function (a) {\n        var count = 0;\n        function add(val) {\n            if (val == null || val === '') {\n                count++;\n            }\n        }\n        function loop(args) {\n            for (var i = 0; i < args.length; ++i) {\n                var x = args[i];\n                if (x instanceof Matrix) {\n                    x.each(add, true);\n                } else {\n                    add(x);\n                }\n            }\n        }\n        loop(a);\n        return count;\n    }).args([[\n            '+',\n            [\n                'args',\n                [\n                    'or',\n                    'matrix',\n                    'anyvalue'\n                ]\n            ]\n        ]]);\n    defineFunction('iseven', function (num) {\n        return num % 2 === 0;\n    }).args([[\n            '*number',\n            'number'\n        ]]);\n    defineFunction('isodd', function (num) {\n        return num % 2 !== 0;\n    }).args([[\n            '*number',\n            'number'\n        ]]);\n    defineFunction('n', function (val) {\n        if (typeof val == 'boolean') {\n            return val ? 1 : 0;\n        }\n        if (typeof val == 'number') {\n            return val;\n        }\n        return 0;\n    }).args([[\n            '*value',\n            'anyvalue'\n        ]]);\n    defineFunction('na', function () {\n        return new CalcError('N/A');\n    }).args([]);\n    function forIFS(args, f) {\n        var chunks = [], i = 0, matrix = args[0];\n        while (i < args.length) {\n            chunks.push({\n                matrix: args[i++],\n                pred: parseCriteria(args[i++])\n            });\n        }\n        ROW:\n            for (var row = 0; row < matrix.height; ++row) {\n                COL:\n                    for (var col = 0; col < matrix.width; ++col) {\n                        for (i = 0; i < chunks.length; ++i) {\n                            var val = chunks[i].matrix.get(row, col);\n                            if (!chunks[i].pred(val == null || val === '' ? 0 : val)) {\n                                continue COL;\n                            }\n                        }\n                        f(row, col);\n                    }\n            }\n    }\n    var ARGS_COUNTIFS = [\n        [\n            'm1',\n            'matrix'\n        ],\n        [\n            'c1',\n            'anyvalue'\n        ],\n        [\n            [\n                'm2',\n                'matrix'\n            ],\n            [\n                'c2',\n                'anyvalue'\n            ]\n        ]\n    ];\n    defineFunction('countifs', function (m1, c1, rest) {\n        var count = 0;\n        rest.unshift(m1, c1);\n        forIFS(rest, function () {\n            count++;\n        });\n        return count;\n    }).args(ARGS_COUNTIFS);\n    var ARGS_SUMIFS = [[\n            'range',\n            'matrix'\n        ]].concat(ARGS_COUNTIFS);\n    defineFunction('sumifs', function (range, m1, c1, args) {\n        args.unshift(range, numericPredicate, m1, c1);\n        var sum = 0;\n        forIFS(args, function (row, col) {\n            var val = range.get(row, col);\n            if (val) {\n                sum += val;\n            }\n        });\n        return sum;\n    }).args(ARGS_SUMIFS);\n    defineFunction('averageifs', function (range, m1, c1, args) {\n        args.unshift(range, numericPredicate, m1, c1);\n        var sum = 0, count = 0;\n        forIFS(args, function (row, col) {\n            var val = range.get(row, col);\n            if (val == null || val === '') {\n                val = 0;\n            }\n            sum += val;\n            count++;\n        });\n        return count ? sum / count : new CalcError('DIV/0');\n    }).args(ARGS_SUMIFS);\n    defineFunction('countif', function (matrix, criteria) {\n        criteria = parseCriteria(criteria);\n        var count = 0;\n        matrix.each(function (val) {\n            if (criteria(val)) {\n                count++;\n            }\n        });\n        return count;\n    }).args([\n        [\n            'range',\n            'matrix'\n        ],\n        [\n            '*criteria',\n            'anyvalue'\n        ]\n    ]);\n    var ARGS_SUMIF = [\n        [\n            'range',\n            'matrix'\n        ],\n        [\n            '*criteria',\n            'anyvalue'\n        ],\n        [\n            'sumRange',\n            [\n                'or',\n                [\n                    'and',\n                    'matrix',\n                    [\n                        'assert',\n                        '$sumRange.width == $range.width'\n                    ],\n                    [\n                        'assert',\n                        '$sumRange.height == $range.height'\n                    ]\n                ],\n                [\n                    'null',\n                    '$range'\n                ]\n            ]\n        ]\n    ];\n    defineFunction('sumif', function (range, criteria, sumRange) {\n        var sum = 0;\n        criteria = parseCriteria(criteria);\n        range.each(function (val, row, col) {\n            if (criteria(val)) {\n                var v = sumRange.get(row, col);\n                if (numericPredicate(v)) {\n                    sum += v || 0;\n                }\n            }\n        });\n        return sum;\n    }).args(ARGS_SUMIF);\n    defineFunction('averageif', function (range, criteria, sumRange) {\n        var sum = 0, count = 0;\n        criteria = parseCriteria(criteria);\n        range.each(function (val, row, col) {\n            if (criteria(val)) {\n                var v = sumRange.get(row, col);\n                if (numericPredicate(v)) {\n                    sum += v || 0;\n                    count++;\n                }\n            }\n        });\n        return count ? sum / count : new CalcError('DIV/0');\n    }).args(ARGS_SUMIF);\n    (function (def) {\n        def('large', function (numbers, nth) {\n            return numbers.sort(descending)[nth];\n        });\n        def('small', function (numbers, nth) {\n            return numbers.sort(ascending)[nth];\n        });\n    }(function (name, handler) {\n        defineFunction(name, function (matrix, nth) {\n            var numbers = [];\n            var error = matrix.each(function (val) {\n                if (val instanceof CalcError) {\n                    return val;\n                }\n                if (typeof val == 'number') {\n                    numbers.push(val);\n                }\n            });\n            if (error) {\n                return error;\n            }\n            if (nth > numbers.length) {\n                return new CalcError('NUM');\n            }\n            return handler(numbers, nth - 1);\n        }).args([\n            [\n                'array',\n                'matrix'\n            ],\n            [\n                '*nth',\n                'number++'\n            ]\n        ]);\n    }));\n    function _avg(numbers) {\n        return numbers.reduce(function (sum, num) {\n            return sum + num;\n        }, 0) / numbers.length;\n    }\n    function _var_sp(numbers, divisor, avg) {\n        if (avg == null) {\n            avg = _avg(numbers);\n        }\n        return numbers.reduce(function (sum, num) {\n            return sum + Math.pow(num - avg, 2);\n        }, 0) / divisor;\n    }\n    function _stdev_sp(numbers, divisor) {\n        return Math.sqrt(_var_sp(numbers, divisor));\n    }\n    defineFunction('stdev.s', function (numbers) {\n        return _stdev_sp(numbers, numbers.length - 1);\n    }).args([\n        [\n            'numbers',\n            [\n                'collect',\n                'number'\n            ]\n        ],\n        [\n            '?',\n            [\n                'assert',\n                '$numbers.length >= 2',\n                'NUM'\n            ]\n        ]\n    ]);\n    defineFunction('stdev.p', function (numbers) {\n        return _stdev_sp(numbers, numbers.length);\n    }).args([\n        [\n            'numbers',\n            [\n                'collect',\n                'number'\n            ]\n        ],\n        [\n            '?',\n            [\n                'assert',\n                '$numbers.length >= 2',\n                'NUM'\n            ]\n        ]\n    ]);\n    defineFunction('var.s', function (numbers) {\n        return _var_sp(numbers, numbers.length - 1);\n    }).args([\n        [\n            'numbers',\n            [\n                'collect',\n                'number'\n            ]\n        ],\n        [\n            '?',\n            [\n                'assert',\n                '$numbers.length >= 2',\n                'NUM'\n            ]\n        ]\n    ]);\n    defineFunction('var.p', function (numbers) {\n        return _var_sp(numbers, numbers.length);\n    }).args([\n        [\n            'numbers',\n            [\n                'collect',\n                'number'\n            ]\n        ],\n        [\n            '?',\n            [\n                'assert',\n                '$numbers.length >= 2',\n                'NUM'\n            ]\n        ]\n    ]);\n    defineFunction('median', function (numbers) {\n        var n = numbers.length;\n        numbers.sort(ascending);\n        if (n % 2) {\n            return numbers[n >> 1];\n        }\n        return (numbers[n >> 1] + numbers[n >> 1 + 1]) / 2;\n    }).args([\n        [\n            'numbers',\n            [\n                'collect',\n                'number'\n            ]\n        ],\n        [\n            '?',\n            [\n                'assert',\n                '$numbers.length > 0',\n                'N/A'\n            ]\n        ]\n    ]);\n    defineFunction('mode.sngl', function (numbers) {\n        numbers.sort(ascending);\n        var prev = null, count = 0, max = 1, mode = null;\n        for (var i = 0; i < numbers.length; ++i) {\n            var n = numbers[i];\n            if (n != prev) {\n                count = 1;\n                prev = n;\n            } else {\n                count++;\n            }\n            if (count > max) {\n                max = count;\n                mode = n;\n            }\n        }\n        return mode == null ? new CalcError('N/A') : mode;\n    }).args([[\n            'numbers',\n            [\n                'collect',\n                'number'\n            ]\n        ]]);\n    defineFunction('mode.mult', function (numbers) {\n        var seen = Object.create(null), max = 2, res = [];\n        numbers.forEach(function (num) {\n            var s = seen[num] || 0;\n            seen[num] = ++s;\n            if (s == max) {\n                res.push(num);\n            } else if (s > max) {\n                max = s;\n                res = [num];\n            }\n        });\n        var m = new Matrix(this);\n        res.forEach(function (num, i) {\n            m.set(i, 0, num);\n        });\n        return m;\n    }).args([[\n            'numbers',\n            [\n                'collect',\n                'number'\n            ]\n        ]]);\n    defineFunction('geomean', function (numbers) {\n        var n = numbers.length;\n        var p = numbers.reduce(function (p, num) {\n            if (num < 0) {\n                throw new CalcError('NUM');\n            }\n            return p * num;\n        }, 1);\n        return Math.pow(p, 1 / n);\n    }).args([\n        [\n            'numbers',\n            [\n                'collect',\n                'number'\n            ]\n        ],\n        [\n            '?',\n            [\n                'assert',\n                '$numbers.length > 0',\n                'NUM'\n            ]\n        ]\n    ]);\n    defineFunction('harmean', function (numbers) {\n        var n = numbers.length;\n        var s = numbers.reduce(function (s, num) {\n            if (!num) {\n                throw new CalcError('DIV/0');\n            }\n            return s + 1 / num;\n        }, 0);\n        return n / s;\n    }).args([\n        [\n            'numbers',\n            [\n                'collect',\n                'number'\n            ]\n        ],\n        [\n            '?',\n            [\n                'assert',\n                '$numbers.length > 0',\n                'NUM'\n            ]\n        ]\n    ]);\n    defineFunction('trimmean', function (numbers, p) {\n        var n = numbers.length;\n        numbers.sort(ascending);\n        var discard = Math.floor(n * p);\n        if (discard % 2) {\n            --discard;\n        }\n        discard /= 2;\n        var sum = 0;\n        for (var i = discard; i < n - discard; ++i) {\n            sum += numbers[i];\n        }\n        return sum / (n - discard * 2);\n    }).args([\n        [\n            'numbers',\n            [\n                'collect',\n                'number',\n                1\n            ]\n        ],\n        [\n            'percent',\n            [\n                'and',\n                'number',\n                [\n                    '[between)',\n                    0,\n                    1\n                ]\n            ]\n        ],\n        [\n            '?',\n            [\n                'assert',\n                '$numbers.length > 0',\n                'NUM'\n            ]\n        ]\n    ]);\n    defineFunction('frequency', function (data, bins) {\n        data.sort(ascending);\n        bins.sort(ascending);\n        var prev = -Infinity;\n        var i = 0;\n        function count(max) {\n            var n = 0;\n            while (i < data.length && data[i] > prev && data[i] <= max) {\n                ++n;\n                ++i;\n            }\n            return n;\n        }\n        var m = new Matrix(this);\n        bins.forEach(function (val, i) {\n            var n = count(val);\n            prev = val;\n            m.set(i, 0, n);\n        });\n        m.set(m.height, 0, data.length - i);\n        return m;\n    }).args([\n        [\n            'data',\n            [\n                'collect',\n                'number',\n                1\n            ]\n        ],\n        [\n            'bins',\n            [\n                'collect',\n                'number',\n                1\n            ]\n        ]\n    ]);\n    defineFunction('rank.eq', function (val, numbers, asc) {\n        numbers.sort(asc ? ascending : descending);\n        var pos = numbers.indexOf(val);\n        return pos < 0 ? new CalcError('N/A') : pos + 1;\n    }).args([\n        [\n            'value',\n            'number'\n        ],\n        [\n            'numbers',\n            [\n                'collect',\n                'number'\n            ]\n        ],\n        [\n            'order',\n            [\n                'or',\n                'logical',\n                [\n                    'null',\n                    false\n                ]\n            ]\n        ]\n    ]);\n    defineAlias('rank', 'rank.eq');\n    defineFunction('rank.avg', function (val, numbers, asc) {\n        numbers.sort(asc ? ascending : descending);\n        var pos = numbers.indexOf(val);\n        if (pos < 0) {\n            return new CalcError('N/A');\n        }\n        for (var i = pos; numbers[i] == val; ++i) {\n        }\n        return (pos + i + 1) / 2;\n    }).args([\n        [\n            'value',\n            'number'\n        ],\n        [\n            'numbers',\n            [\n                'collect',\n                'number'\n            ]\n        ],\n        [\n            'order',\n            [\n                'or',\n                'logical',\n                [\n                    'null',\n                    false\n                ]\n            ]\n        ]\n    ]);\n    defineFunction('kurt', function (numbers) {\n        var n = numbers.length;\n        var avg = _avg(numbers);\n        var variance = _var_sp(numbers, n - 1, avg);\n        var stddev = Math.sqrt(variance);\n        var sum = numbers.reduce(function (sum, num) {\n            return sum + Math.pow((num - avg) / stddev, 4);\n        }, 0);\n        return n * (n + 1) / ((n - 1) * (n - 2) * (n - 3)) * sum - 3 * Math.pow(n - 1, 2) / ((n - 2) * (n - 3));\n    }).args([\n        [\n            'numbers',\n            [\n                'collect',\n                'number'\n            ]\n        ],\n        [\n            '?',\n            [\n                'assert',\n                '$numbers.length >= 4',\n                'NUM'\n            ]\n        ]\n    ]);\n    function _percentrank(numbers, x, exc) {\n        var nlt = 0, ngt = 0, left = null, right = null, found = false;\n        numbers.forEach(function (num) {\n            if (num < x) {\n                nlt++;\n                left = left == null ? num : Math.max(left, num);\n            } else if (num > x) {\n                ngt++;\n                right = right == null ? num : Math.min(right, num);\n            } else {\n                found = true;\n            }\n        });\n        if (!nlt && !ngt) {\n            return new CalcError('N/A');\n        }\n        if (found) {\n            if (exc) {\n                return (nlt + 1) / (numbers.length + 1);\n            }\n            return nlt / (nlt + ngt);\n        }\n        return ((right - x) * _percentrank(numbers, left, exc) + (x - left) * _percentrank(numbers, right, exc)) / (right - left);\n    }\n    var ARGS_PERCENTRANK = [\n        [\n            'array',\n            [\n                'collect',\n                'number',\n                1\n            ]\n        ],\n        [\n            'x',\n            'number'\n        ],\n        [\n            'significance',\n            [\n                'or',\n                [\n                    'null',\n                    3\n                ],\n                'integer++'\n            ]\n        ],\n        [\n            '?',\n            [\n                'assert',\n                '$array.length > 0',\n                'NUM'\n            ]\n        ]\n    ];\n    defineFunction('percentrank.inc', function (numbers, x, significance) {\n        var p = _percentrank(numbers, x, 0);\n        p = p.toFixed(significance + 1);\n        return parseFloat(p.substr(0, p.length - 1));\n    }).args(ARGS_PERCENTRANK);\n    defineFunction('percentrank.exc', function (numbers, x, significance) {\n        var p = _percentrank(numbers, x, 1);\n        p = p.toFixed(significance + 1);\n        return parseFloat(p.substr(0, p.length - 1));\n    }).args(ARGS_PERCENTRANK);\n    defineAlias('percentrank', 'percentrank.inc');\n    function _covariance(x, y, divisor) {\n        var sum = 0;\n        var ax = _avg(x);\n        var ay = _avg(y);\n        var n = x.length;\n        for (var i = 0; i < n; ++i) {\n            sum += (x[i] - ax) * (y[i] - ay);\n        }\n        return sum / divisor;\n    }\n    defineFunction('covariance.p', function (x, y) {\n        return _covariance(x, y, x.length);\n    }).args([\n        [\n            'array1',\n            [\n                'collect',\n                'number',\n                1\n            ]\n        ],\n        [\n            'array2',\n            [\n                'collect',\n                'number',\n                1\n            ]\n        ],\n        [\n            '?',\n            [\n                'assert',\n                '$array1.length == $array2.length',\n                'N/A'\n            ]\n        ],\n        [\n            '?',\n            [\n                'assert',\n                '$array1.length > 0',\n                'DIV/0'\n            ]\n        ]\n    ]);\n    defineFunction('covariance.s', function (x, y) {\n        return _covariance(x, y, x.length - 1);\n    }).args([\n        [\n            'array1',\n            [\n                'collect',\n                'number',\n                1\n            ]\n        ],\n        [\n            'array2',\n            [\n                'collect',\n                'number',\n                1\n            ]\n        ],\n        [\n            '?',\n            [\n                'assert',\n                '$array1.length == $array2.length',\n                'N/A'\n            ]\n        ],\n        [\n            '?',\n            [\n                'assert',\n                '$array1.length > 1',\n                'DIV/0'\n            ]\n        ]\n    ]);\n    defineAlias('covar', 'covariance.p');\n    var _fact = util.memoize(function (n) {\n        for (var i = 2, fact = 1; i <= n; ++i) {\n            fact *= i;\n        }\n        return fact;\n    });\n    defineFunction('fact', _fact).args([[\n            '*n',\n            'integer+'\n        ]]);\n    defineFunction('factdouble', function (n) {\n        for (var i = 2 + (n & 1), fact = 1; i <= n; i += 2) {\n            fact *= i;\n        }\n        return fact;\n    }).args([[\n            '*n',\n            'integer+'\n        ]]);\n    defineFunction('multinomial', function (numbers) {\n        var div = 1, sum = 0;\n        numbers.forEach(function (n) {\n            if (n < 0) {\n                throw new CalcError('NUM');\n            }\n            sum += n;\n            div *= _fact(n);\n        });\n        return _fact(sum) / div;\n    }).args([[\n            'numbers',\n            [\n                'collect',\n                'number'\n            ]\n        ]]);\n    var _combinations = util.memoize(function (n, k) {\n        for (var f1 = k + 1, f2 = 1, p1 = 1, p2 = 1; f2 <= n - k; ++f1, ++f2) {\n            p1 *= f1;\n            p2 *= f2;\n        }\n        return p1 / p2;\n    });\n    defineFunction('combin', _combinations).args([\n        [\n            '*n',\n            'integer++'\n        ],\n        [\n            '*k',\n            [\n                'and',\n                'integer',\n                [\n                    '[between]',\n                    0,\n                    '$n'\n                ]\n            ]\n        ]\n    ]);\n    defineFunction('combina', function (n, k) {\n        return _combinations(n + k - 1, n - 1);\n    }).args([\n        [\n            '*n',\n            'integer++'\n        ],\n        [\n            '*k',\n            [\n                'and',\n                'integer',\n                [\n                    '[between]',\n                    1,\n                    '$n'\n                ]\n            ]\n        ]\n    ]);\n    defineFunction('average', function (numbers) {\n        var sum = numbers.reduce(function (sum, num) {\n            return sum + num;\n        }, 0);\n        return sum / numbers.length;\n    }).args([\n        [\n            'numbers',\n            [\n                'collect',\n                [\n                    'and',\n                    'number',\n                    [\n                        'not',\n                        'boolean'\n                    ]\n                ]\n            ]\n        ],\n        [\n            '?',\n            [\n                'assert',\n                '$numbers.length > 0',\n                'DIV/0'\n            ]\n        ]\n    ]);\n    defineFunction('averagea', function (values) {\n        var sum = 0, count = 0;\n        values.forEach(function (num) {\n            if (typeof num != 'string') {\n                sum += num;\n            }\n            ++count;\n        });\n        return count ? sum / count : new CalcError('DIV/0');\n    }).args([[\n            'values',\n            [\n                'collect',\n                'anyvalue'\n            ]\n        ]]);\n    function _percentile(numbers, rank) {\n        numbers.sort(ascending);\n        var n = numbers.length;\n        var k = rank | 0, d = rank - k;\n        if (k === 0) {\n            return numbers[0];\n        }\n        if (k >= n) {\n            return numbers[n - 1];\n        }\n        --k;\n        return numbers[k] + d * (numbers[k + 1] - numbers[k]);\n    }\n    function _percentile_inc(numbers, p) {\n        var rank = p * (numbers.length - 1) + 1;\n        return _percentile(numbers, rank);\n    }\n    function _percentile_exc(numbers, p) {\n        var rank = p * (numbers.length + 1);\n        return _percentile(numbers, rank);\n    }\n    defineFunction('percentile.inc', _percentile_inc).args([\n        [\n            'numbers',\n            [\n                'collect',\n                'number',\n                1\n            ]\n        ],\n        [\n            'p',\n            [\n                'and',\n                'number',\n                [\n                    '[between]',\n                    0,\n                    1\n                ]\n            ]\n        ]\n    ]);\n    defineFunction('percentile.exc', _percentile_exc).args([\n        [\n            'numbers',\n            [\n                'collect',\n                'number',\n                1\n            ]\n        ],\n        [\n            'p',\n            [\n                'and',\n                'number',\n                [\n                    '(between)',\n                    0,\n                    1\n                ]\n            ]\n        ]\n    ]);\n    defineFunction('quartile.inc', function (numbers, quarter) {\n        return _percentile_inc(numbers, quarter / 4);\n    }).args([\n        [\n            'numbers',\n            [\n                'collect',\n                'number',\n                1\n            ]\n        ],\n        [\n            'quarter',\n            [\n                'values',\n                0,\n                1,\n                2,\n                3,\n                4\n            ]\n        ]\n    ]);\n    defineFunction('quartile.exc', function (numbers, quarter) {\n        return _percentile_exc(numbers, quarter / 4);\n    }).args([\n        [\n            'numbers',\n            [\n                'collect',\n                'number',\n                1\n            ]\n        ],\n        [\n            'quarter',\n            [\n                'values',\n                0,\n                1,\n                2,\n                3,\n                4\n            ]\n        ]\n    ]);\n    defineAlias('quartile', 'quartile.inc');\n    defineAlias('percentile', 'percentile.inc');\n    var AGGREGATE_FUNCS = [\n        'AVERAGE',\n        'COUNT',\n        'COUNTA',\n        'MAX',\n        'MIN',\n        'PRODUCT',\n        'STDEV.S',\n        'STDEV.P',\n        'SUM',\n        'VAR.S',\n        'VAR.P',\n        'MEDIAN',\n        'MODE.SNGL',\n        'LARGE',\n        'SMALL',\n        'PERCENTILE.INC',\n        'QUARTILE.INC',\n        'PERCENTILE.EXC',\n        'QUARTILE.EXC'\n    ];\n    function fetchValuesForAggregate(self, args, options) {\n        var values = [];\n        var opt_ignore_hidden_rows = 1;\n        var opt_ignore_errors = 2;\n        var opt_use_aggregates = 4;\n        (function fetchValues(args) {\n            if (args instanceof Ref) {\n                self.getRefCells(args, true).forEach(function (cell) {\n                    var value = cell.value;\n                    if (options & opt_ignore_hidden_rows && cell.hidden) {\n                        return;\n                    }\n                    if (cell.formula) {\n                        var str = cell.formula.print(cell.row, cell.col);\n                        if (/^\\s*(?:aggregate|subtotal)\\s*\\(/i.test(str)) {\n                            if (!(options & opt_use_aggregates)) {\n                                return;\n                            }\n                        }\n                        if ('value' in cell.formula) {\n                            value = cell.formula.value;\n                        }\n                    }\n                    if (options & opt_ignore_errors && value instanceof CalcError) {\n                        return;\n                    }\n                    if (typeof value == 'number' || value instanceof CalcError) {\n                        values.push(value);\n                    }\n                });\n            } else if (Array.isArray(args)) {\n                for (var i = 0; i < args.length; ++i) {\n                    fetchValues(args[i]);\n                }\n            } else if (args instanceof Matrix) {\n                args.each(fetchValues);\n            } else if (typeof args == 'number') {\n                values.push(args);\n            } else if (args instanceof CalcError && !(options & opt_ignore_errors)) {\n                values.push(args);\n            }\n        }(args));\n        return values;\n    }\n    defineFunction('aggregate', function (callback, funcId, options, args) {\n        var self = this;\n        self.resolveCells(args, function () {\n            var values;\n            if (funcId > 12) {\n                values = fetchValuesForAggregate(self, args[0], options);\n                var k = args[1];\n                if (k instanceof CellRef) {\n                    k = self.getRefData(k);\n                }\n                if (typeof k != 'number') {\n                    return callback(new CalcError('VALUE'));\n                }\n            } else {\n                values = fetchValuesForAggregate(self, args, options);\n            }\n            self.func(AGGREGATE_FUNCS[funcId - 1], callback, values);\n        });\n    }).argsAsync([\n        [\n            'funcId',\n            [\n                'values',\n                1,\n                2,\n                3,\n                4,\n                5,\n                6,\n                7,\n                8,\n                9,\n                10,\n                11,\n                12,\n                13,\n                14,\n                15,\n                16,\n                17,\n                18,\n                19\n            ]\n        ],\n        [\n            'options',\n            [\n                'or',\n                [\n                    'null',\n                    0\n                ],\n                [\n                    'values',\n                    0,\n                    1,\n                    2,\n                    3,\n                    4,\n                    5,\n                    6,\n                    7\n                ]\n            ]\n        ],\n        [\n            'args',\n            'rest'\n        ]\n    ]);\n    defineFunction('subtotal', function (callback, funcId) {\n        var self = this;\n        var ignoreHidden = funcId > 100;\n        if (ignoreHidden) {\n            funcId -= 100;\n        }\n        var args = [];\n        for (var i = 2; i < arguments.length; ++i) {\n            args.push(arguments[i]);\n        }\n        self.resolveCells(args, function () {\n            var values = fetchValuesForAggregate(self, args, ignoreHidden ? 1 : 0);\n            self.func(AGGREGATE_FUNCS[funcId - 1], callback, values);\n        });\n    }).argsAsync([\n        [\n            'funcId',\n            [\n                'values',\n                1,\n                2,\n                3,\n                4,\n                5,\n                6,\n                7,\n                8,\n                9,\n                10,\n                11,\n                101,\n                102,\n                103,\n                104,\n                105,\n                106,\n                107,\n                108,\n                109,\n                110,\n                111\n            ]\n        ],\n        [\n            '+',\n            [\n                'ref',\n                [\n                    'or',\n                    'ref',\n                    '#matrix'\n                ]\n            ]\n        ]\n    ]);\n    defineFunction('avedev', function (numbers) {\n        var avg = numbers.reduce(function (sum, num) {\n            return sum + num;\n        }, 0) / numbers.length;\n        return numbers.reduce(function (sum, num) {\n            return sum + Math.abs(num - avg);\n        }, 0) / numbers.length;\n    }).args([\n        [\n            'numbers',\n            [\n                'collect',\n                'number'\n            ]\n        ],\n        [\n            '?',\n            [\n                'assert',\n                '$numbers.length >= 2',\n                'NUM'\n            ]\n        ]\n    ]);\n    function _binom_dist(x, n, p, cumulative) {\n        if (!cumulative) {\n            return _combinations(n, x) * Math.pow(p, x) * Math.pow(1 - p, n - x);\n        } else {\n            var sum = 0;\n            for (var j = 0; j <= x; ++j) {\n                sum += _combinations(n, j) * Math.pow(p, j) * Math.pow(1 - p, n - j);\n            }\n            return sum;\n        }\n    }\n    defineFunction('binom.dist', _binom_dist).args([\n        [\n            'successes',\n            'integer+'\n        ],\n        [\n            'trials',\n            [\n                'and',\n                'integer',\n                [\n                    'assert',\n                    '$trials >= $successes'\n                ]\n            ]\n        ],\n        [\n            'probability',\n            [\n                'and',\n                'number',\n                [\n                    '[between]',\n                    0,\n                    1\n                ]\n            ]\n        ],\n        [\n            'cumulative',\n            'logical'\n        ]\n    ]);\n    defineAlias('binomdist', 'binom.dist');\n    defineFunction('binom.inv', function (n, p, alpha) {\n        for (var x = 0; x <= n; ++x) {\n            if (_binom_dist(x, n, p, true) >= alpha) {\n                return x;\n            }\n        }\n        return new CalcError('N/A');\n    }).args([\n        [\n            'trials',\n            'integer+'\n        ],\n        [\n            'probability',\n            [\n                'and',\n                'number',\n                [\n                    '[between]',\n                    0,\n                    1\n                ]\n            ]\n        ],\n        [\n            'alpha',\n            [\n                'and',\n                'number',\n                [\n                    '[between]',\n                    0,\n                    1\n                ]\n            ]\n        ]\n    ]);\n    defineAlias('critbinom', 'binom.inv');\n    defineFunction('binom.dist.range', function (n, p, s, s2) {\n        var sum = 0;\n        for (var k = s; k <= s2; ++k) {\n            sum += _combinations(n, k) * Math.pow(p, k) * Math.pow(1 - p, n - k);\n        }\n        return sum;\n    }).args([\n        [\n            'trials',\n            'integer+'\n        ],\n        [\n            'probability',\n            [\n                'and',\n                'number',\n                [\n                    '[between]',\n                    0,\n                    1\n                ]\n            ]\n        ],\n        [\n            'successes_min',\n            [\n                'and',\n                'integer',\n                [\n                    '[between]',\n                    0,\n                    '$trials'\n                ]\n            ]\n        ],\n        [\n            'successes_max',\n            [\n                'or',\n                [\n                    'and',\n                    'integer',\n                    [\n                        '[between]',\n                        '$successes_min',\n                        '$trials'\n                    ]\n                ],\n                [\n                    'null',\n                    '$successes_min'\n                ]\n            ]\n        ]\n    ]);\n    defineFunction('negbinom.dist', function (x, k, p, cumulative) {\n        if (cumulative) {\n            var sum = 0;\n            while (x >= 0) {\n                sum += _combinations(x + k - 1, x) * Math.pow(p, k) * Math.pow(1 - p, x);\n                x--;\n            }\n            return sum;\n        }\n        return _combinations(x + k - 1, x) * Math.pow(p, k) * Math.pow(1 - p, x);\n    }).args([\n        [\n            'number_f',\n            'integer+'\n        ],\n        [\n            'number_s',\n            'integer+'\n        ],\n        [\n            'probability_s',\n            [\n                'and',\n                'number',\n                [\n                    '[between]',\n                    0,\n                    1\n                ]\n            ]\n        ],\n        [\n            'cumulative',\n            'logical'\n        ]\n    ]);\n    defineAlias('negbinomdist', 'negbinom.dist');\n    defineFunction('address', function (row, col, abs, a1, sheet) {\n        var cell = new CellRef(row - 1, col - 1, abs - 1);\n        if (sheet) {\n            cell.setSheet(sheet, true);\n        }\n        return a1 ? cell.print(0, 0) : cell.print();\n    }).args([\n        [\n            'row',\n            'integer++'\n        ],\n        [\n            'col',\n            'integer++'\n        ],\n        [\n            'abs',\n            [\n                'or',\n                [\n                    'null',\n                    1\n                ],\n                [\n                    'values',\n                    1,\n                    2,\n                    3,\n                    4\n                ]\n            ]\n        ],\n        [\n            'a1',\n            [\n                'or',\n                [\n                    'null',\n                    true\n                ],\n                'logical'\n            ]\n        ],\n        [\n            'sheet',\n            [\n                'or',\n                'null',\n                'string'\n            ]\n        ]\n    ]);\n    defineFunction('areas', function (ref) {\n        var count = 0;\n        (function loop(x) {\n            if (x instanceof CellRef || x instanceof RangeRef) {\n                count++;\n            } else if (x instanceof UnionRef) {\n                x.refs.forEach(loop);\n            }\n        }(ref));\n        return count;\n    }).args([[\n            'ref',\n            'ref'\n        ]]);\n    defineFunction('choose', function (index, args) {\n        if (index > args.length) {\n            return new CalcError('N/A');\n        } else {\n            return args[index - 1];\n        }\n    }).args([\n        [\n            '*index',\n            'integer'\n        ],\n        [\n            '+',\n            [\n                'value',\n                'anything'\n            ]\n        ]\n    ]);\n    defineFunction('column', function (ref) {\n        if (!ref) {\n            return this.formula.col + 1;\n        }\n        if (ref instanceof CellRef) {\n            return ref.col + 1;\n        }\n        return this.asMatrix(ref).mapCol(function (col) {\n            return col + ref.topLeft.col + 1;\n        });\n    }).args([[\n            'ref',\n            [\n                'or',\n                'area',\n                'null'\n            ]\n        ]]);\n    defineFunction('columns', function (m) {\n        return m instanceof Ref ? m.width() : m.width;\n    }).args([[\n            'ref',\n            [\n                'or',\n                'area',\n                '#matrix'\n            ]\n        ]]);\n    defineFunction('formulatext', function (ref) {\n        var cell = this.getRefCells(ref)[0];\n        if (!cell.formula) {\n            return new CalcError('N/A');\n        }\n        return cell.formula.print(cell.row, cell.col);\n    }).args([[\n            'ref',\n            'ref'\n        ]]);\n    defineFunction('hlookup', function (value, m, row, approx) {\n        var resultCol = null;\n        m.eachCol(function (col) {\n            var data = m.get(0, col);\n            if (approx) {\n                if (data > value) {\n                    return true;\n                }\n                resultCol = col;\n            } else if (data === value) {\n                resultCol = col;\n                return true;\n            }\n        });\n        if (resultCol == null) {\n            return new CalcError('N/A');\n        }\n        return m.get(row - 1, resultCol);\n    }).args([\n        [\n            'value',\n            'anyvalue'\n        ],\n        [\n            'range',\n            'matrix'\n        ],\n        [\n            'row',\n            'integer++'\n        ],\n        [\n            'approx',\n            [\n                'or',\n                'logical',\n                [\n                    'null',\n                    true\n                ]\n            ]\n        ]\n    ]);\n    defineFunction('index', function (callback, ref, row, col, areanum) {\n        var self = this;\n        if (ref instanceof UnionRef) {\n            ref = ref.refs[areanum - 1];\n        }\n        if (!row && !col || !ref) {\n            return callback(new CalcError('N/A'));\n        }\n        if (ref instanceof CellRef) {\n            ref = ref.toRangeRef();\n        }\n        if (ref instanceof RangeRef) {\n            if (row && col) {\n                if (col > ref.width() || row > ref.height()) {\n                    return callback(new CalcError('REF'));\n                }\n                var cell = ref.toCell(row - 1, col - 1);\n                self.resolveCells([cell], function () {\n                    callback(self.getRefData(cell));\n                });\n                return;\n            }\n            if (!row) {\n                var colRange = ref.toColumn(col - 1);\n                self.resolveCells([colRange], function () {\n                    callback(self.asMatrix(colRange));\n                });\n                return;\n            }\n            if (!col) {\n                var rowRange = ref.toRow(row - 1);\n                self.resolveCells([rowRange], function () {\n                    callback(self.asMatrix(rowRange));\n                });\n                return;\n            }\n        } else if (ref instanceof Matrix) {\n            if (ref.width > 1 && ref.height > 1) {\n                if (row && col) {\n                    return callback(ref.get(row - 1, col - 1));\n                }\n                if (!row) {\n                    return callback(ref.mapRow(function (row) {\n                        return ref.get(row, col - 1);\n                    }));\n                }\n                if (!col) {\n                    return callback(ref.mapCol(function (col) {\n                        return ref.get(row - 1, col);\n                    }));\n                }\n            }\n            if (ref.width == 1) {\n                return callback(ref.get(row - 1, 0));\n            }\n            if (ref.height == 1) {\n                return callback(ref.get(0, col - 1));\n            }\n        } else {\n            callback(new CalcError('REF'));\n        }\n    }).argsAsync([\n        [\n            'range',\n            [\n                'or',\n                'ref',\n                'matrix'\n            ]\n        ],\n        [\n            'row',\n            [\n                'or',\n                'integer+',\n                'null'\n            ]\n        ],\n        [\n            'col',\n            [\n                'or',\n                'integer+',\n                'null'\n            ]\n        ],\n        [\n            'areanum',\n            [\n                'or',\n                'integer++',\n                [\n                    'null',\n                    1\n                ]\n            ]\n        ]\n    ]);\n    defineFunction('indirect', function (thing) {\n        try {\n            var f = this.formula;\n            var exp = calc.parseFormula(f.sheet, f.row, f.col, thing);\n            if (!(exp.ast instanceof Ref)) {\n                throw 1;\n            }\n            return exp.ast.absolute(f.row, f.col);\n        } catch (ex) {\n            return new CalcError('REF');\n        }\n    }).args([[\n            'thing',\n            'string'\n        ]]);\n    defineFunction('match', function (val, m, type) {\n        var index = 1, cmp;\n        if (type === 0) {\n            cmp = parseCriteria(val);\n        } else if (type === -1) {\n            cmp = parseCriteria('<=' + val);\n        } else if (type === 1) {\n            cmp = parseCriteria('>=' + val);\n        }\n        if (m.each(function (el) {\n                if (el != null && cmp(el)) {\n                    if (type !== 0 && val != el) {\n                        --index;\n                    }\n                    return true;\n                }\n                index++;\n            }, true) && index > 0) {\n            return index;\n        } else {\n            return new CalcError('N/A');\n        }\n    }).args([\n        [\n            'value',\n            'anyvalue'\n        ],\n        [\n            'range',\n            'matrix'\n        ],\n        [\n            'type',\n            [\n                'or',\n                [\n                    'values',\n                    -1,\n                    0,\n                    1\n                ],\n                [\n                    'null',\n                    1\n                ]\n            ]\n        ]\n    ]);\n    defineFunction('offset', function (ref, rows, cols, height, width) {\n        var topLeft = (ref instanceof CellRef ? ref : ref.topLeft).clone();\n        topLeft.row += rows;\n        topLeft.col += cols;\n        if (topLeft.row < 0 || topLeft.col < 0) {\n            return new CalcError('VALUE');\n        }\n        if (height > 1 || width > 1) {\n            return new RangeRef(topLeft, new CellRef(topLeft.row + height - 1, topLeft.col + width - 1)).setSheet(ref.sheet, ref.hasSheet());\n        }\n        return topLeft;\n    }).args([\n        [\n            'ref',\n            'area'\n        ],\n        [\n            '*rows',\n            'integer'\n        ],\n        [\n            '*cols',\n            'integer'\n        ],\n        [\n            '*height',\n            [\n                'or',\n                'integer++',\n                [\n                    'null',\n                    '$ref.height()'\n                ]\n            ]\n        ],\n        [\n            '*width',\n            [\n                'or',\n                'integer++',\n                [\n                    'null',\n                    '$ref.width()'\n                ]\n            ]\n        ]\n    ]);\n    defineFunction('row', function (ref) {\n        if (!ref) {\n            return this.formula.row + 1;\n        }\n        if (ref instanceof CellRef) {\n            return ref.row + 1;\n        }\n        return this.asMatrix(ref).mapRow(function (row) {\n            return row + ref.topLeft.row + 1;\n        });\n    }).args([[\n            'ref',\n            [\n                'or',\n                'area',\n                'null'\n            ]\n        ]]);\n    defineFunction('rows', function (m) {\n        return m instanceof Ref ? m.height() : m.height;\n    }).args([[\n            'ref',\n            [\n                'or',\n                'area',\n                '#matrix'\n            ]\n        ]]);\n    defineFunction('vlookup', function (value, m, col, approx) {\n        var resultRow = null;\n        if (typeof value != 'number') {\n            approx = false;\n        }\n        if (typeof value == 'string') {\n            value = value.toLowerCase();\n        }\n        m.eachRow(function (row) {\n            var data = m.get(row, 0);\n            if (approx) {\n                if (data > value) {\n                    return true;\n                }\n                resultRow = row;\n            } else {\n                if (typeof data == 'string') {\n                    data = data.toLowerCase();\n                }\n                if (data === value) {\n                    resultRow = row;\n                    return true;\n                }\n            }\n        });\n        if (resultRow == null) {\n            return new CalcError('N/A');\n        }\n        return m.get(resultRow, col - 1);\n    }).args([\n        [\n            'value',\n            'anyvalue'\n        ],\n        [\n            'range',\n            'matrix'\n        ],\n        [\n            'col',\n            'integer++'\n        ],\n        [\n            'approx',\n            [\n                'or',\n                'logical',\n                [\n                    'null',\n                    true\n                ]\n            ]\n        ]\n    ]);\n    defineFunction('date', function (year, month, date) {\n        return packDate(year, month - 1, date);\n    }).args([\n        [\n            '*year',\n            'integer'\n        ],\n        [\n            '*month',\n            'integer'\n        ],\n        [\n            '*date',\n            'integer'\n        ]\n    ]);\n    defineFunction('day', function (date) {\n        return unpackDate(date).date;\n    }).args([[\n            '*date',\n            'date'\n        ]]);\n    defineFunction('month', function (date) {\n        return unpackDate(date).month + 1;\n    }).args([[\n            '*date',\n            'date'\n        ]]);\n    defineFunction('year', function (date) {\n        return unpackDate(date).year;\n    }).args([[\n            '*date',\n            'date'\n        ]]);\n    defineFunction('weekday', function (date) {\n        return unpackDate(date).day + 1;\n    }).args([[\n            '*date',\n            'date'\n        ]]);\n    defineFunction('weeknum', function (date, type) {\n        var fw = packDate(unpackDate(date).year, 0, 1);\n        var sy = unpackDate(fw);\n        var diff;\n        if (type == 21) {\n            diff = 3 - (sy.day + 6) % 7;\n            if (diff < 0) {\n                diff += 7;\n            }\n            fw += diff;\n            sy.date += diff;\n            sy.day = 4;\n            type = 1;\n        } else {\n            if (type == 1) {\n                type = 0;\n            } else if (type == 2) {\n                type = 1;\n            } else {\n                type = (type - 10) % 7;\n            }\n        }\n        diff = sy.day - type;\n        if (diff < 0) {\n            diff += 7;\n        }\n        fw -= diff;\n        return Math.ceil((date + 1 - fw) / 7);\n    }).args([\n        [\n            '*date',\n            'date'\n        ],\n        [\n            '*type',\n            [\n                'or',\n                [\n                    'null',\n                    1\n                ],\n                [\n                    'values',\n                    1,\n                    2,\n                    11,\n                    12,\n                    13,\n                    14,\n                    15,\n                    16,\n                    17,\n                    21\n                ]\n            ]\n        ]\n    ]);\n    function weeksInYear(year) {\n        var d = unpackDate(packDate(year, 0, 1));\n        if (d.day == 4 || d.day == 3 && runtime.isLeapYear(year)) {\n            return 53;\n        }\n        return 52;\n    }\n    defineFunction('isoweeknum', function isoweeknum(date) {\n        var d = unpackDate(date);\n        var dow = d.day || 7;\n        var wk = Math.floor((d.ord - dow + 10) / 7);\n        if (wk < 1) {\n            return weeksInYear(d.year - 1);\n        } else if (wk == 53 && wk > weeksInYear(d.year)) {\n            return 1;\n        }\n        return wk;\n    }).args([[\n            '*date',\n            'date'\n        ]]);\n    defineFunction('now', function () {\n        return runtime.dateToSerial(new Date());\n    }).args([]);\n    defineFunction('today', function () {\n        return runtime.dateToSerial(new Date()) | 0;\n    }).args([]);\n    defineFunction('time', function (hh, mm, ss) {\n        return runtime.packTime(hh, mm, ss, 0);\n    }).args([\n        [\n            '*hours',\n            'integer'\n        ],\n        [\n            '*minutes',\n            'integer'\n        ],\n        [\n            '*seconds',\n            'integer'\n        ]\n    ]);\n    defineFunction('hour', function (time) {\n        return runtime.unpackTime(time).hours;\n    }).args([[\n            '*time',\n            'datetime'\n        ]]);\n    defineFunction('minute', function (time) {\n        return runtime.unpackTime(time).minutes;\n    }).args([[\n            '*time',\n            'datetime'\n        ]]);\n    defineFunction('second', function (time) {\n        return runtime.unpackTime(time).seconds;\n    }).args([[\n            '*time',\n            'datetime'\n        ]]);\n    defineFunction('edate', function (base, months) {\n        var d = unpackDate(base);\n        var m = d.month + months;\n        var y = d.year + Math.floor(m / 12);\n        m %= 12;\n        if (m < 0) {\n            m += 12;\n        }\n        d = Math.min(d.date, daysInMonth(y, m));\n        return packDate(y, m, d);\n    }).args([\n        [\n            '*start_date',\n            'date'\n        ],\n        [\n            '*months',\n            'integer'\n        ]\n    ]);\n    defineFunction('eomonth', function (base, months) {\n        var d = unpackDate(base);\n        var m = d.month + months;\n        var y = d.year + Math.floor(m / 12);\n        m %= 12;\n        if (m < 0) {\n            m += 12;\n        }\n        d = daysInMonth(y, m);\n        return packDate(y, m, d);\n    }).args([\n        [\n            '*start_date',\n            'date'\n        ],\n        [\n            '*months',\n            'integer'\n        ]\n    ]);\n    defineFunction('workday', function (date, n, holidays) {\n        var inc = n > 0 ? 1 : -1;\n        n = Math.abs(n);\n        var dow = unpackDate(date).day;\n        while (n > 0) {\n            date += inc;\n            dow = (dow + inc) % 7;\n            if (dow > 0 && dow < 6 && holidays.indexOf(date) < 0) {\n                --n;\n            }\n        }\n        return date;\n    }).args([\n        [\n            'start_date',\n            'date'\n        ],\n        [\n            'days',\n            'integer'\n        ],\n        [\n            'holidays',\n            [\n                'collect',\n                'date'\n            ]\n        ]\n    ]);\n    defineFunction('networkdays', function (date, end, holidays) {\n        if (date > end) {\n            var tmp = date;\n            date = end;\n            end = tmp;\n        }\n        var count = 0;\n        var dow = unpackDate(date).day;\n        while (date <= end) {\n            if (dow > 0 && dow < 6 && holidays.indexOf(date) < 0) {\n                count++;\n            }\n            date++;\n            dow = (dow + 1) % 7;\n        }\n        return count;\n    }).args([\n        [\n            'start_date',\n            'date'\n        ],\n        [\n            'end_date',\n            'date'\n        ],\n        [\n            'holidays',\n            [\n                'collect',\n                'date'\n            ]\n        ]\n    ]);\n    defineFunction('days', function (start, end) {\n        return end - start;\n    }).args([\n        [\n            '*start_date',\n            'date'\n        ],\n        [\n            '*end_date',\n            'date'\n        ]\n    ]);\n    function _days_360(start, end, method) {\n        var d1 = unpackDate(start);\n        var d2 = unpackDate(end);\n        if (method) {\n            if (d1.date == 31) {\n                d1.date = 30;\n            }\n            if (d2.date == 31) {\n                d2.date = 30;\n            }\n        } else {\n            if (d1.month == 1 && d2.month == 1 && d1.date == daysInMonth(d1.year, 1) && d2.date == daysInMonth(d2.year, 1)) {\n                d2.date = 30;\n            }\n            if (d1.date == daysInMonth(d1.year, d1.month)) {\n                d1.date = 30;\n                if (d2.date == 31) {\n                    d2.date = 30;\n                }\n            } else {\n                if (d1.date == 30 && d2.date == 31) {\n                    d2.date = 30;\n                }\n            }\n        }\n        return 360 * (d2.year - d1.year) + 30 * (d2.month - d1.month) + (d2.date - d1.date);\n    }\n    runtime._days_360 = _days_360;\n    defineFunction('days360', _days_360).args([\n        [\n            '*start_date',\n            'date'\n        ],\n        [\n            '*end_date',\n            'date'\n        ],\n        [\n            '*method',\n            [\n                'or',\n                'logical',\n                [\n                    'null',\n                    false\n                ]\n            ]\n        ]\n    ]);\n    defineFunction('yearfrac', function (start, end, method) {\n        switch (method) {\n        case 0:\n            return _days_360(start, end, false) / 360;\n        case 1:\n            return (end - start) / daysInYear(unpackDate(start).year);\n        case 2:\n            return (end - start) / 360;\n        case 3:\n            return (end - start) / 365;\n        case 4:\n            return _days_360(start, end, true) / 360;\n        }\n    }).args([\n        [\n            '*start_date',\n            'date'\n        ],\n        [\n            '*end_date',\n            'date'\n        ],\n        [\n            '*method',\n            [\n                'or',\n                [\n                    'null',\n                    0\n                ],\n                [\n                    'values',\n                    0,\n                    1,\n                    2,\n                    3,\n                    4\n                ]\n            ]\n        ]\n    ]);\n    defineFunction('datevalue', function (text) {\n        var date = runtime.parseDate(text);\n        if (date) {\n            return runtime.dateToSerial(date);\n        }\n        return new CalcError('VALUE');\n    }).args([[\n            '*text',\n            'string'\n        ]]);\n    defineFunction('timevalue', function (text) {\n        var m = text.toLowerCase().match(/(\\d+):(\\d+)(:(\\d+)(\\.(\\d+))?)?\\s*(am?|pm?)?/);\n        if (m) {\n            var hh = parseFloat(m[1]);\n            var mm = parseFloat(m[2]);\n            var ss = m[3] ? parseFloat(m[4]) : 0;\n            var ampm = m[7];\n            if (ampm && (hh > 12 || hh < 1)) {\n                return new CalcError('VALUE');\n            }\n            if (/^p/.test(ampm)) {\n                hh += 12;\n            }\n            return runtime.packTime(hh, mm, ss, 0);\n        }\n        return new CalcError('VALUE');\n    }).args([[\n            '*text',\n            'string'\n        ]]);\n    defineFunction('mdeterm', function (m) {\n        var error = m.each(function (val) {\n            if (typeof val != 'number') {\n                return new CalcError('VALUE');\n            }\n        }, true);\n        return error || m.determinant();\n    }).args([[\n            'm',\n            [\n                'and',\n                'matrix',\n                [\n                    'assert',\n                    '$m.width == $m.height'\n                ]\n            ]\n        ]]);\n    defineFunction('transpose', function (m) {\n        return m.transpose();\n    }).args([[\n            'range',\n            'matrix'\n        ]]);\n    defineFunction('mmult', function (a, b) {\n        return a.multiply(b);\n    }).args([\n        [\n            'a',\n            'matrix'\n        ],\n        [\n            'b',\n            [\n                'and',\n                'matrix',\n                [\n                    'assert',\n                    '$b.height == $a.width'\n                ]\n            ]\n        ]\n    ]);\n    defineFunction('munit', function (n) {\n        return new Matrix(this).unit(n);\n    }).args([[\n            'n',\n            'integer+'\n        ]]);\n    defineFunction('minverse', function (m) {\n        var error = m.each(function (val) {\n            if (typeof val != 'number') {\n                return new CalcError('VALUE');\n            }\n        }, true);\n        return error || m.inverse() || new CalcError('VALUE');\n    }).args([[\n            'm',\n            [\n                'and',\n                'matrix',\n                [\n                    'assert',\n                    '$m.width == $m.height'\n                ]\n            ]\n        ]]);\n    defineFunction('rand', function () {\n        return Math.random();\n    }).args([]);\n    defineFunction('randbetween', function (min, max) {\n        return min + Math.floor((max - min + 1) * Math.random());\n    }).args([\n        [\n            'min',\n            'integer'\n        ],\n        [\n            'max',\n            [\n                'and',\n                'integer',\n                [\n                    'assert',\n                    '$max >= $min'\n                ]\n            ]\n        ]\n    ]);\n    defineFunction('true', function () {\n        return true;\n    }).args([]);\n    defineFunction('false', function () {\n        return true;\n    }).args([]);\n    defineFunction('roman', function (num) {\n        return util.arabicToRoman(num).toUpperCase();\n    }).args([[\n            '*number',\n            'integer'\n        ]]);\n    defineFunction('arabic', function (rom) {\n        var num = util.romanToArabic(rom);\n        return num == null ? new CalcError('VALUE') : num;\n    }).args([[\n            '*roman',\n            'string'\n        ]]);\n    defineFunction('base', function (number, radix, minLen) {\n        var str = number.toString(radix).toUpperCase();\n        while (str.length < minLen) {\n            str = '0' + str;\n        }\n        return str;\n    }).args([\n        [\n            '*number',\n            'integer'\n        ],\n        [\n            '*radix',\n            [\n                'and',\n                'integer',\n                [\n                    '[between]',\n                    2,\n                    36\n                ]\n            ]\n        ],\n        [\n            '*minLen',\n            [\n                'or',\n                'integer+',\n                [\n                    'null',\n                    0\n                ]\n            ]\n        ]\n    ]);\n    defineFunction('decimal', function (text, radix) {\n        text = text.toUpperCase();\n        var val = 0;\n        for (var i = 0; i < text.length; ++i) {\n            var d = text.charCodeAt(i);\n            if (d >= 48 && d <= 57) {\n                d -= 48;\n            } else if (d >= 65 && d < 55 + radix) {\n                d -= 55;\n            } else {\n                return new CalcError('VALUE');\n            }\n            val = val * radix + d;\n        }\n        return val;\n    }).args([\n        [\n            '*text',\n            'string'\n        ],\n        [\n            '*radix',\n            [\n                'and',\n                'integer',\n                [\n                    '[between]',\n                    2,\n                    36\n                ]\n            ]\n        ]\n    ]);\n    defineFunction('char', function (code) {\n        return String.fromCharCode(code);\n    }).args([[\n            '*code',\n            'integer+'\n        ]]);\n    var RX_NON_PRINTABLE = /[\\0-\\x1F\\x7F-\\x9F\\xAD\\u0378\\u0379\\u037F-\\u0383\\u038B\\u038D\\u03A2\\u0528-\\u0530\\u0557\\u0558\\u0560\\u0588\\u058B-\\u058E\\u0590\\u05C8-\\u05CF\\u05EB-\\u05EF\\u05F5-\\u0605\\u061C\\u061D\\u06DD\\u070E\\u070F\\u074B\\u074C\\u07B2-\\u07BF\\u07FB-\\u07FF\\u082E\\u082F\\u083F\\u085C\\u085D\\u085F-\\u089F\\u08A1\\u08AD-\\u08E3\\u08FF\\u0978\\u0980\\u0984\\u098D\\u098E\\u0991\\u0992\\u09A9\\u09B1\\u09B3-\\u09B5\\u09BA\\u09BB\\u09C5\\u09C6\\u09C9\\u09CA\\u09CF-\\u09D6\\u09D8-\\u09DB\\u09DE\\u09E4\\u09E5\\u09FC-\\u0A00\\u0A04\\u0A0B-\\u0A0E\\u0A11\\u0A12\\u0A29\\u0A31\\u0A34\\u0A37\\u0A3A\\u0A3B\\u0A3D\\u0A43-\\u0A46\\u0A49\\u0A4A\\u0A4E-\\u0A50\\u0A52-\\u0A58\\u0A5D\\u0A5F-\\u0A65\\u0A76-\\u0A80\\u0A84\\u0A8E\\u0A92\\u0AA9\\u0AB1\\u0AB4\\u0ABA\\u0ABB\\u0AC6\\u0ACA\\u0ACE\\u0ACF\\u0AD1-\\u0ADF\\u0AE4\\u0AE5\\u0AF2-\\u0B00\\u0B04\\u0B0D\\u0B0E\\u0B11\\u0B12\\u0B29\\u0B31\\u0B34\\u0B3A\\u0B3B\\u0B45\\u0B46\\u0B49\\u0B4A\\u0B4E-\\u0B55\\u0B58-\\u0B5B\\u0B5E\\u0B64\\u0B65\\u0B78-\\u0B81\\u0B84\\u0B8B-\\u0B8D\\u0B91\\u0B96-\\u0B98\\u0B9B\\u0B9D\\u0BA0-\\u0BA2\\u0BA5-\\u0BA7\\u0BAB-\\u0BAD\\u0BBA-\\u0BBD\\u0BC3-\\u0BC5\\u0BC9\\u0BCE\\u0BCF\\u0BD1-\\u0BD6\\u0BD8-\\u0BE5\\u0BFB-\\u0C00\\u0C04\\u0C0D\\u0C11\\u0C29\\u0C34\\u0C3A-\\u0C3C\\u0C45\\u0C49\\u0C4E-\\u0C54\\u0C57\\u0C5A-\\u0C5F\\u0C64\\u0C65\\u0C70-\\u0C77\\u0C80\\u0C81\\u0C84\\u0C8D\\u0C91\\u0CA9\\u0CB4\\u0CBA\\u0CBB\\u0CC5\\u0CC9\\u0CCE-\\u0CD4\\u0CD7-\\u0CDD\\u0CDF\\u0CE4\\u0CE5\\u0CF0\\u0CF3-\\u0D01\\u0D04\\u0D0D\\u0D11\\u0D3B\\u0D3C\\u0D45\\u0D49\\u0D4F-\\u0D56\\u0D58-\\u0D5F\\u0D64\\u0D65\\u0D76-\\u0D78\\u0D80\\u0D81\\u0D84\\u0D97-\\u0D99\\u0DB2\\u0DBC\\u0DBE\\u0DBF\\u0DC7-\\u0DC9\\u0DCB-\\u0DCE\\u0DD5\\u0DD7\\u0DE0-\\u0DF1\\u0DF5-\\u0E00\\u0E3B-\\u0E3E\\u0E5C-\\u0E80\\u0E83\\u0E85\\u0E86\\u0E89\\u0E8B\\u0E8C\\u0E8E-\\u0E93\\u0E98\\u0EA0\\u0EA4\\u0EA6\\u0EA8\\u0EA9\\u0EAC\\u0EBA\\u0EBE\\u0EBF\\u0EC5\\u0EC7\\u0ECE\\u0ECF\\u0EDA\\u0EDB\\u0EE0-\\u0EFF\\u0F48\\u0F6D-\\u0F70\\u0F98\\u0FBD\\u0FCD\\u0FDB-\\u0FFF\\u10C6\\u10C8-\\u10CC\\u10CE\\u10CF\\u1249\\u124E\\u124F\\u1257\\u1259\\u125E\\u125F\\u1289\\u128E\\u128F\\u12B1\\u12B6\\u12B7\\u12BF\\u12C1\\u12C6\\u12C7\\u12D7\\u1311\\u1316\\u1317\\u135B\\u135C\\u137D-\\u137F\\u139A-\\u139F\\u13F5-\\u13FF\\u169D-\\u169F\\u16F1-\\u16FF\\u170D\\u1715-\\u171F\\u1737-\\u173F\\u1754-\\u175F\\u176D\\u1771\\u1774-\\u177F\\u17DE\\u17DF\\u17EA-\\u17EF\\u17FA-\\u17FF\\u180F\\u181A-\\u181F\\u1878-\\u187F\\u18AB-\\u18AF\\u18F6-\\u18FF\\u191D-\\u191F\\u192C-\\u192F\\u193C-\\u193F\\u1941-\\u1943\\u196E\\u196F\\u1975-\\u197F\\u19AC-\\u19AF\\u19CA-\\u19CF\\u19DB-\\u19DD\\u1A1C\\u1A1D\\u1A5F\\u1A7D\\u1A7E\\u1A8A-\\u1A8F\\u1A9A-\\u1A9F\\u1AAE-\\u1AFF\\u1B4C-\\u1B4F\\u1B7D-\\u1B7F\\u1BF4-\\u1BFB\\u1C38-\\u1C3A\\u1C4A-\\u1C4C\\u1C80-\\u1CBF\\u1CC8-\\u1CCF\\u1CF7-\\u1CFF\\u1DE7-\\u1DFB\\u1F16\\u1F17\\u1F1E\\u1F1F\\u1F46\\u1F47\\u1F4E\\u1F4F\\u1F58\\u1F5A\\u1F5C\\u1F5E\\u1F7E\\u1F7F\\u1FB5\\u1FC5\\u1FD4\\u1FD5\\u1FDC\\u1FF0\\u1FF1\\u1FF5\\u1FFF\\u200B-\\u200F\\u202A-\\u202E\\u2060-\\u206F\\u2072\\u2073\\u208F\\u209D-\\u209F\\u20BB-\\u20CF\\u20F1-\\u20FF\\u218A-\\u218F\\u23F4-\\u23FF\\u2427-\\u243F\\u244B-\\u245F\\u2700\\u2B4D-\\u2B4F\\u2B5A-\\u2BFF\\u2C2F\\u2C5F\\u2CF4-\\u2CF8\\u2D26\\u2D28-\\u2D2C\\u2D2E\\u2D2F\\u2D68-\\u2D6E\\u2D71-\\u2D7E\\u2D97-\\u2D9F\\u2DA7\\u2DAF\\u2DB7\\u2DBF\\u2DC7\\u2DCF\\u2DD7\\u2DDF\\u2E3C-\\u2E7F\\u2E9A\\u2EF4-\\u2EFF\\u2FD6-\\u2FEF\\u2FFC-\\u2FFF\\u3040\\u3097\\u3098\\u3100-\\u3104\\u312E-\\u3130\\u318F\\u31BB-\\u31BF\\u31E4-\\u31EF\\u321F\\u32FF\\u4DB6-\\u4DBF\\u9FCD-\\u9FFF\\uA48D-\\uA48F\\uA4C7-\\uA4CF\\uA62C-\\uA63F\\uA698-\\uA69E\\uA6F8-\\uA6FF\\uA78F\\uA794-\\uA79F\\uA7AB-\\uA7F7\\uA82C-\\uA82F\\uA83A-\\uA83F\\uA878-\\uA87F\\uA8C5-\\uA8CD\\uA8DA-\\uA8DF\\uA8FC-\\uA8FF\\uA954-\\uA95E\\uA97D-\\uA97F\\uA9CE\\uA9DA-\\uA9DD\\uA9E0-\\uA9FF\\uAA37-\\uAA3F\\uAA4E\\uAA4F\\uAA5A\\uAA5B\\uAA7C-\\uAA7F\\uAAC3-\\uAADA\\uAAF7-\\uAB00\\uAB07\\uAB08\\uAB0F\\uAB10\\uAB17-\\uAB1F\\uAB27\\uAB2F-\\uABBF\\uABEE\\uABEF\\uABFA-\\uABFF\\uD7A4-\\uD7AF\\uD7C7-\\uD7CA\\uD7FC-\\uF8FF\\uFA6E\\uFA6F\\uFADA-\\uFAFF\\uFB07-\\uFB12\\uFB18-\\uFB1C\\uFB37\\uFB3D\\uFB3F\\uFB42\\uFB45\\uFBC2-\\uFBD2\\uFD40-\\uFD4F\\uFD90\\uFD91\\uFDC8-\\uFDEF\\uFDFE\\uFDFF\\uFE1A-\\uFE1F\\uFE27-\\uFE2F\\uFE53\\uFE67\\uFE6C-\\uFE6F\\uFE75\\uFEFD-\\uFF00\\uFFBF-\\uFFC1\\uFFC8\\uFFC9\\uFFD0\\uFFD1\\uFFD8\\uFFD9\\uFFDD-\\uFFDF\\uFFE7\\uFFEF-\\uFFFB\\uFFFE\\uFFFF]/g;\n    defineFunction('clean', function (text) {\n        return text.replace(RX_NON_PRINTABLE, '');\n    }).args([[\n            '*text',\n            'string'\n        ]]);\n    defineFunction('code', function (text) {\n        return text.charAt(0);\n    }).args([[\n            '*text',\n            'string'\n        ]]);\n    defineAlias('unichar', 'char');\n    defineAlias('unicode', 'code');\n    defineFunction('concatenate', function (args) {\n        var out = '';\n        for (var i = 0; i < args.length; ++i) {\n            out += args[i];\n        }\n        return out;\n    }).args([[\n            '+',\n            [\n                '*text',\n                'string'\n            ]\n        ]]);\n    defineFunction('dollar', function (number, decimals) {\n        var format = '$#,##0.DECIMALS;($#,##0.DECIMALS)';\n        var dec = '';\n        while (decimals-- > 0) {\n            dec += '0';\n        }\n        format = format.replace(/DECIMALS/g, dec);\n        return spreadsheet.formatting.text(number, format);\n    }).args([\n        [\n            '*number',\n            'number'\n        ],\n        [\n            '*decimals',\n            [\n                'or',\n                'integer++',\n                [\n                    'null',\n                    2\n                ]\n            ]\n        ]\n    ]);\n    defineFunction('exact', function (a, b) {\n        return a === b;\n    }).args([\n        [\n            '*text1',\n            'string'\n        ],\n        [\n            '*text2',\n            'string'\n        ]\n    ]);\n    defineFunction('find', function (substring, string, start) {\n        var pos = string.indexOf(substring, start - 1);\n        return pos < 0 ? new CalcError('VALUE') : pos + 1;\n    }).args([\n        [\n            '*substring',\n            'string'\n        ],\n        [\n            '*string',\n            'string'\n        ],\n        [\n            '*start',\n            [\n                'or',\n                'integer++',\n                [\n                    'null',\n                    1\n                ]\n            ]\n        ]\n    ]);\n    defineFunction('fixed', function (number, decimals, noCommas) {\n        var format = noCommas ? '0.DECIMALS' : '#,##0.DECIMALS';\n        var dec = '';\n        while (decimals-- > 0) {\n            dec += '0';\n        }\n        format = format.replace(/DECIMALS/g, dec);\n        return spreadsheet.formatting.text(number, format);\n    }).args([\n        [\n            '*number',\n            'number'\n        ],\n        [\n            '*decimals',\n            [\n                'or',\n                'integer++',\n                [\n                    'null',\n                    2\n                ]\n            ]\n        ],\n        [\n            '*noCommas',\n            [\n                'or',\n                'boolean',\n                [\n                    'null',\n                    false\n                ]\n            ]\n        ]\n    ]);\n    defineFunction('left', function (text, length) {\n        return text.substr(0, length);\n    }).args([\n        [\n            '*text',\n            'string'\n        ],\n        [\n            '*length',\n            [\n                'or',\n                'integer+',\n                [\n                    'null',\n                    1\n                ]\n            ]\n        ]\n    ]);\n    defineFunction('right', function (text, length) {\n        return text.substr(-length);\n    }).args([\n        [\n            '*text',\n            'string'\n        ],\n        [\n            '*length',\n            [\n                'or',\n                'integer+',\n                [\n                    'null',\n                    1\n                ]\n            ]\n        ]\n    ]);\n    defineFunction('len', function (text) {\n        return text.length;\n    }).args([[\n            '*text',\n            'string'\n        ]]);\n    defineFunction('lower', function (text) {\n        return text.toLowerCase();\n    }).args([[\n            '*text',\n            'string'\n        ]]);\n    defineFunction('upper', function (text) {\n        return text.toUpperCase();\n    }).args([[\n            '*text',\n            'string'\n        ]]);\n    defineFunction('ltrim', function (text) {\n        return text.replace(/^\\s+/, '');\n    }).args([[\n            '*text',\n            'string'\n        ]]);\n    defineFunction('rtrim', function (text) {\n        return text.replace(/\\s+$/, '');\n    }).args([[\n            '*text',\n            'string'\n        ]]);\n    defineFunction('trim', function (text) {\n        return text.replace(/^\\s+|\\s+$/, '');\n    }).args([[\n            '*text',\n            'string'\n        ]]);\n    defineFunction('mid', function (text, start, length) {\n        return text.substr(start - 1, length);\n    }).args([\n        [\n            '*text',\n            'string'\n        ],\n        [\n            '*start',\n            'integer++'\n        ],\n        [\n            '*length',\n            'integer+'\n        ]\n    ]);\n    defineFunction('proper', function (text) {\n        return text.toLowerCase().replace(/\\b./g, function (s) {\n            return s.toUpperCase();\n        });\n    }).args([[\n            '*text',\n            'string'\n        ]]);\n    defineFunction('replace', function (text, start, length, newText) {\n        return text.substr(0, --start) + newText + text.substr(start + length);\n    }).args([\n        [\n            '*text',\n            'string'\n        ],\n        [\n            '*start',\n            'integer++'\n        ],\n        [\n            '*length',\n            'integer+'\n        ],\n        [\n            '*newText',\n            'string'\n        ]\n    ]);\n    defineFunction('rept', function (text, number) {\n        var out = '';\n        while (number-- > 0) {\n            out += text;\n        }\n        return out;\n    }).args([\n        [\n            '*text',\n            'string'\n        ],\n        [\n            '*number',\n            'integer+'\n        ]\n    ]);\n    defineFunction('search', function (substring, string, start) {\n        var pos = string.toLowerCase().indexOf(substring.toLowerCase(), start - 1);\n        return pos < 0 ? new CalcError('VALUE') : pos + 1;\n    }).args([\n        [\n            '*substring',\n            'string'\n        ],\n        [\n            '*string',\n            'string'\n        ],\n        [\n            '*start',\n            [\n                'or',\n                'integer++',\n                [\n                    'null',\n                    1\n                ]\n            ]\n        ]\n    ]);\n    defineFunction('substitute', function (text, oldText, newText, nth) {\n        if (oldText === newText) {\n            return text;\n        }\n        var pos = -1;\n        function replace() {\n            text = text.substring(0, pos) + newText + text.substring(pos + oldText.length);\n        }\n        while ((pos = text.indexOf(oldText, pos + 1)) >= 0) {\n            if (nth == null) {\n                replace();\n            } else if (--nth === 0) {\n                replace();\n                break;\n            }\n        }\n        return text;\n    }).args([\n        [\n            '*text',\n            'string'\n        ],\n        [\n            '*oldText',\n            'string'\n        ],\n        [\n            '*newText',\n            'string'\n        ],\n        [\n            '*nth',\n            [\n                'or',\n                'integer++',\n                'null'\n            ]\n        ]\n    ]);\n    defineFunction('t', function (value) {\n        return typeof value == 'string' ? value : '';\n    }).args([[\n            '*value',\n            'anyvalue'\n        ]]);\n    defineFunction('text', function (value, format) {\n        return spreadsheet.formatting.text(value, format);\n    }).args([\n        [\n            '*value',\n            'anyvalue'\n        ],\n        [\n            '*format',\n            'string'\n        ]\n    ]);\n    defineFunction('value', function (value) {\n        if (typeof value == 'number') {\n            return value;\n        }\n        if (typeof value == 'boolean') {\n            return +value;\n        }\n        value = (value + '').replace(/[$€,]/g, '');\n        value = parseFloat(value);\n        return isNaN(value) ? new CalcError('VALUE') : value;\n    }).args([[\n            '*value',\n            'anyvalue'\n        ]]);\n    function Hyperlink(link, text) {\n        this.link = link;\n        this.text = text;\n    }\n    Hyperlink.prototype.toString = function () {\n        return this.text;\n    };\n    defineFunction('hyperlink', function (link, text) {\n        return new Hyperlink(link, text);\n    }).args([\n        [\n            '*link',\n            'string'\n        ],\n        [\n            '*text',\n            [\n                'or',\n                'string',\n                [\n                    'null',\n                    '$link'\n                ]\n            ]\n        ]\n    ]);\n    defineFunction('iferror', function (value, valueIfError) {\n        return value instanceof CalcError ? valueIfError : value;\n    }).args([\n        [\n            '*value',\n            'forced!'\n        ],\n        [\n            '*value_if_error',\n            'anyvalue!'\n        ]\n    ]);\n    var parseCriteria = function () {\n        var RXCACHE = Object.create(null);\n        function makeComparator(cmp, x) {\n            if (typeof x == 'string') {\n                var num = parseFloat(x);\n                if (!isNaN(num) && num == x) {\n                    x = num;\n                }\n            }\n            return function (a) {\n                var b = x;\n                if (typeof a == 'string' && typeof b == 'string') {\n                    a = a.toLowerCase();\n                    b = b.toLowerCase();\n                }\n                return cmp(a, b);\n            };\n        }\n        function lc(a) {\n            var num, str;\n            if (typeof a == 'string') {\n                a = a.toLowerCase();\n            }\n            if (/^[0-9.]+%$/.test(a)) {\n                str = a.substr(0, a.length - 1);\n                num = parseFloat(str);\n                if (!isNaN(num) && num == str) {\n                    a = num / 100;\n                }\n            } else if (/^[0-9.]+$/.test(a)) {\n                num = parseFloat(a);\n                if (!isNaN(num) && num == a) {\n                    a = num;\n                }\n            }\n            return a;\n        }\n        function compLT(a, b) {\n            return lc(a) < lc(b);\n        }\n        function compLTE(a, b) {\n            return lc(a) <= lc(b);\n        }\n        function compGT(a, b) {\n            return lc(a) > lc(b);\n        }\n        function compGTE(a, b) {\n            return lc(a) >= lc(b);\n        }\n        function compNE(a, b) {\n            return !compEQ(a, b);\n        }\n        function compEQ(a, b) {\n            if (b instanceof RegExp) {\n                return b.test(a);\n            }\n            if (typeof a == 'string' || typeof b == 'string') {\n                a = String(a);\n                b = String(b);\n            }\n            return lc(a) == lc(b);\n        }\n        return function (cmp) {\n            if (typeof cmp == 'function') {\n                return cmp;\n            }\n            var m;\n            if (m = /^=(.*)$/.exec(cmp)) {\n                return makeComparator(compEQ, m[1]);\n            }\n            if (m = /^<>(.*)$/.exec(cmp)) {\n                return makeComparator(compNE, m[1]);\n            }\n            if (m = /^<=(.*)$/.exec(cmp)) {\n                return makeComparator(compLTE, m[1]);\n            }\n            if (m = /^<(.*)$/.exec(cmp)) {\n                return makeComparator(compLT, m[1]);\n            }\n            if (m = /^>=(.*)$/.exec(cmp)) {\n                return makeComparator(compGTE, m[1]);\n            }\n            if (m = /^>(.*)$/.exec(cmp)) {\n                return makeComparator(compGT, m[1]);\n            }\n            if (/[?*]/.exec(cmp)) {\n                var rx = RXCACHE[cmp];\n                if (!rx) {\n                    rx = cmp.replace(/(~\\?|~\\*|[\\]({\\+\\.\\|\\^\\$\\\\})\\[]|[?*])/g, function (s) {\n                        switch (s) {\n                        case '~?':\n                            return '\\\\?';\n                        case '~*':\n                            return '\\\\*';\n                        case '?':\n                            return '.';\n                        case '*':\n                            return '.*';\n                        default:\n                            return '\\\\' + s;\n                        }\n                    });\n                    rx = RXCACHE[cmp] = new RegExp('^' + rx + '$', 'i');\n                }\n                return makeComparator(compEQ, rx);\n            }\n            return makeComparator(compEQ, cmp);\n        };\n    }();\n    function numericPredicate(val) {\n        return typeof val == 'number' || typeof val == 'boolean' || val == null || val === '';\n    }\n    function ascending(a, b) {\n        return a === b ? 0 : a < b ? -1 : 1;\n    }\n    function descending(a, b) {\n        return a === b ? 0 : a < b ? 1 : -1;\n    }\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('spreadsheet/runtime.functions.2', ['spreadsheet/runtime'], f);\n}(function () {\n    'use strict';\n    if (kendo.support.browser.msie && kendo.support.browser.version < 9) {\n        return;\n    }\n    var spreadsheet = kendo.spreadsheet;\n    var calc = spreadsheet.calc;\n    var runtime = calc.runtime;\n    var defineFunction = runtime.defineFunction;\n    var CalcError = runtime.CalcError;\n    var packDate = runtime.packDate;\n    var unpackDate = runtime.unpackDate;\n    var isLeapYear = runtime.isLeapYear;\n    var daysInMonth = runtime.daysInMonth;\n    var _days_360 = runtime._days_360;\n    defineFunction('ERF', function (ll, ul) {\n        if (ul == null) {\n            return ERF(ll);\n        }\n        return ERF(ul) - ERF(ll);\n    }).args([\n        [\n            'lower_limit',\n            'number'\n        ],\n        [\n            'upper_limit',\n            [\n                'or',\n                'number',\n                'null'\n            ]\n        ]\n    ]);\n    defineFunction('ERFC', ERFC).args([[\n            'x',\n            'number'\n        ]]);\n    defineFunction('GAMMALN', GAMMALN).args([[\n            'x',\n            'number++'\n        ]]);\n    defineFunction('GAMMA', GAMMA).args([[\n            'x',\n            'number'\n        ]]);\n    defineFunction('GAMMA.DIST', GAMMA_DIST).args([\n        [\n            'x',\n            'number+'\n        ],\n        [\n            'alpha',\n            'number++'\n        ],\n        [\n            'beta',\n            'number++'\n        ],\n        [\n            'cumulative',\n            'logical'\n        ]\n    ]);\n    defineFunction('GAMMA.INV', GAMMA_INV).args([\n        [\n            'p',\n            [\n                'and',\n                'number',\n                [\n                    '[between]',\n                    0,\n                    1\n                ]\n            ]\n        ],\n        [\n            'alpha',\n            'number++'\n        ],\n        [\n            'beta',\n            'number++'\n        ]\n    ]);\n    defineFunction('NORM.S.DIST', NORM_S_DIST).args([\n        [\n            'z',\n            'number'\n        ],\n        [\n            'cumulative',\n            'logical'\n        ]\n    ]);\n    defineFunction('NORM.S.INV', NORM_S_INV).args([[\n            'p',\n            [\n                'and',\n                'number',\n                [\n                    '[between]',\n                    0,\n                    1\n                ]\n            ]\n        ]]);\n    defineFunction('NORM.DIST', NORM_DIST).args([\n        [\n            'x',\n            'number'\n        ],\n        [\n            'mean',\n            'number'\n        ],\n        [\n            'stddev',\n            'number++'\n        ],\n        [\n            'cumulative',\n            'logical'\n        ]\n    ]);\n    defineFunction('NORM.INV', NORM_INV).args([\n        [\n            'p',\n            [\n                'and',\n                'number',\n                [\n                    '[between]',\n                    0,\n                    1\n                ]\n            ]\n        ],\n        [\n            'mean',\n            'number'\n        ],\n        [\n            'stddev',\n            'number++'\n        ]\n    ]);\n    defineFunction('BETADIST', BETADIST).args([\n        [\n            'x',\n            'number'\n        ],\n        [\n            'alpha',\n            'number++'\n        ],\n        [\n            'beta',\n            'number++'\n        ],\n        [\n            'A',\n            [\n                'or',\n                'number',\n                [\n                    'null',\n                    0\n                ]\n            ]\n        ],\n        [\n            'B',\n            [\n                'or',\n                'number',\n                [\n                    'null',\n                    1\n                ]\n            ]\n        ],\n        [\n            '?',\n            [\n                'assert',\n                '$x >= $A',\n                'NUM'\n            ]\n        ],\n        [\n            '?',\n            [\n                'assert',\n                '$x <= $B',\n                'NUM'\n            ]\n        ],\n        [\n            '?',\n            [\n                'assert',\n                '$A < $B',\n                'NUM'\n            ]\n        ]\n    ]);\n    defineFunction('BETA.DIST', BETA_DIST).args([\n        [\n            'x',\n            'number'\n        ],\n        [\n            'alpha',\n            'number++'\n        ],\n        [\n            'beta',\n            'number++'\n        ],\n        [\n            'cumulative',\n            'logical'\n        ],\n        [\n            'A',\n            [\n                'or',\n                'number',\n                [\n                    'null',\n                    0\n                ]\n            ]\n        ],\n        [\n            'B',\n            [\n                'or',\n                'number',\n                [\n                    'null',\n                    1\n                ]\n            ]\n        ],\n        [\n            '?',\n            [\n                'assert',\n                '$x >= $A',\n                'NUM'\n            ]\n        ],\n        [\n            '?',\n            [\n                'assert',\n                '$x <= $B',\n                'NUM'\n            ]\n        ],\n        [\n            '?',\n            [\n                'assert',\n                '$A < $B',\n                'NUM'\n            ]\n        ]\n    ]);\n    defineFunction('BETA.INV', BETA_INV).args([\n        [\n            'p',\n            [\n                'and',\n                'number',\n                [\n                    '[between]',\n                    0,\n                    1\n                ]\n            ]\n        ],\n        [\n            'alpha',\n            'number++'\n        ],\n        [\n            'beta',\n            'number++'\n        ],\n        [\n            'A',\n            [\n                'or',\n                'number',\n                [\n                    'null',\n                    0\n                ]\n            ]\n        ],\n        [\n            'B',\n            [\n                'or',\n                'number',\n                [\n                    'null',\n                    1\n                ]\n            ]\n        ]\n    ]);\n    defineFunction('CHISQ.DIST', chisq_left).args([\n        [\n            'x',\n            'number+'\n        ],\n        [\n            'deg_freedom',\n            'integer++'\n        ],\n        [\n            'cumulative',\n            'logical'\n        ]\n    ]);\n    defineFunction('CHISQ.DIST.RT', chisq_right).args([\n        [\n            'x',\n            'number+'\n        ],\n        [\n            'deg_freedom',\n            'integer++'\n        ]\n    ]);\n    defineFunction('CHISQ.INV', chisq_left_inv).args([\n        [\n            'p',\n            [\n                'and',\n                'number',\n                [\n                    '[between]',\n                    0,\n                    1\n                ]\n            ]\n        ],\n        [\n            'deg_freedom',\n            'integer++'\n        ]\n    ]);\n    defineFunction('CHISQ.INV.RT', chisq_right_inv).args([\n        [\n            'p',\n            [\n                'and',\n                'number',\n                [\n                    '[between]',\n                    0,\n                    1\n                ]\n            ]\n        ],\n        [\n            'deg_freedom',\n            'integer++'\n        ]\n    ]);\n    defineFunction('CHISQ.TEST', function (ac, ex) {\n        return chisq_test(ac.data, ex.data);\n    }).args([\n        [\n            'actual_range',\n            'matrix'\n        ],\n        [\n            'expected_range',\n            'matrix'\n        ],\n        [\n            '?',\n            [\n                'assert',\n                '$actual_range.width == $expected_range.width'\n            ]\n        ],\n        [\n            '?',\n            [\n                'assert',\n                '$actual_range.height == $expected_range.height'\n            ]\n        ]\n    ]);\n    defineFunction('EXPON.DIST', expon).args([\n        [\n            'x',\n            'number+'\n        ],\n        [\n            'lambda',\n            'number++'\n        ],\n        [\n            'cumulative',\n            'logical'\n        ]\n    ]);\n    defineFunction('POISSON.DIST', poisson).args([\n        [\n            'x',\n            'integer+'\n        ],\n        [\n            'mean',\n            'number+'\n        ],\n        [\n            'cumulative',\n            'logical'\n        ]\n    ]);\n    defineFunction('F.DIST', Fdist).args([\n        [\n            'x',\n            'number+'\n        ],\n        [\n            'deg_freedom1',\n            'integer++'\n        ],\n        [\n            'deg_freedom2',\n            'integer++'\n        ],\n        [\n            'cumulative',\n            'logical'\n        ]\n    ]);\n    defineFunction('F.DIST.RT', Fdist_right).args([\n        [\n            'x',\n            'number+'\n        ],\n        [\n            'deg_freedom1',\n            'integer++'\n        ],\n        [\n            'deg_freedom2',\n            'integer++'\n        ]\n    ]);\n    defineFunction('F.INV', Finv).args([\n        [\n            'p',\n            [\n                'and',\n                'number',\n                [\n                    '[between]',\n                    0,\n                    1\n                ]\n            ]\n        ],\n        [\n            'deg_freedom1',\n            'integer++'\n        ],\n        [\n            'deg_freedom2',\n            'integer++'\n        ]\n    ]);\n    defineFunction('F.INV.RT', Finv_right).args([\n        [\n            'p',\n            [\n                'and',\n                'number',\n                [\n                    '[between]',\n                    0,\n                    1\n                ]\n            ]\n        ],\n        [\n            'deg_freedom1',\n            'integer++'\n        ],\n        [\n            'deg_freedom2',\n            'integer++'\n        ]\n    ]);\n    defineFunction('F.TEST', Ftest).args([\n        [\n            'array1',\n            [\n                'collect',\n                'number',\n                1\n            ]\n        ],\n        [\n            'array2',\n            [\n                'collect',\n                'number',\n                1\n            ]\n        ],\n        [\n            '?',\n            [\n                'assert',\n                '$array1.length >= 2',\n                'DIV/0'\n            ]\n        ],\n        [\n            '?',\n            [\n                'assert',\n                '$array2.length >= 2',\n                'DIV/0'\n            ]\n        ]\n    ]);\n    defineFunction('FISHER', fisher).args([[\n            'x',\n            [\n                'and',\n                'number',\n                [\n                    '(between)',\n                    -1,\n                    1\n                ]\n            ]\n        ]]);\n    defineFunction('FISHERINV', fisherinv).args([[\n            'y',\n            'number'\n        ]]);\n    defineFunction('T.DIST', Tdist).args([\n        [\n            'x',\n            'number'\n        ],\n        [\n            'deg_freedom',\n            'integer++'\n        ],\n        [\n            'cumulative',\n            'logical'\n        ]\n    ]);\n    defineFunction('T.DIST.RT', Tdist_right).args([\n        [\n            'x',\n            'number'\n        ],\n        [\n            'deg_freedom',\n            'integer++'\n        ]\n    ]);\n    defineFunction('T.DIST.2T', Tdist_2tail).args([\n        [\n            'x',\n            'number+'\n        ],\n        [\n            'deg_freedom',\n            'integer++'\n        ]\n    ]);\n    defineFunction('T.INV', Tdist_inv).args([\n        [\n            'p',\n            [\n                'and',\n                'number',\n                [\n                    '(between]',\n                    0,\n                    1\n                ]\n            ]\n        ],\n        [\n            'deg_freedom',\n            'integer++'\n        ]\n    ]);\n    defineFunction('T.INV.2T', Tdist_2tail_inv).args([\n        [\n            'p',\n            [\n                'and',\n                'number',\n                [\n                    '(between]',\n                    0,\n                    1\n                ]\n            ]\n        ],\n        [\n            'deg_freedom',\n            'integer++'\n        ]\n    ]);\n    defineFunction('T.TEST', Tdist_test).args([\n        [\n            'array1',\n            [\n                'collect',\n                'number',\n                1\n            ]\n        ],\n        [\n            'array2',\n            [\n                'collect',\n                'number',\n                1\n            ]\n        ],\n        [\n            'tails',\n            [\n                'and',\n                'integer',\n                [\n                    'values',\n                    1,\n                    2\n                ]\n            ]\n        ],\n        [\n            'type',\n            [\n                'and',\n                'integer',\n                [\n                    'values',\n                    1,\n                    2,\n                    3\n                ]\n            ]\n        ],\n        [\n            '?',\n            [\n                'assert',\n                '$type != 1 || $array1.length == $array2.length',\n                'N/A'\n            ]\n        ],\n        [\n            '?',\n            [\n                'assert',\n                '$array1.length >= 2',\n                'DIV/0'\n            ]\n        ],\n        [\n            '?',\n            [\n                'assert',\n                '$array2.length >= 2',\n                'DIV/0'\n            ]\n        ]\n    ]);\n    defineFunction('CONFIDENCE.T', confidence_t).args([\n        [\n            'alpha',\n            [\n                'and',\n                'number',\n                [\n                    '(between)',\n                    0,\n                    1\n                ]\n            ]\n        ],\n        [\n            'standard_dev',\n            'number++'\n        ],\n        [\n            'size',\n            [\n                'and',\n                'integer++',\n                [\n                    'assert',\n                    '$size != 1',\n                    'DIV/0'\n                ]\n            ]\n        ]\n    ]);\n    defineFunction('CONFIDENCE.NORM', confidence_norm).args([\n        [\n            'alpha',\n            [\n                'and',\n                'number',\n                [\n                    '(between)',\n                    0,\n                    1\n                ]\n            ]\n        ],\n        [\n            'standard_dev',\n            'number++'\n        ],\n        [\n            'size',\n            [\n                'and',\n                'integer++'\n            ]\n        ]\n    ]);\n    defineFunction('GAUSS', gauss).args([[\n            'z',\n            'number'\n        ]]);\n    defineFunction('PHI', phi).args([[\n            'x',\n            'number'\n        ]]);\n    defineFunction('LOGNORM.DIST', lognorm_dist).args([\n        [\n            'x',\n            'number++'\n        ],\n        [\n            'mean',\n            'number'\n        ],\n        [\n            'standard_dev',\n            'number++'\n        ],\n        [\n            'cumulative',\n            'logical'\n        ]\n    ]);\n    defineFunction('LOGNORM.INV', lognorm_inv).args([\n        [\n            'probability',\n            [\n                'and',\n                'number',\n                [\n                    '(between)',\n                    0,\n                    1\n                ]\n            ]\n        ],\n        [\n            'mean',\n            'number'\n        ],\n        [\n            'standard_dev',\n            'number++'\n        ]\n    ]);\n    defineFunction('PROB', prob).args([\n        [\n            'x_range',\n            [\n                'collect',\n                'number',\n                1\n            ]\n        ],\n        [\n            'prob_range',\n            [\n                'collect',\n                'number',\n                1\n            ]\n        ],\n        [\n            'lower_limit',\n            'number'\n        ],\n        [\n            'upper_limit',\n            [\n                'or',\n                'number',\n                [\n                    'null',\n                    '$lower_limit'\n                ]\n            ]\n        ],\n        [\n            '?',\n            [\n                'assert',\n                '$prob_range.length == $x_range.length',\n                'N/A'\n            ]\n        ]\n    ]);\n    defineFunction('SLOPE', slope).args([\n        [\n            'known_y',\n            [\n                'collect',\n                'number',\n                1\n            ]\n        ],\n        [\n            'known_x',\n            [\n                'collect',\n                'number',\n                1\n            ]\n        ],\n        [\n            '?',\n            [\n                'assert',\n                '$known_x.length == $known_y.length',\n                'N/A'\n            ]\n        ],\n        [\n            '?',\n            [\n                'assert',\n                '$known_x.length > 0 && $known_y.length > 0',\n                'N/A'\n            ]\n        ]\n    ]);\n    defineFunction('INTERCEPT', intercept).args([\n        [\n            'known_y',\n            [\n                'collect',\n                'number',\n                1\n            ]\n        ],\n        [\n            'known_x',\n            [\n                'collect',\n                'number',\n                1\n            ]\n        ],\n        [\n            '?',\n            [\n                'assert',\n                '$known_x.length == $known_y.length',\n                'N/A'\n            ]\n        ],\n        [\n            '?',\n            [\n                'assert',\n                '$known_x.length > 0 && $known_y.length > 0',\n                'N/A'\n            ]\n        ]\n    ]);\n    defineFunction('PEARSON', pearson).args([\n        [\n            'array1',\n            [\n                'collect',\n                'number',\n                1\n            ]\n        ],\n        [\n            'array2',\n            [\n                'collect',\n                'number',\n                1\n            ]\n        ],\n        [\n            '?',\n            [\n                'assert',\n                '$array2.length == $array1.length',\n                'N/A'\n            ]\n        ],\n        [\n            '?',\n            [\n                'assert',\n                '$array2.length > 0 && $array1.length > 0',\n                'N/A'\n            ]\n        ]\n    ]);\n    defineFunction('RSQ', rsq).args([\n        [\n            'known_y',\n            [\n                'collect',\n                'number',\n                1\n            ]\n        ],\n        [\n            'known_x',\n            [\n                'collect',\n                'number',\n                1\n            ]\n        ],\n        [\n            '?',\n            [\n                'assert',\n                '$known_x.length == $known_y.length',\n                'N/A'\n            ]\n        ],\n        [\n            '?',\n            [\n                'assert',\n                '$known_x.length > 0 && $known_y.length > 0',\n                'N/A'\n            ]\n        ],\n        [\n            '?',\n            [\n                'assert',\n                '$known_x.length != 1 && $known_y.length != 1',\n                'N/A'\n            ]\n        ]\n    ]);\n    defineFunction('STEYX', steyx).args([\n        [\n            'known_y',\n            [\n                'collect',\n                'number',\n                1\n            ]\n        ],\n        [\n            'known_x',\n            [\n                'collect',\n                'number',\n                1\n            ]\n        ],\n        [\n            '?',\n            [\n                'assert',\n                '$known_x.length == $known_y.length',\n                'N/A'\n            ]\n        ],\n        [\n            '?',\n            [\n                'assert',\n                '$known_x.length >= 3 && $known_y.length >= 3',\n                'DIV/0'\n            ]\n        ]\n    ]);\n    defineFunction('FORECAST', forecast).args([\n        [\n            'x',\n            'number'\n        ],\n        [\n            'known_y',\n            [\n                'collect',\n                'number',\n                1\n            ]\n        ],\n        [\n            'known_x',\n            [\n                'collect',\n                'number',\n                1\n            ]\n        ],\n        [\n            '?',\n            [\n                'assert',\n                '$known_x.length == $known_y.length',\n                'N/A'\n            ]\n        ],\n        [\n            '?',\n            [\n                'assert',\n                '$known_x.length > 0 && $known_y.length > 0',\n                'N/A'\n            ]\n        ]\n    ]);\n    defineFunction('LINEST', linest).args([\n        [\n            'known_y',\n            'matrix'\n        ],\n        [\n            'known_x',\n            [\n                'or',\n                'matrix',\n                'null'\n            ]\n        ],\n        [\n            'const',\n            [\n                'or',\n                'logical',\n                [\n                    'null',\n                    true\n                ]\n            ]\n        ],\n        [\n            'stats',\n            [\n                'or',\n                'logical',\n                [\n                    'null',\n                    false\n                ]\n            ]\n        ]\n    ]);\n    defineFunction('LOGEST', logest).args([\n        [\n            'known_y',\n            'matrix'\n        ],\n        [\n            'known_x',\n            [\n                'or',\n                'matrix',\n                'null'\n            ]\n        ],\n        [\n            'const',\n            [\n                'or',\n                'logical',\n                [\n                    'null',\n                    true\n                ]\n            ]\n        ],\n        [\n            'stats',\n            [\n                'or',\n                'logical',\n                [\n                    'null',\n                    false\n                ]\n            ]\n        ]\n    ]);\n    defineFunction('TREND', trend).args([\n        [\n            'known_y',\n            'matrix'\n        ],\n        [\n            'known_x',\n            [\n                'or',\n                'matrix',\n                'null'\n            ]\n        ],\n        [\n            'new_x',\n            [\n                'or',\n                'matrix',\n                'null'\n            ]\n        ],\n        [\n            'const',\n            [\n                'or',\n                'logical',\n                [\n                    'null',\n                    true\n                ]\n            ]\n        ]\n    ]);\n    defineFunction('GROWTH', growth).args([\n        [\n            'known_y',\n            'matrix'\n        ],\n        [\n            'known_x',\n            [\n                'or',\n                'matrix',\n                'null'\n            ]\n        ],\n        [\n            'new_x',\n            [\n                'or',\n                'matrix',\n                'null'\n            ]\n        ],\n        [\n            'const',\n            [\n                'or',\n                'logical',\n                [\n                    'null',\n                    true\n                ]\n            ]\n        ]\n    ]);\n    defineFunction('FV', FV).args([\n        [\n            'rate',\n            'number'\n        ],\n        [\n            'nper',\n            'number'\n        ],\n        [\n            'pmt',\n            [\n                'or',\n                'number',\n                [\n                    'null',\n                    0\n                ]\n            ]\n        ],\n        [\n            'pv',\n            [\n                'or',\n                'number',\n                [\n                    'null',\n                    0\n                ]\n            ]\n        ],\n        [\n            'type',\n            [\n                'or',\n                [\n                    'values',\n                    0,\n                    1\n                ],\n                [\n                    'null',\n                    0\n                ]\n            ]\n        ],\n        [\n            '?',\n            [\n                'assert',\n                '$pmt || $pv'\n            ]\n        ]\n    ]);\n    defineFunction('PV', PV).args([\n        [\n            'rate',\n            'number'\n        ],\n        [\n            'nper',\n            'number'\n        ],\n        [\n            'pmt',\n            [\n                'or',\n                'number',\n                [\n                    'null',\n                    0\n                ]\n            ]\n        ],\n        [\n            'fv',\n            [\n                'or',\n                'number',\n                [\n                    'null',\n                    0\n                ]\n            ]\n        ],\n        [\n            'type',\n            [\n                'or',\n                [\n                    'values',\n                    0,\n                    1\n                ],\n                [\n                    'null',\n                    0\n                ]\n            ]\n        ],\n        [\n            '?',\n            [\n                'assert',\n                '$pmt || $fv'\n            ]\n        ]\n    ]);\n    defineFunction('PMT', PMT).args([\n        [\n            'rate',\n            'number'\n        ],\n        [\n            'nper',\n            'number'\n        ],\n        [\n            'pmt',\n            'number'\n        ],\n        [\n            'fv',\n            [\n                'or',\n                'number',\n                [\n                    'null',\n                    0\n                ]\n            ]\n        ],\n        [\n            'type',\n            [\n                'or',\n                [\n                    'values',\n                    0,\n                    1\n                ],\n                [\n                    'null',\n                    0\n                ]\n            ]\n        ]\n    ]);\n    defineFunction('NPER', NPER).args([\n        [\n            'rate',\n            'number'\n        ],\n        [\n            'pmt',\n            'number'\n        ],\n        [\n            'pv',\n            'number'\n        ],\n        [\n            'fv',\n            [\n                'or',\n                'number',\n                [\n                    'null',\n                    0\n                ]\n            ]\n        ],\n        [\n            'type',\n            [\n                'or',\n                [\n                    'values',\n                    0,\n                    1\n                ],\n                [\n                    'null',\n                    0\n                ]\n            ]\n        ]\n    ]);\n    defineFunction('RATE', RATE).args([\n        [\n            'nper',\n            'number'\n        ],\n        [\n            'pmt',\n            [\n                'or',\n                'number',\n                [\n                    'null',\n                    0\n                ]\n            ]\n        ],\n        [\n            'pv',\n            'number'\n        ],\n        [\n            'fv',\n            [\n                'or',\n                'number',\n                [\n                    'null',\n                    0\n                ]\n            ]\n        ],\n        [\n            'type',\n            [\n                'or',\n                [\n                    'values',\n                    0,\n                    1\n                ],\n                [\n                    'null',\n                    0\n                ]\n            ]\n        ],\n        [\n            'guess',\n            [\n                'or',\n                'number++',\n                [\n                    'null',\n                    0.01\n                ]\n            ]\n        ],\n        [\n            '?',\n            [\n                'assert',\n                '$pmt || $fv'\n            ]\n        ]\n    ]);\n    defineFunction('IPMT', IPMT).args([\n        [\n            'rate',\n            'number'\n        ],\n        [\n            'per',\n            'number++'\n        ],\n        [\n            'nper',\n            'number++'\n        ],\n        [\n            'pv',\n            'number'\n        ],\n        [\n            'fv',\n            [\n                'or',\n                'number',\n                [\n                    'null',\n                    0\n                ]\n            ]\n        ],\n        [\n            'type',\n            [\n                'or',\n                [\n                    'values',\n                    0,\n                    1\n                ],\n                [\n                    'null',\n                    0\n                ]\n            ]\n        ],\n        [\n            '?',\n            [\n                'assert',\n                '$per >= 1 && $per <= $nper'\n            ]\n        ]\n    ]);\n    defineFunction('PPMT', PPMT).args([\n        [\n            'rate',\n            'number'\n        ],\n        [\n            'per',\n            'number++'\n        ],\n        [\n            'nper',\n            'number++'\n        ],\n        [\n            'pv',\n            'number'\n        ],\n        [\n            'fv',\n            [\n                'or',\n                'number',\n                [\n                    'null',\n                    0\n                ]\n            ]\n        ],\n        [\n            'type',\n            [\n                'or',\n                [\n                    'values',\n                    0,\n                    1\n                ],\n                [\n                    'null',\n                    0\n                ]\n            ]\n        ],\n        [\n            '?',\n            [\n                'assert',\n                '$per >= 1 && $per <= $nper'\n            ]\n        ]\n    ]);\n    defineFunction('CUMPRINC', CUMPRINC).args([\n        [\n            'rate',\n            'number++'\n        ],\n        [\n            'nper',\n            'number++'\n        ],\n        [\n            'pv',\n            'number++'\n        ],\n        [\n            'start_period',\n            'number++'\n        ],\n        [\n            'end_period',\n            'number++'\n        ],\n        [\n            'type',\n            [\n                'or',\n                [\n                    'values',\n                    0,\n                    1\n                ],\n                [\n                    'null',\n                    0\n                ]\n            ]\n        ],\n        [\n            '?',\n            [\n                'assert',\n                '$end_period >= $start_period',\n                'NUM'\n            ]\n        ]\n    ]);\n    defineFunction('CUMIPMT', CUMIPMT).args([\n        [\n            'rate',\n            'number++'\n        ],\n        [\n            'nper',\n            'number++'\n        ],\n        [\n            'pv',\n            'number++'\n        ],\n        [\n            'start_period',\n            'number++'\n        ],\n        [\n            'end_period',\n            'number++'\n        ],\n        [\n            'type',\n            [\n                'or',\n                [\n                    'values',\n                    0,\n                    1\n                ],\n                [\n                    'null',\n                    0\n                ]\n            ]\n        ],\n        [\n            '?',\n            [\n                'assert',\n                '$end_period >= $start_period',\n                'NUM'\n            ]\n        ]\n    ]);\n    defineFunction('NPV', NPV).args([\n        [\n            'rate',\n            'number'\n        ],\n        [\n            'values',\n            [\n                'collect',\n                'number'\n            ]\n        ],\n        [\n            '?',\n            [\n                'assert',\n                '$values.length > 0',\n                'N/A'\n            ]\n        ]\n    ]);\n    defineFunction('IRR', IRR).args([\n        [\n            'values',\n            [\n                'collect',\n                'number',\n                1\n            ]\n        ],\n        [\n            'guess',\n            [\n                'or',\n                'number',\n                [\n                    'null',\n                    0.1\n                ]\n            ]\n        ]\n    ]);\n    defineFunction('EFFECT', EFFECT).args([\n        [\n            'nominal_rate',\n            'number++'\n        ],\n        [\n            'npery',\n            'integer++'\n        ]\n    ]);\n    defineFunction('NOMINAL', NOMINAL).args([\n        [\n            'effect_rate',\n            'number++'\n        ],\n        [\n            'npery',\n            'integer++'\n        ]\n    ]);\n    defineFunction('XNPV', XNPV).args([\n        [\n            'rate',\n            'number'\n        ],\n        [\n            'values',\n            [\n                'collect',\n                'number',\n                1\n            ]\n        ],\n        [\n            'dates',\n            [\n                'collect',\n                'date',\n                1\n            ]\n        ],\n        [\n            '?',\n            [\n                'assert',\n                '$values.length == $dates.length',\n                'NUM'\n            ]\n        ]\n    ]);\n    defineFunction('XIRR', XIRR).args([\n        [\n            'values',\n            [\n                'collect',\n                'number',\n                1\n            ]\n        ],\n        [\n            'dates',\n            [\n                'collect',\n                'date',\n                1\n            ]\n        ],\n        [\n            'guess',\n            [\n                'or',\n                'number',\n                [\n                    'null',\n                    0.1\n                ]\n            ]\n        ],\n        [\n            '?',\n            [\n                'assert',\n                '$values.length == $dates.length',\n                'NUM'\n            ]\n        ]\n    ]);\n    defineFunction('ISPMT', ISPMT).args([\n        [\n            'rate',\n            'number'\n        ],\n        [\n            'per',\n            'number++'\n        ],\n        [\n            'nper',\n            'number++'\n        ],\n        [\n            'pv',\n            'number'\n        ],\n        [\n            '?',\n            [\n                'assert',\n                '$per >= 1 && $per <= $nper'\n            ]\n        ]\n    ]);\n    defineFunction('DB', DB).args([\n        [\n            'cost',\n            'number'\n        ],\n        [\n            'salvage',\n            'number'\n        ],\n        [\n            'life',\n            'number++'\n        ],\n        [\n            'period',\n            'number++'\n        ],\n        [\n            'month',\n            [\n                'or',\n                'number',\n                [\n                    'null',\n                    12\n                ]\n            ]\n        ]\n    ]);\n    defineFunction('DDB', DDB).args([\n        [\n            'cost',\n            'number'\n        ],\n        [\n            'salvage',\n            'number'\n        ],\n        [\n            'life',\n            'number++'\n        ],\n        [\n            'period',\n            'number++'\n        ],\n        [\n            'factor',\n            [\n                'or',\n                'number',\n                [\n                    'null',\n                    2\n                ]\n            ]\n        ]\n    ]);\n    defineFunction('SLN', SLN).args([\n        [\n            'cost',\n            'number'\n        ],\n        [\n            'salvage',\n            'number'\n        ],\n        [\n            'life',\n            'number++'\n        ]\n    ]);\n    defineFunction('SYD', SYD).args([\n        [\n            'cost',\n            'number'\n        ],\n        [\n            'salvage',\n            'number'\n        ],\n        [\n            'life',\n            'number++'\n        ],\n        [\n            'per',\n            'number++'\n        ]\n    ]);\n    defineFunction('VDB', VDB).args([\n        [\n            'cost',\n            'number+'\n        ],\n        [\n            'salvage',\n            'number+'\n        ],\n        [\n            'life',\n            'number++'\n        ],\n        [\n            'start_period',\n            'number+'\n        ],\n        [\n            'end_period',\n            'number+'\n        ],\n        [\n            'factor',\n            [\n                'or',\n                'number+',\n                [\n                    'null',\n                    2\n                ]\n            ]\n        ],\n        [\n            'no_switch',\n            [\n                'or',\n                'logical',\n                [\n                    'null',\n                    false\n                ]\n            ]\n        ],\n        [\n            '?',\n            [\n                'assert',\n                '$end_period >= $start_period',\n                'NUM'\n            ]\n        ]\n    ]);\n    var COUPS_ARGS = [\n        [\n            'settlement',\n            'date'\n        ],\n        [\n            'maturity',\n            'date'\n        ],\n        [\n            'frequency',\n            [\n                'and',\n                'integer',\n                [\n                    'values',\n                    1,\n                    2,\n                    4\n                ]\n            ]\n        ],\n        [\n            'basis',\n            [\n                'or',\n                [\n                    'null',\n                    0\n                ],\n                [\n                    'and',\n                    'integer',\n                    [\n                        'values',\n                        0,\n                        1,\n                        2,\n                        3,\n                        4\n                    ]\n                ]\n            ]\n        ],\n        [\n            '?',\n            [\n                'assert',\n                '$settlement < $maturity',\n                'NUM'\n            ]\n        ]\n    ];\n    defineFunction('COUPDAYBS', COUPDAYBS).args(COUPS_ARGS);\n    defineFunction('COUPDAYS', COUPDAYS).args(COUPS_ARGS);\n    defineFunction('COUPDAYSNC', COUPDAYSNC).args(COUPS_ARGS);\n    defineFunction('COUPPCD', COUPPCD).args(COUPS_ARGS);\n    defineFunction('COUPNCD', COUPNCD).args(COUPS_ARGS);\n    defineFunction('COUPNUM', COUPNUM).args(COUPS_ARGS);\n    defineFunction('ACCRINTM', ACCRINTM).args([\n        [\n            'issue',\n            'date'\n        ],\n        [\n            'settlement',\n            'date'\n        ],\n        [\n            'rate',\n            'number++'\n        ],\n        [\n            'par',\n            [\n                'or',\n                [\n                    'null',\n                    1000\n                ],\n                'number++'\n            ]\n        ],\n        [\n            'basis',\n            [\n                'or',\n                [\n                    'null',\n                    0\n                ],\n                [\n                    'and',\n                    'integer',\n                    [\n                        'values',\n                        0,\n                        1,\n                        2,\n                        3,\n                        4\n                    ]\n                ]\n            ]\n        ],\n        [\n            '?',\n            [\n                'assert',\n                '$issue < $settlement',\n                'NUM'\n            ]\n        ]\n    ]);\n    defineFunction('ACCRINT', ACCRINT).args([\n        [\n            'issue',\n            'date'\n        ],\n        [\n            'first_interest',\n            'date'\n        ],\n        [\n            'settlement',\n            'date'\n        ],\n        [\n            'rate',\n            'number++'\n        ],\n        [\n            'par',\n            [\n                'or',\n                [\n                    'null',\n                    1000\n                ],\n                'number++'\n            ]\n        ],\n        [\n            'frequency',\n            [\n                'and',\n                'integer',\n                [\n                    'values',\n                    1,\n                    2,\n                    4\n                ]\n            ]\n        ],\n        [\n            'basis',\n            [\n                'or',\n                [\n                    'null',\n                    0\n                ],\n                [\n                    'and',\n                    'integer',\n                    [\n                        'values',\n                        0,\n                        1,\n                        2,\n                        3,\n                        4\n                    ]\n                ]\n            ]\n        ],\n        [\n            'calc_method',\n            [\n                'or',\n                'logical',\n                [\n                    'null',\n                    true\n                ]\n            ]\n        ],\n        [\n            '?',\n            [\n                'assert',\n                '$issue < $settlement',\n                'NUM'\n            ]\n        ]\n    ]);\n    defineFunction('DISC', DISC).args([\n        [\n            'settlement',\n            'date'\n        ],\n        [\n            'maturity',\n            'date'\n        ],\n        [\n            'pr',\n            'number++'\n        ],\n        [\n            'redemption',\n            'number++'\n        ],\n        [\n            'basis',\n            [\n                'or',\n                [\n                    'null',\n                    0\n                ],\n                [\n                    'and',\n                    'integer',\n                    [\n                        'values',\n                        0,\n                        1,\n                        2,\n                        3,\n                        4\n                    ]\n                ]\n            ]\n        ],\n        [\n            '?',\n            [\n                'assert',\n                '$settlement < $maturity',\n                'NUM'\n            ]\n        ]\n    ]);\n    defineFunction('INTRATE', INTRATE).args([\n        [\n            'settlement',\n            'date'\n        ],\n        [\n            'maturity',\n            'date'\n        ],\n        [\n            'investment',\n            'number++'\n        ],\n        [\n            'redemption',\n            'number++'\n        ],\n        [\n            'basis',\n            [\n                'or',\n                [\n                    'null',\n                    0\n                ],\n                [\n                    'and',\n                    'integer',\n                    [\n                        'values',\n                        0,\n                        1,\n                        2,\n                        3,\n                        4\n                    ]\n                ]\n            ]\n        ],\n        [\n            '?',\n            [\n                'assert',\n                '$settlement < $maturity',\n                'NUM'\n            ]\n        ]\n    ]);\n    defineFunction('RECEIVED', RECEIVED).args([\n        [\n            'settlement',\n            'date'\n        ],\n        [\n            'maturity',\n            'date'\n        ],\n        [\n            'investment',\n            'number++'\n        ],\n        [\n            'discount',\n            'number++'\n        ],\n        [\n            'basis',\n            [\n                'or',\n                [\n                    'null',\n                    0\n                ],\n                [\n                    'and',\n                    'integer',\n                    [\n                        'values',\n                        0,\n                        1,\n                        2,\n                        3,\n                        4\n                    ]\n                ]\n            ]\n        ],\n        [\n            '?',\n            [\n                'assert',\n                '$settlement < $maturity',\n                'NUM'\n            ]\n        ]\n    ]);\n    defineFunction('PRICE', PRICE).args([\n        [\n            'settlement',\n            'date'\n        ],\n        [\n            'maturity',\n            'date'\n        ],\n        [\n            'rate',\n            'number++'\n        ],\n        [\n            'yld',\n            'number++'\n        ],\n        [\n            'redemption',\n            'number++'\n        ],\n        [\n            'frequency',\n            [\n                'and',\n                'integer',\n                [\n                    'values',\n                    1,\n                    2,\n                    4\n                ]\n            ]\n        ],\n        [\n            'basis',\n            [\n                'or',\n                [\n                    'null',\n                    0\n                ],\n                [\n                    'and',\n                    'integer',\n                    [\n                        'values',\n                        0,\n                        1,\n                        2,\n                        3,\n                        4\n                    ]\n                ]\n            ]\n        ],\n        [\n            '?',\n            [\n                'assert',\n                '$settlement < $maturity',\n                'NUM'\n            ]\n        ]\n    ]);\n    defineFunction('PRICEDISC', PRICEDISC).args([\n        [\n            'settlement',\n            'date'\n        ],\n        [\n            'maturity',\n            'date'\n        ],\n        [\n            'discount',\n            'number++'\n        ],\n        [\n            'redemption',\n            'number++'\n        ],\n        [\n            'basis',\n            [\n                'or',\n                [\n                    'null',\n                    0\n                ],\n                [\n                    'and',\n                    'integer',\n                    [\n                        'values',\n                        0,\n                        1,\n                        2,\n                        3,\n                        4\n                    ]\n                ]\n            ]\n        ],\n        [\n            '?',\n            [\n                'assert',\n                '$settlement < $maturity',\n                'NUM'\n            ]\n        ]\n    ]);\n    var MAX_IT = 300, EPS = 2.2204e-16, FP_MIN = 1e-30, f_abs = Math.abs;\n    function ERF(x) {\n        if (f_abs(x) >= 3.3) {\n            return 1 - ERFC(x);\n        }\n        var S = x > 0 ? 1 : -1;\n        if (S == -1) {\n            x = -x;\n        }\n        var m = 0, an = 1;\n        for (var n = 1; n < 100; n++) {\n            m += an;\n            an *= 2 * x * x / (2 * n + 1);\n        }\n        return S * 2 / Math.sqrt(Math.PI) * x * Math.exp(-x * x) * m;\n    }\n    function ERFC(x) {\n        if (f_abs(x) < 3.3) {\n            return 1 - ERF(x);\n        }\n        var s = 1;\n        if (x < 0) {\n            s = -1;\n            x = -x;\n        }\n        var frac = x;\n        for (var n = 8; n >= 1; n -= 0.5) {\n            frac = x + n / frac;\n        }\n        frac = 1 / (x + frac);\n        return s == 1 ? Math.exp(-x * x) / Math.sqrt(Math.PI) * frac : 2 - Math.exp(-x * x) / Math.sqrt(Math.PI) * frac;\n    }\n    function GAMMALN(x) {\n        var cof = [\n            1.000000000190015,\n            76.18009172947146,\n            -86.50532032941678,\n            24.01409824083091,\n            -1.231739572450155,\n            0.001208650973866179,\n            -0.000005395239384953\n        ];\n        var y = x, tmp = x + 5.5, ser = cof[0];\n        tmp -= (x + 0.5) * Math.log(tmp);\n        for (var j = 1; j <= 6; j++) {\n            y += 1;\n            ser += cof[j] / y;\n        }\n        return -tmp + Math.log(Math.sqrt(2 * Math.PI) * ser / x);\n    }\n    function GAMMA(x) {\n        if (x > 0) {\n            return Math.exp(GAMMALN(x));\n        }\n        var pi = Math.PI, y = -x;\n        return -pi / (y * GAMMA(y) * Math.sin(pi * y));\n    }\n    function BETALN(a, b) {\n        return GAMMALN(a) + GAMMALN(b) - GAMMALN(a + b);\n    }\n    function BETA(a, b) {\n        return Math.exp(BETALN(a, b));\n    }\n    function gamma_inc(a, x) {\n        return x < a + 1 ? g_series(a, x) : 1 - g_contfrac(a, x);\n    }\n    function g_series(a, x) {\n        var sum = 1 / a, frac = sum, ap = a;\n        var gln = GAMMALN(a), n;\n        for (n = 1; n <= MAX_IT; n++) {\n            ap++;\n            frac *= x / ap;\n            sum += frac;\n            if (f_abs(frac) < f_abs(sum) * EPS) {\n                break;\n            }\n        }\n        return sum * Math.exp(-x + a * Math.log(x) - gln);\n    }\n    function g_contfrac(a, x) {\n        var f = FP_MIN, c = f, d = 0, aj = 1, bj = x + 1 - a;\n        var gln = GAMMALN(a);\n        for (var i = 1; i <= MAX_IT; i++) {\n            d = bj + aj * d;\n            if (f_abs(d) < FP_MIN) {\n                d = FP_MIN;\n            }\n            c = bj + aj / c;\n            if (f_abs(c) < FP_MIN) {\n                c = FP_MIN;\n            }\n            d = 1 / d;\n            var delta = c * d;\n            f *= delta;\n            if (f_abs(delta - 1) < EPS) {\n                break;\n            }\n            bj += 2;\n            aj = -i * (i - a);\n        }\n        return f * Math.exp(-x - gln + a * Math.log(x));\n    }\n    function GAMMA_DIST(x, a, b, cumulative) {\n        if (!cumulative) {\n            return Math.pow(x / b, a - 1) * Math.exp(-x / b) / (b * GAMMA(a));\n        }\n        return gamma_inc(a, x / b);\n    }\n    function GAMMA_INV(p, a, b) {\n        if (p === 0) {\n            return 0;\n        }\n        if (p == 1) {\n            return Infinity;\n        }\n        var m = 0, M = 10, x = 0, ab = a * b;\n        if (ab > 1) {\n            M *= ab;\n        }\n        for (var i = 0; i < MAX_IT; i++) {\n            x = 0.5 * (m + M);\n            var q = GAMMA_DIST(x, a, b, true);\n            if (f_abs(p - q) < 1e-16) {\n                break;\n            }\n            if (q > p) {\n                M = x;\n            } else {\n                m = x;\n            }\n        }\n        return x;\n    }\n    function NORM_S_DIST(x, cumulative) {\n        if (!cumulative) {\n            return Math.exp(-x * x / 2) / Math.sqrt(2 * Math.PI);\n        }\n        return 0.5 + 0.5 * ERF(x / Math.sqrt(2));\n    }\n    function NORM_S_INV(p) {\n        var a = [\n                -39.69683028665376,\n                220.9460984245205,\n                -275.9285104469687,\n                138.357751867269,\n                -30.66479806614716,\n                2.506628277459239\n            ], b = [\n                -54.47609879822406,\n                161.5858368580409,\n                -155.6989798598866,\n                66.80131188771972,\n                -13.28068155288572\n            ], c = [\n                -0.007784894002430293,\n                -0.3223964580411365,\n                -2.400758277161838,\n                -2.549732539343734,\n                4.374664141464968,\n                2.938163982698783\n            ], d = [\n                0.007784695709041462,\n                0.3224671290700398,\n                2.445134137142996,\n                3.754408661907416\n            ];\n        var plow = 0.02425, phigh = 1 - plow;\n        var q, r;\n        if (p < plow) {\n            q = Math.sqrt(-2 * Math.log(p));\n            return (((((c[0] * q + c[1]) * q + c[2]) * q + c[3]) * q + c[4]) * q + c[5]) / ((((d[0] * q + d[1]) * q + d[2]) * q + d[3]) * q + 1);\n        }\n        if (phigh < p) {\n            q = Math.sqrt(-2 * Math.log(1 - p));\n            return -(((((c[0] * q + c[1]) * q + c[2]) * q + c[3]) * q + c[4]) * q + c[5]) / ((((d[0] * q + d[1]) * q + d[2]) * q + d[3]) * q + 1);\n        }\n        q = p - 0.5;\n        r = q * q;\n        return (((((a[0] * r + a[1]) * r + a[2]) * r + a[3]) * r + a[4]) * r + a[5]) * q / (((((b[0] * r + b[1]) * r + b[2]) * r + b[3]) * r + b[4]) * r + 1);\n    }\n    function NORM_DIST(x, m, s, cumulative) {\n        if (!cumulative) {\n            return Math.exp(-(x - m) * (x - m) / (2 * s * s)) / (s * Math.sqrt(2 * Math.PI));\n        }\n        return NORM_S_DIST((x - m) / s, true);\n    }\n    function NORM_INV(p, m, s) {\n        return m + s * NORM_S_INV(p);\n    }\n    function betastd_pdf(x, a, b) {\n        return Math.exp((a - 1) * Math.log(x) + (b - 1) * Math.log(1 - x) - BETALN(a, b));\n    }\n    function betastd_cdf(x, a, b) {\n        var k = Math.exp(a * Math.log(x) + b * Math.log(1 - x) - BETALN(a, b));\n        return x < (a + 1) / (a + b + 2) ? k * beta_lentz(a, b, x) / a : 1 - k * beta_lentz(b, a, 1 - x) / b;\n    }\n    function beta_lentz(a, b, x) {\n        var m, m2;\n        var aa, c, d, del, h, qab, qam, qap;\n        qab = a + b;\n        qap = a + 1;\n        qam = a - 1;\n        c = 1;\n        d = 1 - qab * x / qap;\n        if (f_abs(d) < FP_MIN) {\n            d = FP_MIN;\n        }\n        d = 1 / d;\n        h = d;\n        for (m = 1; m <= MAX_IT; m++) {\n            m2 = 2 * m;\n            aa = m * (b - m) * x / ((qam + m2) * (a + m2));\n            d = 1 + aa * d;\n            if (f_abs(d) < FP_MIN) {\n                d = FP_MIN;\n            }\n            c = 1 + aa / c;\n            if (f_abs(c) < FP_MIN) {\n                c = FP_MIN;\n            }\n            d = 1 / d;\n            h *= d * c;\n            aa = -(a + m) * (qab + m) * x / ((a + m2) * (qap + m2));\n            d = 1 + aa * d;\n            if (f_abs(d) < FP_MIN) {\n                d = FP_MIN;\n            }\n            c = 1 + aa / c;\n            if (f_abs(c) < FP_MIN) {\n                c = FP_MIN;\n            }\n            d = 1 / d;\n            del = d * c;\n            h *= del;\n            if (f_abs(del - 1) < EPS) {\n                break;\n            }\n        }\n        return h;\n    }\n    function betastd_inv(p, a, b) {\n        var m = 0, M = 1, x = 0;\n        for (var i = 0; i < MAX_IT; i++) {\n            x = 0.5 * (m + M);\n            var q = betastd_cdf(x, a, b);\n            if (f_abs(p - q) < EPS) {\n                break;\n            }\n            if (q > p) {\n                M = x;\n            } else {\n                m = x;\n            }\n        }\n        return x;\n    }\n    function BETADIST(x, a, b, m, M) {\n        return betastd_cdf((x - m) / (M - m), a, b);\n    }\n    function BETA_DIST(x, a, b, cdf, m, M) {\n        if (cdf) {\n            return betastd_cdf((x - m) / (M - m), a, b);\n        }\n        return betastd_pdf((x - m) / (M - m), a, b) / (M - m);\n    }\n    function BETA_INV(p, a, b, m, M) {\n        return m + (M - m) * betastd_inv(p, a, b);\n    }\n    function chisq_left(x, n, cds) {\n        return GAMMA_DIST(x, n / 2, 2, cds);\n    }\n    function chisq_right(x, n) {\n        return 1 - chisq_left(x, n, true);\n    }\n    function chisq_left_inv(p, n) {\n        return GAMMA_INV(p, n / 2, 2);\n    }\n    function chisq_right_inv(p, n) {\n        return chisq_left_inv(1 - p, n);\n    }\n    function chisq_test(obsv, expect) {\n        var rows = obsv.length, cols = obsv[0].length;\n        var x = 0, i, j;\n        for (i = 0; i < rows; i++) {\n            for (j = 0; j < cols; j++) {\n                var eij = expect[i][j];\n                var delta = obsv[i][j] - eij;\n                delta *= delta;\n                x += delta / eij;\n            }\n        }\n        var n = (rows - 1) * (cols - 1);\n        return chisq_right(x, n);\n    }\n    function expon(x, r, cdf) {\n        if (cdf) {\n            return 1 - Math.exp(-r * x);\n        }\n        return r * Math.exp(-r * x);\n    }\n    function poisson(k, m, cdf) {\n        if (cdf) {\n            return 1 - chisq_left(2 * m, 2 * (k + 1), true);\n        }\n        var lnf = 0;\n        for (var i = 2; i <= k; i++) {\n            lnf += Math.log(i);\n        }\n        return Math.exp(k * Math.log(m) - m - lnf);\n    }\n    function Fdist(x, n, d, cdf) {\n        if (cdf) {\n            return betastd_cdf(n * x / (d + n * x), n / 2, d / 2);\n        }\n        var u = n / d;\n        n /= 2;\n        d /= 2;\n        return u / BETA(n, d) * Math.pow(u * x, n - 1) / Math.pow(1 + u * x, n + d);\n    }\n    function Fdist_right(x, n, d) {\n        return 1 - Fdist(x, n, d, true);\n    }\n    function Finv_right(p, n, d) {\n        return d / n * (1 / BETA_INV(p, d / 2, n / 2, 0, 1) - 1);\n    }\n    function Finv(p, n, d) {\n        return d / n * (1 / BETA_INV(1 - p, d / 2, n / 2, 0, 1) - 1);\n    }\n    function _mean(arr) {\n        var me = 0, n = arr.length;\n        for (var i = 0; i < n; i++) {\n            me += arr[i];\n        }\n        return me / n;\n    }\n    function _var_sq(arr, m) {\n        var v = 0, n = arr.length;\n        for (var i = 0; i < n; i++) {\n            var delta = arr[i] - m;\n            v += delta * delta;\n        }\n        return v / (n - 1);\n    }\n    function Ftest(arr1, arr2) {\n        var n1 = arr1.length - 1, n2 = arr2.length - 1;\n        var va1 = _var_sq(arr1, _mean(arr1)), va2 = _var_sq(arr2, _mean(arr2));\n        if (!va1 || !va2) {\n            throw new CalcError('DIV/0');\n        }\n        return 2 * Fdist(va1 / va2, n1, n2, true);\n    }\n    function fisher(x) {\n        return 0.5 * Math.log((1 + x) / (1 - x));\n    }\n    function fisherinv(x) {\n        var e2 = Math.exp(2 * x);\n        return (e2 - 1) / (e2 + 1);\n    }\n    function Tdist(x, n, cdf) {\n        if (cdf) {\n            return 1 - 0.5 * betastd_cdf(n / (x * x + n), n / 2, 0.5);\n        }\n        return 1 / (Math.sqrt(n) * BETA(0.5, n / 2)) * Math.pow(1 + x * x / n, -(n + 1) / 2);\n    }\n    function Tdist_right(x, n) {\n        return 1 - Tdist(x, n, true);\n    }\n    function Tdist_2tail(x, n) {\n        if (x < 0) {\n            x = -x;\n        }\n        return 2 * Tdist_right(x, n);\n    }\n    function Tdist_inv(p, n) {\n        var x = betastd_inv(2 * Math.min(p, 1 - p), n / 2, 0.5);\n        x = Math.sqrt(n * (1 - x) / x);\n        return p > 0.5 ? x : -x;\n    }\n    function Tdist_2tail_inv(p, n) {\n        return Tdist_inv(1 - p / 2, n);\n    }\n    function Tdist_test(gr1, gr2, tail, type) {\n        var n1 = gr1.length, n2 = gr2.length;\n        var t_st, df;\n        if (type == 1) {\n            var d = 0, d2 = 0;\n            for (var i = 0; i < n1; i++) {\n                var delta = gr1[i] - gr2[i];\n                d += delta;\n                d2 += delta * delta;\n            }\n            var md = d / n1;\n            t_st = md / Math.sqrt((d2 - d * md) / (n1 * (n1 - 1)));\n            return tail == 1 ? Tdist_right(t_st, n1 - 1) : Tdist_2tail(t_st, n1 - 1);\n        }\n        var m1 = _mean(gr1), m2 = _mean(gr2), v1 = _var_sq(gr1, m1), v2 = _var_sq(gr2, m2);\n        if (type == 3) {\n            var u1 = v1 / n1, u2 = v2 / n2, u = u1 + u2;\n            var q1 = u1 / u, q2 = u2 / u;\n            df = 1 / (q1 * q1 / (n1 - 1) + q2 * q2 / (n2 - 1));\n            t_st = f_abs(m1 - m2) / Math.sqrt(u);\n            return tail == 1 ? Tdist_right(t_st, df) : Tdist_2tail(t_st, df);\n        } else {\n            df = n1 + n2 - 2;\n            t_st = f_abs(m1 - m2) * Math.sqrt(df * n1 * n2 / ((n1 + n2) * ((n1 - 1) * v1 + (n2 - 1) * v2)));\n            return tail == 1 ? Tdist_right(t_st, df) : Tdist_2tail(t_st, df);\n        }\n    }\n    function confidence_t(alpha, stddev, size) {\n        return -Tdist_inv(alpha / 2, size - 1) * stddev / Math.sqrt(size);\n    }\n    function confidence_norm(alpha, stddev, size) {\n        return -NORM_S_INV(alpha / 2) * stddev / Math.sqrt(size);\n    }\n    function gauss(z) {\n        return NORM_S_DIST(z, true) - 0.5;\n    }\n    function phi(x) {\n        return NORM_S_DIST(x);\n    }\n    function lognorm_dist(x, m, s, cumulative) {\n        if (cumulative) {\n            return 0.5 + 0.5 * ERF((Math.log(x) - m) / (s * Math.sqrt(2)));\n        }\n        var t = Math.log(x) - m;\n        return Math.exp(-t * t / (2 * s * s)) / (x * s * Math.sqrt(2 * Math.PI));\n    }\n    function lognorm_inv(p, m, s) {\n        return Math.exp(NORM_INV(p, m, s));\n    }\n    function prob(x_, p_, lw, up) {\n        var n = x_.length;\n        var s = 0, i;\n        for (i = 0; i < n; i++) {\n            if (p_[i] <= 0 || p_[i] > 1) {\n                throw new CalcError('NUM');\n            }\n            s += p_[i];\n        }\n        if (s != 1) {\n            throw new CalcError('NUM');\n        }\n        var res = 0;\n        for (i = 0; i < n; i++) {\n            var x = x_[i];\n            if (x >= lw && x <= up) {\n                res += p_[i];\n            }\n        }\n        return res;\n    }\n    function slope(y_, x_) {\n        var mx = _mean(x_), my = _mean(y_), b1 = 0, b2 = 0;\n        for (var i = 0, n = y_.length; i < n; i++) {\n            var t = x_[i] - mx;\n            b1 += t * (y_[i] - my);\n            b2 += t * t;\n        }\n        return b1 / b2;\n    }\n    function intercept(y_, x_) {\n        var mx = _mean(x_), my = _mean(y_);\n        var b1 = 0, b2 = 0;\n        for (var i = 0, n = y_.length; i < n; i++) {\n            var t = x_[i] - mx;\n            b1 += t * (y_[i] - my);\n            b2 += t * t;\n        }\n        return my - b1 * mx / b2;\n    }\n    function pearson(x_, y_) {\n        var mx = _mean(x_), my = _mean(y_);\n        var s1 = 0, s2 = 0, s3 = 0;\n        for (var i = 0, n = x_.length; i < n; i++) {\n            var t1 = x_[i] - mx, t2 = y_[i] - my;\n            s1 += t1 * t2;\n            s2 += t1 * t1;\n            s3 += t2 * t2;\n        }\n        return s1 / Math.sqrt(s2 * s3);\n    }\n    function rsq(x_, y_) {\n        var r = pearson(x_, y_);\n        return r * r;\n    }\n    function steyx(y_, x_) {\n        var n = x_.length;\n        var mx = _mean(x_), my = _mean(y_);\n        var s1 = 0, s2 = 0, s3 = 0;\n        for (var i = 0; i < n; i++) {\n            var t1 = x_[i] - mx, t2 = y_[i] - my;\n            s1 += t2 * t2;\n            s2 += t1 * t2;\n            s3 += t1 * t1;\n        }\n        return Math.sqrt((s1 - s2 * s2 / s3) / (n - 2));\n    }\n    function forecast(x, y_, x_) {\n        var mx = _mean(x_), my = _mean(y_);\n        var s1 = 0, s2 = 0;\n        for (var i = 0, n = x_.length; i < n; i++) {\n            var t1 = x_[i] - mx, t2 = y_[i] - my;\n            s1 += t1 * t2;\n            s2 += t1 * t1;\n        }\n        if (s2 === 0) {\n            throw new CalcError('N/A');\n        }\n        var b = s1 / s2, a = my - b * mx;\n        return a + b * x;\n    }\n    function _mat_mean(Mat) {\n        var n = Mat.height, sum = 0;\n        for (var i = 0; i < n; i++) {\n            sum += Mat.data[i][0];\n        }\n        return sum / n;\n    }\n    function _mat_devsq(Mat, mean) {\n        var n = Mat.height, sq = 0;\n        for (var i = 0; i < n; i++) {\n            var x = Mat.data[i][0] - mean;\n            sq += x * x;\n        }\n        return sq;\n    }\n    function linest(Y, X, konst, stats) {\n        var i = 0;\n        if (!X) {\n            X = Y.map(function () {\n                return ++i;\n            });\n        }\n        if (konst) {\n            X = X.clone();\n            X.eachRow(function (row) {\n                X.data[row].unshift(1);\n            });\n            ++X.width;\n        }\n        var Xt = X.transpose();\n        var B = Xt.multiply(X).inverse().multiply(Xt).multiply(Y);\n        var line_1 = [];\n        for (i = B.height - 1; i >= 0; i--) {\n            line_1.push(B.data[i][0]);\n        }\n        if (!konst) {\n            line_1.push(0);\n        }\n        if (!stats) {\n            return this.asMatrix([line_1]);\n        }\n        var Y1 = X.multiply(B);\n        var y_y1 = Y.adds(Y1, true);\n        var mp = !konst ? 0 : _mat_mean(Y1);\n        var SSreg = _mat_devsq(Y1, mp);\n        var me = !konst ? 0 : _mat_mean(y_y1);\n        var SSresid = _mat_devsq(y_y1, me);\n        var line_5 = [];\n        line_5.push(SSreg, SSresid);\n        var R2 = SSreg / (SSreg + SSresid);\n        var degfre = Y.height - X.width;\n        var err_est = Math.sqrt(SSresid / degfre);\n        var line_3 = [];\n        line_3.push(R2, err_est);\n        var F_sta = !konst ? R2 / X.width / ((1 - R2) / degfre) : SSreg / (X.width - 1) / (SSresid / degfre);\n        var line_4 = [];\n        line_4.push(F_sta, degfre);\n        var SCP = Xt.multiply(X).inverse();\n        var line_2 = [];\n        for (i = SCP.height - 1; i >= 0; i--) {\n            line_2.push(Math.sqrt(SCP.data[i][i] * SSresid / degfre));\n        }\n        return this.asMatrix([\n            line_1,\n            line_2,\n            line_3,\n            line_4,\n            line_5\n        ]);\n    }\n    function logest(Y, X, konst, stats) {\n        return linest.call(this, Y.map(Math.log), X, konst, stats).map(Math.exp);\n    }\n    function trend(Y, X, W, konst) {\n        var i = 0;\n        if (!X) {\n            X = Y.map(function () {\n                return ++i;\n            });\n        }\n        if (konst) {\n            X = X.clone();\n            X.eachRow(function (row) {\n                X.data[row].unshift(1);\n            });\n            ++X.width;\n        }\n        var Xt = X.transpose();\n        var B = Xt.multiply(X).inverse().multiply(Xt).multiply(Y);\n        if (!W) {\n            W = X;\n        } else {\n            if (konst) {\n                W = W.clone();\n                W.eachRow(function (row) {\n                    W.data[row].unshift(1);\n                });\n                ++W.width;\n            }\n        }\n        return W.multiply(B);\n    }\n    function growth(Y, X, new_X, konst) {\n        return trend.call(this, Y.map(Math.log), X, new_X, konst).map(Math.exp);\n    }\n    function root_newton(func, guess, max_it, eps) {\n        var MAX_IT = max_it || 20, EPS = eps || 1e-7;\n        var root = guess;\n        for (var j = 1; j <= MAX_IT; j++) {\n            var f_d = func(root), f = f_d[0], df = f_d[1];\n            var dx = f / df;\n            root -= dx;\n            if (Math.abs(dx) < EPS) {\n                return root;\n            }\n        }\n        return new CalcError('NUM');\n    }\n    function FV(rate, nper, pmt, pv, type) {\n        var h1 = Math.pow(1 + rate, nper);\n        var h2 = rate ? (h1 - 1) / rate : nper;\n        return -(pv * h1 + pmt * h2 * (1 + rate * type));\n    }\n    function PV(rate, nper, pmt, fv, type) {\n        if (!rate) {\n            return -fv - pmt * nper;\n        }\n        var h1 = Math.pow(1 + rate, nper);\n        return -(fv + pmt * (h1 - 1) / rate * (1 + rate * type)) / h1;\n    }\n    function PMT(rate, nper, pv, fv, type) {\n        if (!rate) {\n            return -(fv + pv) / nper;\n        }\n        var h1 = Math.pow(1 + rate, nper);\n        return -rate * (fv + pv * h1) / ((1 + rate * type) * (h1 - 1));\n    }\n    function NPER(rate, pmt, pv, fv, type) {\n        if (!rate) {\n            return -(fv + pv) / pmt;\n        }\n        var h1 = pmt * (1 + rate * type);\n        return Math.log((h1 - fv * rate) / (h1 + pv * rate)) / Math.log(1 + rate);\n    }\n    function RATE(nper, pmt, pv, fv, type, guess) {\n        function xfd(x) {\n            var h2 = Math.pow(1 + x, nper - 1), h1 = h2 * (1 + x);\n            return [\n                pv * h1 + pmt * (1 / x + type) * (h1 - 1) + fv,\n                nper * pv * h2 + pmt * (-(h1 - 1) / (x * x) + (1 / x + type) * nper * h2)\n            ];\n        }\n        return root_newton(xfd, guess);\n    }\n    function IPMT(rate, per, nper, pv, fv, type) {\n        if (type == 1 && per == 1) {\n            return 0;\n        }\n        var pmt = PMT(rate, nper, pv, fv, type);\n        var ipmt = FV(rate, per - 1, pmt, pv, type) * rate;\n        return type ? ipmt / (1 + rate) : ipmt;\n    }\n    function PPMT(rate, per, nper, pv, fv, type) {\n        var pmt = PMT(rate, nper, pv, fv, type);\n        return pmt - IPMT(rate, per, nper, pv, fv, type);\n    }\n    function CUMPRINC(rate, nper, pv, start, end, type) {\n        if (type == 1) {\n            start--;\n            end--;\n        }\n        var tn = Math.pow(1 + rate, nper), ts = Math.pow(1 + rate, start - 1), te = Math.pow(1 + rate, end);\n        var monthlyPayment = rate * pv * tn / (tn - 1);\n        var remainingBalanceAtStart = ts * pv - (ts - 1) / rate * monthlyPayment;\n        var remainingBalanceAtEnd = te * pv - (te - 1) / rate * monthlyPayment;\n        return remainingBalanceAtEnd - remainingBalanceAtStart;\n    }\n    function CUMIPMT(rate, nper, pv, start, end, type) {\n        var cip = 0;\n        for (var i = start; i <= end; i++) {\n            cip += IPMT(rate, i, nper, pv, 0, type);\n        }\n        return cip;\n    }\n    function NPV(rate, flows) {\n        var npv = 0;\n        for (var i = 0, n = flows.length; i < n; i++) {\n            npv += flows[i] * Math.pow(1 + rate, -i - 1);\n        }\n        return npv;\n    }\n    function IRR(flows, guess) {\n        function xfd(x) {\n            var npv = 0, npv1 = 0;\n            for (var j = 0, n = flows.length; j < n; j++) {\n                npv += flows[j] * Math.pow(1 + x, -j - 1);\n                npv1 += -j * flows[j] * Math.pow(1 + x, -j - 2);\n            }\n            return [\n                npv,\n                npv1\n            ];\n        }\n        return root_newton(xfd, guess);\n    }\n    function EFFECT(nominal_rate, npery) {\n        return Math.pow(1 + nominal_rate / npery, npery) - 1;\n    }\n    function NOMINAL(effect_rate, npery) {\n        return npery * (Math.pow(effect_rate + 1, 1 / npery) - 1);\n    }\n    function XNPV(rate, values, dates) {\n        var npv = 0;\n        for (var i = 0, n = values.length; i < n; i++) {\n            npv += values[i] * Math.pow(1 + rate, (dates[0] - dates[i]) / 365);\n        }\n        return npv;\n    }\n    function XIRR(values, dates, guess) {\n        function xfd(x) {\n            var npv = values[0], npv1 = 0;\n            for (var j = 1, n = values.length; j < n; j++) {\n                var delta = (dates[0] - dates[j]) / 365;\n                npv += values[j] * Math.pow(1 + x, delta);\n                npv1 += delta * values[j] * Math.pow(1 + x, delta - 1);\n            }\n            return [\n                npv,\n                npv1\n            ];\n        }\n        return root_newton(xfd, guess);\n    }\n    function ISPMT(rate, per, nper, pv) {\n        var tmp = -pv * rate;\n        return tmp * (1 - per / nper);\n    }\n    function DB(cost, salvage, life, period, month) {\n        var rate = 1 - Math.pow(salvage / cost, 1 / life);\n        rate = Math.floor(rate * 1000 + 0.5) / 1000;\n        var db = cost * rate * month / 12;\n        if (period == 1) {\n            return db;\n        }\n        for (var i = 1; i < life; i++) {\n            if (i == period - 1) {\n                return (cost - db) * rate;\n            }\n            db += (cost - db) * rate;\n        }\n        return (cost - db) * rate * (12 - month) / 12;\n    }\n    function DDB(cost, salvage, life, period, factor) {\n        var f = factor / life;\n        var prior = -cost * (Math.pow(1 - f, period - 1) - 1);\n        var dep = (cost - prior) * f;\n        dep = Math.min(dep, Math.max(0, cost - prior - salvage));\n        return dep;\n    }\n    function SLN(cost, salvage, life) {\n        return (cost - salvage) / life;\n    }\n    function SYD(cost, salvage, life, per) {\n        return (cost - salvage) * (life - per + 1) * 2 / (life * (life + 1));\n    }\n    function VDB(cost, salvage, life, start, end, factor, no_switch) {\n        var interest = factor >= life ? 1 : factor / life;\n        function _getGDA(value, period) {\n            var gda, oldValue, newValue;\n            if (interest == 1) {\n                oldValue = period == 1 ? value : 0;\n            } else {\n                oldValue = value * Math.pow(1 - interest, period - 1);\n            }\n            newValue = value * Math.pow(1 - interest, period);\n            gda = newValue < salvage ? oldValue - salvage : oldValue - newValue;\n            return gda < 0 ? 0 : gda;\n        }\n        function _interVDB(cost, life1, period) {\n            var remValue = cost - salvage;\n            var intEnd = Math.ceil(period);\n            var term, lia = 0, vdb = 0, nowLia = false;\n            for (var i = 1; i <= intEnd; i++) {\n                if (!nowLia) {\n                    var gda = _getGDA(cost, i);\n                    lia = remValue / (life1 - i + 1);\n                    if (lia > gda) {\n                        term = lia;\n                        nowLia = true;\n                    } else {\n                        term = gda;\n                        remValue -= gda;\n                    }\n                } else {\n                    term = lia;\n                }\n                if (i == intEnd) {\n                    term *= period + 1 - intEnd;\n                }\n                vdb += term;\n            }\n            return vdb;\n        }\n        var intStart = Math.floor(start), intEnd = Math.ceil(end);\n        var vdb = 0;\n        if (no_switch) {\n            for (var i = intStart + 1; i <= intEnd; i++) {\n                var term = _getGDA(cost, i);\n                if (i == intStart + 1) {\n                    term *= Math.min(end, intStart + 1) - start;\n                } else {\n                    if (i == intEnd) {\n                        term *= end + 1 - intEnd;\n                    }\n                }\n                vdb += term;\n            }\n        } else {\n            var life1 = life;\n            if (start != Math.floor(start)) {\n                if (factor > 1) {\n                    if (start >= life / 2) {\n                        var part = start - life / 2;\n                        start = life / 2;\n                        end -= part;\n                        life1 += 1;\n                    }\n                }\n            }\n            cost -= _interVDB(cost, life1, start);\n            vdb = _interVDB(cost, life - start, end - start);\n        }\n        return vdb;\n    }\n    function _edate(base, months) {\n        var d = unpackDate(base);\n        var m = d.month + months;\n        var y = d.year + Math.floor(m / 12);\n        m %= 12;\n        if (m < 0) {\n            m += 12;\n        }\n        d = Math.min(d.date, daysInMonth(y, m));\n        return packDate(y, m, d);\n    }\n    function _daysBetween(from, to, basis) {\n        if (basis == 1 || basis == 2 || basis == 3) {\n            return to - from;\n        }\n        return _days_360(from, to, basis);\n    }\n    function _borderCoupons(settlement, maturity, freq) {\n        var sett = unpackDate(settlement), base = unpackDate(maturity);\n        var periods = base.year - sett.year;\n        if (periods > 0) {\n            periods = (periods - 1) * freq;\n        }\n        var prev, next, months = 12 / freq;\n        do {\n            periods++;\n            prev = _edate(maturity, -periods * months);\n        } while (settlement < prev);\n        periods--;\n        next = _edate(maturity, -periods * months);\n        return [\n            prev,\n            next\n        ];\n    }\n    function _borderCoupons_fw(first, settlement, freq) {\n        var sett = unpackDate(settlement), base = unpackDate(first);\n        var periods = sett.year - base.year;\n        if (periods > 0) {\n            periods = (periods - 1) * freq;\n        }\n        var prev = first, next, months = 12 / freq;\n        while (settlement > prev) {\n            next = prev;\n            periods++;\n            prev = _edate(first, periods * months);\n        }\n        return [\n            next,\n            prev\n        ];\n    }\n    function COUPDAYBS(settlement, maturity, frequency, basis) {\n        var prev = _borderCoupons(settlement, maturity, frequency)[0];\n        return _daysBetween(prev, settlement, basis);\n    }\n    function COUPDAYS(settl, matur, freq, basis) {\n        if (basis == 1) {\n            var borders = _borderCoupons(settl, matur, freq);\n            return _daysBetween(borders[0], borders[1], 1);\n        }\n        if (basis == 3) {\n            return 365 / freq;\n        }\n        return 360 / freq;\n    }\n    function COUPDAYSNC(settl, matur, freq, basis) {\n        var next = _borderCoupons(settl, matur, freq)[1];\n        return _daysBetween(settl, next, basis);\n    }\n    function COUPPCD(settl, matur, freq) {\n        return _borderCoupons(settl, matur, freq)[0];\n    }\n    function COUPNCD(settl, matur, freq) {\n        return _borderCoupons(settl, matur, freq)[1];\n    }\n    function COUPNUM(settl, matur, freq) {\n        var sett = unpackDate(settl), mat = unpackDate(matur);\n        var months = 12 * (mat.year - sett.year) + mat.month - sett.month;\n        return 1 + (months * freq / 12 | 0);\n    }\n    function daysInYear(yr, basis) {\n        if (basis == 3) {\n            return 365;\n        }\n        if (basis == 1) {\n            return isLeapYear(yr) ? 366 : 365;\n        }\n        return 360;\n    }\n    function ACCRINTM(issue, maturity, rate, par, basis) {\n        var year_days = daysInYear(unpackDate(maturity).year, basis);\n        return rate * par * _daysBetween(issue, maturity, basis) / year_days;\n    }\n    function ACCRINT(issue, first, settl, rate, par, freq, basis, calc) {\n        var accr = 0, cost = par * rate / freq;\n        var brace, prev, next, prev1, next1, nrc;\n        var annual = basis % 2 === 0 ? 360 : 365;\n        function _numCoupons(from, to) {\n            return (to - from) * freq / annual | 0;\n        }\n        if (settl <= first) {\n            brace = _borderCoupons(settl, first, freq);\n            prev = brace[0];\n            next = brace[1];\n            if (prev <= issue) {\n                return cost * _daysBetween(issue, settl, basis) / _daysBetween(prev, next, basis);\n            }\n            brace = _borderCoupons(issue, prev, freq);\n            prev1 = brace[0];\n            next1 = brace[1];\n            nrc = _numCoupons(next1, settl);\n            return cost * (nrc + _daysBetween(issue, next1, basis) / _daysBetween(prev1, next1, basis) + (settl < next ? _daysBetween(prev, settl, basis) / _daysBetween(prev, next, basis) : 0));\n        } else {\n            brace = _borderCoupons_fw(first, settl, freq);\n            prev = brace[0];\n            next = brace[1];\n            nrc = _numCoupons(first, settl);\n            if (next == settl) {\n                accr = cost * nrc;\n            } else {\n                accr = cost * (nrc + _daysBetween(prev, settl, basis) / _daysBetween(prev, next, basis));\n            }\n            if (!calc) {\n                return accr;\n            }\n            brace = _borderCoupons(issue, first, freq);\n            prev = brace[0];\n            next = brace[1];\n            nrc = _numCoupons(issue, first);\n            accr += cost * (nrc + _daysBetween(issue, next, basis) / _daysBetween(prev, next, basis));\n            return accr;\n        }\n    }\n    function DISC(settl, matur, pr, redemption, basis) {\n        var annual = basis % 2 === 0 ? 360 : isLeapYear(unpackDate(settl).year) ? 366 : 365;\n        return (redemption - pr) / redemption * annual / _daysBetween(settl, matur, basis);\n    }\n    function INTRATE(settl, matur, investment, redemption, basis) {\n        var annual = basis % 2 === 0 ? 360 : isLeapYear(unpackDate(settl).year) ? 366 : 365;\n        return (redemption - investment) / investment * annual / _daysBetween(settl, matur, basis);\n    }\n    function RECEIVED(settl, matur, investment, discount, basis) {\n        var annual = basis % 2 === 0 ? 360 : isLeapYear(unpackDate(settl).year) ? 366 : 365;\n        return investment / (1 - discount * _daysBetween(settl, matur, basis) / annual);\n    }\n    function PRICE(settl, matur, rate, yld, redemption, freq, basis) {\n        var N = 1 + ((matur - settl) * freq / (basis % 2 === 0 ? 360 : 365) | 0);\n        var brace = _borderCoupons(settl, matur, freq), prev = brace[0], next = brace[1];\n        var beg_settl = _daysBetween(prev, settl, basis), settl_end = _daysBetween(settl, next, basis), beg_end = _daysBetween(prev, next, basis);\n        var den = 100 * rate / freq, yf = yld / freq, frac = settl_end / beg_end;\n        if (N == 1) {\n            return (redemption + den) / (1 + frac * yf) - beg_settl / beg_end * den;\n        }\n        return redemption / Math.pow(1 + yf, N - 1 + frac) + den * Math.pow(1 + yf, 1 - N - frac) * (Math.pow(1 + yf, N) - 1) / yf - beg_settl / beg_end * den;\n    }\n    function PRICEDISC(settl, matur, discount, redemption, basis) {\n        var dsm = _daysBetween(settl, matur, basis), dy = daysInYear(unpackDate(matur).year, basis);\n        return redemption - discount * redemption * dsm / dy;\n    }\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('spreadsheet/borderpalette', [\n        'kendo.core',\n        'kendo.colorpicker',\n        'kendo.popup'\n    ], f);\n}(function () {\n    (function (kendo) {\n        if (kendo.support.browser.msie && kendo.support.browser.version < 9) {\n            return;\n        }\n        var $ = kendo.jQuery;\n        var BORDER_TYPES = [\n            'allBorders',\n            'insideBorders',\n            'insideHorizontalBorders',\n            'insideVerticalBorders',\n            'outsideBorders',\n            'leftBorder',\n            'topBorder',\n            'rightBorder',\n            'bottomBorder',\n            'noBorders'\n        ];\n        var BORDER_PALETTE_MESSAGES = kendo.spreadsheet.messages.borderPalette = {\n            allBorders: 'All borders',\n            insideBorders: 'Inside borders',\n            insideHorizontalBorders: 'Inside horizontal borders',\n            insideVerticalBorders: 'Inside vertical borders',\n            outsideBorders: 'Outside borders',\n            leftBorder: 'Left border',\n            topBorder: 'Top border',\n            rightBorder: 'Right border',\n            bottomBorder: 'Bottom border',\n            noBorders: 'No border',\n            reset: 'Reset color',\n            customColor: 'Custom color...',\n            apply: 'Apply',\n            cancel: 'Cancel'\n        };\n        function withPreventDefault(f) {\n            return function (e) {\n                e.preventDefault();\n                return f.apply(this, arguments);\n            };\n        }\n        var ColorChooser = kendo.ui.Widget.extend({\n            init: function (element, options) {\n                kendo.ui.Widget.call(this, element, options);\n                this.element = element;\n                this.color = options.color;\n                this._resetButton();\n                this._colorPalette();\n                this._customColorPalette();\n                this._customColorButton();\n                this.resetButton.on('click', withPreventDefault(this.resetColor.bind(this)));\n                this.customColorButton.on('click', withPreventDefault(this.customColor.bind(this)));\n            },\n            options: { name: 'ColorChooser' },\n            events: ['change'],\n            destroy: function () {\n                kendo.unbind(this.dialog.element.find('.k-action-buttons'));\n                this.dialog.destroy();\n                this.colorPalette.destroy();\n                this.resetButton.off('click');\n                this.customColorButton.off('click');\n            },\n            value: function (value) {\n                if (value !== undefined) {\n                    this.color = value;\n                    this.customColorButton.find('.k-icon').css('background-color', this.color);\n                    this.colorPalette.value(null);\n                    this.flatColorPicker.value(this.color);\n                } else {\n                    return this.color;\n                }\n            },\n            _change: function (value) {\n                this.color = value;\n                this.trigger('change', { value: value });\n            },\n            _colorPalette: function () {\n                var element = $('<div />', { 'class': 'k-spreadsheet-color-palette' });\n                var colorPalette = this.colorPalette = $('<div />').kendoColorPalette({\n                    palette: [\n                        '#ffffff',\n                        '#000000',\n                        '#d6ecff',\n                        '#4e5b6f',\n                        '#7fd13b',\n                        '#ea157a',\n                        '#feb80a',\n                        '#00addc',\n                        '#738ac8',\n                        '#1ab39f',\n                        '#f2f2f2',\n                        '#7f7f7f',\n                        '#a7d6ff',\n                        '#d9dde4',\n                        '#e5f5d7',\n                        '#fad0e4',\n                        '#fef0cd',\n                        '#c5f2ff',\n                        '#e2e7f4',\n                        '#c9f7f1',\n                        '#d8d8d8',\n                        '#595959',\n                        '#60b5ff',\n                        '#b3bcca',\n                        '#cbecb0',\n                        '#f6a1c9',\n                        '#fee29c',\n                        '#8be6ff',\n                        '#c7d0e9',\n                        '#94efe3',\n                        '#bfbfbf',\n                        '#3f3f3f',\n                        '#007dea',\n                        '#8d9baf',\n                        '#b2e389',\n                        '#f272af',\n                        '#fed46b',\n                        '#51d9ff',\n                        '#aab8de',\n                        '#5fe7d5',\n                        '#a5a5a5',\n                        '#262626',\n                        '#003e75',\n                        '#3a4453',\n                        '#5ea226',\n                        '#af0f5b',\n                        '#c58c00',\n                        '#0081a5',\n                        '#425ea9',\n                        '#138677',\n                        '#7f7f7f',\n                        '#0c0c0c',\n                        '#00192e',\n                        '#272d37',\n                        '#3f6c19',\n                        '#750a3d',\n                        '#835d00',\n                        '#00566e',\n                        '#2c3f71',\n                        '#0c594f'\n                    ],\n                    value: this.color,\n                    change: function (e) {\n                        this.customColorButton.find('.k-icon').css('background-color', 'transparent');\n                        this.flatColorPicker.value(null);\n                        this._change(e.value);\n                    }.bind(this)\n                }).data('kendoColorPalette');\n                element.append(colorPalette.wrapper).appendTo(this.element);\n            },\n            _customColorPalette: function () {\n                var element = $('<div />', {\n                    'class': 'k-spreadsheet-window',\n                    'html': '<div></div>' + '<div class=\\'k-action-buttons\\'>' + '<button class=\\'k-button k-primary\\' data-bind=\\'click: apply\\'>' + BORDER_PALETTE_MESSAGES.apply + '</button>' + '<button class=\\'k-button\\' data-bind=\\'click: close\\'>' + BORDER_PALETTE_MESSAGES.cancel + '</button>' + '</div>'\n                });\n                var dialog = this.dialog = element.appendTo(document.body).kendoWindow({\n                    animation: false,\n                    scrollable: false,\n                    resizable: false,\n                    maximizable: false,\n                    modal: true,\n                    visible: false,\n                    width: 268,\n                    open: function () {\n                        this.center();\n                    }\n                }).data('kendoWindow');\n                dialog.one('activate', function () {\n                    this.element.find('[data-role=flatcolorpicker]').data('kendoFlatColorPicker')._hueSlider.resize();\n                });\n                var flatColorPicker = this.flatColorPicker = dialog.element.children().first().kendoFlatColorPicker().data('kendoFlatColorPicker');\n                var viewModel = kendo.observable({\n                    apply: function () {\n                        this.customColorButton.find('.k-icon').css('background-color', flatColorPicker.value());\n                        this.colorPalette.value(null);\n                        this._change(flatColorPicker.value());\n                        dialog.close();\n                    }.bind(this),\n                    close: function () {\n                        flatColorPicker.value(null);\n                        dialog.close();\n                    }\n                });\n                kendo.bind(dialog.element.find('.k-action-buttons'), viewModel);\n            },\n            _resetButton: function () {\n                this.resetButton = $('<a class=\\'k-button k-reset-color\\' href=\\'#\\'>' + '<span class=\\'k-icon k-i-reset-color\\'></span>' + BORDER_PALETTE_MESSAGES.reset + '</a>').appendTo(this.element);\n            },\n            _customColorButton: function () {\n                this.customColorButton = $('<a class=\\'k-button k-custom-color\\' href=\\'#\\'>' + '<span class=\\'k-icon\\'></span>' + BORDER_PALETTE_MESSAGES.customColor + '</a>').appendTo(this.element);\n            },\n            resetColor: function () {\n                this.colorPalette.value(null);\n                this.flatColorPicker.value(null);\n                this._change(null);\n            },\n            customColor: function () {\n                this.dialog.open();\n            }\n        });\n        var BorderPalette = kendo.ui.Widget.extend({\n            init: function (element, options) {\n                kendo.ui.Widget.call(this, element, options);\n                this.element = element;\n                this.color = '#000';\n                this.element.addClass('k-spreadsheet-border-palette');\n                this._borderTypePalette();\n                this._borderColorPalette();\n                this.element.on('click', '.k-spreadsheet-border-type-palette .k-button', withPreventDefault(this._click.bind(this)));\n            },\n            options: { name: 'BorderPalette' },\n            events: ['change'],\n            destroy: function () {\n                this.colorChooser.destroy();\n                this.element.off('click');\n            },\n            _borderTypePalette: function () {\n                var messages = BORDER_PALETTE_MESSAGES;\n                var buttons = BORDER_TYPES.map(function (type) {\n                    return '<a title=\"' + messages[type] + '\" aria-label=\"' + messages[type] + '\" href=\"#\" data-border-type=\"' + type + '\" class=\"k-button k-button-icon\">' + '<span class=\"k-icon k-i-' + kendo.toHyphens(type) + '\"></span>' + '</a>';\n                }).join('');\n                var element = $('<div />', {\n                    'class': 'k-spreadsheet-border-type-palette',\n                    'html': buttons\n                });\n                element.appendTo(this.element);\n            },\n            _borderColorPalette: function () {\n                var element = $('<div />', { 'class': 'k-spreadsheet-border-color-palette' });\n                element.appendTo(this.element);\n                this.colorChooser = new ColorChooser(element, {\n                    color: this.color,\n                    change: this._colorChange.bind(this)\n                });\n            },\n            _click: function (e) {\n                this.type = $(e.currentTarget).data('borderType');\n                this.trigger('change', {\n                    type: this.type,\n                    color: this.color\n                });\n            },\n            _colorChange: function (e) {\n                this.color = e.value;\n                if (this.type) {\n                    this.trigger('change', {\n                        type: this.type,\n                        color: this.color\n                    });\n                }\n            }\n        });\n        kendo.spreadsheet.ColorChooser = ColorChooser;\n        kendo.spreadsheet.BorderPalette = BorderPalette;\n    }(window.kendo));\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('spreadsheet/toolbar', [\n        'kendo.toolbar',\n        'kendo.colorpicker',\n        'kendo.combobox',\n        'kendo.dropdownlist',\n        'kendo.popup',\n        'spreadsheet/borderpalette'\n    ], f);\n}(function () {\n    (function (kendo) {\n        if (kendo.support.browser.msie && kendo.support.browser.version < 9) {\n            return;\n        }\n        var $ = kendo.jQuery;\n        var ToolBar = kendo.ui.ToolBar;\n        var MESSAGES = kendo.spreadsheet.messages.toolbar = {\n            addColumnLeft: 'Add column left',\n            addColumnRight: 'Add column right',\n            addRowAbove: 'Add row above',\n            addRowBelow: 'Add row below',\n            alignment: 'Alignment',\n            alignmentButtons: {\n                justtifyLeft: 'Align left',\n                justifyCenter: 'Center',\n                justifyRight: 'Align right',\n                justifyFull: 'Justify',\n                alignTop: 'Align top',\n                alignMiddle: 'Align middle',\n                alignBottom: 'Align bottom'\n            },\n            backgroundColor: 'Background',\n            bold: 'Bold',\n            borders: 'Borders',\n            colorPicker: {\n                reset: 'Reset color',\n                customColor: 'Custom color...'\n            },\n            copy: 'Copy',\n            cut: 'Cut',\n            deleteColumn: 'Delete column',\n            deleteRow: 'Delete row',\n            filter: 'Filter',\n            fontFamily: 'Font',\n            fontSize: 'Font size',\n            format: 'Custom format...',\n            formatTypes: {\n                automatic: 'Automatic',\n                number: 'Number',\n                percent: 'Percent',\n                financial: 'Financial',\n                currency: 'Currency',\n                date: 'Date',\n                time: 'Time',\n                dateTime: 'Date time',\n                duration: 'Duration',\n                moreFormats: 'More formats...'\n            },\n            formatDecreaseDecimal: 'Decrease decimal',\n            formatIncreaseDecimal: 'Increase decimal',\n            freeze: 'Freeze panes',\n            freezeButtons: {\n                freezePanes: 'Freeze panes',\n                freezeRows: 'Freeze rows',\n                freezeColumns: 'Freeze columns',\n                unfreeze: 'Unfreeze panes'\n            },\n            italic: 'Italic',\n            merge: 'Merge cells',\n            mergeButtons: {\n                mergeCells: 'Merge all',\n                mergeHorizontally: 'Merge horizontally',\n                mergeVertically: 'Merge vertically',\n                unmerge: 'Unmerge'\n            },\n            open: 'Open...',\n            paste: 'Paste',\n            quickAccess: {\n                redo: 'Redo',\n                undo: 'Undo'\n            },\n            exportAs: 'Export...',\n            toggleGridlines: 'Toggle gridlines',\n            sort: 'Sort',\n            sortAsc: 'Sort ascending',\n            sortDesc: 'Sort descending',\n            sortButtons: {\n                sortSheetAsc: 'Sort sheet A to Z',\n                sortSheetDesc: 'Sort sheet Z to A',\n                sortRangeAsc: 'Sort range A to Z',\n                sortRangeDesc: 'Sort range Z to A'\n            },\n            textColor: 'Text Color',\n            textWrap: 'Wrap text',\n            underline: 'Underline',\n            validation: 'Data validation...',\n            hyperlink: 'Link'\n        };\n        var defaultTools = {\n            home: [\n                'open',\n                'exportAs',\n                [\n                    'cut',\n                    'copy',\n                    'paste'\n                ],\n                [\n                    'bold',\n                    'italic',\n                    'underline'\n                ],\n                'hyperlink',\n                'backgroundColor',\n                'textColor',\n                'borders',\n                'fontSize',\n                'fontFamily',\n                'alignment',\n                'textWrap',\n                [\n                    'formatDecreaseDecimal',\n                    'formatIncreaseDecimal'\n                ],\n                'format',\n                'merge',\n                'freeze',\n                'filter',\n                'toggleGridlines'\n            ],\n            insert: [\n                [\n                    'addColumnLeft',\n                    'addColumnRight',\n                    'addRowBelow',\n                    'addRowAbove'\n                ],\n                [\n                    'deleteColumn',\n                    'deleteRow'\n                ]\n            ],\n            data: [\n                'sort',\n                'filter',\n                'validation'\n            ]\n        };\n        var toolDefaults = {\n            open: {\n                type: 'open',\n                overflow: 'never',\n                iconClass: 'file-excel'\n            },\n            exportAs: {\n                type: 'exportAsDialog',\n                dialogName: 'exportAs',\n                overflow: 'never',\n                text: '',\n                iconClass: 'file-excel'\n            },\n            bold: {\n                type: 'button',\n                command: 'PropertyChangeCommand',\n                property: 'bold',\n                value: true,\n                iconClass: 'bold',\n                togglable: true\n            },\n            italic: {\n                type: 'button',\n                command: 'PropertyChangeCommand',\n                property: 'italic',\n                value: true,\n                iconClass: 'italic',\n                togglable: true\n            },\n            underline: {\n                type: 'button',\n                command: 'PropertyChangeCommand',\n                property: 'underline',\n                value: true,\n                iconClass: 'underline',\n                togglable: true\n            },\n            formatDecreaseDecimal: {\n                type: 'button',\n                command: 'AdjustDecimalsCommand',\n                value: -1,\n                iconClass: 'decimal-decrease'\n            },\n            formatIncreaseDecimal: {\n                type: 'button',\n                command: 'AdjustDecimalsCommand',\n                value: +1,\n                iconClass: 'decimal-increase'\n            },\n            textWrap: {\n                type: 'button',\n                command: 'TextWrapCommand',\n                property: 'wrap',\n                value: true,\n                iconClass: 'text-wrap',\n                togglable: true\n            },\n            cut: {\n                type: 'button',\n                command: 'ToolbarCutCommand',\n                iconClass: 'cut'\n            },\n            copy: {\n                type: 'button',\n                command: 'ToolbarCopyCommand',\n                iconClass: 'copy'\n            },\n            paste: {\n                type: 'button',\n                command: 'ToolbarPasteCommand',\n                iconClass: 'paste'\n            },\n            separator: { type: 'separator' },\n            alignment: {\n                type: 'alignment',\n                iconClass: 'align-left'\n            },\n            backgroundColor: {\n                type: 'colorPicker',\n                property: 'background',\n                iconClass: 'paint'\n            },\n            textColor: {\n                type: 'colorPicker',\n                property: 'color',\n                iconClass: 'foreground-color'\n            },\n            fontFamily: {\n                type: 'fontFamily',\n                property: 'fontFamily',\n                iconClass: 'font-family'\n            },\n            fontSize: {\n                type: 'fontSize',\n                property: 'fontSize',\n                iconClass: 'font-size'\n            },\n            format: {\n                type: 'format',\n                property: 'format',\n                iconClass: 'custom-format'\n            },\n            filter: {\n                type: 'filter',\n                property: 'hasFilter',\n                iconClass: 'filter'\n            },\n            merge: {\n                type: 'merge',\n                iconClass: 'cells-merge'\n            },\n            freeze: {\n                type: 'freeze',\n                iconClass: 'pane-freeze'\n            },\n            borders: {\n                type: 'borders',\n                iconClass: 'borders-all'\n            },\n            formatCells: {\n                type: 'dialog',\n                dialogName: 'formatCells',\n                overflow: 'never'\n            },\n            hyperlink: {\n                type: 'dialog',\n                dialogName: 'hyperlink',\n                iconClass: 'link-horizontal',\n                overflow: 'never',\n                text: ''\n            },\n            toggleGridlines: {\n                type: 'button',\n                command: 'GridLinesChangeCommand',\n                property: 'gridLines',\n                value: true,\n                iconClass: 'border-no',\n                togglable: true\n            },\n            addColumnLeft: {\n                type: 'button',\n                command: 'AddColumnCommand',\n                value: 'left',\n                iconClass: 'table-column-insert-left'\n            },\n            addColumnRight: {\n                type: 'button',\n                command: 'AddColumnCommand',\n                value: 'right',\n                iconClass: 'table-column-insert-right'\n            },\n            addRowBelow: {\n                type: 'button',\n                command: 'AddRowCommand',\n                value: 'below',\n                iconClass: 'table-row-insert-below'\n            },\n            addRowAbove: {\n                type: 'button',\n                command: 'AddRowCommand',\n                value: 'above',\n                iconClass: 'table-row-insert-above'\n            },\n            deleteColumn: {\n                type: 'button',\n                command: 'DeleteColumnCommand',\n                iconClass: 'table-column-delete'\n            },\n            deleteRow: {\n                type: 'button',\n                command: 'DeleteRowCommand',\n                iconClass: 'table-row-delete'\n            },\n            sort: {\n                type: 'sort',\n                iconClass: 'sort-desc'\n            },\n            validation: {\n                type: 'dialog',\n                dialogName: 'validation',\n                iconClass: 'exception',\n                overflow: 'never'\n            }\n        };\n        var SpreadsheetToolBar = ToolBar.extend({\n            init: function (element, options) {\n                options.items = this._expandTools(options.tools || SpreadsheetToolBar.prototype.options.tools[options.toolbarName]);\n                ToolBar.fn.init.call(this, element, options);\n                var handleClick = this._click.bind(this);\n                this.element.addClass('k-spreadsheet-toolbar');\n                this._addSeparators(this.element);\n                this.bind({\n                    click: handleClick,\n                    toggle: handleClick\n                });\n            },\n            _addSeparators: function (element) {\n                var groups = element.children('.k-widget, a.k-button, .k-button-group');\n                groups.before('<span class=\\'k-separator\\' />');\n            },\n            _expandTools: function (tools) {\n                function expandTool(toolName) {\n                    var options = $.isPlainObject(toolName) ? toolName : toolDefaults[toolName] || {};\n                    var spriteCssClass = 'k-icon k-i-' + options.iconClass;\n                    var type = options.type;\n                    var typeDefaults = {\n                        button: { showText: 'overflow' },\n                        colorPicker: {\n                            toolIcon: spriteCssClass,\n                            spriteCssClass: spriteCssClass\n                        },\n                        borders: { spriteCssClass: spriteCssClass },\n                        alignment: { spriteCssClass: spriteCssClass },\n                        merge: { spriteCssClass: spriteCssClass },\n                        freeze: { spriteCssClass: spriteCssClass }\n                    };\n                    var tool = $.extend({\n                        name: options.name || toolName,\n                        text: MESSAGES[options.name || toolName],\n                        icon: options.iconClass,\n                        attributes: {\n                            title: MESSAGES[options.name || toolName],\n                            'aria-label': MESSAGES[options.name || toolName]\n                        }\n                    }, typeDefaults[type], options);\n                    if (type == 'splitButton') {\n                        tool.menuButtons = tool.menuButtons.map(expandTool);\n                    }\n                    tool.attributes['data-tool'] = toolName;\n                    if (options.property) {\n                        tool.attributes['data-property'] = options.property;\n                    }\n                    return tool;\n                }\n                return tools.reduce(function (tools, tool) {\n                    if ($.isArray(tool)) {\n                        tools.push({\n                            type: 'buttonGroup',\n                            buttons: tool.map(expandTool)\n                        });\n                    } else {\n                        tools.push(expandTool.call(this, tool));\n                    }\n                    return tools;\n                }, []);\n            },\n            _click: function (e) {\n                var toolName = e.target.attr('data-tool');\n                var tool = toolDefaults[toolName] || {};\n                var commandType = tool.command;\n                if (!commandType) {\n                    return;\n                }\n                var args = {\n                    command: commandType,\n                    options: {\n                        property: tool.property || null,\n                        value: tool.value || null\n                    }\n                };\n                if (typeof args.options.value === 'boolean') {\n                    args.options.value = e.checked ? true : null;\n                }\n                this.action(args);\n            },\n            events: [\n                'click',\n                'toggle',\n                'open',\n                'close',\n                'overflowOpen',\n                'overflowClose',\n                'action',\n                'dialog'\n            ],\n            options: {\n                name: 'SpreadsheetToolBar',\n                resizable: true,\n                tools: defaultTools\n            },\n            action: function (args) {\n                this.trigger('action', args);\n            },\n            dialog: function (args) {\n                this.trigger('dialog', args);\n            },\n            refresh: function (activeCell) {\n                var range = activeCell;\n                var tools = this._tools();\n                function setToggle(tool, value) {\n                    var toolbar = tool.toolbar;\n                    var overflow = tool.overflow;\n                    var togglable = toolbar && toolbar.options.togglable || overflow && overflow.options.togglable;\n                    if (!togglable) {\n                        return;\n                    }\n                    var toggle = false;\n                    if (typeof value === 'boolean') {\n                        toggle = value;\n                    } else if (typeof value === 'string') {\n                        toggle = toolbar.options.value === value;\n                    }\n                    toolbar.toggle(toggle);\n                    if (overflow) {\n                        overflow.toggle(toggle);\n                    }\n                }\n                function update(tool, value) {\n                    var toolbar = tool.toolbar;\n                    var overflow = tool.overflow;\n                    if (toolbar && toolbar.update) {\n                        toolbar.update(value);\n                    }\n                    if (overflow && overflow.update) {\n                        overflow.update(value);\n                    }\n                }\n                for (var i = 0; i < tools.length; i++) {\n                    var property = tools[i].property;\n                    var tool = tools[i].tool;\n                    var value = kendo.isFunction(range[property]) ? range[property]() : range;\n                    if (property == 'gridLines') {\n                        value = range.sheet().showGridLines();\n                    }\n                    if (tool.type === 'button') {\n                        setToggle(tool, value);\n                    } else {\n                        update(tool, value);\n                    }\n                }\n                this.resize();\n            },\n            _tools: function () {\n                return this.element.find('[data-property]').toArray().map(function (element) {\n                    element = $(element);\n                    return {\n                        property: element.attr('data-property'),\n                        tool: this._getItem(element)\n                    };\n                }.bind(this));\n            },\n            destroy: function () {\n                this.element.find('[data-command],.k-button').each(function () {\n                    var element = $(this);\n                    var instance = element.data('instance');\n                    if (instance && instance.destroy) {\n                        instance.destroy();\n                    }\n                });\n                ToolBar.fn.destroy.call(this);\n            }\n        });\n        kendo.spreadsheet.ToolBar = SpreadsheetToolBar;\n        var DropDownTool = kendo.toolbar.Item.extend({\n            init: function (options, toolbar) {\n                var dropDownList = $('<select />').attr('title', options.attributes.title).attr('aria-label', options.attributes.title).kendoDropDownList({ height: 'auto' }).data('kendoDropDownList');\n                this.dropDownList = dropDownList;\n                this.element = dropDownList.wrapper;\n                this.options = options;\n                this.toolbar = toolbar;\n                this.attributes();\n                this.addUidAttr();\n                this.addOverflowAttr();\n                dropDownList.bind('open', this._open.bind(this));\n                dropDownList.bind('change', this._change.bind(this));\n                this.element.width(options.width).attr({\n                    'data-command': 'PropertyChangeCommand',\n                    'data-property': options.property\n                });\n            },\n            _open: function () {\n                var ddl = this.dropDownList;\n                var list = ddl.list;\n                var listWidth;\n                list.css({\n                    whiteSpace: 'nowrap',\n                    width: 'auto'\n                });\n                listWidth = list.width();\n                if (listWidth) {\n                    listWidth += 20;\n                } else {\n                    listWidth = ddl._listWidth;\n                }\n                list.css('width', listWidth + kendo.support.scrollbar());\n                ddl._listWidth = listWidth;\n            },\n            _change: function (e) {\n                var instance = e.sender;\n                var value = instance.value();\n                var dataItem = instance.dataItem();\n                var popupName = dataItem ? dataItem.popup : undefined;\n                if (popupName) {\n                    this.toolbar.dialog({ name: popupName });\n                } else {\n                    this.toolbar.action({\n                        command: 'PropertyChangeCommand',\n                        options: {\n                            property: this.options.property,\n                            value: value == 'null' ? null : value\n                        }\n                    });\n                }\n            },\n            value: function (value) {\n                if (value !== undefined) {\n                    this.dropDownList.value(value);\n                } else {\n                    return this.dropDownList.value();\n                }\n            }\n        });\n        var PopupTool = kendo.toolbar.Item.extend({\n            init: function (options, toolbar) {\n                this.element = $('<a href=\\'#\\' class=\\'k-button k-button-icon\\'>' + '<span class=\\'' + options.spriteCssClass + '\\'>' + '</span><span class=\\'k-icon k-i-arrow-60-down\\'></span>' + '</a>');\n                this.element.on('click touchend', this.open.bind(this)).attr('data-command', options.command);\n                this.options = options;\n                this.toolbar = toolbar;\n                this.attributes();\n                this.addUidAttr();\n                this.addOverflowAttr();\n                this._popup();\n            },\n            destroy: function () {\n                this.popup.destroy();\n            },\n            open: function (ev) {\n                ev.preventDefault();\n                this.popup.toggle();\n            },\n            _popup: function () {\n                var element = this.element;\n                this.popup = $('<div class=\\'k-spreadsheet-popup\\' />').appendTo(element).kendoPopup({ anchor: element }).data('kendoPopup');\n            }\n        });\n        kendo.toolbar.registerComponent('dialog', kendo.toolbar.ToolBarButton.extend({\n            init: function (options, toolbar) {\n                kendo.toolbar.ToolBarButton.fn.init.call(this, options, toolbar);\n                this._dialogName = options.dialogName;\n                this.element.bind('click touchend', this.open.bind(this)).data('instance', this);\n            },\n            open: function () {\n                this.toolbar.dialog({ name: this._dialogName });\n            }\n        }));\n        kendo.toolbar.registerComponent('exportAsDialog', kendo.toolbar.Item.extend({\n            init: function (options, toolbar) {\n                this._dialogName = options.dialogName;\n                this.toolbar = toolbar;\n                this._title = options.attributes.title;\n                this.element = $('<button class=\\'k-button k-button-icon\\'>' + '<span class=\\'k-icon k-i-download\\' />' + '</button>').attr('title', this._title).attr('aria-label', this._title).data('instance', this);\n                this.element.bind('click', this.open.bind(this)).data('instance', this);\n            },\n            open: function () {\n                this.toolbar.dialog({ name: this._dialogName });\n            }\n        }));\n        var OverflowDialogButton = kendo.toolbar.OverflowButton.extend({\n            init: function (options, toolbar) {\n                kendo.toolbar.OverflowButton.fn.init.call(this, options, toolbar);\n                this.element.on('click touchend', this._click.bind(this));\n                this.message = this.options.text;\n                var instance = this.element.data('button');\n                this.element.data(this.options.type, instance);\n            },\n            _click: $.noop\n        });\n        var ColorPicker = PopupTool.extend({\n            init: function (options, toolbar) {\n                PopupTool.fn.init.call(this, options, toolbar);\n                this.popup.element.addClass('k-spreadsheet-colorpicker');\n                this.colorChooser = new kendo.spreadsheet.ColorChooser(this.popup.element, { change: this._colorChange.bind(this) });\n                this.element.attr({ 'data-property': options.property });\n                this.element.data({\n                    type: 'colorPicker',\n                    colorPicker: this,\n                    instance: this\n                });\n            },\n            destroy: function () {\n                this.colorChooser.destroy();\n                PopupTool.fn.destroy.call(this);\n            },\n            update: function (value) {\n                this.value(value);\n            },\n            value: function (value) {\n                this.colorChooser.value(value);\n            },\n            _colorChange: function (e) {\n                this.toolbar.action({\n                    command: 'PropertyChangeCommand',\n                    options: {\n                        property: this.options.property,\n                        value: e.sender.value()\n                    }\n                });\n                this.popup.close();\n            }\n        });\n        var ColorPickerButton = OverflowDialogButton.extend({\n            init: function (options, toolbar) {\n                options.iconName = 'text';\n                OverflowDialogButton.fn.init.call(this, options, toolbar);\n            },\n            _click: function () {\n                this.toolbar.dialog({\n                    name: 'colorPicker',\n                    options: {\n                        title: this.options.property,\n                        property: this.options.property\n                    }\n                });\n            }\n        });\n        kendo.toolbar.registerComponent('colorPicker', ColorPicker, ColorPickerButton);\n        var FONT_SIZES = [\n            8,\n            9,\n            10,\n            11,\n            12,\n            13,\n            14,\n            16,\n            18,\n            20,\n            22,\n            24,\n            26,\n            28,\n            36,\n            48,\n            72\n        ];\n        var DEFAULT_FONT_SIZE = 12;\n        var FontSize = kendo.toolbar.Item.extend({\n            init: function (options, toolbar) {\n                var comboBox = $('<input />').attr('aria-label', options.attributes.title).kendoComboBox({\n                    change: this._valueChange.bind(this),\n                    clearButton: false,\n                    dataSource: options.fontSizes || FONT_SIZES,\n                    value: DEFAULT_FONT_SIZE\n                }).data('kendoComboBox');\n                this.comboBox = comboBox;\n                this.element = comboBox.wrapper;\n                this.options = options;\n                this.toolbar = toolbar;\n                this.attributes();\n                this.addUidAttr();\n                this.addOverflowAttr();\n                this.element.width(options.width).attr({\n                    'data-command': 'PropertyChangeCommand',\n                    'data-property': options.property\n                });\n                this.element.data({\n                    type: 'fontSize',\n                    fontSize: this\n                });\n            },\n            _valueChange: function (e) {\n                this.toolbar.action({\n                    command: 'PropertyChangeCommand',\n                    options: {\n                        property: this.options.property,\n                        value: kendo.parseInt(e.sender.value())\n                    }\n                });\n            },\n            update: function (value) {\n                this.value(kendo.parseInt(value) || DEFAULT_FONT_SIZE);\n            },\n            value: function (value) {\n                if (value !== undefined) {\n                    this.comboBox.value(value);\n                } else {\n                    return this.comboBox.value();\n                }\n            }\n        });\n        var FontSizeButton = OverflowDialogButton.extend({\n            _click: function () {\n                this.toolbar.dialog({\n                    name: 'fontSize',\n                    options: {\n                        sizes: FONT_SIZES,\n                        defaultSize: DEFAULT_FONT_SIZE\n                    }\n                });\n            },\n            update: function (value) {\n                this._value = value || DEFAULT_FONT_SIZE;\n                this.element.find('.k-text').text(this.message + ' (' + this._value + ') ...');\n            }\n        });\n        kendo.toolbar.registerComponent('fontSize', FontSize, FontSizeButton);\n        var FONT_FAMILIES = [\n            'Arial',\n            'Courier New',\n            'Georgia',\n            'Times New Roman',\n            'Trebuchet MS',\n            'Verdana'\n        ];\n        var DEFAULT_FONT_FAMILY = 'Arial';\n        var FontFamily = DropDownTool.extend({\n            init: function (options, toolbar) {\n                DropDownTool.fn.init.call(this, options, toolbar);\n                var ddl = this.dropDownList;\n                ddl.setDataSource(options.fontFamilies || FONT_FAMILIES);\n                ddl.value(DEFAULT_FONT_FAMILY);\n                this.element.data({\n                    type: 'fontFamily',\n                    fontFamily: this\n                });\n            },\n            update: function (value) {\n                this.value(value || DEFAULT_FONT_FAMILY);\n            }\n        });\n        var FontFamilyButton = OverflowDialogButton.extend({\n            _click: function () {\n                this.toolbar.dialog({\n                    name: 'fontFamily',\n                    options: {\n                        fonts: FONT_FAMILIES,\n                        defaultFont: DEFAULT_FONT_FAMILY\n                    }\n                });\n            },\n            update: function (value) {\n                this._value = value || DEFAULT_FONT_FAMILY;\n                this.element.find('.k-text').text(this.message + ' (' + this._value + ') ...');\n            }\n        });\n        kendo.toolbar.registerComponent('fontFamily', FontFamily, FontFamilyButton);\n        var defaultFormats = kendo.spreadsheet.formats = {\n            automatic: null,\n            number: '#,0.00',\n            percent: '0.00%',\n            financial: '_(\"$\"* #,##0.00_);_(\"$\"* (#,##0.00);_(\"$\"* \"-\"??_);_(@_)',\n            currency: '$#,##0.00;[Red]$#,##0.00',\n            date: 'm/d/yyyy',\n            time: 'h:mm:ss AM/PM',\n            dateTime: 'm/d/yyyy h:mm',\n            duration: '[h]:mm:ss'\n        };\n        var Format = DropDownTool.extend({\n            _revertTitle: function (e) {\n                e.sender.value('');\n                e.sender.wrapper.width('auto');\n            },\n            init: function (options, toolbar) {\n                DropDownTool.fn.init.call(this, options, toolbar);\n                var ddl = this.dropDownList;\n                var icon = '<span class=\\'k-icon k-i-' + options.iconClass + '\\' style=\\'line-height: 1em; width: 1.35em;\\'></span>';\n                ddl.bind('change', this._revertTitle.bind(this));\n                ddl.bind('dataBound', this._revertTitle.bind(this));\n                ddl.setOptions({\n                    dataValueField: 'format',\n                    dataTextField: 'name',\n                    dataValuePrimitive: true,\n                    valueTemplate: icon,\n                    template: '# if (data.sample) { #' + '<span class=\\'k-spreadsheet-sample\\'>#: data.sample #</span>' + '# } #' + '#: data.name #'\n                });\n                ddl.text(icon);\n                ddl.setDataSource([\n                    {\n                        format: defaultFormats.automatic,\n                        name: MESSAGES.formatTypes.automatic\n                    },\n                    {\n                        format: defaultFormats.number,\n                        name: MESSAGES.formatTypes.number,\n                        sample: '1,499.99'\n                    },\n                    {\n                        format: defaultFormats.percent,\n                        name: MESSAGES.formatTypes.percent,\n                        sample: '14.50%'\n                    },\n                    {\n                        format: defaultFormats.financial,\n                        name: MESSAGES.formatTypes.financial,\n                        sample: '(1,000.12)'\n                    },\n                    {\n                        format: defaultFormats.currency,\n                        name: MESSAGES.formatTypes.currency,\n                        sample: '$1,499.99'\n                    },\n                    {\n                        format: defaultFormats.date,\n                        name: MESSAGES.formatTypes.date,\n                        sample: '4/21/2012'\n                    },\n                    {\n                        format: defaultFormats.time,\n                        name: MESSAGES.formatTypes.time,\n                        sample: '5:49:00 PM'\n                    },\n                    {\n                        format: defaultFormats.dateTime,\n                        name: MESSAGES.formatTypes.dateTime,\n                        sample: '4/21/2012 5:49:00'\n                    },\n                    {\n                        format: defaultFormats.duration,\n                        name: MESSAGES.formatTypes.duration,\n                        sample: '168:05:00'\n                    },\n                    {\n                        popup: 'formatCells',\n                        name: MESSAGES.formatTypes.moreFormats\n                    }\n                ]);\n                this.element.data({\n                    type: 'format',\n                    format: this\n                });\n            }\n        });\n        var FormatButton = OverflowDialogButton.extend({\n            _click: function () {\n                this.toolbar.dialog({ name: 'formatCells' });\n            }\n        });\n        kendo.toolbar.registerComponent('format', Format, FormatButton);\n        var BorderChangeTool = PopupTool.extend({\n            init: function (options, toolbar) {\n                PopupTool.fn.init.call(this, options, toolbar);\n                this._borderPalette();\n                this.element.data({\n                    type: 'borders',\n                    instance: this\n                });\n            },\n            destroy: function () {\n                this.borderPalette.destroy();\n                PopupTool.fn.destroy.call(this);\n            },\n            _borderPalette: function () {\n                var element = $('<div />').appendTo(this.popup.element);\n                this.borderPalette = new kendo.spreadsheet.BorderPalette(element, { change: this._action.bind(this) });\n            },\n            _action: function (e) {\n                this.toolbar.action({\n                    command: 'BorderChangeCommand',\n                    options: {\n                        border: e.type,\n                        style: {\n                            size: 1,\n                            color: e.color\n                        }\n                    }\n                });\n            }\n        });\n        var BorderChangeButton = OverflowDialogButton.extend({\n            _click: function () {\n                this.toolbar.dialog({ name: 'borders' });\n            }\n        });\n        kendo.toolbar.registerComponent('borders', BorderChangeTool, BorderChangeButton);\n        var AlignmentTool = PopupTool.extend({\n            init: function (options, toolbar) {\n                PopupTool.fn.init.call(this, options, toolbar);\n                this.element.attr({ 'data-property': 'alignment' });\n                this._commandPalette();\n                this.popup.element.on('click', '.k-button', function (e) {\n                    this._action($(e.currentTarget));\n                }.bind(this));\n                this.element.data({\n                    type: 'alignment',\n                    alignment: this,\n                    instance: this\n                });\n            },\n            buttons: [\n                {\n                    property: 'textAlign',\n                    value: 'left',\n                    iconClass: 'align-left',\n                    text: MESSAGES.alignmentButtons.justtifyLeft\n                },\n                {\n                    property: 'textAlign',\n                    value: 'center',\n                    iconClass: 'align-center',\n                    text: MESSAGES.alignmentButtons.justifyCenter\n                },\n                {\n                    property: 'textAlign',\n                    value: 'right',\n                    iconClass: 'align-right',\n                    text: MESSAGES.alignmentButtons.justifyRight\n                },\n                {\n                    property: 'textAlign',\n                    value: 'justify',\n                    iconClass: 'align-justify',\n                    text: MESSAGES.alignmentButtons.justifyFull\n                },\n                {\n                    property: 'verticalAlign',\n                    value: 'top',\n                    iconClass: 'align-top',\n                    text: MESSAGES.alignmentButtons.alignTop\n                },\n                {\n                    property: 'verticalAlign',\n                    value: 'center',\n                    iconClass: 'align-middle',\n                    text: MESSAGES.alignmentButtons.alignMiddle\n                },\n                {\n                    property: 'verticalAlign',\n                    value: 'bottom',\n                    iconClass: 'align-bottom',\n                    text: MESSAGES.alignmentButtons.alignBottom\n                }\n            ],\n            destroy: function () {\n                this.popup.element.off();\n                PopupTool.fn.destroy.call(this);\n            },\n            update: function (range) {\n                var textAlign = range.textAlign();\n                var verticalAlign = range.verticalAlign();\n                var element = this.popup.element;\n                element.find('.k-button').removeClass('k-state-active');\n                if (textAlign) {\n                    element.find('[data-property=textAlign][data-value=' + textAlign + ']').addClass('k-state-active');\n                }\n                if (verticalAlign) {\n                    element.find('[data-property=verticalAlign][data-value=' + verticalAlign + ']').addClass('k-state-active');\n                }\n            },\n            _commandPalette: function () {\n                var buttons = this.buttons;\n                var element = $('<div />').appendTo(this.popup.element);\n                buttons.forEach(function (options, index) {\n                    var button = '<a title=\\'' + options.text + '\\' data-property=\\'' + options.property + '\\' data-value=\\'' + options.value + '\\' class=\\'k-button k-button-icon\\'>' + '<span class=\\'k-icon k-i-' + options.iconClass + '\\'></span>' + '</a>';\n                    if (index !== 0 && buttons[index - 1].property !== options.property) {\n                        element.append($('<span class=\\'k-separator\\' />'));\n                    }\n                    element.append(button);\n                });\n            },\n            _action: function (button) {\n                var property = button.attr('data-property');\n                var value = button.attr('data-value');\n                this.toolbar.action({\n                    command: 'PropertyChangeCommand',\n                    options: {\n                        property: property,\n                        value: value\n                    }\n                });\n            }\n        });\n        var AlignmentButton = OverflowDialogButton.extend({\n            _click: function () {\n                this.toolbar.dialog({ name: 'alignment' });\n            }\n        });\n        kendo.toolbar.registerComponent('alignment', AlignmentTool, AlignmentButton);\n        var MergeTool = PopupTool.extend({\n            init: function (options, toolbar) {\n                PopupTool.fn.init.call(this, options, toolbar);\n                this._commandPalette();\n                this.popup.element.on('click', '.k-button', function (e) {\n                    this._action($(e.currentTarget));\n                }.bind(this));\n                this.element.data({\n                    type: 'merge',\n                    merge: this,\n                    instance: this\n                });\n            },\n            buttons: [\n                {\n                    value: 'cells',\n                    iconClass: 'cells-merge',\n                    text: MESSAGES.mergeButtons.mergeCells\n                },\n                {\n                    value: 'horizontally',\n                    iconClass: 'cells-merge-horizontally',\n                    text: MESSAGES.mergeButtons.mergeHorizontally\n                },\n                {\n                    value: 'vertically',\n                    iconClass: 'cells-merge-vertically',\n                    text: MESSAGES.mergeButtons.mergeVertically\n                },\n                {\n                    value: 'unmerge',\n                    iconClass: 'table-unmerge',\n                    text: MESSAGES.mergeButtons.unmerge\n                }\n            ],\n            destroy: function () {\n                this.popup.element.off();\n                PopupTool.fn.destroy.call(this);\n            },\n            _commandPalette: function () {\n                var element = $('<div />').appendTo(this.popup.element);\n                this.buttons.forEach(function (options) {\n                    var button = '<a title=\\'' + options.text + '\\' data-value=\\'' + options.value + '\\' class=\\'k-button k-button-icontext\\'>' + '<span class=\\'k-icon k-i-' + options.iconClass + '\\'></span>' + options.text + '</a>';\n                    element.append(button);\n                });\n            },\n            _action: function (button) {\n                var value = button.attr('data-value');\n                this.toolbar.action({\n                    command: 'MergeCellCommand',\n                    options: { value: value }\n                });\n            }\n        });\n        var MergeButton = OverflowDialogButton.extend({\n            _click: function () {\n                this.toolbar.dialog({ name: 'merge' });\n            }\n        });\n        kendo.toolbar.registerComponent('merge', MergeTool, MergeButton);\n        var FreezeTool = PopupTool.extend({\n            init: function (options, toolbar) {\n                PopupTool.fn.init.call(this, options, toolbar);\n                this._commandPalette();\n                this.popup.element.on('click', '.k-button', function (e) {\n                    this._action($(e.currentTarget));\n                }.bind(this));\n                this.element.data({\n                    type: 'freeze',\n                    freeze: this,\n                    instance: this\n                });\n            },\n            buttons: [\n                {\n                    value: 'panes',\n                    iconClass: 'pane-freeze',\n                    text: MESSAGES.freezeButtons.freezePanes\n                },\n                {\n                    value: 'rows',\n                    iconClass: 'row-freeze',\n                    text: MESSAGES.freezeButtons.freezeRows\n                },\n                {\n                    value: 'columns',\n                    iconClass: 'column-freeze',\n                    text: MESSAGES.freezeButtons.freezeColumns\n                },\n                {\n                    value: 'unfreeze',\n                    iconClass: 'table-unmerge',\n                    text: MESSAGES.freezeButtons.unfreeze\n                }\n            ],\n            destroy: function () {\n                this.popup.element.off();\n                PopupTool.fn.destroy.call(this);\n            },\n            _commandPalette: function () {\n                var element = $('<div />').appendTo(this.popup.element);\n                this.buttons.forEach(function (options) {\n                    var button = '<a title=\\'' + options.text + '\\' data-value=\\'' + options.value + '\\' class=\\'k-button k-button-icontext\\'>' + '<span class=\\'k-icon k-i-' + options.iconClass + '\\'></span>' + options.text + '</a>';\n                    element.append(button);\n                });\n            },\n            _action: function (button) {\n                var value = button.attr('data-value');\n                this.toolbar.action({\n                    command: 'FreezePanesCommand',\n                    options: { value: value }\n                });\n            }\n        });\n        var FreezeButton = OverflowDialogButton.extend({\n            _click: function () {\n                this.toolbar.dialog({ name: 'freeze' });\n            }\n        });\n        kendo.toolbar.registerComponent('freeze', FreezeTool, FreezeButton);\n        var Sort = DropDownTool.extend({\n            _revertTitle: function (e) {\n                e.sender.value('');\n                e.sender.wrapper.width('auto');\n            },\n            init: function (options, toolbar) {\n                DropDownTool.fn.init.call(this, options, toolbar);\n                var ddl = this.dropDownList;\n                ddl.bind('change', this._revertTitle.bind(this));\n                ddl.bind('dataBound', this._revertTitle.bind(this));\n                ddl.setOptions({\n                    valueTemplate: '<span class=\\'k-icon k-i-' + options.iconClass + '\\' style=\\'line-height: 1em; width: 1.35em;\\'></span>',\n                    template: '<span class=\\'k-icon k-i-#= iconClass #\\' style=\\'line-height: 1em; width: 1.35em;\\'></span>#=text#',\n                    dataTextField: 'text',\n                    dataValueField: 'value'\n                });\n                ddl.setDataSource([\n                    {\n                        value: 'asc',\n                        sheet: false,\n                        text: MESSAGES.sortButtons.sortRangeAsc,\n                        iconClass: 'sort-asc'\n                    },\n                    {\n                        value: 'desc',\n                        sheet: false,\n                        text: MESSAGES.sortButtons.sortRangeDesc,\n                        iconClass: 'sort-desc'\n                    }\n                ]);\n                ddl.select(0);\n                this.element.data({\n                    type: 'sort',\n                    sort: this\n                });\n            },\n            _change: function (e) {\n                var instance = e.sender;\n                var dataItem = instance.dataItem();\n                if (dataItem) {\n                    this.toolbar.action({\n                        command: 'SortCommand',\n                        options: {\n                            value: dataItem.value,\n                            sheet: dataItem.sheet\n                        }\n                    });\n                }\n            },\n            value: $.noop\n        });\n        var SortButton = OverflowDialogButton.extend({\n            _click: function () {\n                this.toolbar.dialog({ name: 'sort' });\n            }\n        });\n        kendo.toolbar.registerComponent('sort', Sort, SortButton);\n        var Filter = kendo.toolbar.ToolBarButton.extend({\n            init: function (options, toolbar) {\n                options.showText = 'overflow';\n                kendo.toolbar.ToolBarButton.fn.init.call(this, options, toolbar);\n                this.element.on('click', this._click.bind(this));\n                this.element.data({\n                    type: 'filter',\n                    filter: this\n                });\n            },\n            _click: function () {\n                this.toolbar.action({ command: 'FilterCommand' });\n            },\n            update: function (value) {\n                this.toggle(value);\n            }\n        });\n        var FilterButton = OverflowDialogButton.extend({\n            init: function (options, toolbar) {\n                OverflowDialogButton.fn.init.call(this, options, toolbar);\n                this.element.data({\n                    type: 'filter',\n                    filter: this\n                });\n            },\n            _click: function () {\n                this.toolbar.action({ command: 'FilterCommand' });\n            },\n            update: function (value) {\n                this.toggle(value);\n            }\n        });\n        kendo.toolbar.registerComponent('filter', Filter, FilterButton);\n        var Open = kendo.toolbar.Item.extend({\n            init: function (options, toolbar) {\n                this.toolbar = toolbar;\n                this.element = $('<div class=\\'k-button k-upload-button k-button-icon\\'>' + '<span class=\\'k-icon k-i-folder-open\\' />' + '</div>').data('instance', this);\n                this._title = options.attributes.title;\n                this._reset();\n            },\n            _reset: function () {\n                this.element.remove('input');\n                $('<input type=\\'file\\' autocomplete=\\'off\\' accept=\\'.xlsx\\'/>').attr('title', this._title).attr('aria-label', this._title).one('change', this._change.bind(this)).appendTo(this.element);\n            },\n            _change: function (e) {\n                this.toolbar.action({\n                    command: 'OpenCommand',\n                    options: { file: e.target.files[0] }\n                });\n                this._reset();\n            }\n        });\n        kendo.toolbar.registerComponent('open', Open);\n        kendo.spreadsheet.TabStrip = kendo.ui.TabStrip.extend({\n            init: function (element, options) {\n                kendo.ui.TabStrip.fn.init.call(this, element, options);\n                element.addClass('k-spreadsheet-tabstrip');\n                this._quickAccessButtons();\n                this.toolbars = {};\n                var tabs = options.dataSource;\n                this.contentElements.each(function (idx, element) {\n                    this._toolbar($(element), tabs[idx].id, options.toolbarOptions[tabs[idx].id]);\n                }.bind(this));\n                this.one('activate', function () {\n                    this.toolbars[this.options.dataSource[0].id].resize();\n                });\n            },\n            events: kendo.ui.TabStrip.fn.events.concat([\n                'action',\n                'dialog'\n            ]),\n            destroy: function () {\n                this.quickAccessToolBar.off('click');\n                kendo.ui.TabStrip.fn.destroy.call(this);\n                for (var name in this.toolbars) {\n                    this.toolbars[name].destroy();\n                }\n            },\n            action: function (args) {\n                this.trigger('action', args);\n            },\n            dialog: function (args) {\n                this.trigger('dialog', args);\n            },\n            refreshTools: function (range) {\n                var toolbars = this.toolbars;\n                for (var name in toolbars) {\n                    if (toolbars.hasOwnProperty(name)) {\n                        toolbars[name].refresh(range);\n                    }\n                }\n            },\n            _quickAccessButtons: function () {\n                var buttons = [\n                    {\n                        title: MESSAGES.quickAccess.undo,\n                        iconClass: 'undo',\n                        action: 'undo'\n                    },\n                    {\n                        title: MESSAGES.quickAccess.redo,\n                        iconClass: 'redo',\n                        action: 'redo'\n                    }\n                ];\n                var buttonTemplate = kendo.template('<a href=\\'\\\\#\\' title=\\'#= title #\\' data-action=\\'#= action #\\' class=\\'k-button k-button-icon\\' aria-label=\\'#= title #\\'><span class=\\'k-icon k-i-#=iconClass#\\'></span></a>');\n                this.quickAccessToolBar = $('<div />', {\n                    'class': 'k-spreadsheet-quick-access-toolbar',\n                    'html': kendo.render(buttonTemplate, buttons)\n                }).insertBefore(this.wrapper);\n                this.quickAccessToolBar.on('click', '.k-button', function (e) {\n                    e.preventDefault();\n                    var action = $(e.currentTarget).attr('data-action');\n                    this.action({ action: action });\n                }.bind(this));\n                this.quickAccessAdjust();\n            },\n            quickAccessAdjust: function () {\n                this.tabGroup.css('padding-left', kendo._outerWidth(this.quickAccessToolBar));\n            },\n            _toolbar: function (container, name, tools) {\n                var element;\n                var options;\n                if (this.toolbars[name]) {\n                    this.toolbars[name].destroy();\n                    container.children('.k-toolbar').remove();\n                }\n                if (tools) {\n                    element = container.html('<div />').children('div');\n                    options = {\n                        tools: typeof tools === 'boolean' ? undefined : tools,\n                        toolbarName: name,\n                        action: this.action.bind(this),\n                        dialog: this.dialog.bind(this)\n                    };\n                    this.toolbars[name] = new kendo.spreadsheet.ToolBar(element, options);\n                }\n            }\n        });\n    }(window.kendo));\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('spreadsheet/dialogs', [\n        'kendo.core',\n        'kendo.binder',\n        'kendo.validator'\n    ], f);\n}(function () {\n    (function (kendo) {\n        if (kendo.support.browser.msie && kendo.support.browser.version < 9) {\n            return;\n        }\n        var $ = kendo.jQuery;\n        var ObservableObject = kendo.data.ObservableObject;\n        var MESSAGES = kendo.spreadsheet.messages.dialogs = {\n            apply: 'Apply',\n            save: 'Save',\n            cancel: 'Cancel',\n            remove: 'Remove',\n            retry: 'Retry',\n            revert: 'Revert',\n            okText: 'OK',\n            formatCellsDialog: {\n                title: 'Format',\n                categories: {\n                    number: 'Number',\n                    currency: 'Currency',\n                    date: 'Date'\n                }\n            },\n            fontFamilyDialog: { title: 'Font' },\n            fontSizeDialog: { title: 'Font size' },\n            bordersDialog: { title: 'Borders' },\n            alignmentDialog: {\n                title: 'Alignment',\n                buttons: {\n                    justtifyLeft: 'Align left',\n                    justifyCenter: 'Center',\n                    justifyRight: 'Align right',\n                    justifyFull: 'Justify',\n                    alignTop: 'Align top',\n                    alignMiddle: 'Align middle',\n                    alignBottom: 'Align bottom'\n                }\n            },\n            mergeDialog: {\n                title: 'Merge cells',\n                buttons: {\n                    mergeCells: 'Merge all',\n                    mergeHorizontally: 'Merge horizontally',\n                    mergeVertically: 'Merge vertically',\n                    unmerge: 'Unmerge'\n                }\n            },\n            freezeDialog: {\n                title: 'Freeze panes',\n                buttons: {\n                    freezePanes: 'Freeze panes',\n                    freezeRows: 'Freeze rows',\n                    freezeColumns: 'Freeze columns',\n                    unfreeze: 'Unfreeze panes'\n                }\n            },\n            confirmationDialog: {\n                text: 'Are you sure you want to remove this sheet?',\n                title: 'Sheet remove'\n            },\n            validationDialog: {\n                title: 'Data Validation',\n                hintMessage: 'Please enter a valid {0} value {1}.',\n                hintTitle: 'Validation {0}',\n                criteria: {\n                    any: 'Any value',\n                    number: 'Number',\n                    text: 'Text',\n                    date: 'Date',\n                    custom: 'Custom Formula',\n                    list: 'List'\n                },\n                comparers: {\n                    greaterThan: 'greater than',\n                    lessThan: 'less than',\n                    between: 'between',\n                    notBetween: 'not between',\n                    equalTo: 'equal to',\n                    notEqualTo: 'not equal to',\n                    greaterThanOrEqualTo: 'greater than or equal to',\n                    lessThanOrEqualTo: 'less than or equal to'\n                },\n                comparerMessages: {\n                    greaterThan: 'greater than {0}',\n                    lessThan: 'less than {0}',\n                    between: 'between {0} and {1}',\n                    notBetween: 'not between {0} and {1}',\n                    equalTo: 'equal to {0}',\n                    notEqualTo: 'not equal to {0}',\n                    greaterThanOrEqualTo: 'greater than or equal to {0}',\n                    lessThanOrEqualTo: 'less than or equal to {0}',\n                    custom: 'that satisfies the formula: {0}'\n                },\n                labels: {\n                    criteria: 'Criteria',\n                    comparer: 'Comparer',\n                    min: 'Min',\n                    max: 'Max',\n                    value: 'Value',\n                    start: 'Start',\n                    end: 'End',\n                    onInvalidData: 'On invalid data',\n                    rejectInput: 'Reject input',\n                    showWarning: 'Show warning',\n                    showHint: 'Show hint',\n                    hintTitle: 'Hint title',\n                    hintMessage: 'Hint message',\n                    ignoreBlank: 'Ignore blank',\n                    showListButton: 'Display button to show list',\n                    showCalendarButton: 'Display button to show calendar'\n                },\n                placeholders: {\n                    typeTitle: 'Type title',\n                    typeMessage: 'Type message'\n                }\n            },\n            exportAsDialog: {\n                title: 'Export...',\n                labels: {\n                    scale: 'Scale',\n                    fit: 'Fit to page',\n                    fileName: 'File name',\n                    saveAsType: 'Save as type',\n                    exportArea: 'Export',\n                    paperSize: 'Paper size',\n                    margins: 'Margins',\n                    orientation: 'Orientation',\n                    print: 'Print',\n                    guidelines: 'Guidelines',\n                    center: 'Center',\n                    horizontally: 'Horizontally',\n                    vertically: 'Vertically'\n                }\n            },\n            modifyMergedDialog: { errorMessage: 'Cannot change part of a merged cell.' },\n            rangeDisabledDialog: { errorMessage: 'Destination range contains disabled cells.' },\n            incompatibleRangesDialog: { errorMessage: 'Incompatible ranges' },\n            noFillDirectionDialog: { errorMessage: 'Cannot determine fill direction' },\n            duplicateSheetNameDialog: { errorMessage: 'Duplicate sheet name' },\n            overflowDialog: { errorMessage: 'Cannot paste, because the copy area and the paste area are not the same size and shape.' },\n            useKeyboardDialog: {\n                title: 'Copying and pasting',\n                errorMessage: 'These actions cannot be invoked through the menu. Please use the keyboard shortcuts instead:',\n                labels: {\n                    forCopy: 'for copy',\n                    forCut: 'for cut',\n                    forPaste: 'for paste'\n                }\n            },\n            unsupportedSelectionDialog: { errorMessage: 'That action cannot be performed on multiple selection.' },\n            linkDialog: {\n                title: 'Hyperlink',\n                labels: {\n                    text: 'Text',\n                    url: 'Address',\n                    removeLink: 'Remove link'\n                }\n            }\n        };\n        var registry = {};\n        kendo.spreadsheet.dialogs = {\n            register: function (name, dialogClass) {\n                registry[name] = dialogClass;\n            },\n            registered: function (name) {\n                return !!registry[name];\n            },\n            create: function (name, options) {\n                var dialogClass = registry[name];\n                if (dialogClass) {\n                    return new dialogClass(options);\n                }\n            }\n        };\n        var SpreadsheetDialog = kendo.spreadsheet.SpreadsheetDialog = kendo.Observable.extend({\n            init: function (options) {\n                kendo.Observable.fn.init.call(this, options);\n                this.options = $.extend(true, {}, this.options, options);\n                this.bind(this.events, options);\n            },\n            events: [\n                'close',\n                'activate'\n            ],\n            options: { autoFocus: true },\n            dialog: function () {\n                if (!this._dialog) {\n                    this._dialog = $('<div class=\\'k-spreadsheet-window k-action-window k-popup-edit-form\\' />').addClass(this.options.className || '').append(kendo.template(this.options.template)({\n                        messages: kendo.spreadsheet.messages.dialogs || MESSAGES,\n                        errors: this.options.errors\n                    })).appendTo(document.body).kendoWindow({\n                        autoFocus: this.options.autoFocus,\n                        scrollable: false,\n                        resizable: false,\n                        modal: true,\n                        visible: false,\n                        width: this.options.width || 320,\n                        title: this.options.title,\n                        open: function () {\n                            this.center();\n                        },\n                        close: this._onDialogClose.bind(this),\n                        activate: this._onDialogActivate.bind(this),\n                        deactivate: this._onDialogDeactivate.bind(this)\n                    }).data('kendoWindow');\n                }\n                return this._dialog;\n            },\n            _onDialogClose: function () {\n                this.trigger('close', { action: this._action });\n            },\n            _onDialogActivate: function () {\n                this.trigger('activate');\n            },\n            _onDialogDeactivate: function () {\n                this.trigger('deactivate');\n                this.destroy();\n            },\n            destroy: function () {\n                if (this._dialog) {\n                    this._dialog.destroy();\n                    this._dialog = null;\n                }\n            },\n            open: function () {\n                this.dialog().open();\n            },\n            apply: function () {\n                this.close();\n            },\n            close: function () {\n                this._action = 'close';\n                this.dialog().close();\n            }\n        });\n        function formattedValue(value, format) {\n            return kendo.spreadsheet.formatting.text(value, format);\n        }\n        var FormatCellsViewModel = kendo.spreadsheet.FormatCellsViewModel = ObservableObject.extend({\n            init: function (options) {\n                ObservableObject.fn.init.call(this, options);\n                this.useCategory(this.category);\n            },\n            useCategory: function (category) {\n                var type = category && category.type || 'number';\n                var formatCurrency = type == 'currency';\n                this.category = category;\n                this.set('showCurrencyFilter', formatCurrency && this.currencies.length > 1);\n                if (!formatCurrency) {\n                    this.set('formats', this.allFormats[type + 'Formats']);\n                } else {\n                    this.currency(this.currencies[0]);\n                }\n                this.useFirstFormat();\n            },\n            useFirstFormat: function () {\n                if (this.formats.length) {\n                    this.set('format', this.formats[0].value);\n                }\n            },\n            currency: function (currency) {\n                if (currency !== undefined) {\n                    this._currency = currency;\n                    var info = currency.value;\n                    var formats = [\n                        {\n                            currency: info,\n                            decimals: true\n                        },\n                        {\n                            currency: info,\n                            decimals: true,\n                            iso: true\n                        },\n                        {\n                            currency: info,\n                            decimals: false\n                        }\n                    ];\n                    formats = formats.map(function (format) {\n                        format = FormatCellsViewModel.convert.currency(format);\n                        return {\n                            value: format,\n                            name: formattedValue(1000, format)\n                        };\n                    });\n                    this.set('formats', formats);\n                    this.useFirstFormat();\n                }\n                return this._currency || this.currencies[0];\n            },\n            categoryFilter: function (category) {\n                if (category !== undefined) {\n                    this.useCategory(category);\n                }\n                return this.category;\n            },\n            preview: function () {\n                var format = this.get('format');\n                var value = this.value || 0;\n                if (format && format.length) {\n                    return formattedValue(value, format);\n                } else {\n                    return value;\n                }\n            }\n        });\n        FormatCellsViewModel.convert = {\n            currency: function (options) {\n                function repeat(token, n) {\n                    return new Array(n + 1).join(token);\n                }\n                var info = options.currency;\n                var format = info.pattern[1];\n                if (options.decimals) {\n                    format = format.replace(/n/g, 'n' + info['.'] + repeat('0', info.decimals));\n                }\n                if (options.iso) {\n                    format = '\"' + info.abbr + '\" ' + format.replace(/\\s*\\$\\s*/g, '');\n                } else {\n                    format = format.replace(/\\$/g, info.symbol);\n                }\n                format = format.replace(/n/g, '?');\n                return format;\n            },\n            date: function (format) {\n                if (/T|Z/.test(format)) {\n                    return '';\n                }\n                return format.toLowerCase().replace(/tt/g, 'AM/PM').replace(/'/g, '\"');\n            }\n        };\n        function uniqueBy(field, array) {\n            var result = [];\n            var values = [];\n            for (var i = 0; i < array.length; i++) {\n                if ($.inArray(array[i][field], values) == -1) {\n                    result.push(array[i]);\n                    values.push(array[i][field]);\n                }\n            }\n            return result;\n        }\n        var FormatCellsDialog = SpreadsheetDialog.extend({\n            init: function (options) {\n                var messages = kendo.spreadsheet.messages.dialogs.formatCellsDialog || MESSAGES;\n                var defaultOptions = {\n                    title: messages.title,\n                    categories: [\n                        {\n                            type: 'number',\n                            name: messages.categories.number\n                        },\n                        {\n                            type: 'currency',\n                            name: messages.categories.currency\n                        },\n                        {\n                            type: 'date',\n                            name: messages.categories.date\n                        }\n                    ]\n                };\n                SpreadsheetDialog.fn.init.call(this, $.extend(defaultOptions, options));\n                this._generateFormats();\n            },\n            options: {\n                className: 'k-spreadsheet-format-cells',\n                template: '<div class=\\'k-edit-form-container\\'>' + '<div class=\\'k-root-tabs\\' data-role=\\'tabstrip\\' ' + 'data-text-field=\\'name\\' ' + 'data-bind=\\'source: categories, value: categoryFilter\\' ' + 'data-animation=\\'false\\' />' + '<div class=\\'k-spreadsheet-preview\\' data-bind=\\'text: preview\\' />' + '<script type=\\'text/x-kendo-template\\' id=\\'format-item-template\\'>' + '\\\\#: data.name \\\\#' + '</script>' + '<select data-role=\\'dropdownlist\\' class=\\'k-format-filter\\' ' + 'data-text-field=\\'description\\' ' + 'data-value-field=\\'value.name\\' ' + 'data-bind=\\'visible: showCurrencyFilter, value: currency, source: currencies\\' />' + '<ul data-role=\\'staticlist\\' tabindex=\\'0\\' ' + 'class=\\'k-list k-reset\\' ' + 'data-template=\\'format-item-template\\' ' + 'data-value-primitive=\\'true\\' ' + 'data-value-field=\\'value\\' ' + 'data-bind=\\'source: formats, value: format\\' />' + '<div class=\\'k-action-buttons\\'>' + '<button class=\\'k-button k-primary\\' data-bind=\\'click: apply\\'>#: messages.apply #</button>' + '<button class=\\'k-button\\' data-bind=\\'click: close\\'>#: messages.cancel #</button>' + '</div>' + '</div>'\n            },\n            _generateFormats: function () {\n                var options = this.options;\n                if (!options.currencies) {\n                    options.currencies = FormatCellsDialog.currenciesFrom(kendo.cultures);\n                }\n                if (!options.numberFormats) {\n                    options.numberFormats = [\n                        {\n                            value: '#.00%',\n                            name: '100.00%'\n                        },\n                        {\n                            value: '#%',\n                            name: '100%'\n                        },\n                        {\n                            value: '#.00',\n                            name: '1024.00'\n                        },\n                        {\n                            value: '#,###.00',\n                            name: '1,024.00'\n                        }\n                    ];\n                }\n                if (!options.dateFormats) {\n                    var calendarPatterns = kendo.cultures.current.calendars.standard.patterns;\n                    options.dateFormats = uniqueBy('value', $.map(calendarPatterns, function (format) {\n                        format = FormatCellsViewModel.convert.date(format);\n                        if (!format) {\n                            return;\n                        }\n                        return {\n                            value: format,\n                            name: formattedValue(34567.7678, format)\n                        };\n                    }));\n                }\n            },\n            open: function (range) {\n                var options = this.options;\n                var value = range.value();\n                var categories = options.categories.slice(0);\n                var element;\n                this.viewModel = new FormatCellsViewModel({\n                    currencies: options.currencies.slice(0),\n                    allFormats: {\n                        numberFormats: options.numberFormats.slice(0),\n                        dateFormats: options.dateFormats.slice(0)\n                    },\n                    categories: categories,\n                    format: range.format(),\n                    category: value instanceof Date ? categories[2] : categories[0],\n                    apply: this.apply.bind(this),\n                    close: this.close.bind(this),\n                    value: value\n                });\n                SpreadsheetDialog.fn.open.call(this);\n                element = this.dialog().element;\n                kendo.bind(element, this.viewModel);\n                var currencyFilter = element.find('select.k-format-filter').data('kendoDropDownList');\n                if (options.currencies.length > 10) {\n                    currencyFilter.setOptions({ filter: 'contains' });\n                }\n                element.find(kendo.roleSelector('staticlist')).parent().addClass('k-list-wrapper');\n            },\n            apply: function () {\n                var format = this.viewModel.format;\n                SpreadsheetDialog.fn.apply.call(this);\n                this.trigger('action', {\n                    command: 'PropertyChangeCommand',\n                    options: {\n                        property: 'format',\n                        value: format\n                    }\n                });\n            }\n        });\n        FormatCellsDialog.currenciesFrom = function (cultures) {\n            return uniqueBy('description', $.map(cultures, function (culture, name) {\n                if (!/-/.test(name)) {\n                    return;\n                }\n                var currency = culture.numberFormat.currency;\n                var description = kendo.format('{0} ({1}, {2})', currency.name, currency.abbr, currency.symbol);\n                return {\n                    description: description,\n                    value: currency\n                };\n            }));\n        };\n        kendo.spreadsheet.dialogs.register('formatCells', FormatCellsDialog);\n        kendo.spreadsheet.dialogs.FormatCellsDialog = FormatCellsDialog;\n        var MessageDialog = SpreadsheetDialog.extend({\n            options: {\n                className: 'k-spreadsheet-message',\n                title: '',\n                messageId: '',\n                text: '',\n                template: '<div class=\\'k-spreadsheet-message-content\\' data-bind=\\'text: text\\' />' + '<div class=\\'k-action-buttons\\'>' + '<button class=\\'k-button k-primary\\' data-bind=\\'click: close\\'>' + '#= messages.okText #' + '</button>' + '</div>'\n            },\n            open: function () {\n                SpreadsheetDialog.fn.open.call(this);\n                var options = this.options;\n                var text = options.text;\n                if (options.messageId) {\n                    text = kendo.getter(options.messageId, true)(kendo.spreadsheet.messages.dialogs);\n                }\n                kendo.bind(this.dialog().element, {\n                    text: text,\n                    close: this.close.bind(this)\n                });\n            }\n        });\n        kendo.spreadsheet.dialogs.register('message', MessageDialog);\n        var ConfirmationDialog = SpreadsheetDialog.extend({\n            init: function (options) {\n                var messages = kendo.spreadsheet.messages.dialogs.confirmationDialog || MESSAGES;\n                var defaultOptions = {\n                    title: messages.title,\n                    text: messages.text\n                };\n                SpreadsheetDialog.fn.init.call(this, $.extend(defaultOptions, options));\n            },\n            options: {\n                className: 'k-spreadsheet-message',\n                messageId: '',\n                template: '<div class=\\'k-spreadsheet-message-content\\' data-bind=\\'text: text\\' />' + '<div class=\\'k-action-buttons\\'>' + '<button class=\\'k-button k-primary\\' data-bind=\\'click: confirm\\'>' + '#= messages.okText #' + '</button>' + '<button class=\\'k-button\\' data-bind=\\'click: cancel\\'>' + '#= messages.cancel #' + '</button>' + '</div>'\n            },\n            open: function () {\n                SpreadsheetDialog.fn.open.call(this);\n                var options = this.options;\n                var text = options.text;\n                if (options.messageId) {\n                    text = kendo.getter(options.messageId, true)(kendo.spreadsheet.messages.dialogs);\n                }\n                kendo.bind(this.dialog().element, {\n                    text: text,\n                    confirm: this.confirm.bind(this),\n                    cancel: this.close.bind(this)\n                });\n            },\n            isConfirmed: function () {\n                return this._confirmed;\n            },\n            confirm: function () {\n                this._confirmed = true;\n                this.close();\n            }\n        });\n        kendo.spreadsheet.dialogs.register('confirmation', ConfirmationDialog);\n        var ValidationErrorDialog = SpreadsheetDialog.extend({\n            options: {\n                className: 'k-spreadsheet-message',\n                title: '',\n                messageId: '',\n                text: '',\n                template: '<div class=\\'k-spreadsheet-message-content\\' data-bind=\\'text: text\\' />' + '<div class=\\'k-action-buttons\\'>' + '<button class=\\'k-button k-primary\\' data-bind=\\'click: retry\\'>' + '#= messages.retry #' + '</button>' + '<button class=\\'k-button\\' data-bind=\\'click: cancel\\'>' + '#= messages.cancel #' + '</button>' + '</div>'\n            },\n            open: function () {\n                SpreadsheetDialog.fn.open.call(this);\n                var options = this.options;\n                var text = options.text;\n                if (options.messageId) {\n                    text = kendo.getter(options.messageId, true)(kendo.spreadsheet.messages.dialogs);\n                }\n                kendo.bind(this.dialog().element, {\n                    text: text,\n                    retry: this.retry.bind(this),\n                    cancel: this.close.bind(this)\n                });\n            },\n            retry: function () {\n                this._retry = true;\n                this.close();\n            }\n        });\n        kendo.spreadsheet.dialogs.register('validationError', ValidationErrorDialog);\n        var FontFamilyDialog = SpreadsheetDialog.extend({\n            init: function (options) {\n                var messages = kendo.spreadsheet.messages.dialogs.fontFamilyDialog || MESSAGES;\n                SpreadsheetDialog.fn.init.call(this, $.extend({ title: messages.title }, options));\n                this._list();\n            },\n            options: { template: '<ul class=\\'k-list k-reset\\'></ul>' },\n            _list: function () {\n                var ul = this.dialog().element.find('ul');\n                var fonts = this.options.fonts;\n                var defaultFont = this.options.defaultFont;\n                this.list = new kendo.ui.StaticList(ul, {\n                    dataSource: new kendo.data.DataSource({ data: fonts }),\n                    template: '#: data #',\n                    value: defaultFont,\n                    change: this.apply.bind(this)\n                });\n                this.list.dataSource.fetch();\n            },\n            apply: function (e) {\n                SpreadsheetDialog.fn.apply.call(this);\n                this.trigger('action', {\n                    command: 'PropertyChangeCommand',\n                    options: {\n                        property: 'fontFamily',\n                        value: e.sender.value()[0]\n                    }\n                });\n            }\n        });\n        kendo.spreadsheet.dialogs.register('fontFamily', FontFamilyDialog);\n        var FontSizeDialog = SpreadsheetDialog.extend({\n            init: function (options) {\n                var messages = kendo.spreadsheet.messages.dialogs.fontSizeDialog || MESSAGES;\n                SpreadsheetDialog.fn.init.call(this, $.extend({ title: messages.title }, options));\n                this._list();\n            },\n            options: { template: '<ul class=\\'k-list k-reset\\'></ul>' },\n            _list: function () {\n                var ul = this.dialog().element.find('ul');\n                var sizes = this.options.sizes;\n                var defaultSize = this.options.defaultSize;\n                this.list = new kendo.ui.StaticList(ul, {\n                    dataSource: new kendo.data.DataSource({ data: sizes }),\n                    template: '#: data #',\n                    value: defaultSize,\n                    change: this.apply.bind(this)\n                });\n                this.list.dataSource.fetch();\n            },\n            apply: function (e) {\n                SpreadsheetDialog.fn.apply.call(this);\n                this.trigger('action', {\n                    command: 'PropertyChangeCommand',\n                    options: {\n                        property: 'fontSize',\n                        value: kendo.parseInt(e.sender.value()[0])\n                    }\n                });\n            }\n        });\n        kendo.spreadsheet.dialogs.register('fontSize', FontSizeDialog);\n        var BordersDialog = SpreadsheetDialog.extend({\n            init: function (options) {\n                var messages = kendo.spreadsheet.messages.dialogs.bordersDialog || MESSAGES;\n                SpreadsheetDialog.fn.init.call(this, $.extend({ title: messages.title }, options));\n                this.element = this.dialog().element;\n                this._borderPalette();\n                this.viewModel = kendo.observable({\n                    apply: this.apply.bind(this),\n                    close: this.close.bind(this)\n                });\n                kendo.bind(this.element.find('.k-action-buttons'), this.viewModel);\n            },\n            options: {\n                width: 177,\n                template: '<div></div>' + '<div class=\\'k-action-buttons\\'>' + '<button class=\\'k-button k-primary\\' data-bind=\\'click: apply\\'>#: messages.apply #</button>' + '<button class=\\'k-button\\' data-bind=\\'click: close\\'>#: messages.cancel #</button>' + '</div>'\n            },\n            apply: function () {\n                SpreadsheetDialog.fn.apply.call(this);\n                var state = this.value();\n                this.trigger('action', {\n                    command: 'BorderChangeCommand',\n                    options: {\n                        border: state.type,\n                        style: {\n                            size: 1,\n                            color: state.color\n                        }\n                    }\n                });\n            },\n            _borderPalette: function () {\n                var element = this.dialog().element.find('div:first');\n                this.borderPalette = new kendo.spreadsheet.BorderPalette(element, { change: this.value.bind(this) });\n            },\n            value: function (state) {\n                if (state === undefined) {\n                    return this._state;\n                } else {\n                    this._state = state;\n                }\n            }\n        });\n        kendo.spreadsheet.dialogs.register('borders', BordersDialog);\n        var ColorChooser = SpreadsheetDialog.extend({\n            init: function (options) {\n                SpreadsheetDialog.fn.init.call(this, options);\n                this.element = this.dialog().element;\n                this.property = options.property;\n                this.options.title = options.title;\n                this.viewModel = kendo.observable({\n                    apply: this.apply.bind(this),\n                    close: this.close.bind(this)\n                });\n                kendo.bind(this.element.find('.k-action-buttons'), this.viewModel);\n            },\n            options: { template: '<div></div>' + '<div class=\\'k-action-buttons\\'>' + '<button class=\\'k-button k-primary\\' data-bind=\\'click: apply\\'>#: messages.apply #</button>' + '<button class=\\'k-button\\' data-bind=\\'click: close\\'>#: messages.cancel #</button>' + '</div>' },\n            apply: function () {\n                SpreadsheetDialog.fn.apply.call(this);\n                this.trigger('action', {\n                    command: 'PropertyChangeCommand',\n                    options: {\n                        property: this.property,\n                        value: this.value()\n                    }\n                });\n            },\n            value: function (e) {\n                if (e === undefined) {\n                    return this._value;\n                } else {\n                    this._value = e.value;\n                }\n            }\n        });\n        var ColorPickerDialog = ColorChooser.extend({\n            init: function (options) {\n                options.width = 177;\n                ColorChooser.fn.init.call(this, options);\n                this._colorPalette();\n            },\n            _colorPalette: function () {\n                var element = this.dialog().element.find('div:first');\n                this.colorPalette = element.kendoColorPalette({\n                    palette: [\n                        '#ffffff',\n                        '#000000',\n                        '#d6ecff',\n                        '#4e5b6f',\n                        '#7fd13b',\n                        '#ea157a',\n                        '#feb80a',\n                        '#00addc',\n                        '#738ac8',\n                        '#1ab39f',\n                        '#f2f2f2',\n                        '#7f7f7f',\n                        '#a7d6ff',\n                        '#d9dde4',\n                        '#e5f5d7',\n                        '#fad0e4',\n                        '#fef0cd',\n                        '#c5f2ff',\n                        '#e2e7f4',\n                        '#c9f7f1',\n                        '#d8d8d8',\n                        '#595959',\n                        '#60b5ff',\n                        '#b3bcca',\n                        '#cbecb0',\n                        '#f6a1c9',\n                        '#fee29c',\n                        '#8be6ff',\n                        '#c7d0e9',\n                        '#94efe3',\n                        '#bfbfbf',\n                        '#3f3f3f',\n                        '#007dea',\n                        '#8d9baf',\n                        '#b2e389',\n                        '#f272af',\n                        '#fed46b',\n                        '#51d9ff',\n                        '#aab8de',\n                        '#5fe7d5',\n                        '#a5a5a5',\n                        '#262626',\n                        '#003e75',\n                        '#3a4453',\n                        '#5ea226',\n                        '#af0f5b',\n                        '#c58c00',\n                        '#0081a5',\n                        '#425ea9',\n                        '#138677',\n                        '#7f7f7f',\n                        '#0c0c0c',\n                        '#00192e',\n                        '#272d37',\n                        '#3f6c19',\n                        '#750a3d',\n                        '#835d00',\n                        '#00566e',\n                        '#2c3f71',\n                        '#0c594f'\n                    ],\n                    change: this.value.bind(this)\n                }).data('kendoColorPalette');\n            }\n        });\n        kendo.spreadsheet.dialogs.register('colorPicker', ColorPickerDialog);\n        var CustomColorDialog = ColorChooser.extend({\n            init: function (options) {\n                options.width = 268;\n                ColorChooser.fn.init.call(this, options);\n                this.dialog().setOptions({ animation: false });\n                this.dialog().one('activate', this._colorPicker.bind(this));\n            },\n            _colorPicker: function () {\n                var element = this.dialog().element.find('div:first');\n                this.colorPicker = element.kendoFlatColorPicker({ change: this.value.bind(this) }).data('kendoFlatColorPicker');\n            }\n        });\n        kendo.spreadsheet.dialogs.register('customColor', CustomColorDialog);\n        var AlignmentDialog = SpreadsheetDialog.extend({\n            init: function (options) {\n                var messages = kendo.spreadsheet.messages.dialogs.alignmentDialog || MESSAGES;\n                var defaultOptions = {\n                    title: messages.title,\n                    buttons: [\n                        {\n                            property: 'textAlign',\n                            value: 'left',\n                            iconClass: 'align-left',\n                            text: messages.buttons.justtifyLeft\n                        },\n                        {\n                            property: 'textAlign',\n                            value: 'center',\n                            iconClass: 'align-center',\n                            text: messages.buttons.justifyCenter\n                        },\n                        {\n                            property: 'textAlign',\n                            value: 'right',\n                            iconClass: 'align-right',\n                            text: messages.buttons.justifyRight\n                        },\n                        {\n                            property: 'textAlign',\n                            value: 'justify',\n                            iconClass: 'align-justify',\n                            text: messages.buttons.justifyFull\n                        },\n                        {\n                            property: 'verticalAlign',\n                            value: 'top',\n                            iconClass: 'align-top',\n                            text: messages.buttons.alignTop\n                        },\n                        {\n                            property: 'verticalAlign',\n                            value: 'center',\n                            iconClass: 'align-middle',\n                            text: messages.buttons.alignMiddle\n                        },\n                        {\n                            property: 'verticalAlign',\n                            value: 'bottom',\n                            iconClass: 'align-bottom',\n                            text: messages.buttons.alignBottom\n                        }\n                    ]\n                };\n                SpreadsheetDialog.fn.init.call(this, $.extend(defaultOptions, options));\n                this._list();\n            },\n            options: { template: '<ul class=\\'k-list k-reset\\'></ul>' },\n            _list: function () {\n                var ul = this.dialog().element.find('ul');\n                this.list = new kendo.ui.StaticList(ul, {\n                    dataSource: new kendo.data.DataSource({ data: this.options.buttons }),\n                    template: '<a title=\\'#=text#\\' data-property=\\'#=property#\\' data-value=\\'#=value#\\'>' + '<span class=\\'k-icon k-i-#=iconClass#\\'></span>' + '#=text#' + '</a>',\n                    change: this.apply.bind(this)\n                });\n                this.list.dataSource.fetch();\n            },\n            apply: function (e) {\n                var dataItem = e.sender.value()[0];\n                SpreadsheetDialog.fn.apply.call(this);\n                this.trigger('action', {\n                    command: 'PropertyChangeCommand',\n                    options: {\n                        property: dataItem.property,\n                        value: dataItem.value\n                    }\n                });\n            }\n        });\n        kendo.spreadsheet.dialogs.register('alignment', AlignmentDialog);\n        var MergeDialog = SpreadsheetDialog.extend({\n            init: function (options) {\n                var messages = kendo.spreadsheet.messages.dialogs.mergeDialog || MESSAGES;\n                var defaultOptions = {\n                    title: messages.title,\n                    buttons: [\n                        {\n                            value: 'cells',\n                            iconClass: 'cells-merge',\n                            text: messages.buttons.mergeCells\n                        },\n                        {\n                            value: 'horizontally',\n                            iconClass: 'cells-merge-horizontally',\n                            text: messages.buttons.mergeHorizontally\n                        },\n                        {\n                            value: 'vertically',\n                            iconClass: 'cells-merge-vertically',\n                            text: messages.buttons.mergeVertically\n                        },\n                        {\n                            value: 'unmerge',\n                            iconClass: 'table-unmerge',\n                            text: messages.buttons.unmerge\n                        }\n                    ]\n                };\n                SpreadsheetDialog.fn.init.call(this, $.extend(defaultOptions, options));\n                this._list();\n            },\n            options: { template: '<ul class=\\'k-list k-reset\\'></ul>' },\n            _list: function () {\n                var ul = this.dialog().element.find('ul');\n                this.list = new kendo.ui.StaticList(ul, {\n                    dataSource: new kendo.data.DataSource({ data: this.options.buttons }),\n                    template: '<a title=\\'#=text#\\' data-value=\\'#=value#\\'>' + '<span class=\\'k-icon k-icon k-i-#=iconClass#\\'></span>#=text#' + '</a>',\n                    change: this.apply.bind(this)\n                });\n                this.list.dataSource.fetch();\n            },\n            apply: function (e) {\n                var dataItem = e.sender.value()[0];\n                SpreadsheetDialog.fn.apply.call(this);\n                this.trigger('action', {\n                    command: 'MergeCellCommand',\n                    options: { value: dataItem.value }\n                });\n            }\n        });\n        kendo.spreadsheet.dialogs.register('merge', MergeDialog);\n        var FreezeDialog = SpreadsheetDialog.extend({\n            init: function (options) {\n                var messages = kendo.spreadsheet.messages.dialogs.freezeDialog || MESSAGES;\n                var defaultOptions = {\n                    title: messages.title,\n                    buttons: [\n                        {\n                            value: 'panes',\n                            iconClass: 'pane-freeze',\n                            text: messages.buttons.freezePanes\n                        },\n                        {\n                            value: 'rows',\n                            iconClass: 'row-freeze',\n                            text: messages.buttons.freezeRows\n                        },\n                        {\n                            value: 'columns',\n                            iconClass: 'column-freeze',\n                            text: messages.buttons.freezeColumns\n                        },\n                        {\n                            value: 'unfreeze',\n                            iconClass: 'table-unmerge',\n                            text: messages.buttons.unfreeze\n                        }\n                    ]\n                };\n                SpreadsheetDialog.fn.init.call(this, $.extend(defaultOptions, options));\n                this._list();\n            },\n            options: { template: '<ul class=\\'k-list k-reset\\'></ul>' },\n            _list: function () {\n                var ul = this.dialog().element.find('ul');\n                this.list = new kendo.ui.StaticList(ul, {\n                    dataSource: new kendo.data.DataSource({ data: this.options.buttons }),\n                    template: '<a title=\\'#=text#\\' data-value=\\'#=value#\\'>' + '<span class=\\'k-icon k-icon k-i-#=iconClass#\\'></span>#=text#' + '</a>',\n                    change: this.apply.bind(this)\n                });\n                this.list.dataSource.fetch();\n            },\n            apply: function (e) {\n                var dataItem = e.sender.value()[0];\n                SpreadsheetDialog.fn.apply.call(this);\n                this.trigger('action', {\n                    command: 'FreezePanesCommand',\n                    options: { value: dataItem.value }\n                });\n            }\n        });\n        kendo.spreadsheet.dialogs.register('freeze', FreezeDialog);\n        var ValidationViewModel = kendo.spreadsheet.ValidationCellsViewModel = ObservableObject.extend({\n            init: function (options) {\n                ObservableObject.fn.init.call(this, options);\n                this.bind('change', function (e) {\n                    if (e.field === 'criterion') {\n                        this.reset();\n                        if (this.criterion === 'custom' || this.criterion === 'list') {\n                            this.setHintMessageTemplate();\n                        }\n                    }\n                    if (e.field === 'comparer') {\n                        this.setHintMessageTemplate();\n                    }\n                    if ((e.field == 'hintMessage' || e.field == 'hintTitle') && !this._mute) {\n                        this.shouldBuild = false;\n                    }\n                    if ((e.field == 'from' || e.field == 'to' || e.field == 'hintMessageTemplate' || e.field == 'type') && this.shouldBuild) {\n                        this.buildMessages();\n                    }\n                }.bind(this));\n                this.reset();\n            },\n            buildMessages: function () {\n                this._mute = true;\n                this.set('hintTitle', this.hintTitleTemplate ? kendo.format(this.hintTitleTemplate, this.type) : '');\n                this.set('hintMessage', this.hintMessageTemplate ? kendo.format(this.hintMessageTemplate, this.from, this.to) : '');\n                this._mute = false;\n            },\n            reset: function () {\n                this.setComparers();\n                this.set('comparer', this.comparers[0].type);\n                this.set('from', null);\n                this.set('to', null);\n                this.set('useCustomMessages', false);\n                this.shouldBuild = true;\n                this.hintTitleTemplate = this.defaultHintTitle;\n                this.buildMessages();\n            },\n            setComparers: function () {\n                var all = this.defaultComparers;\n                var comparers = [];\n                if (this.criterion === 'text') {\n                    var text_comparers = [\n                        'equalTo',\n                        'notEqualTo'\n                    ];\n                    for (var idx = 0; idx < all.length; idx++) {\n                        if (text_comparers[0] == all[idx].type) {\n                            comparers.push(all[idx]);\n                            text_comparers.shift();\n                        }\n                    }\n                } else {\n                    comparers = all.slice();\n                }\n                this.set('comparers', comparers);\n            },\n            setHintMessageTemplate: function () {\n                if (this.criterion !== 'custom' && this.criterion !== 'list') {\n                    this.set('hintMessageTemplate', kendo.format(this.defaultHintMessage, this.criterion, this.comparerMessages[this.comparer]));\n                } else {\n                    this.set('hintMessageTemplate', '');\n                    this.set('hintMessage', '');\n                }\n            },\n            isAny: function () {\n                return this.get('criterion') === 'any';\n            },\n            isNumber: function () {\n                return this.get('criterion') === 'number';\n            },\n            showToForNumber: function () {\n                return this.showTo() && this.isNumber();\n            },\n            showToForDate: function () {\n                return this.showTo() && this.isDate();\n            },\n            isText: function () {\n                return this.get('criterion') === 'text';\n            },\n            isDate: function () {\n                return this.get('criterion') === 'date';\n            },\n            isList: function () {\n                return this.get('criterion') === 'list';\n            },\n            isCustom: function () {\n                return this.get('criterion') === 'custom';\n            },\n            showRemove: function () {\n                return this.get('hasValidation');\n            },\n            showTo: function () {\n                return this.get('comparer') == 'between' || this.get('comparer') == 'notBetween';\n            },\n            update: function (validation) {\n                this.set('hasValidation', !!validation);\n                if (validation) {\n                    this.fromValidationObject(validation);\n                }\n            },\n            fromValidationObject: function (validation) {\n                this.set('criterion', validation.dataType);\n                this.set('comparer', validation.comparerType);\n                this.set('from', validation.from);\n                this.set('to', validation.to);\n                this.set('type', validation.type);\n                this.set('ignoreBlank', validation.allowNulls);\n                this.set('showButton', validation.showButton);\n                if (validation.messageTemplate || validation.titleTemplate) {\n                    this.hintMessageTemplate = validation.messageTemplate;\n                    this.hintMessage = validation.messageTemplate;\n                    this.hintTitleTemplate = validation.titleTemplate;\n                    this.hintTitle = validation.titleTemplate;\n                    this.useCustomMessages = true;\n                    this.buildMessages();\n                } else {\n                    this.useCustomMessages = false;\n                }\n            },\n            toValidationObject: function () {\n                if (this.criterion === 'any') {\n                    return null;\n                }\n                var options = {\n                    type: this.type,\n                    dataType: this.criterion,\n                    comparerType: this.comparer,\n                    from: this.from,\n                    to: this.to,\n                    allowNulls: this.ignoreBlank,\n                    showButton: this.showButton\n                };\n                if (this.useCustomMessages) {\n                    options.messageTemplate = this.shouldBuild ? this.hintMessageTemplate : this.hintMessage;\n                    options.titleTemplate = this.hintTitle;\n                }\n                return options;\n            }\n        });\n        var ValidationDialog = SpreadsheetDialog.extend({\n            init: function (options) {\n                var messages = kendo.spreadsheet.messages.dialogs.validationDialog || MESSAGES;\n                var defaultOptions = {\n                    title: messages.title,\n                    hintMessage: messages.hintMessage,\n                    hintTitle: messages.hintTitle,\n                    criteria: [\n                        {\n                            type: 'any',\n                            name: messages.criteria.any\n                        },\n                        {\n                            type: 'number',\n                            name: messages.criteria.number\n                        },\n                        {\n                            type: 'text',\n                            name: messages.criteria.text\n                        },\n                        {\n                            type: 'date',\n                            name: messages.criteria.date\n                        },\n                        {\n                            type: 'custom',\n                            name: messages.criteria.custom\n                        },\n                        {\n                            type: 'list',\n                            name: messages.criteria.list\n                        }\n                    ],\n                    comparers: [\n                        {\n                            type: 'greaterThan',\n                            name: messages.comparers.greaterThan\n                        },\n                        {\n                            type: 'lessThan',\n                            name: messages.comparers.lessThan\n                        },\n                        {\n                            type: 'between',\n                            name: messages.comparers.between\n                        },\n                        {\n                            type: 'notBetween',\n                            name: messages.comparers.notBetween\n                        },\n                        {\n                            type: 'equalTo',\n                            name: messages.comparers.equalTo\n                        },\n                        {\n                            type: 'notEqualTo',\n                            name: messages.comparers.notEqualTo\n                        },\n                        {\n                            type: 'greaterThanOrEqualTo',\n                            name: messages.comparers.greaterThanOrEqualTo\n                        },\n                        {\n                            type: 'lessThanOrEqualTo',\n                            name: messages.comparers.lessThanOrEqualTo\n                        }\n                    ],\n                    comparerMessages: messages.comparerMessages\n                };\n                SpreadsheetDialog.fn.init.call(this, $.extend(defaultOptions, options));\n            },\n            options: {\n                width: 450,\n                criterion: 'any',\n                type: 'reject',\n                ignoreBlank: true,\n                showButton: true,\n                useCustomMessages: false,\n                errorTemplate: '<div class=\"k-widget k-tooltip k-tooltip-validation\" style=\"margin:0.5em\"><span class=\"k-icon k-i-warning\"> </span>' + '#= message #<div class=\"k-callout k-callout-n\"></div></div>',\n                template: '<div class=\"k-edit-form-container\">' + '<div class=\"k-edit-label\"><label>#: messages.validationDialog.labels.criteria #:</label></div>' + '<div class=\"k-edit-field\">' + '<select data-role=\"dropdownlist\" ' + 'title=\"#: messages.validationDialog.labels.criteria #\"' + 'data-text-field=\"name\" ' + 'data-value-field=\"type\" ' + 'data-bind=\"value: criterion, source: criteria\" />' + '</div>' + '<div data-bind=\"visible: isNumber\">' + '<div class=\"k-edit-label\"><label>#: messages.validationDialog.labels.comparer #:</label></div>' + '<div class=\"k-edit-field\">' + '<select data-role=\"dropdownlist\" ' + 'title=\"#: messages.validationDialog.labels.comparer #\"' + 'data-text-field=\"name\" ' + 'data-value-field=\"type\" ' + 'data-bind=\"value: comparer, source: comparers\" />' + '</div>' + '<div class=\"k-edit-label\"><label>#: messages.validationDialog.labels.min #:</label></div>' + '<div class=\"k-edit-field\">' + '<input name=\"#: messages.validationDialog.labels.min #\" title=\"#: messages.validationDialog.labels.min #\" placeholder=\"e.g. 10\" class=\"k-textbox\" data-bind=\"value: from, enabled: isNumber\" required=\"required\" />' + '</div>' + '<div data-bind=\"visible: showTo\">' + '<div class=\"k-edit-label\"><label>#: messages.validationDialog.labels.max #:</label></div>' + '<div class=\"k-edit-field\">' + '<input name=\"#: messages.validationDialog.labels.max #\" title=\"#: messages.validationDialog.labels.max #\" placeholder=\"e.g. 100\" class=\"k-textbox\" data-bind=\"value: to, enabled: showToForNumber\" required=\"required\" />' + '</div>' + '</div>' + '</div>' + '<div data-bind=\"visible: isText\">' + '<div class=\"k-edit-label\"><label>#: messages.validationDialog.labels.comparer #:</label></div>' + '<div class=\"k-edit-field\">' + '<select data-role=\"dropdownlist\" ' + 'title=\"#: messages.validationDialog.labels.comparer #\"' + 'data-text-field=\"name\" ' + 'data-value-field=\"type\" ' + 'data-bind=\"value: comparer, source: comparers\" />' + '</div>' + '<div class=\"k-edit-label\"><label>#: messages.validationDialog.labels.value #:</label></div>' + '<div class=\"k-edit-field\">' + '<input name=\"#: messages.validationDialog.labels.value #\" title=\"#: messages.validationDialog.labels.value #\" class=\"k-textbox\" data-bind=\"value: from, enabled: isText\" required=\"required\" />' + '</div>' + '</div>' + '<div data-bind=\"visible: isDate\">' + '<div class=\"k-edit-label\"><label>#: messages.validationDialog.labels.comparer #:</label></div>' + '<div class=\"k-edit-field\">' + '<select data-role=\"dropdownlist\" ' + 'title=\"#: messages.validationDialog.labels.comparer #\"' + 'data-text-field=\"name\" ' + 'data-value-field=\"type\" ' + 'data-bind=\"value: comparer, source: comparers\" />' + '</div>' + '<div class=\"k-edit-label\"><label>#: messages.validationDialog.labels.start #:</label></div>' + '<div class=\"k-edit-field\">' + '<input name=\"#: messages.validationDialog.labels.start #\" title=\"#: messages.validationDialog.labels.start #\" class=\"k-textbox\" data-bind=\"value: from, enabled: isDate\" required=\"required\" />' + '</div>' + '<div data-bind=\"visible: showTo\">' + '<div class=\"k-edit-label\"><label>#: messages.validationDialog.labels.end #:</label></div>' + '<div class=\"k-edit-field\">' + '<input name=\"#: messages.validationDialog.labels.end #\" title=\"#: messages.validationDialog.labels.end #\" class=\"k-textbox\" data-bind=\"value: to, enabled: showToForDate\" required=\"required\" />' + '</div>' + '</div>' + '</div>' + '<div data-bind=\"visible: isCustom\">' + '<div class=\"k-edit-label\"><label>#: messages.validationDialog.labels.value #:</label></div>' + '<div class=\"k-edit-field\">' + '<input name=\"#: messages.validationDialog.labels.value #\" title=\"#: messages.validationDialog.labels.value #\" class=\"k-textbox\" data-bind=\"value: from, enabled: isCustom\" required=\"required\" />' + '</div>' + '</div>' + '<div data-bind=\"visible: isList\">' + '<div class=\"k-edit-label\"><label>#: messages.validationDialog.labels.value #:</label></div>' + '<div class=\"k-edit-field\">' + '<input name=\"#: messages.validationDialog.labels.value #\" title=\"#: messages.validationDialog.labels.value #\" class=\"k-textbox\" data-bind=\"value: from, enabled: isList\" required=\"required\" />' + '</div>' + '</div>' + '<div data-bind=\"visible: isList\">' + '<div class=\"k-edit-field\">' + '<input type=\"checkbox\" name=\"showButton\" id=\"listShowButton\" class=\"k-checkbox\" data-bind=\"checked: showButton\"/>' + '<label for=\"listShowButton\" class=\"k-checkbox-label\">' + ' #: messages.validationDialog.labels.showListButton #' + '</label>' + '</div>' + '</div>' + '<div data-bind=\"visible: isDate\">' + '<div class=\"k-edit-field\">' + '<input type=\"checkbox\" name=\"showButton\" id=\"dateShowButton\" class=\"k-checkbox\" data-bind=\"checked: showButton\"/>' + '<label for=\"dateShowButton\" class=\"k-checkbox-label\">' + ' #: messages.validationDialog.labels.showCalendarButton #' + '</label>' + '</div>' + '</div>' + '<div data-bind=\"invisible: isAny\">' + '<div class=\"k-edit-field\">' + '<input type=\"checkbox\" title=\"#: messages.validationDialog.labels.ignoreBlank #\" name=\"ignoreBlank\" id=\"ignoreBlank\" class=\"k-checkbox\" data-bind=\"checked: ignoreBlank\"/>' + '<label for=\"ignoreBlank\" class=\"k-checkbox-label\">' + ' #: messages.validationDialog.labels.ignoreBlank #' + '</label>' + '</div>' + '</div>' + '<div data-bind=\"invisible: isAny\">' + '<div class=\"k-action-buttons\"></div>' + '<div class=\"k-edit-label\"><label>#: messages.validationDialog.labels.onInvalidData #:</label></div>' + '<div class=\"k-edit-field\">' + '<input type=\"radio\" title=\"#: messages.validationDialog.labels.rejectInput #\" id=\"validationTypeReject\" name=\"validationType\" value=\"reject\" data-bind=\"checked: type\" class=\"k-radio\" />' + '<label for=\"validationTypeReject\" class=\"k-radio-label\">' + '#: messages.validationDialog.labels.rejectInput #' + '</label> ' + '<input type=\"radio\" title=\"#: messages.validationDialog.labels.showWarning #\" id=\"validationTypeWarning\"  name=\"validationType\" value=\"warning\" data-bind=\"checked: type\" class=\"k-radio\" />' + '<label for=\"validationTypeWarning\" class=\"k-radio-label\">' + '#: messages.validationDialog.labels.showWarning #' + '</label>' + '</div>' + '</div>' + '<div data-bind=\"invisible: isAny\" class=\"hint-wrapper\">' + '<div class=\"k-edit-field\">' + '<input type=\"checkbox\" title=\"#: messages.validationDialog.labels.showHint #\" name=\"useCustomMessages\" id=\"useCustomMessages\" class=\"k-checkbox\" data-bind=\"checked: useCustomMessages\" />' + '<label class=\"k-checkbox-label\" for=\"useCustomMessages\">' + ' #: messages.validationDialog.labels.showHint #' + '</label>' + '</div>' + '<div data-bind=\"visible: useCustomMessages\">' + '<div class=\"k-edit-label\"><label>#: messages.validationDialog.labels.hintTitle #:</label></div>' + '<div class=\"k-edit-field\">' + '<input class=\"k-textbox\" title=\"#: messages.validationDialog.labels.hintTitle #\" placeholder=\"#: messages.validationDialog.placeholders.typeTitle #\" data-bind=\"value: hintTitle\" />' + '</div>' + '<div class=\"k-edit-label\"><label>#: messages.validationDialog.labels.hintMessage #:</label></div>' + '<div class=\"k-edit-field\">' + '<input class=\"k-textbox\" title=\"#: messages.validationDialog.labels.hintMessage #\" placeholder=\"#: messages.validationDialog.placeholders.typeMessage #\" data-bind=\"value: hintMessage\" />' + '</div>' + '</div>' + '</div>' + '<div class=\"k-action-buttons\">' + '<button class=\"k-button\" data-bind=\"visible: showRemove, click: remove\">#: messages.remove #</button>' + '<button class=\"k-button k-primary\" data-bind=\"click: apply\">#: messages.apply #</button>' + '<button class=\"k-button\" data-bind=\"click: close\">#: messages.cancel #</button>' + '</div>' + '</div>'\n            },\n            open: function (range) {\n                var options = this.options;\n                var element;\n                this.viewModel = new ValidationViewModel({\n                    type: options.type,\n                    defaultHintMessage: options.hintMessage,\n                    defaultHintTitle: options.hintTitle,\n                    defaultComparers: options.comparers.slice(0),\n                    comparerMessages: options.comparerMessages,\n                    criteria: options.criteria.slice(0),\n                    criterion: options.criterion,\n                    ignoreBlank: options.ignoreBlank,\n                    showButton: options.showButton,\n                    apply: this.apply.bind(this),\n                    close: this.close.bind(this),\n                    remove: this.remove.bind(this)\n                });\n                this.viewModel.update(range.validation());\n                SpreadsheetDialog.fn.open.call(this);\n                element = this.dialog().element;\n                if (this.validatable) {\n                    this.validatable.destroy();\n                }\n                kendo.bind(element, this.viewModel);\n                this.validatable = new kendo.ui.Validator(element.find('.k-edit-form-container'), {\n                    validateOnBlur: false,\n                    errorTemplate: this.options.errorTemplate || undefined\n                });\n            },\n            apply: function () {\n                if (this.validatable.validate()) {\n                    SpreadsheetDialog.fn.apply.call(this);\n                    this.trigger('action', {\n                        command: 'EditValidationCommand',\n                        options: { value: this.viewModel.toValidationObject() }\n                    });\n                }\n            },\n            remove: function () {\n                this.viewModel.set('criterion', 'any');\n                this.apply();\n            }\n        });\n        kendo.spreadsheet.dialogs.register('validation', ValidationDialog);\n        kendo.spreadsheet.dialogs.ValidationDialog = ValidationDialog;\n        var ExportAsDialog = SpreadsheetDialog.extend({\n            init: function (options) {\n                var messages = kendo.spreadsheet.messages.dialogs.exportAsDialog || MESSAGES;\n                SpreadsheetDialog.fn.init.call(this, $.extend({ title: messages.title }, options));\n                this.viewModel = kendo.observable({\n                    title: this.options.title,\n                    name: this.options.name,\n                    extension: this.options.extension,\n                    fileFormats: this.options.fileFormats,\n                    excel: options.excelExport,\n                    pdf: {\n                        proxyURL: options.pdfExport.proxyURL,\n                        forceProxy: options.pdfExport.forceProxy,\n                        title: options.pdfExport.title,\n                        author: options.pdfExport.author,\n                        subject: options.pdfExport.subject,\n                        keywords: options.pdfExport.keywords,\n                        creator: options.pdfExport.creator,\n                        date: options.pdfExport.date,\n                        fitWidth: this.options.pdf.fitWidth,\n                        area: this.options.pdf.area,\n                        areas: this.options.pdf.areas,\n                        paperSize: this.options.pdf.paperSize,\n                        paperSizes: this.options.pdf.paperSizes,\n                        margin: this.options.pdf.margin,\n                        margins: this.options.pdf.margins,\n                        landscape: this.options.pdf.landscape,\n                        guidelines: this.options.pdf.guidelines,\n                        hCenter: this.options.pdf.hCenter,\n                        vCenter: this.options.pdf.vCenter\n                    },\n                    apply: this.apply.bind(this),\n                    close: this.close.bind(this)\n                });\n                var dialog = this.dialog();\n                this.viewModel.bind('change', function (e) {\n                    if (e.field === 'extension') {\n                        this.set('showPdfOptions', this.extension === '.pdf' ? true : false);\n                        dialog.center();\n                    }\n                });\n                kendo.bind(dialog.element, this.viewModel);\n            },\n            options: {\n                name: 'Workbook',\n                extension: '.xlsx',\n                fileFormats: [\n                    {\n                        description: 'Excel Workbook (.xlsx)',\n                        extension: '.xlsx'\n                    },\n                    {\n                        description: 'Portable Document Format(.pdf)',\n                        extension: '.pdf'\n                    }\n                ],\n                pdf: {\n                    fitWidth: true,\n                    area: 'workbook',\n                    areas: [\n                        {\n                            area: 'workbook',\n                            text: 'Entire Workbook'\n                        },\n                        {\n                            area: 'sheet',\n                            text: 'Active Sheet'\n                        },\n                        {\n                            area: 'selection',\n                            text: 'Selection'\n                        }\n                    ],\n                    paperSize: 'a4',\n                    paperSizes: [\n                        {\n                            value: 'a2',\n                            text: 'A2 (420 mm \\xD7 594 mm)     '\n                        },\n                        {\n                            value: 'a3',\n                            text: 'A3 (297 mm x 420 mm)     '\n                        },\n                        {\n                            value: 'a4',\n                            text: 'A4 (210 mm x 297 mm)     '\n                        },\n                        {\n                            value: 'a5',\n                            text: 'A5 (148 mm x 210 mm)     '\n                        },\n                        {\n                            value: 'b3',\n                            text: 'B3 (353 mm \\xD7 500 mm)     '\n                        },\n                        {\n                            value: 'b4',\n                            text: 'B4 (250 mm x 353 mm)     '\n                        },\n                        {\n                            value: 'b5',\n                            text: 'B5 (176 mm x 250 mm)     '\n                        },\n                        {\n                            value: 'folio',\n                            text: 'Folio (8.5\" x 13\")       '\n                        },\n                        {\n                            value: 'legal',\n                            text: 'Legal (8.5\" x 14\")       '\n                        },\n                        {\n                            value: 'letter',\n                            text: 'Letter (8.5\" x 11\")      '\n                        },\n                        {\n                            value: 'tabloid',\n                            text: 'Tabloid (11\" x 17\")      '\n                        },\n                        {\n                            value: 'executive',\n                            text: 'Executive (7.25\" x 10.5\")'\n                        }\n                    ],\n                    margin: {\n                        bottom: '0.75in',\n                        left: '0.7in',\n                        right: '0.7in',\n                        top: '0.75in'\n                    },\n                    margins: [\n                        {\n                            value: {\n                                bottom: '0.75in',\n                                left: '0.7in',\n                                right: '0.7in',\n                                top: '0.75in'\n                            },\n                            text: 'Normal'\n                        },\n                        {\n                            value: {\n                                bottom: '0.75in',\n                                left: '0.25in',\n                                right: '0.25in',\n                                top: '0.75in'\n                            },\n                            text: 'Narrow'\n                        },\n                        {\n                            value: {\n                                bottom: '1in',\n                                left: '1in',\n                                right: '1in',\n                                top: '1in'\n                            },\n                            text: 'Wide'\n                        }\n                    ],\n                    landscape: true,\n                    guidelines: true,\n                    hCenter: true,\n                    vCenter: true\n                },\n                width: 520,\n                template: '<div class=\\'k-edit-label\\'><label>#: messages.exportAsDialog.labels.fileName #:</label></div>' + '<div class=\\'k-edit-field\\'>' + '<input class=\\'k-textbox\\' data-bind=\\'value: name\\' />' + '</div>' + '<div >' + '<div class=\\'k-edit-label\\'><label>#: messages.exportAsDialog.labels.saveAsType #:</label></div>' + '<div class=\\'k-edit-field\\'>' + '<select data-role=\\'dropdownlist\\' class=\\'k-file-format\\' ' + 'data-text-field=\\'description\\' ' + 'data-value-field=\\'extension\\' ' + 'data-bind=\\'value: extension, source: fileFormats\\' />' + '</div>' + '</div>' + '<div class=\\'export-config\\' data-bind=\\'visible: showPdfOptions\\'>' + '<div class=\\'k-edit-label\\'><label>#: messages.exportAsDialog.labels.exportArea #:</label></div>' + '<div class=\\'k-edit-field\\'>' + '<select data-role=\\'dropdownlist\\' class=\\'k-file-format\\' ' + 'data-text-field=\\'text\\' ' + 'data-value-field=\\'area\\' ' + 'data-bind=\\'value: pdf.area, source: pdf.areas\\' />' + '</div>' + '<div class=\\'k-edit-label\\'><label>#: messages.exportAsDialog.labels.paperSize#:</label></div>' + '<div class=\\'k-edit-field\\'>' + '<select data-role=\\'dropdownlist\\' class=\\'k-file-format\\' ' + 'data-text-field=\\'text\\' ' + 'data-value-field=\\'value\\' ' + 'data-bind=\\'value: pdf.paperSize, source: pdf.paperSizes\\' />' + '</div>' + '<div class=\\'k-edit-label\\'><label>#: messages.exportAsDialog.labels.margins #:</label></div>' + '<div class=\\'k-edit-field\\'>' + '<select data-role=\\'dropdownlist\\' class=\\'k-file-format\\' ' + 'data-value-primitive=\\'true\\'' + 'data-text-field=\\'text\\' ' + 'data-value-field=\\'value\\' ' + 'data-bind=\\'value: pdf.margin, source: pdf.margins\\' />' + '</div>' + '<div class=\\'k-edit-label\\'><label>#: messages.exportAsDialog.labels.orientation #:</label></div>' + '<div class=\\'k-edit-field\\'>' + '<input type=\\'radio\\' id=\\'k-orientation-portrait\\' name=\\'orientation\\' data-type=\\'boolean\\' data-bind=\\'checked: pdf.landscape\\' value=\\'false\\' /><label class=\\'k-orientation-label k-orientation-portrait-label\\' for=\\'k-orientation-portrait\\'></label>' + '<input type=\\'radio\\' id=\\'k-orientation-landscape\\' name=\\'orientation\\' data-type=\\'boolean\\' data-bind=\\'checked: pdf.landscape\\' value=\\'true\\' /><label class=\\'k-orientation-label k-orientation-landscape-label\\' for=\\'k-orientation-landscape\\'></label>' + '</div>' + '<div class=\\'k-edit-label\\'><label>#: messages.exportAsDialog.labels.print #:</label></div>' + '<div class=\\'k-edit-field\\'>' + '<input class=\\'k-checkbox\\' id=\\'guidelines\\' type=\\'checkbox\\' data-bind=\\'checked: pdf.guidelines\\'/><label class=\\'k-checkbox-label\\' for=\\'guidelines\\'>#: messages.exportAsDialog.labels.guidelines#</label>' + '</div>' + '<div class=\\'k-edit-label\\'><label>#: messages.exportAsDialog.labels.scale #:</label></div>' + '<div class=\\'k-edit-field\\'>' + '<input class=\\'k-checkbox\\' id=\\'fitWidth\\' type=\\'checkbox\\' data-bind=\\'checked: pdf.fitWidth\\'/><label class=\\'k-checkbox-label\\' for=\\'fitWidth\\'>#: messages.exportAsDialog.labels.fit #</label>' + '</div>' + '<div class=\\'k-edit-label\\'><label>#: messages.exportAsDialog.labels.center #:</label></div>' + '<div class=\\'k-edit-field\\'>' + '<input class=\\'k-checkbox\\' id=\\'hCenter\\' type=\\'checkbox\\' data-bind=\\'checked: pdf.hCenter\\'/><label class=\\'k-checkbox-label\\' for=\\'hCenter\\'>#: messages.exportAsDialog.labels.horizontally #</label>' + '<input class=\\'k-checkbox\\' id=\\'vCenter\\' type=\\'checkbox\\' data-bind=\\'checked: pdf.vCenter\\'/><label class=\\'k-checkbox-label\\' for=\\'vCenter\\'>#: messages.exportAsDialog.labels.vertically #</label>' + '</div>' + '<div class=\\'k-page-orientation\\' data-bind=\\'css: {k-page-landscape: pdf.landscape}\\'>' + '<div class=\\'k-margins-horizontal\\'></div>' + '<div class=\\'k-margins-vertical\\'></div>' + '</div>' + '</div>' + '<div class=\\'k-action-buttons\\'>' + '<button class=\\'k-button k-primary\\' data-bind=\\'click: apply\\'>#: messages.save #</button>' + '<button class=\\'k-button\\' data-bind=\\'click: close\\'>#: messages.cancel #</button>' + '</div>'\n            },\n            apply: function () {\n                SpreadsheetDialog.fn.apply.call(this);\n                this.trigger('action', {\n                    command: 'SaveAsCommand',\n                    options: this.viewModel\n                });\n            }\n        });\n        kendo.spreadsheet.dialogs.register('exportAs', ExportAsDialog);\n        function basicErrorDialog(id, msg) {\n            kendo.spreadsheet.dialogs.register(id, MessageDialog.extend({ options: { messageId: msg } }));\n        }\n        basicErrorDialog('modifyMerged', 'modifyMergedDialog.errorMessage');\n        basicErrorDialog('rangeDisabled', 'rangeDisabledDialog.errorMessage');\n        basicErrorDialog('overflow', 'overflowDialog.errorMessage');\n        basicErrorDialog('unsupportedSelection', 'unsupportedSelectionDialog.errorMessage');\n        basicErrorDialog('incompatibleRanges', 'incompatibleRangesDialog.errorMessage');\n        basicErrorDialog('noFillDirection', 'noFillDirectionDialog.errorMessage');\n        basicErrorDialog('duplicateSheetName', 'duplicateSheetNameDialog.errorMessage');\n        var ImportErrorDialog = MessageDialog.extend({\n            options: {\n                width: 640,\n                title: 'Errors in import',\n                template: '<div class=\\'k-spreadsheet-message-content k-spreadsheet-import-errors\\'>' + '<div class=\\'k--header-message\\'>We encountered #= errors.length # errors while reading this file.  Please be aware that some formulas might be missing, or contain invalid results.</div>' + '<div class=\\'k--errors\\'>' + '<table>' + '<thead>' + '<tr><th>Context</th><th>Error message</th></tr>' + '</thead>' + '# for (var i = 0; i < errors.length; ++i) { #' + '# var err = errors[i]; #' + '<tr><td>#: err.context #</td><td>#: err.error #</td></tr>' + '# } #' + '</table>' + '</div>' + '</div>' + '<div class=\\'k-action-buttons\\'>' + '<button class=\\'k-button k-primary\\' data-bind=\\'click: close\\'>' + '#: messages.okText #' + '</button>' + '</div>'\n            }\n        });\n        kendo.spreadsheet.dialogs.register('importError', ImportErrorDialog);\n        var UseKeyboardDialog = MessageDialog.extend({\n            init: function (options) {\n                var messages = kendo.spreadsheet.messages.dialogs.useKeyboardDialog || MESSAGES;\n                SpreadsheetDialog.fn.init.call(this, $.extend({ title: messages.title }, options));\n            },\n            options: { template: '#: messages.useKeyboardDialog.errorMessage #' + '<div>Ctrl+C #: messages.useKeyboardDialog.labels.forCopy #</div>' + '<div>Ctrl+X #: messages.useKeyboardDialog.labels.forCut #</div>' + '<div>Ctrl+V #: messages.useKeyboardDialog.labels.forPaste #</div>' + '<div class=\"k-action-buttons\">' + '<button class=\\'k-button k-primary\\' data-bind=\\'click: close\\'>' + '#= messages.okText #' + '</button>' + '</div>' }\n        });\n        kendo.spreadsheet.dialogs.register('useKeyboard', UseKeyboardDialog);\n        var HyperlinkDialog = SpreadsheetDialog.extend({\n            options: {\n                template: '<div class=\\'k-edit-label\\'><label>#: messages.linkDialog.labels.url #:</label></div>' + '<div class=\\'k-edit-field\\'><input class=\\'k-textbox\\' data-bind=\\'value: url\\' title=\\'#: messages.linkDialog.labels.url #\\' /></div>' + '<div class=\\'k-action-buttons\\'>' + ('<button style=\\'float: left\\' class=\\'k-button\\' data-bind=\\'click: remove\\'>#= messages.linkDialog.labels.removeLink #</button>' + '<button class=\\'k-button k-primary\\' data-bind=\\'click: apply\\'>#= messages.okText #</button>' + '<button class=\\'k-button\\' data-bind=\\'click: cancel\\'>#= messages.cancel #</button>') + '</div>',\n                title: MESSAGES.linkDialog.title,\n                autoFocus: false\n            },\n            open: function (range) {\n                var self = this;\n                SpreadsheetDialog.fn.open.apply(self, arguments);\n                var element = self.dialog().element;\n                var model = kendo.observable({\n                    url: range.link(),\n                    apply: function () {\n                        if (!/\\S/.test(model.url)) {\n                            model.url = null;\n                        }\n                        self.trigger('action', {\n                            command: 'HyperlinkCommand',\n                            options: { link: model.url }\n                        });\n                        self.close();\n                    },\n                    remove: function () {\n                        model.url = null;\n                        model.apply();\n                    },\n                    cancel: self.close.bind(self)\n                });\n                kendo.bind(element, model);\n                element.find('input').focus().on('keydown', function (ev) {\n                    if (ev.keyCode == 13) {\n                        model.url = $(this).val();\n                        ev.stopPropagation();\n                        ev.preventDefault();\n                        model.apply();\n                    } else if (ev.keyCode == 27) {\n                        ev.stopPropagation();\n                        ev.preventDefault();\n                        model.cancel();\n                    }\n                });\n            }\n        });\n        kendo.spreadsheet.dialogs.register('hyperlink', HyperlinkDialog);\n    }(window.kendo));\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('spreadsheet/sheetbinder', [\n        'kendo.core',\n        'kendo.data',\n        'spreadsheet/sheet'\n    ], f);\n}(function () {\n    (function (kendo) {\n        if (kendo.support.browser.msie && kendo.support.browser.version < 9) {\n            return;\n        }\n        var identity = function (o) {\n            return o;\n        };\n        var SheetDataSourceBinder = kendo.Class.extend({\n            init: function (options) {\n                this.options = $.extend({}, this.options, options);\n                this.columns = this._normalizeColumns(this.options.columns);\n                this._sheet();\n                this._dataSource();\n                this._header();\n                this._boundRowsCount = 0;\n                this.dataSource.fetch();\n            },\n            _sheet: function () {\n                this.sheet = this.options.sheet;\n                this._sheetChangeHandler = this._sheetChange.bind(this);\n                this._sheetDeleteRowHandler = this._sheetDeleteRow.bind(this);\n                this._sheetInsertRowHandler = this._sheetInsertRow.bind(this);\n                this.sheet.bind('change', this._sheetChangeHandler).bind('afterDeleteRow', this._sheetDeleteRowHandler).bind('afterInsertRow', this._sheetInsertRowHandler);\n            },\n            _sheetInsertRow: function (e) {\n                if (e.index !== undefined) {\n                    this.dataSource.insert(Math.max(e.index - 1, 0), {});\n                }\n            },\n            _sheetDeleteRow: function (e) {\n                if (e.index !== undefined) {\n                    var dataSource = this.dataSource;\n                    var model = dataSource.view()[e.index - 1];\n                    if (model) {\n                        dataSource.remove(model);\n                    }\n                }\n            },\n            _header: function () {\n                this.sheet.batch(function () {\n                    this.columns.forEach(function (column, index) {\n                        this.sheet.range(0, index).value(column.title);\n                    }.bind(this));\n                }.bind(this));\n            },\n            _sheetChange: function (e) {\n                if (e.insertRow || e.deleteRow) {\n                    return;\n                }\n                if (e.recalc && e.ref) {\n                    var dataSource = this.dataSource;\n                    var data = dataSource.view();\n                    var columns = this.columns;\n                    var fields;\n                    if (dataSource.reader.model) {\n                        fields = dataSource.reader.model.fields;\n                    }\n                    if (!columns.length && data.length) {\n                        columns = Object.keys(data[0].toJSON());\n                    }\n                    var getters = columns.map(function (column) {\n                        var field = column.field;\n                        if (field && fields && fields[field] && fields[field].type == 'date') {\n                            return kendo.spreadsheet.numberToDate;\n                        }\n                        return identity;\n                    });\n                    this._skipRebind = true;\n                    var normalizedRef = this.sheet._grid.normalize(e.ref);\n                    var values = this.sheet.range(normalizedRef).values();\n                    normalizedRef.forEach(function (ref) {\n                        ref = ref.toRangeRef();\n                        var record;\n                        var valueIndex = 0;\n                        for (var ri = ref.topLeft.row; ri <= ref.bottomRight.row; ri++) {\n                            record = data[ri - 1];\n                            if (!record) {\n                                record = dataSource.insert(ri - 1, {});\n                                data = dataSource.view();\n                            }\n                            var colValueIndex = 0;\n                            for (var ci = ref.topLeft.col; ci <= ref.bottomRight.col && ci < columns.length; ci++) {\n                                record.set(columns[ci].field, getters[ci](values[valueIndex][colValueIndex++]));\n                            }\n                            valueIndex++;\n                        }\n                    });\n                    this._boundRowsCount = dataSource.view().length;\n                    this._skipRebind = false;\n                }\n            },\n            _normalizeColumns: function (columns) {\n                return columns.map(function (column) {\n                    var field = column.field || column;\n                    return {\n                        field: field,\n                        title: column.title || field\n                    };\n                });\n            },\n            _dataSource: function () {\n                var options = this.options;\n                var dataSource = options.dataSource;\n                dataSource = Array.isArray(dataSource) ? { data: dataSource } : dataSource;\n                if (this.dataSource && this._changeHandler) {\n                    this.dataSource.unbind('change', this._changeHandler);\n                } else {\n                    this._changeHandler = this._change.bind(this);\n                }\n                this.dataSource = kendo.data.DataSource.create(dataSource).bind('change', this._changeHandler);\n            },\n            _change: function () {\n                if (this._skipRebind) {\n                    return;\n                }\n                var data = this.dataSource.view();\n                var columns = this.columns;\n                if (!columns.length && data.length) {\n                    this.columns = columns = this._normalizeColumns(Object.keys(data[0].toJSON()));\n                    this._header();\n                }\n                var getters = columns.map(function (column) {\n                    return kendo.getter(column.field);\n                });\n                this.sheet.batch(function () {\n                    var length = Math.max(data.length, this._boundRowsCount);\n                    for (var idx = 0; idx < length; idx++) {\n                        for (var getterIdx = 0; getterIdx < getters.length; getterIdx++) {\n                            var value = data[idx] ? getters[getterIdx](data[idx]) : null;\n                            this.sheet.range(idx + 1, getterIdx).value(value);\n                        }\n                    }\n                }.bind(this));\n                this._boundRowsCount = data.length;\n            },\n            destroy: function () {\n                this.dataSource.unbind('change', this._changeHandler);\n                this.sheet.unbind('change', this._sheetChangeHandler).unbind('deleteRow', this._sheetDeleteRowHandler).unbind('insertRow', this._sheetInsertRowHandler);\n            },\n            options: { columns: [] }\n        });\n        kendo.spreadsheet.SheetDataSourceBinder = SheetDataSourceBinder;\n    }(kendo));\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('spreadsheet/filtermenu', [\n        'kendo.core',\n        'kendo.popup',\n        'kendo.treeview',\n        'kendo.numerictextbox',\n        'kendo.datepicker',\n        'kendo.datetimepicker'\n    ], f);\n}(function () {\n    (function (kendo) {\n        if (kendo.support.browser.msie && kendo.support.browser.version < 9) {\n            return;\n        }\n        var $ = kendo.jQuery;\n        var Widget = kendo.ui.Widget;\n        var classNames = {\n            details: 'k-details',\n            button: 'k-button',\n            detailsSummary: 'k-details-summary',\n            detailsContent: 'k-details-content',\n            icon: 'k-icon',\n            iconCollapse: 'k-i-arrow-45-down-right',\n            iconExpand: 'k-i-arrow-60-right',\n            iconSearch: 'k-i-zoom',\n            textbox: 'k-textbox',\n            wrapper: 'k-spreadsheet-filter-menu',\n            filterByCondition: 'k-spreadsheet-condition-filter',\n            filterByValue: 'k-spreadsheet-value-filter',\n            valuesTreeViewWrapper: 'k-spreadsheet-value-treeview-wrapper',\n            actionButtons: 'k-action-buttons'\n        };\n        var Details = Widget.extend({\n            init: function (element, options) {\n                Widget.fn.init.call(this, element, options);\n                this.element.addClass(FilterMenu.classNames.details);\n                this._summary = this.element.find('.' + FilterMenu.classNames.detailsSummary).on('click', this._toggle.bind(this));\n                var iconClass = options.expanded ? FilterMenu.classNames.iconCollapse : FilterMenu.classNames.iconExpand;\n                this._icon = $('<span />', { 'class': FilterMenu.classNames.icon + ' ' + iconClass }).prependTo(this._summary);\n                this._container = kendo.wrap(this._summary.next(), true);\n                if (!options.expanded) {\n                    this._container.hide();\n                }\n            },\n            options: { name: 'Details' },\n            events: ['toggle'],\n            visible: function () {\n                return this.options.expanded;\n            },\n            toggle: function (show) {\n                var animation = kendo.fx(this._container).expand('vertical');\n                animation.stop()[show ? 'reverse' : 'play']();\n                this._icon.toggleClass(FilterMenu.classNames.iconExpand, show).toggleClass(FilterMenu.classNames.iconCollapse, !show);\n                this.options.expanded = !show;\n            },\n            _toggle: function () {\n                var show = this.visible();\n                this.toggle(show);\n                this.trigger('toggle', { show: show });\n            }\n        });\n        var FILTERMENU_MESSAGES = kendo.spreadsheet.messages.filterMenu = {\n            sortAscending: 'Sort range A to Z',\n            sortDescending: 'Sort range Z to A',\n            filterByValue: 'Filter by value',\n            filterByCondition: 'Filter by condition',\n            apply: 'Apply',\n            search: 'Search',\n            addToCurrent: 'Add to current selection',\n            clear: 'Clear',\n            blanks: '(Blanks)',\n            operatorNone: 'None',\n            and: 'AND',\n            or: 'OR',\n            operators: {\n                string: {\n                    contains: 'Text contains',\n                    doesnotcontain: 'Text does not contain',\n                    startswith: 'Text starts with',\n                    endswith: 'Text ends with',\n                    matches: 'Text matches',\n                    doesnotmatch: 'Text does not match'\n                },\n                date: {\n                    eq: 'Date is',\n                    neq: 'Date is not',\n                    lt: 'Date is before',\n                    gt: 'Date is after'\n                },\n                number: {\n                    eq: 'Is equal to',\n                    neq: 'Is not equal to',\n                    gte: 'Is greater than or equal to',\n                    gt: 'Is greater than',\n                    lte: 'Is less than or equal to',\n                    lt: 'Is less than'\n                }\n            }\n        };\n        kendo.data.binders.spreadsheetFilterValue = kendo.data.Binder.extend({\n            init: function (element, bindings, options) {\n                kendo.data.Binder.fn.init.call(this, element, bindings, options);\n                this._change = $.proxy(this.change, this);\n                $(this.element).on('change', this._change);\n            },\n            refresh: function () {\n                var that = this, value = that.bindings.spreadsheetFilterValue.get();\n                $(that.element).val(value instanceof Date ? '' : value);\n            },\n            change: function () {\n                var value = this.element.value;\n                this.bindings.spreadsheetFilterValue.set(value);\n            }\n        });\n        kendo.data.binders.widget.spreadsheetFilterValue = kendo.data.Binder.extend({\n            init: function (widget, bindings, options) {\n                kendo.data.Binder.fn.init.call(this, widget.element[0], bindings, options);\n                this.widget = widget;\n                this._change = $.proxy(this.change, this);\n                this.widget.first('change', this._change);\n            },\n            refresh: function () {\n                var binding = this.bindings.spreadsheetFilterValue, value = binding.get(), type = $(this.widget.element).data('filterType');\n                if (type === 'date' && value instanceof Date || type === 'number' && !isNaN(value)) {\n                    this.widget.value(value);\n                } else {\n                    this.widget.value(null);\n                }\n            },\n            change: function () {\n                var value = this.widget.value(), binding = this.bindings.spreadsheetFilterValue;\n                binding.set(value);\n            }\n        });\n        var templates = {\n            filterByValue: '<div class=\\'' + classNames.detailsSummary + '\\'>#= messages.filterByValue #</div>' + '<div class=\\'' + classNames.detailsContent + '\\'>' + '<div class=\\'k-textbox k-space-right\\'>' + '<input placeholder=\\'#= messages.search #\\' data-#=ns#bind=\\'events: { input: filterValues }\\' />' + '<span class=\\'k-icon k-i-zoom\\' />' + '</div>' + '<div data-#=ns#bind=\\'visible: hasActiveSearch\\'><input class=\\'k-checkbox\\' type=\\'checkbox\\' data-#=ns#bind=\\'checked: appendToSearch\\' id=\\'_#=guid#\\' /><label class=\\'k-checkbox-label\\' for=\\'_#=guid#\\'>#= messages.addToCurrent #</label></div>' + '<div class=\\'' + classNames.valuesTreeViewWrapper + '\\'>' + '<div data-#=ns#role=\\'treeview\\' ' + 'data-#=ns#checkboxes=\\'{ checkChildren: true }\\' ' + 'data-#=ns#bind=\\'source: valuesDataSource, events: { check: valuesChange, select: valueSelect }\\' ' + '/>' + '</div>' + '</div>',\n            filterByCondition: '<div class=\\'' + classNames.detailsSummary + '\\'>#= messages.filterByCondition #</div>' + '<div class=\\'' + classNames.detailsContent + '\\'>' + '<div>' + '<select ' + 'data-#=ns#role=\"dropdownlist\"' + 'data-#=ns#bind=\"value: operator, source: operators, events: { change: operatorChange } \"' + 'data-value-primitive=\"false\"' + 'data-option-label=\"#=messages.operatorNone#\"' + 'data-height=\"auto\"' + 'data-text-field=\"text\"' + 'data-value-field=\"unique\">' + '</select>' + '</div>' + '<div data-#=ns#bind=\"visible: isString\">' + '<input data-filter-type=\"string\" data-#=ns#bind=\"spreadsheetFilterValue: customFilter.criteria[0].value\" class=\"k-textbox\" />' + '</div>' + '<div data-#=ns#bind=\"visible: isNumber\">' + '<input data-filter-type=\"number\" data-#=ns#role=\"numerictextbox\" data-#=ns#bind=\"spreadsheetFilterValue: customFilter.criteria[0].value\" />' + '</div>' + '<div data-#=ns#bind=\"visible: isDate\">' + '<input data-filter-type=\"date\" data-#=ns#role=\"datepicker\" data-#=ns#bind=\"spreadsheetFilterValue: customFilter.criteria[0].value\" />' + '</div>' + '</div>',\n            menuItem: '<li data-command=\\'#=command#\\' data-dir=\\'#=dir#\\'>' + '<span class=\\'k-icon k-i-#=iconClass#\\'></span>#=text#' + '</li>',\n            actionButtons: '<button data-#=ns#bind=\\'click: apply\\' class=\\'k-button k-primary\\'>#=messages.apply#</button>' + '<button data-#=ns#bind=\\'click: clear\\' class=\\'k-button\\'>#=messages.clear#</button>'\n        };\n        function distinctValues(values) {\n            var hash = {};\n            var result = [];\n            for (var i = 0; i < values.length; i++) {\n                if (!hash[values[i].value]) {\n                    hash[values[i].value] = values[i];\n                    result.push(values[i]);\n                } else if (!hash[values[i].value].checked && values[i].checked) {\n                    hash[values[i].value].checked = true;\n                }\n            }\n            return result;\n        }\n        function filter(dataSource, query) {\n            var hasVisibleChildren = false;\n            var data = dataSource instanceof kendo.data.HierarchicalDataSource && dataSource.data();\n            var valuesFilter = this;\n            var values = this.values;\n            for (var i = 0; i < data.length; i++) {\n                var item = data[i];\n                var text = item.text.toString().toLowerCase();\n                var itemVisible = query === true || query === '' || text.indexOf(query) >= 0;\n                var filterSpread = filter.bind(valuesFilter);\n                var anyVisibleChildren = filterSpread(item.children, query);\n                hasVisibleChildren = hasVisibleChildren || anyVisibleChildren || itemVisible;\n                item.hidden = !itemVisible && !anyVisibleChildren;\n                if (query.length || values && !values.length) {\n                    item.checked = !item.hidden;\n                } else if (values && values.indexOf(item.text) != -1) {\n                    item.checked = true;\n                }\n            }\n            if (data) {\n                dataSource.filter({\n                    field: 'hidden',\n                    operator: 'neq',\n                    value: true\n                });\n            }\n            return hasVisibleChildren;\n        }\n        function uncheckAll(dataSource) {\n            var data = dataSource instanceof kendo.data.HierarchicalDataSource && dataSource.data();\n            for (var i = 0; i < data.length; i++) {\n                var item = data[i];\n                item.checked = false;\n                if (item.hasChildren) {\n                    uncheckAll(item.children);\n                }\n            }\n        }\n        var FilterMenuViewModel = kendo.spreadsheet.FilterMenuViewModel = kendo.data.ObservableObject.extend({\n            valuesChange: function (e) {\n                var dataSource = e ? e.sender.dataSource : this.valuesDataSource;\n                var checked = function (item) {\n                    return item.checked;\n                };\n                var value = function (item) {\n                    return item.dataType === 'date' ? kendo.spreadsheet.dateToNumber(item.value) : item.value;\n                };\n                var unique = function (value, index, array) {\n                    return array.lastIndexOf(value) === index;\n                };\n                var data = dataSource.data();\n                var values = data[0].children.data().toJSON();\n                var blanks = values.filter(function (item) {\n                    return item.dataType === 'blank';\n                });\n                blanks = blanks.length ? blanks[0].checked : false;\n                values = values.filter(checked).map(value);\n                if (this.appendToSearch && this.valueFilter && this.valueFilter.values.length) {\n                    values = values.concat(this.valueFilter.values.toJSON()).sort().filter(unique);\n                }\n                this.set('valueFilter', {\n                    values: values,\n                    blanks: blanks\n                });\n            },\n            valueSelect: function (e) {\n                e.preventDefault();\n                var node = e.sender.dataItem(e.node);\n                node.set('checked', !node.checked);\n            },\n            hasActiveSearch: false,\n            appendToSearch: false,\n            filterValues: function (e) {\n                var query = typeof e == 'string' ? e : $(e.target).val().toLowerCase();\n                var dataSource = this.valuesDataSource;\n                this.set('hasActiveSearch', !!query);\n                var filterSpread = filter.bind(this.valueFilter);\n                uncheckAll(dataSource);\n                filterSpread(dataSource, query);\n            },\n            reset: function () {\n                this.set('customFilter', {\n                    logic: 'and',\n                    criteria: [{\n                            operator: null,\n                            value: null\n                        }]\n                });\n                this.set('valueFilter', { values: [] });\n            },\n            operatorChange: function (e) {\n                var dataItem = e.sender.dataItem();\n                this.set('operatorType', dataItem.type);\n                this.set('customFilter.criteria[0].operator', dataItem.value);\n            },\n            isNone: function () {\n                return this.get('operatorType') === undefined;\n            },\n            isString: function () {\n                return this.get('operatorType') === 'string';\n            },\n            isNumber: function () {\n                return this.get('operatorType') === 'number';\n            },\n            isDate: function () {\n                return this.get('operatorType') === 'date';\n            }\n        });\n        function flattenOperators(operators) {\n            var messages = FILTERMENU_MESSAGES.operators;\n            var result = [];\n            for (var type in operators) {\n                if (!operators.hasOwnProperty(type)) {\n                    continue;\n                }\n                for (var operator in operators[type]) {\n                    if (!operators[type].hasOwnProperty(operator)) {\n                        continue;\n                    }\n                    result.push({\n                        text: messages[type][operator],\n                        value: operator,\n                        unique: type + '_' + operator,\n                        type: type\n                    });\n                }\n            }\n            return result;\n        }\n        var FilterMenuController = kendo.spreadsheet.FilterMenuController = {\n            valuesTree: function (range, column) {\n                return [{\n                        text: 'All',\n                        expanded: true,\n                        checked: false,\n                        items: this.values(range.resize({ top: 1 }), column)\n                    }];\n            },\n            values: function (range, column) {\n                var values = [];\n                var messages = FILTERMENU_MESSAGES;\n                var columnRange = range.column(column);\n                var sheet = range.sheet();\n                columnRange.forEachCell(function (row, col, cell) {\n                    var checked = true;\n                    if (sheet.isHiddenRow(row)) {\n                        checked = false;\n                    }\n                    var value = cell.value;\n                    var dataType = cell.dataType;\n                    var text = cell.text;\n                    if (value === undefined) {\n                        dataType = 'blank';\n                    } else if (cell.format) {\n                        dataType = kendo.spreadsheet.formatting.type(value, cell.format);\n                    } else {\n                        dataType = typeof value;\n                    }\n                    if (value !== null && cell.format) {\n                        text = kendo.spreadsheet.formatting.text(value, cell.format);\n                    } else {\n                        text = dataType == 'blank' ? messages.blanks : value;\n                    }\n                    if (dataType === 'percent') {\n                        dataType = 'number';\n                    }\n                    if (dataType === 'date') {\n                        value = kendo.spreadsheet.numberToDate(value);\n                    }\n                    values.push({\n                        dataType: dataType,\n                        value: value,\n                        text: text,\n                        checked: checked\n                    });\n                });\n                values = distinctValues(values);\n                values.sort(function (a, b) {\n                    if (a.dataType === b.dataType) {\n                        return 0;\n                    }\n                    if (a.dataType === 'blank' || b.dataType === 'blank') {\n                        return a.dataType === 'blank' ? -1 : 1;\n                    }\n                    if (a.dataType === 'number' || b.dataType === 'number') {\n                        return a.dataType === 'number' ? -1 : 1;\n                    }\n                    if (a.dataType === 'date' || b.dataType === 'date') {\n                        return a.dataType === 'date' ? -1 : 1;\n                    }\n                    return 0;\n                });\n                return values;\n            },\n            filterType: function (range, column) {\n                var sheet = range.sheet();\n                var filter = this.filterForColumn(column, sheet);\n                var type;\n                filter = filter && filter.filter.toJSON();\n                if (filter && filter.filter == 'custom') {\n                    var value = filter.criteria[0].value;\n                    if (value instanceof Date) {\n                        type = 'date';\n                    } else if (typeof value == 'string') {\n                        type = 'string';\n                    } else if (typeof value == 'number') {\n                        type = 'number';\n                    }\n                }\n                if (!type) {\n                    var topValue = this.values(range.row(1), column)[0];\n                    type = topValue && topValue.dataType;\n                    if (type == 'blank') {\n                        type = null;\n                    }\n                }\n                return type;\n            },\n            filterForColumn: function (column, sheet) {\n                var allFilters = sheet.filter();\n                var filters;\n                if (allFilters) {\n                    filters = allFilters.columns.filter(function (item) {\n                        return item.index === column;\n                    })[0];\n                }\n                return filters;\n            },\n            filter: function (column, sheet) {\n                var columnFilters = this.filterForColumn(column, sheet);\n                if (!columnFilters) {\n                    return;\n                }\n                var options = columnFilters.filter.toJSON();\n                var type = options.filter;\n                delete options.filter;\n                var result = {\n                    type: type,\n                    options: options\n                };\n                var criteria = options.criteria;\n                if (criteria && criteria.length) {\n                    result.operator = criteria[0].operator;\n                }\n                return result;\n            }\n        };\n        var FilterMenu = Widget.extend({\n            init: function (element, options) {\n                Widget.call(this, element, options);\n                this.element.addClass(FilterMenu.classNames.wrapper);\n                this.viewModel = new FilterMenuViewModel({\n                    active: 'value',\n                    operator: null,\n                    operators: flattenOperators(this.options.operators),\n                    clear: this.clear.bind(this),\n                    apply: this.apply.bind(this)\n                });\n                this._filterInit();\n                this._popup();\n                this._sort();\n                this._filterByCondition();\n                this._filterByValue();\n                this._actionButtons();\n            },\n            options: {\n                name: 'FilterMenu',\n                column: 0,\n                range: null,\n                operators: {\n                    string: {\n                        contains: 'Text contains',\n                        doesnotcontain: 'Text does not contain',\n                        startswith: 'Text starts with',\n                        endswith: 'Text ends with',\n                        matches: 'Text matches',\n                        doesnotmatch: 'Text does not match'\n                    },\n                    date: {\n                        eq: 'Date is',\n                        neq: 'Date is not',\n                        lt: 'Date is before',\n                        gt: 'Date is after'\n                    },\n                    number: {\n                        eq: 'Is equal to',\n                        neq: 'Is not equal to',\n                        gte: 'Is greater than or equal to',\n                        gt: 'Is greater than',\n                        lte: 'Is less than or equal to',\n                        lt: 'Is less than'\n                    }\n                }\n            },\n            events: ['action'],\n            destroy: function () {\n                Widget.fn.destroy.call(this);\n                this.menu.destroy();\n                this.valuesTreeView.destroy();\n                this.popup.destroy();\n            },\n            openFor: function (anchor) {\n                this.popup.setOptions({ anchor: anchor });\n                this.popup.open();\n            },\n            close: function () {\n                this.popup.close();\n            },\n            clear: function () {\n                this.action({\n                    command: 'ClearFilterCommand',\n                    options: { column: this.options.column }\n                });\n                this.viewModel.reset();\n                this.close();\n            },\n            apply: function () {\n                this._active();\n                var options = {\n                    operatingRange: this.options.range,\n                    column: this.options.column\n                };\n                var valueFilter;\n                var customFilter;\n                if (this.viewModel.active === 'value') {\n                    this.viewModel.valuesChange({ sender: this.valuesTreeView });\n                    valueFilter = this.viewModel.valueFilter.toJSON();\n                    if (valueFilter.blanks || valueFilter.values && valueFilter.values.length) {\n                        options.valueFilter = valueFilter;\n                    }\n                } else if (this.viewModel.active === 'custom') {\n                    customFilter = this.viewModel.customFilter.toJSON();\n                    if (customFilter.criteria.length && customFilter.criteria[0].value !== null) {\n                        options.customFilter = customFilter;\n                    }\n                }\n                if (options.valueFilter || options.customFilter) {\n                    this.action({\n                        command: 'ApplyFilterCommand',\n                        options: options\n                    });\n                }\n            },\n            action: function (options) {\n                this.trigger('action', $.extend({}, options));\n            },\n            _filterInit: function () {\n                var column = this.options.column;\n                var range = this.options.range;\n                var sheet = range.sheet();\n                var activeFilter = FilterMenuController.filter(column, sheet);\n                if (activeFilter) {\n                    var filterType = FilterMenuController.filterType(range, column);\n                    this.viewModel.set('active', activeFilter.type);\n                    this.viewModel.set(activeFilter.type + 'Filter', activeFilter.options);\n                    if (activeFilter.type == 'custom') {\n                        this.viewModel.set('operator', filterType + '_' + activeFilter.operator);\n                        this.viewModel.set('operatorType', filterType);\n                    }\n                } else {\n                    this.viewModel.reset();\n                }\n            },\n            _popup: function () {\n                this.popup = this.element.kendoPopup({ copyAnchorStyles: false }).data('kendoPopup');\n            },\n            _sort: function () {\n                var template = kendo.template(FilterMenu.templates.menuItem);\n                var messages = FILTERMENU_MESSAGES;\n                var items = [\n                    {\n                        command: 'sort',\n                        dir: 'asc',\n                        text: messages.sortAscending,\n                        iconClass: 'sort-asc'\n                    },\n                    {\n                        command: 'sort',\n                        dir: 'desc',\n                        text: messages.sortDescending,\n                        iconClass: 'sort-desc'\n                    }\n                ];\n                var ul = $('<ul />', { 'html': kendo.render(template, items) }).appendTo(this.element);\n                this.menu = ul.kendoMenu({\n                    orientation: 'vertical',\n                    select: function (e) {\n                        var dir = $(e.item).data('dir');\n                        var range = this.options.range.resize({ top: 1 });\n                        var options = {\n                            value: dir,\n                            sheet: false,\n                            operatingRange: range,\n                            column: this.options.column\n                        };\n                        if (range.isSortable()) {\n                            this.action({\n                                command: 'SortCommand',\n                                options: options\n                            });\n                        } else {\n                            this.close();\n                        }\n                    }.bind(this)\n                }).data('kendoMenu');\n            },\n            _appendTemplate: function (template, className, details, expanded) {\n                var compiledTemplate = kendo.template(template);\n                var wrapper = $('<div class=\\'' + className + '\\'/>').html(compiledTemplate({\n                    messages: FILTERMENU_MESSAGES,\n                    guid: kendo.guid(),\n                    ns: kendo.ns\n                }));\n                this.element.append(wrapper);\n                if (details) {\n                    details = new Details(wrapper, {\n                        expanded: expanded,\n                        toggle: this._detailToggle.bind(this)\n                    });\n                }\n                kendo.bind(wrapper, this.viewModel);\n                return wrapper;\n            },\n            _detailToggle: function (e) {\n                this.element.find('[data-role=details]').not(e.sender.element).data('kendoDetails').toggle(!e.show);\n            },\n            _filterByCondition: function () {\n                var isExpanded = this.viewModel.active === 'custom';\n                this._appendTemplate(FilterMenu.templates.filterByCondition, FilterMenu.classNames.filterByCondition, true, isExpanded);\n            },\n            _filterByValue: function () {\n                var isExpanded = this.viewModel.active === 'value';\n                var wrapper = this._appendTemplate(FilterMenu.templates.filterByValue, FilterMenu.classNames.filterByValue, true, isExpanded);\n                this.valuesTreeView = wrapper.find('[data-role=treeview]').data('kendoTreeView');\n                var values = FilterMenuController.valuesTree(this.options.range, this.options.column);\n                this.viewModel.set('valuesDataSource', new kendo.data.HierarchicalDataSource({ data: values }));\n            },\n            _actionButtons: function () {\n                this._appendTemplate(FilterMenu.templates.actionButtons, FilterMenu.classNames.actionButtons, false);\n            },\n            _active: function () {\n                var activeContainer = this.element.find('[data-role=details]').filter(function (index, element) {\n                    return $(element).data('kendoDetails').visible();\n                });\n                if (activeContainer.hasClass(FilterMenu.classNames.filterByValue)) {\n                    this.viewModel.set('active', 'value');\n                } else if (activeContainer.hasClass(FilterMenu.classNames.filterByCondition)) {\n                    this.viewModel.set('active', 'custom');\n                }\n            }\n        });\n        kendo.spreadsheet.FilterMenu = FilterMenu;\n        $.extend(true, FilterMenu, {\n            classNames: classNames,\n            templates: templates\n        });\n    }(window.kendo));\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('spreadsheet/editor', ['kendo.core'], f);\n}(function () {\n    (function (kendo) {\n        if (kendo.support.browser.msie && kendo.support.browser.version < 9) {\n            return;\n        }\n        var SheetEditor = kendo.Observable.extend({\n            init: function (view) {\n                kendo.Observable.fn.init.call(this);\n                this.view = view;\n                this.formulaBar = view.formulaBar;\n                this._active = false;\n                this.barInput = view.formulaBar.formulaInput;\n                this.cellInput = view.formulaInput;\n                this.barInput.syncWith(this.cellInput);\n                this.cellInput.syncWith(this.barInput);\n                this.barInput.bind('keyup', this._triggerUpdate.bind(this));\n                this.cellInput.bind('keyup', this._triggerUpdate.bind(this));\n                this.barInput.bind('blur', this._blur.bind(this));\n                this.cellInput.bind('blur', this._blur.bind(this));\n            },\n            events: [\n                'activate',\n                'deactivate',\n                'change',\n                'update'\n            ],\n            _blur: function () {\n                this.deactivate();\n            },\n            _triggerUpdate: function () {\n                this.trigger('update', { value: this.value() });\n            },\n            activeEditor: function () {\n                var editor = null;\n                var activeElement = kendo._activeElement();\n                if (this.barElement()[0] === activeElement) {\n                    editor = this.barInput;\n                } else if (this.cellElement()[0] === activeElement) {\n                    editor = this.cellInput;\n                }\n                return editor;\n            },\n            activate: function (options) {\n                this._active = true;\n                this._rect = options.rect;\n                this._range = options.range;\n                this.cellInput.position(options.rect);\n                this.cellInput.resize(options.rect);\n                this.cellInput.tooltip(options.tooltip);\n                this.cellInput.activeCell = this.barInput.activeCell = this._range.topLeft();\n                this.cellInput.activeSheet = this.barInput.activeSheet = this._range._sheet;\n                this.trigger('activate');\n                return this;\n            },\n            deactivate: function () {\n                var cellInput = this.cellInput;\n                if (!this._active) {\n                    return;\n                }\n                if (cellInput.value() != this._value) {\n                    this.trigger('change', {\n                        value: cellInput.value(),\n                        range: this._range\n                    });\n                }\n                this._active = false;\n                this._rect = null;\n                cellInput.hide();\n                this.trigger('deactivate');\n            },\n            enable: function (enable) {\n                this.barInput.enable(enable);\n                this.cellInput.enable(enable);\n            },\n            barElement: function () {\n                return this.barInput.element;\n            },\n            cellElement: function () {\n                return this.cellInput.element;\n            },\n            focus: function (inputType) {\n                inputType = inputType || 'cell';\n                if (inputType === 'cell') {\n                    this.cellInput.element.focus();\n                    this.cellInput.end();\n                } else {\n                    this.barInput.element.focus();\n                }\n            },\n            isActive: function () {\n                return this._active;\n            },\n            isFiltered: function () {\n                return this.barInput.popup.visible() || this.cellInput.popup.visible();\n            },\n            canInsertRef: function (isKeyboardAction) {\n                var editor = this.activeEditor();\n                return editor && editor.canInsertRef(isKeyboardAction);\n            },\n            highlightedRefs: function () {\n                var editor = this.activeEditor();\n                var refs = [];\n                if (editor) {\n                    refs = editor.highlightedRefs();\n                }\n                return refs;\n            },\n            scale: function () {\n                this.cellInput.scale();\n            },\n            toggleTooltip: function (rect) {\n                this.cellInput.toggleTooltip(notEqual(this._rect, rect));\n            },\n            value: function (value) {\n                if (value === undefined) {\n                    return this.barInput.value();\n                }\n                if (value === null) {\n                    value = '';\n                }\n                this._value = value;\n                this.barInput.value(value);\n                this.cellInput.value(value);\n            },\n            insertNewline: function () {\n                this.activeEditor().insertNewline();\n                this.scale();\n            },\n            select: function () {\n                this.activeEditor().select();\n            }\n        });\n        function notEqual(oldRect, newRect) {\n            return oldRect && (oldRect.top !== newRect.top || oldRect.left !== newRect.left);\n        }\n        kendo.spreadsheet.SheetEditor = SheetEditor;\n    }(kendo));\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('spreadsheet/autofill', [\n        'spreadsheet/runtime',\n        'spreadsheet/range'\n    ], f);\n}(function () {\n    'use strict';\n    if (kendo.support.browser.msie && kendo.support.browser.version < 9) {\n        return;\n    }\n    var spreadsheet = kendo.spreadsheet;\n    var Range = spreadsheet.Range;\n    var runtime = spreadsheet.calc.runtime;\n    var Formula = runtime.Formula;\n    var ERR_INCOMPATIBLE = 'incompatibleRanges';\n    var ERR_NO_DIRECTION = 'noFillDirection';\n    var FillError = Range.FillError = function (msg) {\n        this.code = msg;\n    };\n    Range.prototype._previewFillFrom = function (srcRange, direction) {\n        var destRange = this, sheet = destRange._sheet;\n        if (typeof srcRange == 'string') {\n            srcRange = sheet.range(srcRange);\n        }\n        var src = srcRange._ref.toRangeRef();\n        var dest = destRange._ref.toRangeRef();\n        if (src.intersects(dest)) {\n            if (src.eq(dest)) {\n                return null;\n            }\n            dest = dest.clone();\n            if (src.topLeft.eq(dest.topLeft)) {\n                if (src.width() == dest.width()) {\n                    dest.topLeft.row += src.height();\n                    direction = 0;\n                } else if (src.height() == dest.height()) {\n                    dest.topLeft.col += src.width();\n                    direction = 1;\n                } else {\n                    throw new FillError(ERR_INCOMPATIBLE);\n                }\n            } else if (src.bottomRight.eq(dest.bottomRight)) {\n                if (src.width() == dest.width()) {\n                    dest.bottomRight.row -= src.height();\n                    direction = 2;\n                } else if (src.height() == dest.height()) {\n                    dest.bottomRight.col -= src.width();\n                    direction = 3;\n                } else {\n                    throw new FillError(ERR_INCOMPATIBLE);\n                }\n            } else {\n                throw new FillError(ERR_INCOMPATIBLE);\n            }\n            return sheet.range(dest)._previewFillFrom(srcRange, direction);\n        }\n        if (direction == null) {\n            if (src.topLeft.col == dest.topLeft.col) {\n                direction = src.topLeft.row < dest.topLeft.row ? 0 : 2;\n            } else if (src.topLeft.row == dest.topLeft.row) {\n                direction = src.topLeft.col < dest.topLeft.col ? 1 : 3;\n            } else {\n                throw new FillError(ERR_NO_DIRECTION);\n            }\n        }\n        var horizontal = direction & 1;\n        var descending = direction & 2;\n        if (horizontal && src.height() != dest.height() || !horizontal && src.width() != dest.width()) {\n            throw new FillError(ERR_INCOMPATIBLE);\n        }\n        var data = srcRange._properties(), n;\n        if (!horizontal) {\n            data = transpose(data);\n            n = dest.height();\n        } else {\n            n = dest.width();\n        }\n        var fill = new Array(data.length);\n        for (var i = 0; i < data.length; ++i) {\n            var s = data[i];\n            var f = findSeries(s);\n            var a = fill[i] = new Array(n);\n            for (var j = 0; j < n; ++j) {\n                var idx = descending ? -j - 1 : s.length + j;\n                var srcIdx = descending ? s.length - j % s.length - 1 : j % s.length;\n                a[descending ? n - j - 1 : j] = f(idx, srcIdx);\n            }\n        }\n        if (!horizontal) {\n            fill = transpose(fill);\n        }\n        return {\n            props: fill,\n            direction: direction,\n            dest: destRange\n        };\n    };\n    Range.prototype.fillFrom = function (srcRange, direction) {\n        var x = this._previewFillFrom(srcRange, direction);\n        x.dest._properties(x.props);\n        return x.dest;\n    };\n    function linearRegression(data) {\n        var N = data.length;\n        var mx = (N + 1) / 2, my = data.reduce(function (a, b) {\n                return a + b;\n            }, 0) / N;\n        var s1 = 0, s2 = 0;\n        for (var i = 0; i < N; i++) {\n            var t1 = i + 1 - mx, t2 = data[i] - my;\n            s1 += t1 * t2;\n            s2 += t1 * t1;\n        }\n        if (!s2) {\n            return function (N) {\n                return data[N % data.length];\n            };\n        }\n        var b = s1 / s2, a = my - b * mx;\n        return function (N) {\n            return a + b * (N + 1);\n        };\n    }\n    function findSeries(properties) {\n        function findStep(a) {\n            var diff = a[1] - a[0];\n            for (var i = 2; i < a.length; ++i) {\n                if (a[i] - a[i - 1] != diff) {\n                    return null;\n                }\n            }\n            return diff;\n        }\n        function getData(a) {\n            return a.map(function (v) {\n                return v.number;\n            });\n        }\n        var series = [];\n        var data = properties.map(function (x) {\n            return x.formula || x.value;\n        });\n        forEachSeries(data, function (begin, end, type, a) {\n            var f, values;\n            if (type == 'number') {\n                values = getData(a);\n                if (values.length == 1 && (begin > 0 || end < data.length || formatType(values[0], properties[begin].format) == 'date')) {\n                    values.push(values[0] + 1);\n                }\n                f = linearRegression(values);\n            } else if (type == 'string' || type == 'formula' || type == 'boolean') {\n                f = function (N, i) {\n                    return data[i];\n                };\n            } else if (Array.isArray(type)) {\n                if (a.length == 1) {\n                    f = function (N) {\n                        return type[(a[0].number + N) % type.length];\n                    };\n                } else {\n                    var diff = findStep(getData(a));\n                    if (diff == null) {\n                        f = function (N) {\n                            return a[N % a.length].value;\n                        };\n                    } else {\n                        f = function (N) {\n                            var idx = a[0].number + diff * N;\n                            return type[idx % type.length];\n                        };\n                    }\n                }\n            } else if (type != 'null') {\n                values = getData(a);\n                if (values.length == 1) {\n                    values.push(values[0] + 1);\n                }\n                values = linearRegression(values);\n                f = function (N, i) {\n                    return data[i].replace(/^(.*\\D)\\d+/, '$1' + values(N, i));\n                };\n            } else {\n                f = function () {\n                    return null;\n                };\n            }\n            var s = {\n                f: f,\n                begin: begin,\n                end: end,\n                len: end - begin\n            };\n            for (var i = begin; i < end; ++i) {\n                series[i] = s;\n            }\n        });\n        return function (N, i) {\n            var s = series[i];\n            var q = N / data.length | 0;\n            var r = N % data.length;\n            var n = q * s.len + r - s.begin;\n            var value = s.f(n, i);\n            var props = clone(properties[i]);\n            delete props.enable;\n            if (value instanceof Formula) {\n                props.formula = value;\n            } else {\n                props.value = value;\n            }\n            return props;\n        };\n    }\n    function formatType(value, format) {\n        if (format != null) {\n            return spreadsheet.formatting.type(value, format);\n        }\n    }\n    function clone(obj) {\n        var copy = {};\n        Object.keys(obj || {}).forEach(function (key) {\n            copy[key] = obj[key];\n        });\n        return copy;\n    }\n    function forEachSeries(data, f) {\n        var prev = null, start = 0, a = [], type;\n        for (var i = 0; i < data.length; ++i) {\n            type = getType(data[i]);\n            a.push(type);\n            if (prev != null && type.type !== prev.type) {\n                f(start, i, prev.type, a.slice(start, i));\n                start = i;\n            }\n            prev = type;\n        }\n        f(start, i, prev.type, a.slice(start, i));\n    }\n    function getType(el) {\n        if (typeof el == 'number') {\n            return {\n                type: 'number',\n                number: el\n            };\n        }\n        if (typeof el == 'string') {\n            var lst = findStringList(el);\n            if (lst) {\n                return lst;\n            }\n            var m = /^(.*\\D)(\\d+)/.exec(el);\n            if (m) {\n                el = el.replace(/^(.*\\D)\\d+/, '$1-######');\n                return {\n                    type: el,\n                    match: m,\n                    number: parseFloat(m[2])\n                };\n            }\n            return { type: 'string' };\n        }\n        if (typeof el == 'boolean') {\n            return { type: 'boolean' };\n        }\n        if (el == null) {\n            return { type: 'null' };\n        }\n        if (el instanceof Formula) {\n            return { type: 'formula' };\n        }\n        window.console.error(el);\n        throw new Error('Cannot fill data');\n    }\n    function stringLists() {\n        var culture = kendo.culture();\n        return [\n            culture.calendars.standard.days.namesAbbr,\n            culture.calendars.standard.days.names,\n            culture.calendars.standard.months.namesAbbr,\n            culture.calendars.standard.months.names\n        ];\n    }\n    function findStringList(str) {\n        var strl = str.toLowerCase();\n        var lists = stringLists();\n        for (var i = 0; i < lists.length; ++i) {\n            var a = lists[i];\n            for (var j = a.length; --j >= 0;) {\n                var el = a[j].toLowerCase();\n                if (el == strl) {\n                    return {\n                        type: a,\n                        number: j,\n                        value: str\n                    };\n                }\n            }\n        }\n    }\n    function transpose(a) {\n        var height = a.length, width = a[0].length;\n        var t = [];\n        for (var i = 0; i < width; ++i) {\n            t[i] = [];\n            for (var j = 0; j < height; ++j) {\n                t[i][j] = a[j][i];\n            }\n        }\n        return t;\n    }\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('spreadsheet/nameeditor', ['kendo.core'], f);\n}(function () {\n    (function (kendo) {\n        if (kendo.support.browser.msie && kendo.support.browser.version < 9) {\n            return;\n        }\n        var $ = kendo.jQuery;\n        var CLASS_NAMES = {\n            input: 'k-spreadsheet-name-editor',\n            list: 'k-spreadsheet-name-list'\n        };\n        var NameEditor = kendo.ui.Widget.extend({\n            init: function (element, options) {\n                kendo.ui.Widget.call(this, element, options);\n                element.addClass(CLASS_NAMES.input);\n                var comboBoxTitle = options.messages.nameBox || 'Name Box';\n                var dataSource = new kendo.data.DataSource({\n                    transport: {\n                        read: function (options) {\n                            var data = [];\n                            this._workbook.forEachName(function (def) {\n                                if (!def.hidden && def.value instanceof kendo.spreadsheet.Ref) {\n                                    data.push({ name: def.name });\n                                }\n                            });\n                            options.success(data);\n                        }.bind(this),\n                        cache: false\n                    }\n                });\n                var comboElement = $('<input />').attr('title', comboBoxTitle).attr('aria-label', comboBoxTitle);\n                this.combo = comboElement.appendTo(element).kendoComboBox({\n                    clearButton: false,\n                    dataTextField: 'name',\n                    dataValueField: 'name',\n                    template: '#:data.name#<a class=\\'k-button-delete\\' href=\\'\\\\#\\'><span class=\\'k-icon k-i-close\\'></span></a>',\n                    dataSource: dataSource,\n                    autoBind: false,\n                    ignoreCase: true,\n                    change: this._on_listChange.bind(this),\n                    noDataTemplate: '<div></div>',\n                    open: function () {\n                        dataSource.read();\n                    }\n                }).getKendoComboBox();\n                this.combo.input.on('keydown', this._on_keyDown.bind(this)).on('focus', this._on_focus.bind(this));\n                this.combo.popup.element.addClass('k-spreadsheet-names-popup').on('mousemove', function (ev) {\n                    ev.stopPropagation();\n                }).on('click', '.k-button-delete', function (ev) {\n                    ev.preventDefault();\n                    ev.stopPropagation();\n                    var item = $(ev.target).closest('.k-item');\n                    item = this.combo.dataItem(item);\n                    this._deleteItem(item.name);\n                }.bind(this));\n            },\n            value: function (val) {\n                if (val === undefined) {\n                    return this.combo.value();\n                } else {\n                    this.combo.value(val);\n                }\n            },\n            _deleteItem: function (name) {\n                this.trigger('delete', { name: name });\n            },\n            _on_keyDown: function (ev) {\n                switch (ev.keyCode) {\n                case 27:\n                    this.combo.value(this._prevValue);\n                    this.trigger('cancel');\n                    break;\n                case 13:\n                    this.trigger('enter');\n                    break;\n                }\n            },\n            _on_focus: function () {\n                this._prevValue = this.combo.value();\n            },\n            _on_listChange: function () {\n                var name = this.combo.value();\n                if (name) {\n                    this.trigger('select', { name: name });\n                }\n            }\n        });\n        kendo.spreadsheet.NameEditor = NameEditor;\n    }(window.kendo));\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('spreadsheet/print', [\n        'kendo.pdf',\n        'spreadsheet/sheet',\n        'spreadsheet/range',\n        'spreadsheet/references',\n        'spreadsheet/numformat',\n        'util/text-metrics'\n    ], f);\n}(function () {\n    'use strict';\n    if (kendo.support.browser.msie && kendo.support.browser.version < 9) {\n        return;\n    }\n    var spreadsheet = kendo.spreadsheet;\n    var CellRef = spreadsheet.CellRef;\n    var drawing = kendo.drawing;\n    var formatting = spreadsheet.formatting;\n    var geo = kendo.geometry;\n    var GUIDELINE_WIDTH = 0.8;\n    function distributeCoords(heights, pageHeight) {\n        var curr = 0;\n        var out = [];\n        var threshold = 0.2 * pageHeight;\n        var bottom = pageHeight;\n        heights.forEach(function (h) {\n            if (pageHeight && curr + h > bottom) {\n                if (bottom - curr < threshold) {\n                    curr = pageHeight * Math.ceil(curr / pageHeight);\n                }\n                bottom += pageHeight * Math.ceil(h / pageHeight);\n            }\n            out.push(curr);\n            curr += h;\n        });\n        out.push(curr);\n        return out;\n    }\n    function doLayout(sheet, range, options) {\n        var grid = sheet._grid;\n        range = grid.normalize(range);\n        var cells = [];\n        var rowHeights = [];\n        var colWidths = [];\n        var mergedCells = sheet._getMergedCells(range);\n        var maxRow = -1, maxCol = -1;\n        sheet.forEach(range, function (row, col, cell) {\n            var relrow = row - range.topLeft.row;\n            var relcol = col - range.topLeft.col;\n            var rh = sheet.rowHeight(row);\n            var cw = sheet.columnWidth(col);\n            if (!relcol) {\n                rowHeights.push(rh);\n            }\n            if (!relrow) {\n                colWidths.push(cw);\n            }\n            if (sheet.isHiddenColumn(col) || sheet.isHiddenRow(row) || !rh || !cw) {\n                return;\n            }\n            var nonEmpty = options.forScreen || shouldDrawCell(cell);\n            if (!(options.emptyCells || nonEmpty)) {\n                return;\n            }\n            var id = new CellRef(row, col).print();\n            if (mergedCells.secondary[id]) {\n                return;\n            }\n            if (nonEmpty) {\n                maxRow = Math.max(maxRow, relrow);\n                maxCol = Math.max(maxCol, relcol);\n            } else {\n                cell.empty = true;\n            }\n            cell.row = relrow;\n            cell.col = relcol;\n            var m = mergedCells.primary[id];\n            if (m) {\n                delete mergedCells.primary[id];\n                cell.merged = true;\n                cell.rowspan = m.height();\n                cell.colspan = m.width();\n                if (options.forScreen) {\n                    cell.width = sheet._columns.sum(m.topLeft.col, m.bottomRight.col);\n                    cell.height = sheet._rows.sum(m.topLeft.row, m.bottomRight.row);\n                }\n            } else {\n                cell.rowspan = 1;\n                cell.colspan = 1;\n            }\n            cells.push(cell);\n        });\n        rowHeights = rowHeights.slice(0, maxRow + 1);\n        colWidths = colWidths.slice(0, maxCol + 1);\n        var pageWidth = Math.floor(options.pageWidth);\n        var pageHeight = Math.floor(options.pageHeight);\n        var scaleFactor = 1;\n        if (options.fitWidth) {\n            var width = colWidths.reduce(sum, 0);\n            if (width > pageWidth) {\n                scaleFactor = pageWidth / width;\n                pageWidth /= scaleFactor;\n                pageHeight /= scaleFactor;\n            }\n        }\n        var yCoords = distributeCoords(rowHeights, pageHeight || 0);\n        var xCoords = distributeCoords(colWidths, pageWidth || 0);\n        var boxWidth = 0;\n        var boxHeight = 0;\n        cells = cells.filter(function (cell) {\n            if (cell.empty && (cell.row > maxRow || cell.col > maxCol)) {\n                return false;\n            }\n            cell.left = xCoords[cell.col];\n            cell.top = yCoords[cell.row];\n            if (cell.merged) {\n                if (!options.forScreen) {\n                    cell.right = orlast(xCoords, cell.col + cell.colspan);\n                    cell.bottom = orlast(yCoords, cell.row + cell.rowspan);\n                    cell.width = cell.right - cell.left;\n                    cell.height = cell.bottom - cell.top;\n                } else {\n                    cell.right = cell.left + cell.width;\n                    cell.bottom = cell.top + cell.height;\n                }\n            } else {\n                cell.width = colWidths[cell.col];\n                cell.height = rowHeights[cell.row];\n                cell.bottom = cell.top + cell.height;\n                cell.right = cell.left + cell.width;\n            }\n            boxWidth = Math.max(boxWidth, cell.right);\n            boxHeight = Math.max(boxHeight, cell.bottom);\n            return true;\n        });\n        Object.keys(mergedCells.primary).forEach(function (id) {\n            var ref = mergedCells.primary[id];\n            sheet.forEach(ref.topLeft.toRangeRef(), function (row, col, cell) {\n                var relrow = row - range.topLeft.row;\n                var relcol = col - range.topLeft.col;\n                cell.merged = true;\n                cell.colspan = ref.height();\n                cell.rowspan = ref.width();\n                if (relrow < 0) {\n                    cell.top = -sheet._rows.sum(row, row - relrow - 1);\n                } else {\n                    cell.top = yCoords[relrow];\n                }\n                if (relcol < 0) {\n                    cell.left = -sheet._columns.sum(col, col - relcol - 1);\n                } else {\n                    cell.left = xCoords[relcol];\n                }\n                cell.height = sheet._rows.sum(ref.topLeft.row, ref.bottomRight.row);\n                cell.width = sheet._columns.sum(ref.topLeft.col, ref.bottomRight.col);\n                if (cell.height > 0 && cell.width > 0) {\n                    cell.right = cell.left + cell.width;\n                    cell.bottom = cell.top + cell.height;\n                    cells.push(cell);\n                }\n            });\n        });\n        return {\n            width: boxWidth,\n            height: boxHeight,\n            cells: cells.sort(normalOrder),\n            scale: scaleFactor,\n            xCoords: xCoords,\n            yCoords: yCoords\n        };\n    }\n    function sameBorder(a, b) {\n        return a.size === b.size && a.color === b.color;\n    }\n    function sum(a, b) {\n        return a + b;\n    }\n    function orlast(a, i) {\n        return i < a.length ? a[i] : a[a.length - 1];\n    }\n    function shouldDrawCell(cell) {\n        return cell.value != null || cell.merged || cell.background != null || cell.borderTop != null || cell.borderRight != null || cell.borderBottom != null || cell.borderLeft != null || cell.validation != null && !cell.validation.value;\n    }\n    function normalOrder(a, b) {\n        if (a.top < b.top) {\n            return -1;\n        } else if (a.top == b.top) {\n            if (a.left < b.left) {\n                return -1;\n            } else if (a.left == b.left) {\n                return 0;\n            } else {\n                return 1;\n            }\n        } else {\n            return 1;\n        }\n    }\n    function drawLayout(layout, group, options) {\n        var ncols = Math.ceil(layout.width / options.pageWidth);\n        var nrows = Math.ceil(layout.height / options.pageHeight);\n        var pageWidth = options.pageWidth / layout.scale;\n        var pageHeight = options.pageHeight / layout.scale;\n        for (var i = 0; i < ncols; ++i) {\n            for (var j = 0; j < nrows; ++j) {\n                addPage(j, i);\n            }\n        }\n        function addPage(row, col) {\n            var left = col * pageWidth;\n            var right = left + pageWidth;\n            var top = row * pageHeight;\n            var bottom = top + pageHeight;\n            var endbottom = 0, endright = 0;\n            var cells = layout.cells.filter(function (cell) {\n                if (cell.right <= left || cell.left >= right || cell.bottom <= top || cell.top >= bottom) {\n                    return false;\n                }\n                endbottom = Math.max(cell.bottom, endbottom);\n                endright = Math.max(cell.right, endright);\n                return true;\n            });\n            if (cells.length > 0) {\n                var page = new drawing.Group();\n                group.append(page);\n                page.clip(drawing.Path.fromRect(new geo.Rect([\n                    0,\n                    0\n                ], [\n                    options.pageWidth,\n                    options.pageHeight\n                ])));\n                var content = new drawing.Group();\n                page.append(content);\n                var matrix = geo.Matrix.scale(layout.scale, layout.scale).multiplyCopy(geo.Matrix.translate(-left, -top));\n                if (options.hCenter || options.vCenter) {\n                    matrix = matrix.multiplyCopy(geo.Matrix.translate(options.hCenter ? (right - endright) / 2 : 0, options.vCenter ? (bottom - endbottom) / 2 : 0));\n                }\n                content.transform(matrix);\n                if (options.guidelines) {\n                    var prev = null;\n                    layout.xCoords.forEach(function (x) {\n                        x = Math.min(x, endright);\n                        if (x !== prev && x >= left && x <= right) {\n                            prev = x;\n                            content.append(new drawing.Path().moveTo(x, top).lineTo(x, endbottom).close().stroke('#aaa', GUIDELINE_WIDTH));\n                        }\n                    });\n                    var prev = null;\n                    layout.yCoords.forEach(function (y) {\n                        y = Math.min(y, endbottom);\n                        if (y !== prev && y >= top && y <= bottom) {\n                            prev = y;\n                            content.append(new drawing.Path().moveTo(left, y).lineTo(endright, y).close().stroke('#aaa', GUIDELINE_WIDTH));\n                        }\n                    });\n                }\n                var borders = Borders();\n                cells.forEach(function (cell) {\n                    drawCell(cell, content, options);\n                    borders.add(cell);\n                });\n                var bordersGroup = new drawing.Group();\n                borders.vert.forEach(function (a) {\n                    a.forEach(function (b) {\n                        if (!b.rendered) {\n                            b.rendered = true;\n                            bordersGroup.append(new drawing.Path().moveTo(b.x, b.top).lineTo(b.x, b.bottom).close().stroke(b.color, b.size));\n                        }\n                    });\n                });\n                borders.horiz.forEach(function (a) {\n                    a.forEach(function (b) {\n                        if (!b.rendered) {\n                            b.rendered = true;\n                            bordersGroup.append(new drawing.Path().moveTo(b.left, b.y).lineTo(b.right, b.y).close().stroke(b.color, b.size));\n                        }\n                    });\n                });\n                content.append(bordersGroup);\n            }\n        }\n    }\n    function drawCell(cell, content, options) {\n        var g = new drawing.Group();\n        content.append(g);\n        var rect = new geo.Rect([\n            cell.left,\n            cell.top\n        ], [\n            cell.width,\n            cell.height\n        ]);\n        if (cell.background || cell.merged) {\n            var r2d2 = rect;\n            if (options.guidelines) {\n                r2d2 = rect.clone();\n                r2d2.origin.x += GUIDELINE_WIDTH / 2;\n                r2d2.origin.y += GUIDELINE_WIDTH / 2;\n                r2d2.size.width -= GUIDELINE_WIDTH;\n                r2d2.size.height -= GUIDELINE_WIDTH;\n            }\n            g.append(new drawing.Rect(r2d2).fill(cell.background || '#fff').stroke(null));\n        }\n        var val = cell.value;\n        if (val != null) {\n            var type = typeof val == 'number' ? 'number' : null;\n            var clip = new drawing.Group();\n            clip.clip(drawing.Path.fromRect(rect));\n            g.append(clip);\n            var f;\n            if (cell.format) {\n                f = formatting.textAndColor(val, cell.format);\n                val = f.text;\n                if (f.type) {\n                    type = f.type;\n                }\n            } else {\n                val += '';\n            }\n            if (!cell.textAlign) {\n                switch (type) {\n                case 'number':\n                case 'date':\n                case 'percent':\n                    cell.textAlign = 'right';\n                    break;\n                case 'boolean':\n                    cell.textAlign = 'center';\n                    break;\n                }\n            }\n            drawText(val, f && f.color || cell.color || '#000', cell, clip);\n        }\n    }\n    var CONT;\n    function drawText(text, color, cell, group) {\n        if (!CONT) {\n            CONT = document.createElement('div');\n            CONT.style.position = 'absolute';\n            CONT.style.left = '-10000px';\n            CONT.style.top = '-10000px';\n            CONT.style.overflow = 'hidden';\n            CONT.style.boxSizing = 'border-box';\n            CONT.style.padding = '2px 4px';\n            CONT.style.lineHeight = 'normal';\n            document.body.appendChild(CONT);\n        }\n        CONT.style.color = color;\n        CONT.style.font = makeFontDef(cell);\n        CONT.style.width = cell.width + 'px';\n        CONT.style.textAlign = cell.textAlign || 'left';\n        CONT.style.textDecoration = cell.underline ? 'underline' : 'none';\n        if (cell.wrap) {\n            CONT.style.whiteSpace = 'pre-wrap';\n            CONT.style.overflowWrap = CONT.style.wordWrap = 'break-word';\n        } else {\n            CONT.style.whiteSpace = 'pre';\n            CONT.style.overflowWrap = CONT.style.wordWrap = 'normal';\n        }\n        if (CONT.firstChild) {\n            CONT.removeChild(CONT.firstChild);\n        }\n        CONT.appendChild(document.createTextNode(text));\n        var vtrans = 0;\n        switch (cell.verticalAlign) {\n        case 'center':\n            vtrans = cell.height - CONT.offsetHeight >> 1;\n            break;\n        case undefined:\n        case null:\n        case 'bottom':\n            vtrans = cell.height - CONT.offsetHeight;\n            break;\n        }\n        if (vtrans < 0) {\n            vtrans = 0;\n        }\n        var text_group = kendo.drawing.drawDOM.drawText(CONT);\n        text_group.transform(geo.Matrix.translate(10000 + cell.left, 10000 + cell.top + vtrans));\n        group.append(text_group);\n    }\n    function makeFontDef(cell) {\n        var font = [];\n        if (cell.italic) {\n            font.push('italic');\n        }\n        if (cell.bold) {\n            font.push('bold');\n        }\n        font.push((cell.fontSize || 12) + 'px');\n        font.push(cell.fontFamily || 'Arial');\n        return font.join(' ');\n    }\n    function draw(sheet, range, options, callback) {\n        if (options == null && callback == null) {\n            callback = range;\n            options = {};\n            range = spreadsheet.SHEETREF;\n        }\n        if (callback == null) {\n            callback = options;\n            if (range instanceof spreadsheet.Range || range instanceof spreadsheet.Ref || typeof range == 'string') {\n                options = {};\n            } else {\n                options = range;\n                range = spreadsheet.SHEETREF;\n            }\n        }\n        options = kendo.jQuery.extend({\n            paperSize: 'A4',\n            landscape: true,\n            margin: '1cm',\n            guidelines: true,\n            emptyCells: true,\n            fitWidth: false,\n            center: false\n        }, options);\n        var group = new drawing.Group();\n        var paper = kendo.pdf.getPaperOptions(options);\n        group.options.set('pdf', {\n            author: options.author,\n            creator: options.creator,\n            date: options.date,\n            keywords: options.keywords,\n            margin: paper.margin,\n            multiPage: true,\n            paperSize: paper.paperSize,\n            subject: options.subject,\n            title: options.title\n        });\n        var pageWidth = paper.paperSize[0];\n        var pageHeight = paper.paperSize[1];\n        if (paper.margin) {\n            pageWidth -= paper.margin.left + paper.margin.right + 1;\n            pageHeight -= paper.margin.top + paper.margin.bottom + 1;\n        }\n        options.pageWidth = pageWidth;\n        options.pageHeight = pageHeight;\n        var layout = doLayout(sheet, sheet._ref(range), options);\n        drawLayout(layout, group, options);\n        callback(group);\n    }\n    spreadsheet.Sheet.prototype.draw = function (range, options, callback) {\n        var sheet = this;\n        if (sheet._workbook) {\n            sheet.recalc(sheet._workbook._context, function () {\n                draw(sheet, range, options, callback);\n            });\n        } else {\n            draw(sheet, range, options, callback);\n        }\n    };\n    function Borders() {\n        var horiz = [];\n        var vert = [];\n        function add(cell) {\n            if (cell.borderLeft) {\n                addVert(cell.row, cell.col, cell.borderLeft, cell.left, cell.top, cell.bottom);\n            }\n            if (cell.borderRight) {\n                addVert(cell.row, cell.col + cell.colspan, cell.borderRight, cell.right, cell.top, cell.bottom);\n            }\n            if (cell.borderTop) {\n                addHoriz(cell.row, cell.col, cell.borderTop, cell.top, cell.left, cell.right);\n            }\n            if (cell.borderBottom) {\n                addHoriz(cell.row + cell.rowspan, cell.col, cell.borderBottom, cell.bottom, cell.left, cell.right);\n            }\n        }\n        function addVert(row, col, border, x, top, bottom) {\n            var a = vert[col] || (vert[col] = []);\n            var prev = row > 0 && a[row - 1];\n            if (prev && sameBorder(prev, border)) {\n                a[row] = prev;\n                prev.bottom = bottom;\n            } else {\n                a[row] = {\n                    size: border.size,\n                    color: border.color,\n                    x: x,\n                    top: top,\n                    bottom: bottom\n                };\n            }\n        }\n        function addHoriz(row, col, border, y, left, right) {\n            var a = horiz[row] || (horiz[row] = []);\n            var prev = col > 0 && a[col - 1];\n            if (prev && sameBorder(prev, border)) {\n                a[col] = prev;\n                prev.right = right;\n            } else {\n                a[col] = {\n                    size: border.size,\n                    color: border.color,\n                    y: y,\n                    left: left,\n                    right: right\n                };\n            }\n        }\n        return {\n            add: add,\n            horiz: horiz,\n            vert: vert\n        };\n    }\n    spreadsheet.draw = {\n        Borders: Borders,\n        doLayout: doLayout,\n        drawLayout: drawLayout\n    };\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.spreadsheet', [\n        'util/undoredostack',\n        'util/text-metrics',\n        'util/parse-xml',\n        'kendo.excel',\n        'kendo.progressbar',\n        'kendo.pdf',\n        'spreadsheet/commands',\n        'spreadsheet/formulabar',\n        'spreadsheet/formulainput',\n        'spreadsheet/eventlistener',\n        'spreadsheet/rangelist',\n        'spreadsheet/propertybag',\n        'spreadsheet/references',\n        'spreadsheet/navigator',\n        'spreadsheet/axismanager',\n        'spreadsheet/clipboard',\n        'spreadsheet/range',\n        'spreadsheet/sheet',\n        'spreadsheet/sheetsbar',\n        'spreadsheet/excel-reader',\n        'spreadsheet/workbook',\n        'spreadsheet/formulacontext',\n        'spreadsheet/controller',\n        'spreadsheet/view',\n        'spreadsheet/customeditors',\n        'spreadsheet/grid',\n        'spreadsheet/axis',\n        'spreadsheet/filter',\n        'spreadsheet/sorter',\n        'spreadsheet/runtime',\n        'spreadsheet/calc',\n        'spreadsheet/numformat',\n        'spreadsheet/runtime.functions',\n        'spreadsheet/runtime.functions.2',\n        'spreadsheet/toolbar',\n        'spreadsheet/dialogs',\n        'spreadsheet/sheetbinder',\n        'spreadsheet/filtermenu',\n        'spreadsheet/editor',\n        'spreadsheet/autofill',\n        'spreadsheet/nameeditor',\n        'spreadsheet/print'\n    ], f);\n}(function () {\n    var __meta__ = {\n        id: 'spreadsheet',\n        name: 'Spreadsheet',\n        category: 'web',\n        description: 'Spreadsheet component',\n        depends: [\n            'core',\n            'binder',\n            'colorpicker',\n            'combobox',\n            'data',\n            'dom',\n            'dropdownlist',\n            'menu',\n            'ooxml',\n            'popup',\n            'sortable',\n            'tabstrip',\n            'toolbar',\n            'treeview',\n            'window',\n            'validator',\n            'excel',\n            'pdf',\n            'drawing'\n        ]\n    };\n    (function (kendo, undefined) {\n        if (kendo.support.browser.msie && kendo.support.browser.version < 9) {\n            return;\n        }\n        var $ = kendo.jQuery;\n        var Widget = kendo.ui.Widget;\n        var Workbook = kendo.spreadsheet.Workbook;\n        var Controller = kendo.spreadsheet.Controller;\n        var View = kendo.spreadsheet.View;\n        var NS = '.kendoSpreadsheet';\n        var ALL_REASONS = {\n            recalc: true,\n            selection: true,\n            activeCell: true,\n            layout: true,\n            sheetSelection: true,\n            resize: true,\n            editorChange: false,\n            editorClose: false\n        };\n        var classNames = { wrapper: 'k-widget k-spreadsheet' };\n        var Spreadsheet = kendo.ui.Widget.extend({\n            init: function (element, options) {\n                Widget.fn.init.call(this, element, options);\n                this.element.addClass(Spreadsheet.classNames.wrapper);\n                this._view = new View(this.element, {\n                    messages: this.options.messages.view,\n                    toolbar: this.options.toolbar,\n                    sheetsbar: this.options.sheetsbar\n                });\n                this._workbook = new Workbook(this.options, this._view);\n                this._controller = new Controller(this._view, this._workbook);\n                this._autoRefresh = true;\n                this._bindWorkbookEvents();\n                this._view.workbook(this._workbook);\n                this.refresh();\n                this._resizeHandler = function () {\n                    this.resize();\n                }.bind(this);\n                $(window).on('resize' + NS, this._resizeHandler);\n            },\n            _resize: function () {\n                this.refresh({ layout: true });\n            },\n            _workbookChange: function (e) {\n                if (this._autoRefresh) {\n                    this.refresh(e);\n                }\n                if (e.recalc && e.ref) {\n                    var range = e.range || new kendo.spreadsheet.Range(e.ref, this.activeSheet());\n                    this.trigger('change', { range: range });\n                }\n            },\n            _workbookCut: function (e) {\n                this.trigger('cut', e);\n            },\n            _workbookCopy: function (e) {\n                this.trigger('copy', e);\n            },\n            _workbookPaste: function (e) {\n                this.trigger('paste', e);\n            },\n            activeSheet: function (sheet) {\n                return this._workbook.activeSheet(sheet);\n            },\n            moveSheetToIndex: function (sheet, index) {\n                return this._workbook.moveSheetToIndex(sheet, index);\n            },\n            insertSheet: function (options) {\n                return this._workbook.insertSheet(options);\n            },\n            sheets: function () {\n                return this._workbook.sheets();\n            },\n            removeSheet: function (sheet) {\n                return this._workbook.removeSheet(sheet);\n            },\n            sheetByName: function (sheetName) {\n                return this._workbook.sheetByName(sheetName);\n            },\n            sheetIndex: function (sheet) {\n                return this._workbook.sheetIndex(sheet);\n            },\n            sheetByIndex: function (index) {\n                return this._workbook.sheetByIndex(index);\n            },\n            renameSheet: function (sheet, newSheetName) {\n                return this._workbook.renameSheet(sheet, newSheetName);\n            },\n            refresh: function (reason) {\n                if (!reason) {\n                    reason = ALL_REASONS;\n                }\n                if (!reason.editorClose) {\n                    this._view.sheet(this._workbook.activeSheet());\n                    this._controller.sheet(this._workbook.activeSheet());\n                    this._workbook.refresh(reason);\n                }\n                if (!reason.editorChange) {\n                    this._view.refresh(reason);\n                    this._controller.refresh();\n                    this._view.render();\n                    this.trigger('render');\n                }\n                return this;\n            },\n            openDialog: function (name, options) {\n                return this._view.openDialog(name, options);\n            },\n            autoRefresh: function (value) {\n                if (value !== undefined) {\n                    this._autoRefresh = value;\n                    if (value === true) {\n                        this.refresh();\n                    }\n                    return this;\n                }\n                return this._autoRefresh;\n            },\n            toJSON: function () {\n                return this._workbook.toJSON();\n            },\n            fromJSON: function (json) {\n                if (json.sheets) {\n                    this._workbook.destroy();\n                    this._workbook = new Workbook($.extend({}, this.options, json));\n                    this._bindWorkbookEvents();\n                    this._view.workbook(this._workbook);\n                    this._controller.workbook(this._workbook);\n                    this.activeSheet(this.activeSheet());\n                } else {\n                    this.refresh();\n                }\n            },\n            fromFile: function (blob, name) {\n                return this._workbook.fromFile(blob, name);\n            },\n            saveAsPDF: function (options) {\n                this._workbook.saveAsPDF($.extend({}, this.options.pdf, options, { workbook: this._workbook }));\n            },\n            saveAsExcel: function (options) {\n                this._workbook.saveAsExcel(options);\n            },\n            draw: function (options, callback) {\n                this._workbook.draw(options, callback);\n            },\n            _workbookExcelExport: function (e) {\n                if (this.trigger('excelExport', e)) {\n                    e.preventDefault();\n                }\n            },\n            _workbookExcelImport: function (e) {\n                if (this.trigger('excelImport', e)) {\n                    e.preventDefault();\n                } else {\n                    this._initProgress(e.promise);\n                }\n            },\n            _initProgress: function (deferred) {\n                var loading = $('<div class=\\'k-loading-mask\\' ' + 'style=\\'width: 100%; height: 100%; top: 0;\\'>' + '<div class=\\'k-loading-color\\'/>' + '</div>').appendTo(this.element);\n                var pb = $('<div class=\\'k-loading-progress\\'>').appendTo(loading).kendoProgressBar({\n                    type: 'chunk',\n                    chunkCount: 10,\n                    min: 0,\n                    max: 1,\n                    value: 0\n                }).data('kendoProgressBar');\n                deferred.progress(function (e) {\n                    pb.value(e.progress);\n                }).always(function () {\n                    kendo.destroy(loading);\n                    loading.remove();\n                });\n            },\n            _workbookPdfExport: function (e) {\n                if (this.trigger('pdfExport', e)) {\n                    e.preventDefault();\n                }\n            },\n            _workbookInsertSheet: function (e) {\n                if (this.trigger('insertSheet', e)) {\n                    e.preventDefault();\n                }\n            },\n            _workbookRemoveSheet: function (e) {\n                if (this.trigger('removeSheet', e)) {\n                    e.preventDefault();\n                }\n            },\n            _workbookSelectSheet: function (e) {\n                if (this.trigger('selectSheet', e)) {\n                    e.preventDefault();\n                }\n            },\n            _workbookRenameSheet: function (e) {\n                if (this.trigger('renameSheet', e)) {\n                    e.preventDefault();\n                }\n            },\n            _workbookInsertRow: function (e) {\n                if (this.trigger('insertRow', e)) {\n                    e.preventDefault();\n                }\n            },\n            _workbookInsertColumn: function (e) {\n                if (this.trigger('insertColumn', e)) {\n                    e.preventDefault();\n                }\n            },\n            _workbookDeleteRow: function (e) {\n                if (this.trigger('deleteRow', e)) {\n                    e.preventDefault();\n                }\n            },\n            _workbookDeleteColumn: function (e) {\n                if (this.trigger('deleteColumn', e)) {\n                    e.preventDefault();\n                }\n            },\n            _workbookHideRow: function (e) {\n                if (this.trigger('hideRow', e)) {\n                    e.preventDefault();\n                }\n            },\n            _workbookHideColumn: function (e) {\n                if (this.trigger('hideColumn', e)) {\n                    e.preventDefault();\n                }\n            },\n            _workbookUnhideRow: function (e) {\n                if (this.trigger('unhideRow', e)) {\n                    e.preventDefault();\n                }\n            },\n            _workbookUnhideColumn: function (e) {\n                if (this.trigger('unhideColumn', e)) {\n                    e.preventDefault();\n                }\n            },\n            _workbookSelect: function (e) {\n                this.trigger('select', e);\n            },\n            _workbookChangeFormat: function (e) {\n                this.trigger('changeFormat', e);\n            },\n            _bindWorkbookEvents: function () {\n                this._workbook.bind('cut', this._workbookCut.bind(this));\n                this._workbook.bind('copy', this._workbookCopy.bind(this));\n                this._workbook.bind('paste', this._workbookPaste.bind(this));\n                this._workbook.bind('change', this._workbookChange.bind(this));\n                this._workbook.bind('excelExport', this._workbookExcelExport.bind(this));\n                this._workbook.bind('excelImport', this._workbookExcelImport.bind(this));\n                this._workbook.bind('pdfExport', this._workbookPdfExport.bind(this));\n                this._workbook.bind('insertSheet', this._workbookInsertSheet.bind(this));\n                this._workbook.bind('removeSheet', this._workbookRemoveSheet.bind(this));\n                this._workbook.bind('selectSheet', this._workbookSelectSheet.bind(this));\n                this._workbook.bind('renameSheet', this._workbookRenameSheet.bind(this));\n                this._workbook.bind('insertRow', this._workbookInsertRow.bind(this));\n                this._workbook.bind('insertColumn', this._workbookInsertColumn.bind(this));\n                this._workbook.bind('deleteRow', this._workbookDeleteRow.bind(this));\n                this._workbook.bind('deleteColumn', this._workbookDeleteColumn.bind(this));\n                this._workbook.bind('hideRow', this._workbookHideRow.bind(this));\n                this._workbook.bind('hideColumn', this._workbookHideColumn.bind(this));\n                this._workbook.bind('unhideRow', this._workbookUnhideRow.bind(this));\n                this._workbook.bind('unhideColumn', this._workbookUnhideColumn.bind(this));\n                this._workbook.bind('select', this._workbookSelect.bind(this));\n                this._workbook.bind('changeFormat', this._workbookChangeFormat.bind(this));\n            },\n            destroy: function () {\n                kendo.ui.Widget.fn.destroy.call(this);\n                this._workbook.destroy();\n                this._controller.destroy();\n                this._view.destroy();\n                if (this._resizeHandler) {\n                    $(window).off('resize' + NS, this._resizeHandler);\n                }\n            },\n            options: {\n                name: 'Spreadsheet',\n                toolbar: true,\n                sheetsbar: true,\n                rows: 200,\n                columns: 50,\n                rowHeight: 20,\n                columnWidth: 64,\n                headerHeight: 20,\n                headerWidth: 32,\n                excel: {\n                    proxyURL: '',\n                    fileName: 'Workbook.xlsx'\n                },\n                messages: {},\n                pdf: {\n                    area: 'workbook',\n                    fileName: 'Workbook.pdf',\n                    proxyURL: '',\n                    paperSize: 'a4',\n                    landscape: true,\n                    margin: null,\n                    title: null,\n                    author: null,\n                    subject: null,\n                    keywords: null,\n                    creator: 'Kendo UI PDF Generator v.' + kendo.version,\n                    date: null\n                },\n                defaultCellStyle: {\n                    fontFamily: 'Arial',\n                    fontSize: '12'\n                }\n            },\n            defineName: function (name, value, hidden) {\n                return this._workbook.defineName(name, value, hidden);\n            },\n            undefineName: function (name) {\n                return this._workbook.undefineName(name);\n            },\n            nameValue: function (name) {\n                return this._workbook.nameValue(name);\n            },\n            forEachName: function (func) {\n                return this._workbook.forEachName(func);\n            },\n            cellContextMenu: function () {\n                return this._view.cellContextMenu;\n            },\n            rowHeaderContextMenu: function () {\n                return this._view.rowHeaderContextMenu;\n            },\n            colHeaderContextMenu: function () {\n                return this._view.colHeaderContextMenu;\n            },\n            events: [\n                'cut',\n                'copy',\n                'paste',\n                'pdfExport',\n                'excelExport',\n                'excelImport',\n                'change',\n                'render',\n                'removeSheet',\n                'selectSheet',\n                'renameSheet',\n                'insertRow',\n                'insertColumn',\n                'deleteRow',\n                'insertSheet',\n                'deleteColumn',\n                'hideRow',\n                'hideColumn',\n                'unhideRow',\n                'unhideColumn',\n                'select',\n                'changeFormat'\n            ]\n        });\n        kendo.spreadsheet.ALL_REASONS = ALL_REASONS;\n        kendo.ui.plugin(Spreadsheet);\n        $.extend(true, Spreadsheet, { classNames: classNames });\n    }(window.kendo));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.pivot.configurator', ['kendo.dom'], f);\n}(function () {\n    var __meta__ = {\n        id: 'pivot.configurator',\n        name: 'PivotConfigurator',\n        category: 'web',\n        depends: [\n            'dropdownlist',\n            'treeview',\n            'pivot.fieldmenu'\n        ],\n        hidden: true\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, ui = kendo.ui, Widget = ui.Widget, ns = '.kendoPivotConfigurator', HOVEREVENTS = 'mouseenter' + ns + ' mouseleave' + ns, SETTING_CONTAINER_TEMPLATE = kendo.template('<p class=\"k-reset\"><span class=\"k-icon #=icon#\"></span>${name}</p>' + '<div class=\"k-list-container k-reset\"/>');\n        function addKPI(data) {\n            var found;\n            var idx = 0;\n            var length = data.length;\n            for (; idx < length; idx++) {\n                if (data[idx].type == 2) {\n                    found = true;\n                    break;\n                }\n            }\n            if (found) {\n                data.splice(idx + 1, 0, {\n                    caption: 'KPIs',\n                    defaultHierarchy: '[KPIs]',\n                    name: 'KPIs',\n                    uniqueName: '[KPIs]'\n                });\n            }\n        }\n        function kpiNode(node) {\n            return {\n                name: node.uniqueName,\n                type: node.type\n            };\n        }\n        function normalizeKPIs(data) {\n            for (var idx = 0, length = data.length; idx < length; idx++) {\n                data[idx].uniqueName = data[idx].name;\n                data[idx].type = 'kpi';\n            }\n            return data;\n        }\n        function settingTargetFromNode(node) {\n            var target = $(node).closest('.k-pivot-setting');\n            if (target.length) {\n                return target.data('kendoPivotSettingTarget');\n            }\n            return null;\n        }\n        var PivotConfigurator = Widget.extend({\n            init: function (element, options) {\n                Widget.fn.init.call(this, element, options);\n                this.element.addClass('k-widget k-fieldselector k-alt k-edit-form-container');\n                this._dataSource();\n                this._layout();\n                this.refresh();\n                kendo.notify(this);\n            },\n            events: [],\n            options: {\n                name: 'PivotConfigurator',\n                filterable: false,\n                sortable: false,\n                messages: {\n                    measures: 'Drop Data Fields Here',\n                    columns: 'Drop Column Fields Here',\n                    rows: 'Drop Rows Fields Here',\n                    measuresLabel: 'Measures',\n                    columnsLabel: 'Columns',\n                    rowsLabel: 'Rows',\n                    fieldsLabel: 'Fields'\n                }\n            },\n            _dataSource: function () {\n                var that = this;\n                if (that.dataSource && that._refreshHandler) {\n                    that.dataSource.unbind('change', that._refreshHandler).unbind('error', that._errorHandler).unbind('progress', that._progressHandler);\n                } else {\n                    that._errorHandler = $.proxy(that._error, that);\n                    that._refreshHandler = $.proxy(that.refresh, that);\n                    that._progressHandler = $.proxy(that._requestStart, that);\n                }\n                that.dataSource = kendo.data.PivotDataSource.create(that.options.dataSource);\n                that.dataSource.bind('change', that._refreshHandler).bind('error', that._errorHandler).bind('progress', that._progressHandler);\n            },\n            setDataSource: function (dataSource) {\n                this.options.dataSource = dataSource;\n                this._dataSource();\n                if (this.measures) {\n                    this.measures.setDataSource(dataSource);\n                }\n                if (this.rows) {\n                    this.rows.setDataSource(dataSource);\n                }\n                if (this.columns) {\n                    this.columns.setDataSource(dataSource);\n                }\n                this.refresh();\n            },\n            _treeViewDataSource: function () {\n                var that = this;\n                return kendo.data.HierarchicalDataSource.create({\n                    schema: {\n                        model: {\n                            id: 'uniqueName',\n                            hasChildren: function (item) {\n                                return !('hierarchyUniqueName' in item) && !('aggregator' in item);\n                            }\n                        }\n                    },\n                    transport: {\n                        read: function (options) {\n                            var promise;\n                            var node;\n                            var kpi;\n                            if ($.isEmptyObject(options.data)) {\n                                promise = that.dataSource.schemaDimensions();\n                                promise.done(function (data) {\n                                    if (!that.dataSource.cubeBuilder) {\n                                        addKPI(data);\n                                    }\n                                    options.success(data);\n                                }).fail(options.error);\n                            } else {\n                                node = that.treeView.dataSource.get(options.data.uniqueName);\n                                if (node.uniqueName === '[KPIs]') {\n                                    kpi = true;\n                                    promise = that.dataSource.schemaKPIs();\n                                    promise.done(function (data) {\n                                        options.success(normalizeKPIs(data));\n                                    }).fail(options.error);\n                                } else if (node.type == 'kpi') {\n                                    kpi = true;\n                                    options.success(buildKPImeasures(node));\n                                }\n                                if (!kpi) {\n                                    if (node.type == 2) {\n                                        promise = that.dataSource.schemaMeasures();\n                                    } else if (node.dimensionUniqueName) {\n                                        promise = that.dataSource.schemaLevels(options.data.uniqueName);\n                                    } else {\n                                        promise = that.dataSource.schemaHierarchies(options.data.uniqueName);\n                                    }\n                                    promise.done(options.success).fail(options.error);\n                                }\n                            }\n                        }\n                    }\n                });\n            },\n            _progress: function (toggle) {\n                kendo.ui.progress(this.element, toggle);\n            },\n            _error: function () {\n                this._progress(false);\n            },\n            _requestStart: function () {\n                this._progress(true);\n            },\n            _layout: function () {\n                this.form = $('<div class=\"k-columns k-state-default k-floatwrap\"/>').appendTo(this.element);\n                this._fields();\n                this._targets();\n            },\n            _fields: function () {\n                var container = $('<div class=\"k-state-default\"><p class=\"k-reset\"><span class=\"k-icon k-i-group\"></span>' + this.options.messages.fieldsLabel + '</p></div>').appendTo(this.form);\n                var template = '# if (item.type == 2 || item.uniqueName == \"[KPIs]\") { #' + '<span class=\"k-icon k-i-#= (item.type == 2 ? \"sum\" : \"kpi\") #\"></span>' + '# } else if (item.type && item.type !== \"kpi\") { #' + '<span class=\"k-icon k-i-arrows-dimensions\"></span>' + '# } #' + '#: item.caption || item.name #';\n                this.treeView = $('<div/>').appendTo(container).kendoTreeView({\n                    template: template,\n                    dataTextField: 'caption',\n                    dragAndDrop: true,\n                    autoBind: false,\n                    dataSource: this._treeViewDataSource(),\n                    dragstart: function (e) {\n                        var dataItem = this.dataItem(e.sourceNode);\n                        if (!dataItem.hasChildren && !dataItem.aggregator && !dataItem.measure || dataItem.type == 2 || dataItem.uniqueName === '[KPIs]') {\n                            e.preventDefault();\n                        }\n                    },\n                    drag: function (e) {\n                        var status = 'k-i-cancel';\n                        var setting = settingTargetFromNode(e.dropTarget);\n                        if (setting && setting.validate(this.dataItem(e.sourceNode))) {\n                            status = 'k-i-plus';\n                        }\n                        e.setStatusClass(status);\n                    },\n                    drop: function (e) {\n                        e.preventDefault();\n                        var setting = settingTargetFromNode(e.dropTarget);\n                        var node = this.dataItem(e.sourceNode);\n                        var idx, length, measures;\n                        var name;\n                        if (setting && setting.validate(node)) {\n                            name = node.defaultHierarchy || node.uniqueName;\n                            if (node.type === 'kpi') {\n                                measures = buildKPImeasures(node);\n                                length = measures.length;\n                                name = [];\n                                for (idx = 0; idx < length; idx++) {\n                                    name.push(kpiNode(measures[idx]));\n                                }\n                            } else if (node.kpi) {\n                                name = [kpiNode(node)];\n                            }\n                            setting.add(name);\n                        }\n                    }\n                }).data('kendoTreeView');\n            },\n            _createTarget: function (element, options) {\n                var template = '<li class=\"k-item k-header\" data-' + kendo.ns + 'name=\"${data.name}\">${data.name}';\n                var sortable = options.sortable;\n                var icons = '';\n                if (sortable) {\n                    icons += '#if (data.sortIcon) {#';\n                    icons += '<span class=\"k-icon ${data.sortIcon}-sm\"></span>';\n                    icons += '#}#';\n                }\n                if (options.filterable || sortable) {\n                    icons += '<span class=\"k-icon k-i-more-vertical k-setting-fieldmenu\"></span>';\n                }\n                icons += '<span class=\"k-icon k-i-close k-setting-delete\"></span>';\n                template += '<span class=\"k-field-actions\">' + icons + '</span></li>';\n                return new kendo.ui.PivotSettingTarget(element, $.extend({\n                    dataSource: this.dataSource,\n                    hint: function (element) {\n                        var wrapper = $('<div class=\"k-fieldselector\"><ul class=\"k-list k-reset\"></ul></div>');\n                        wrapper.find('.k-list').append(element.clone());\n                        return wrapper;\n                    },\n                    template: template,\n                    emptyTemplate: '<li class=\"k-item k-empty\">${data}</li>'\n                }, options));\n            },\n            _targets: function () {\n                var container = $('<div class=\"k-state-default\"/>').appendTo(this.form);\n                var columnsContainer = $(SETTING_CONTAINER_TEMPLATE({\n                    name: this.options.messages.columnsLabel,\n                    icon: 'k-i-columns'\n                })).appendTo(container);\n                var columns = $('<ul class=\"k-pivot-configurator-settings k-list k-reset\" />').appendTo(columnsContainer.last());\n                var rowsContainer = $(SETTING_CONTAINER_TEMPLATE({\n                    name: this.options.messages.rowsLabel,\n                    icon: 'k-i-rows'\n                })).appendTo(container);\n                var rows = $('<ul class=\"k-pivot-configurator-settings k-list k-reset\" />').appendTo(rowsContainer.last());\n                var measuresContainer = $(SETTING_CONTAINER_TEMPLATE({\n                    name: this.options.messages.measuresLabel,\n                    icon: 'k-i-sum'\n                })).appendTo(container);\n                var measures = $('<ul class=\"k-pivot-configurator-settings k-list k-reset\" />').appendTo(measuresContainer.last());\n                var options = this.options;\n                this.columns = this._createTarget(columns, {\n                    filterable: options.filterable,\n                    sortable: options.sortable,\n                    connectWith: rows,\n                    messages: {\n                        empty: options.messages.columns,\n                        fieldMenu: options.messages.fieldMenu\n                    }\n                });\n                this.rows = this._createTarget(rows, {\n                    filterable: options.filterable,\n                    sortable: options.sortable,\n                    setting: 'rows',\n                    connectWith: columns,\n                    messages: {\n                        empty: this.options.messages.rows,\n                        fieldMenu: this.options.messages.fieldMenu\n                    }\n                });\n                this.measures = this._createTarget(measures, {\n                    setting: 'measures',\n                    messages: { empty: options.messages.measures }\n                });\n                columns.add(rows).add(measures).on(HOVEREVENTS, '.k-item:not(.k-empty)', this._toggleHover);\n            },\n            _toggleHover: function (e) {\n                $(e.currentTarget).toggleClass('k-state-hover', e.type === 'mouseenter');\n            },\n            _resize: function () {\n                var element = this.element;\n                var height = this.options.height;\n                var border, fields;\n                var outerHeight = kendo._outerHeight;\n                if (!height) {\n                    return;\n                }\n                element.height(height);\n                if (element.is(':visible')) {\n                    fields = element.children('.k-columns').children('div.k-state-default');\n                    height = element.innerHeight();\n                    border = (outerHeight(element) - height) / 2;\n                    height = height - (outerHeight(fields, true) - fields.height()) - border;\n                    fields.height(height);\n                }\n            },\n            refresh: function () {\n                var dataSource = this.dataSource;\n                if (dataSource.cubeBuilder || this._cube !== dataSource.cube() || this._catalog !== dataSource.catalog()) {\n                    this.treeView.dataSource.fetch();\n                }\n                this._catalog = this.dataSource.catalog();\n                this._cube = this.dataSource.cube();\n                this._resize();\n                this._progress(false);\n            },\n            destroy: function () {\n                Widget.fn.destroy.call(this);\n                this.dataSource.unbind('change', this._refreshHandler);\n                this.form.find('.k-list').off(ns);\n                this.rows.destroy();\n                this.columns.destroy();\n                this.measures.destroy();\n                this.treeView.destroy();\n                this.element = null;\n                this._refreshHandler = null;\n            }\n        });\n        function kpiMeasure(name, measure, type) {\n            return {\n                hierarchyUniqueName: name,\n                uniqueName: measure,\n                caption: measure,\n                measure: measure,\n                name: measure,\n                type: type,\n                kpi: true\n            };\n        }\n        function buildKPImeasures(node) {\n            var name = node.name;\n            return [\n                kpiMeasure(name, node.value, 'value'),\n                kpiMeasure(name, node.goal, 'goal'),\n                kpiMeasure(name, node.status, 'status'),\n                kpiMeasure(name, node.trend, 'trend')\n            ];\n        }\n        ui.plugin(PivotConfigurator);\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.angular', ['kendo.core'], f);\n}(function () {\n    var __meta__ = {\n        id: 'angular',\n        name: 'AngularJS Directives',\n        category: 'framework',\n        description: 'Adds Kendo UI for AngularJS directives',\n        depends: ['core'],\n        defer: true\n    };\n    (function ($, angular, undefined) {\n        'use strict';\n        if (!angular || !angular.injector) {\n            return;\n        }\n        var module = angular.module('kendo.directives', []), $injector = angular.injector(['ng']), $parse = $injector.get('$parse'), $timeout = $injector.get('$timeout'), $defaultCompile, $log = $injector.get('$log');\n        function withoutTimeout(f) {\n            var save = $timeout;\n            try {\n                $timeout = function (f) {\n                    return f();\n                };\n                return f();\n            } finally {\n                $timeout = save;\n            }\n        }\n        var OPTIONS_NOW;\n        var createDataSource = function () {\n            var types = {\n                TreeList: 'TreeListDataSource',\n                TreeView: 'HierarchicalDataSource',\n                Scheduler: 'SchedulerDataSource',\n                PivotGrid: 'PivotDataSource',\n                PivotConfigurator: 'PivotDataSource',\n                PanelBar: 'HierarchicalDataSource',\n                Menu: '$PLAIN',\n                ContextMenu: '$PLAIN'\n            };\n            var toDataSource = function (dataSource, type) {\n                if (type == '$PLAIN') {\n                    return dataSource;\n                }\n                return kendo.data[type].create(dataSource);\n            };\n            return function (scope, element, role, source) {\n                var type = types[role] || 'DataSource';\n                var current = scope.$eval(source);\n                var ds = toDataSource(current, type);\n                scope.$watch(source, function (mew) {\n                    var widget = kendoWidgetInstance(element);\n                    if (widget && typeof widget.setDataSource == 'function') {\n                        if (mew !== current) {\n                            var ds = toDataSource(mew, type);\n                            widget.setDataSource(ds);\n                            current = mew;\n                        }\n                    }\n                });\n                return ds;\n            };\n        }();\n        var ignoredAttributes = {\n            kDataSource: true,\n            kOptions: true,\n            kRebind: true,\n            kNgModel: true,\n            kNgDelay: true\n        };\n        var ignoredOwnProperties = {\n            name: true,\n            title: true,\n            style: true\n        };\n        function createWidget(scope, element, attrs, widget, origAttr, controllers) {\n            if (!(element instanceof jQuery)) {\n                throw new Error('The Kendo UI directives require jQuery to be available before AngularJS. Please include jquery before angular in the document.');\n            }\n            var kNgDelay = attrs.kNgDelay, delayValue = scope.$eval(kNgDelay);\n            controllers = controllers || [];\n            var ngModel = controllers[0], ngForm = controllers[1];\n            var ctor = $(element)[widget];\n            if (!ctor) {\n                window.console.error('Could not find: ' + widget);\n                return null;\n            }\n            var parsed = parseOptions(scope, element, attrs, widget, ctor);\n            var options = parsed.options;\n            if (parsed.unresolved.length) {\n                var promises = [];\n                for (var i = 0, len = parsed.unresolved.length; i < len; i++) {\n                    var unresolved = parsed.unresolved[i];\n                    var promise = $.Deferred(function (d) {\n                        var unwatch = scope.$watch(unresolved.path, function (newValue) {\n                            if (newValue !== undefined) {\n                                unwatch();\n                                d.resolve();\n                            }\n                        });\n                    }).promise();\n                    promises.push(promise);\n                }\n                $.when.apply(null, promises).then(createIt);\n                return;\n            }\n            if (kNgDelay && !delayValue) {\n                var root = scope.$root || scope;\n                var register = function () {\n                    var unregister = scope.$watch(kNgDelay, function (newValue) {\n                        if (newValue !== undefined) {\n                            unregister();\n                            element.removeAttr(attrs.$attr.kNgDelay);\n                            kNgDelay = null;\n                            $timeout(createIt);\n                        }\n                    });\n                };\n                if (/^\\$(digest|apply)$/.test(root.$$phase)) {\n                    register();\n                } else {\n                    scope.$apply(register);\n                }\n                return;\n            } else {\n                return createIt();\n            }\n            function createIt() {\n                var originalElement;\n                if (attrs.kRebind) {\n                    originalElement = $($(element)[0].cloneNode(true));\n                }\n                options = parseOptions(scope, element, attrs, widget, ctor).options;\n                if (element.is('select')) {\n                    (function (options) {\n                        if (options.length > 0) {\n                            var first = $(options[0]);\n                            if (!/\\S/.test(first.text()) && /^\\?/.test(first.val())) {\n                                first.remove();\n                            }\n                        }\n                    }(element[0].options));\n                }\n                var object = ctor.call(element, OPTIONS_NOW = options).data(widget);\n                exposeWidget(object, scope, attrs, widget, origAttr);\n                scope.$emit('kendoWidgetCreated', object);\n                var destroyRegister = destroyWidgetOnScopeDestroy(scope, object);\n                if (attrs.kRebind) {\n                    setupRebind(object, scope, element, originalElement, attrs.kRebind, destroyRegister, attrs);\n                }\n                if (attrs.kNgDisabled) {\n                    var kNgDisabled = attrs.kNgDisabled;\n                    var isDisabled = scope.$eval(kNgDisabled);\n                    if (isDisabled) {\n                        object.enable(!isDisabled);\n                    }\n                    bindToKNgDisabled(object, scope, element, kNgDisabled);\n                }\n                if (attrs.kNgReadonly) {\n                    var kNgReadonly = attrs.kNgReadonly;\n                    var isReadonly = scope.$eval(kNgReadonly);\n                    if (isReadonly) {\n                        object.readonly(isReadonly);\n                    }\n                    bindToKNgReadonly(object, scope, element, kNgReadonly);\n                }\n                if (attrs.kNgModel) {\n                    bindToKNgModel(object, scope, attrs.kNgModel);\n                }\n                if (ngModel) {\n                    bindToNgModel(object, scope, element, ngModel, ngForm);\n                }\n                if (object) {\n                    propagateClassToWidgetWrapper(object, element);\n                }\n                return object;\n            }\n        }\n        function parseOptions(scope, element, attrs, widget, ctor) {\n            var role = widget.replace(/^kendo/, '');\n            var unresolved = [];\n            var optionsPath = attrs.kOptions || attrs.options;\n            var optionsValue = scope.$eval(optionsPath);\n            if (optionsPath && optionsValue === undefined) {\n                unresolved.push({\n                    option: 'options',\n                    path: optionsPath\n                });\n            }\n            var options = angular.extend({}, attrs.defaultOptions, optionsValue);\n            function addOption(name, value) {\n                var scopeValue = angular.copy(scope.$eval(value));\n                if (scopeValue === undefined) {\n                    unresolved.push({\n                        option: name,\n                        path: value\n                    });\n                } else {\n                    options[name] = scopeValue;\n                }\n            }\n            var widgetOptions = ctor.widget.prototype.options;\n            var widgetEvents = ctor.widget.prototype.events;\n            $.each(attrs, function (name, value) {\n                if (name === 'source' || name === 'kDataSource' || name === 'kScopeField' || name === 'scopeField') {\n                    return;\n                }\n                var dataName = 'data' + name.charAt(0).toUpperCase() + name.slice(1);\n                if (name.indexOf('on') === 0) {\n                    var eventKey = name.replace(/^on./, function (prefix) {\n                        return prefix.charAt(2).toLowerCase();\n                    });\n                    if (widgetEvents.indexOf(eventKey) > -1) {\n                        options[eventKey] = value;\n                    }\n                }\n                if (widgetOptions.hasOwnProperty(dataName)) {\n                    addOption(dataName, value);\n                } else if (widgetOptions.hasOwnProperty(name) && !ignoredOwnProperties[name]) {\n                    addOption(name, value);\n                } else if (!ignoredAttributes[name]) {\n                    var match = name.match(/^k(On)?([A-Z].*)/);\n                    if (match) {\n                        var optionName = match[2].charAt(0).toLowerCase() + match[2].slice(1);\n                        if (match[1] && name != 'kOnLabel') {\n                            options[optionName] = value;\n                        } else {\n                            if (name == 'kOnLabel') {\n                                optionName = 'onLabel';\n                            }\n                            addOption(optionName, value);\n                        }\n                    }\n                }\n            });\n            var dataSource = attrs.kDataSource || attrs.source;\n            if (dataSource) {\n                options.dataSource = createDataSource(scope, element, role, dataSource);\n            }\n            options.$angular = [scope];\n            return {\n                options: options,\n                unresolved: unresolved\n            };\n        }\n        function bindToKNgDisabled(widget, scope, element, kNgDisabled) {\n            if (kendo.ui.PanelBar && widget instanceof kendo.ui.PanelBar || kendo.ui.Menu && widget instanceof kendo.ui.Menu) {\n                $log.warn('k-ng-disabled specified on a widget that does not have the enable() method: ' + widget.options.name);\n                return;\n            }\n            scope.$watch(kNgDisabled, function (newValue, oldValue) {\n                if (newValue != oldValue) {\n                    widget.enable(!newValue);\n                }\n            });\n        }\n        function bindToKNgReadonly(widget, scope, element, kNgReadonly) {\n            if (typeof widget.readonly != 'function') {\n                $log.warn('k-ng-readonly specified on a widget that does not have the readonly() method: ' + widget.options.name);\n                return;\n            }\n            scope.$watch(kNgReadonly, function (newValue, oldValue) {\n                if (newValue != oldValue) {\n                    widget.readonly(newValue);\n                }\n            });\n        }\n        function exposeWidget(widget, scope, attrs, kendoWidget, origAttr) {\n            if (attrs[origAttr]) {\n                var set = $parse(attrs[origAttr]).assign;\n                if (set) {\n                    set(scope, widget);\n                } else {\n                    throw new Error(origAttr + ' attribute used but expression in it is not assignable: ' + attrs[kendoWidget]);\n                }\n            }\n        }\n        function formValue(element) {\n            if (/checkbox|radio/i.test(element.attr('type'))) {\n                return element.prop('checked');\n            }\n            return element.val();\n        }\n        var formRegExp = /^(input|select|textarea)$/i;\n        function isForm(element) {\n            return formRegExp.test(element[0].tagName);\n        }\n        function bindToNgModel(widget, scope, element, ngModel, ngForm) {\n            if (!widget.value) {\n                return;\n            }\n            var value;\n            var haveChangeOnElement = false;\n            if (isForm(element)) {\n                value = function () {\n                    return formValue(element);\n                };\n            } else {\n                value = function () {\n                    return widget.value();\n                };\n            }\n            var viewRender = function () {\n                var val = ngModel.$viewValue;\n                if (val === undefined) {\n                    val = ngModel.$modelValue;\n                }\n                if (val === undefined) {\n                    val = null;\n                }\n                haveChangeOnElement = true;\n                setTimeout(function () {\n                    haveChangeOnElement = false;\n                    if (widget) {\n                        var kNgModel = scope[widget.element.attr('k-ng-model')];\n                        if (kNgModel) {\n                            val = kNgModel;\n                        }\n                        if (widget.options.autoBind === false && !widget.listView.bound()) {\n                            if (val) {\n                                widget.value(val);\n                            }\n                        } else {\n                            widget.value(val);\n                        }\n                    }\n                }, 0);\n            };\n            ngModel.$render = viewRender;\n            setTimeout(function () {\n                if (ngModel.$render !== viewRender) {\n                    ngModel.$render = viewRender;\n                    ngModel.$render();\n                }\n            });\n            if (isForm(element)) {\n                element.on('change', function () {\n                    haveChangeOnElement = true;\n                });\n            }\n            var onChange = function (pristine) {\n                return function () {\n                    var formPristine;\n                    if (haveChangeOnElement && !element.is('select')) {\n                        return;\n                    }\n                    if (pristine && ngForm) {\n                        formPristine = ngForm.$pristine;\n                    }\n                    ngModel.$setViewValue(value());\n                    if (pristine) {\n                        ngModel.$setPristine();\n                        if (formPristine) {\n                            ngForm.$setPristine();\n                        }\n                    }\n                    digest(scope);\n                };\n            };\n            widget.first('change', onChange(false));\n            widget.first('spin', onChange(false));\n            if (!(kendo.ui.AutoComplete && widget instanceof kendo.ui.AutoComplete)) {\n                widget.first('dataBound', onChange(true));\n            }\n            var currentVal = value();\n            if (!isNaN(ngModel.$viewValue) && currentVal != ngModel.$viewValue) {\n                if (!ngModel.$isEmpty(ngModel.$viewValue)) {\n                    widget.value(ngModel.$viewValue);\n                } else if (currentVal != null && currentVal !== '' && currentVal != ngModel.$viewValue) {\n                    ngModel.$setViewValue(currentVal);\n                }\n            }\n            ngModel.$setPristine();\n        }\n        function bindToKNgModel(widget, scope, kNgModel) {\n            if (typeof widget.value != 'function') {\n                $log.warn('k-ng-model specified on a widget that does not have the value() method: ' + widget.options.name);\n                return;\n            }\n            var form = $(widget.element).parents('form');\n            var ngForm = kendo.getter(form.attr('name'), true)(scope);\n            var getter = $parse(kNgModel);\n            var setter = getter.assign;\n            var updating = false;\n            var valueIsCollection = kendo.ui.MultiSelect && widget instanceof kendo.ui.MultiSelect;\n            var length = function (value) {\n                return value && valueIsCollection ? value.length : 0;\n            };\n            var currentValueLength = length(getter(scope));\n            widget.$angular_setLogicValue(getter(scope));\n            var watchHandler = function (newValue, oldValue) {\n                if (newValue === undefined) {\n                    newValue = null;\n                }\n                if (updating || newValue == oldValue && length(newValue) == currentValueLength) {\n                    return;\n                }\n                currentValueLength = length(newValue);\n                widget.$angular_setLogicValue(newValue);\n            };\n            if (valueIsCollection) {\n                scope.$watchCollection(kNgModel, watchHandler);\n            } else {\n                scope.$watch(kNgModel, watchHandler);\n            }\n            var changeHandler = function () {\n                updating = true;\n                if (ngForm && ngForm.$pristine) {\n                    ngForm.$setDirty();\n                }\n                digest(scope, function () {\n                    setter(scope, widget.$angular_getLogicValue());\n                    currentValueLength = length(getter(scope));\n                });\n                updating = false;\n            };\n            widget.first('change', changeHandler);\n            widget.first('spin', changeHandler);\n        }\n        function destroyWidgetOnScopeDestroy(scope, widget) {\n            var deregister = scope.$on('$destroy', function () {\n                deregister();\n                if (widget) {\n                    kendo.destroy(widget.element);\n                    widget = null;\n                }\n            });\n            return deregister;\n        }\n        function propagateClassToWidgetWrapper(widget, element) {\n            if (!(window.MutationObserver && widget.wrapper)) {\n                return;\n            }\n            var prevClassList = [].slice.call($(element)[0].classList);\n            var mo = new MutationObserver(function (changes) {\n                suspend();\n                if (!widget) {\n                    return;\n                }\n                changes.forEach(function (chg) {\n                    var w = $(widget.wrapper)[0];\n                    switch (chg.attributeName) {\n                    case 'class':\n                        var currClassList = [].slice.call(chg.target.classList);\n                        currClassList.forEach(function (cls) {\n                            if (prevClassList.indexOf(cls) < 0) {\n                                w.classList.add(cls);\n                                if (kendo.ui.ComboBox && widget instanceof kendo.ui.ComboBox) {\n                                    widget.input[0].classList.add(cls);\n                                }\n                            }\n                        });\n                        prevClassList.forEach(function (cls) {\n                            if (currClassList.indexOf(cls) < 0) {\n                                w.classList.remove(cls);\n                                if (kendo.ui.ComboBox && widget instanceof kendo.ui.ComboBox) {\n                                    widget.input[0].classList.remove(cls);\n                                }\n                            }\n                        });\n                        prevClassList = currClassList;\n                        break;\n                    case 'disabled':\n                        if (typeof widget.enable == 'function' && !widget.element.attr('readonly')) {\n                            widget.enable(!$(chg.target).attr('disabled'));\n                        }\n                        break;\n                    case 'readonly':\n                        if (typeof widget.readonly == 'function' && !widget.element.attr('disabled')) {\n                            widget.readonly(!!$(chg.target).attr('readonly'));\n                        }\n                        break;\n                    }\n                });\n                resume();\n            });\n            function suspend() {\n                mo.disconnect();\n            }\n            function resume() {\n                mo.observe($(element)[0], { attributes: true });\n            }\n            resume();\n            widget.first('destroy', suspend);\n        }\n        function setupRebind(widget, scope, element, originalElement, rebindAttr, destroyRegister, attrs) {\n            var unregister = scope.$watch(rebindAttr, function (newValue, oldValue) {\n                if (!widget._muteRebind && newValue !== oldValue) {\n                    unregister();\n                    if (attrs._cleanUp) {\n                        attrs._cleanUp();\n                    }\n                    var templateOptions = WIDGET_TEMPLATE_OPTIONS[widget.options.name];\n                    if (templateOptions) {\n                        templateOptions.forEach(function (name) {\n                            var templateContents = scope.$eval(attrs['k' + name]);\n                            if (templateContents) {\n                                originalElement.append($(templateContents).attr(kendo.toHyphens('k' + name), ''));\n                            }\n                        });\n                    }\n                    var _wrapper = $(widget.wrapper)[0];\n                    var _element = $(widget.element)[0];\n                    var isUpload = widget.options.name === 'Upload';\n                    if (isUpload) {\n                        element = $(_element);\n                    }\n                    var compile = element.injector().get('$compile');\n                    widget._destroy();\n                    if (destroyRegister) {\n                        destroyRegister();\n                    }\n                    widget = null;\n                    if (_element) {\n                        if (_wrapper) {\n                            _wrapper.parentNode.replaceChild(_element, _wrapper);\n                        }\n                        $(element).replaceWith(originalElement);\n                    }\n                    compile(originalElement)(scope);\n                }\n            }, true);\n            digest(scope);\n        }\n        function bind(f, obj) {\n            return function (a, b) {\n                return f.call(obj, a, b);\n            };\n        }\n        function setTemplate(key, value) {\n            this[key] = kendo.stringify(value);\n        }\n        module.factory('directiveFactory', [\n            '$compile',\n            function (compile) {\n                var kendoRenderedTimeout;\n                var RENDERED = false;\n                $defaultCompile = compile;\n                var create = function (role, origAttr) {\n                    return {\n                        restrict: 'AC',\n                        require: [\n                            '?ngModel',\n                            '^?form'\n                        ],\n                        scope: false,\n                        controller: [\n                            '$scope',\n                            '$attrs',\n                            '$element',\n                            function ($scope, $attrs) {\n                                this.template = bind(setTemplate, $attrs);\n                                $attrs._cleanUp = bind(function () {\n                                    this.template = null;\n                                    $attrs._cleanUp = null;\n                                }, this);\n                            }\n                        ],\n                        link: function (scope, element, attrs, controllers) {\n                            var $element = $(element);\n                            var roleattr = role.replace(/([A-Z])/g, '-$1');\n                            $element.attr(roleattr, $element.attr('data-' + roleattr));\n                            $element[0].removeAttribute('data-' + roleattr);\n                            var widget = createWidget(scope, element, attrs, role, origAttr, controllers);\n                            if (!widget) {\n                                return;\n                            }\n                            if (kendoRenderedTimeout) {\n                                clearTimeout(kendoRenderedTimeout);\n                            }\n                            kendoRenderedTimeout = setTimeout(function () {\n                                scope.$emit('kendoRendered');\n                                if (!RENDERED) {\n                                    RENDERED = true;\n                                    $('form').each(function () {\n                                        var form = $(this).controller('form');\n                                        if (form) {\n                                            form.$setPristine();\n                                        }\n                                    });\n                                }\n                            });\n                        }\n                    };\n                };\n                return { create: create };\n            }\n        ]);\n        var TAGNAMES = {\n            Editor: 'textarea',\n            NumericTextBox: 'input',\n            DatePicker: 'input',\n            DateTimePicker: 'input',\n            TimePicker: 'input',\n            AutoComplete: 'input',\n            ColorPicker: 'input',\n            MaskedTextBox: 'input',\n            MultiSelect: 'input',\n            Upload: 'input',\n            Validator: 'form',\n            Button: 'button',\n            MobileButton: 'a',\n            MobileBackButton: 'a',\n            MobileDetailButton: 'a',\n            ListView: 'ul',\n            MobileListView: 'ul',\n            PanelBar: 'ul',\n            TreeView: 'ul',\n            Menu: 'ul',\n            ContextMenu: 'ul',\n            ActionSheet: 'ul'\n        };\n        var SKIP_SHORTCUTS = [\n            'MobileView',\n            'MobileDrawer',\n            'MobileLayout',\n            'MobileSplitView',\n            'MobilePane',\n            'MobileModalView'\n        ];\n        var MANUAL_DIRECTIVES = [\n            'MobileApplication',\n            'MobileView',\n            'MobileModalView',\n            'MobileLayout',\n            'MobileActionSheet',\n            'MobileDrawer',\n            'MobileSplitView',\n            'MobilePane',\n            'MobileScrollView',\n            'MobilePopOver'\n        ];\n        angular.forEach([\n            'MobileNavBar',\n            'MobileButton',\n            'MobileBackButton',\n            'MobileDetailButton',\n            'MobileTabStrip',\n            'MobileScrollView',\n            'MobileScroller'\n        ], function (widget) {\n            MANUAL_DIRECTIVES.push(widget);\n            widget = 'kendo' + widget;\n            module.directive(widget, function () {\n                return {\n                    restrict: 'A',\n                    link: function (scope, element, attrs) {\n                        createWidget(scope, element, attrs, widget, widget);\n                    }\n                };\n            });\n        });\n        function createDirectives(klass, isMobile) {\n            function make(directiveName, widgetName) {\n                module.directive(directiveName, [\n                    'directiveFactory',\n                    function (directiveFactory) {\n                        return directiveFactory.create(widgetName, directiveName);\n                    }\n                ]);\n            }\n            var name = isMobile ? 'Mobile' : '';\n            name += klass.fn.options.name;\n            var className = name;\n            var shortcut = 'kendo' + name.charAt(0) + name.substr(1).toLowerCase();\n            name = 'kendo' + name;\n            var dashed = name.replace(/([A-Z])/g, '-$1');\n            if (SKIP_SHORTCUTS.indexOf(name.replace('kendo', '')) == -1) {\n                var names = name === shortcut ? [name] : [\n                    name,\n                    shortcut\n                ];\n                angular.forEach(names, function (directiveName) {\n                    module.directive(directiveName, function () {\n                        return {\n                            restrict: 'E',\n                            replace: true,\n                            template: function (element, attributes) {\n                                var tag = TAGNAMES[className] || 'div';\n                                var scopeField = attributes.kScopeField || attributes.scopeField;\n                                return '<' + tag + ' ' + dashed + (scopeField ? '=\"' + scopeField + '\"' : '') + '>' + element.html() + '</' + tag + '>';\n                            }\n                        };\n                    });\n                });\n            }\n            if (MANUAL_DIRECTIVES.indexOf(name.replace('kendo', '')) > -1) {\n                return;\n            }\n            make(name, name);\n            if (shortcut != name) {\n                make(shortcut, name);\n            }\n        }\n        function kendoWidgetInstance(el) {\n            el = $(el);\n            return kendo.widgetInstance(el, kendo.ui) || kendo.widgetInstance(el, kendo.mobile.ui) || kendo.widgetInstance(el, kendo.dataviz.ui);\n        }\n        function digest(scope, func) {\n            var root = scope.$root || scope;\n            var isDigesting = /^\\$(digest|apply)$/.test(root.$$phase);\n            if (func) {\n                if (isDigesting) {\n                    func();\n                } else {\n                    root.$apply(func);\n                }\n            } else if (!isDigesting) {\n                root.$digest();\n            }\n        }\n        function destroyScope(scope, el) {\n            scope.$destroy();\n            if (el) {\n                $(el).removeData('$scope').removeData('$$kendoScope').removeData('$isolateScope').removeData('$isolateScopeNoTemplate').removeClass('ng-scope');\n            }\n        }\n        var pendingPatches = [];\n        function defadvice(klass, methodName, func) {\n            if ($.isArray(klass)) {\n                return angular.forEach(klass, function (klass) {\n                    defadvice(klass, methodName, func);\n                });\n            }\n            if (typeof klass == 'string') {\n                var a = klass.split('.');\n                var x = kendo;\n                while (x && a.length > 0) {\n                    x = x[a.shift()];\n                }\n                if (!x) {\n                    pendingPatches.push([\n                        klass,\n                        methodName,\n                        func\n                    ]);\n                    return false;\n                }\n                klass = x.prototype;\n            }\n            var origMethod = klass[methodName];\n            klass[methodName] = function () {\n                var self = this, args = arguments;\n                return func.apply({\n                    self: self,\n                    next: function () {\n                        return origMethod.apply(self, arguments.length > 0 ? arguments : args);\n                    }\n                }, args);\n            };\n            return true;\n        }\n        kendo.onWidgetRegistered(function (entry) {\n            pendingPatches = $.grep(pendingPatches, function (args) {\n                return !defadvice.apply(null, args);\n            });\n            createDirectives(entry.widget, entry.prefix == 'Mobile');\n        });\n        defadvice([\n            'ui.Widget',\n            'mobile.ui.Widget'\n        ], 'angular', function (cmd, arg) {\n            var self = this.self;\n            if (cmd == 'init') {\n                if (!arg && OPTIONS_NOW) {\n                    arg = OPTIONS_NOW;\n                }\n                OPTIONS_NOW = null;\n                if (arg && arg.$angular) {\n                    self.$angular_scope = arg.$angular[0];\n                    self.$angular_init(self.element, arg);\n                }\n                return;\n            }\n            var scope = self.$angular_scope;\n            if (scope) {\n                withoutTimeout(function () {\n                    var x = arg(), elements = x.elements, data = x.data;\n                    if (elements.length > 0) {\n                        switch (cmd) {\n                        case 'cleanup':\n                            angular.forEach(elements, function (el) {\n                                var itemScope = $(el).data('$$kendoScope');\n                                if (itemScope && itemScope !== scope && itemScope.$$kendoScope) {\n                                    destroyScope(itemScope, el);\n                                }\n                            });\n                            break;\n                        case 'compile':\n                            var injector = self.element.injector();\n                            var compile = injector ? injector.get('$compile') : $defaultCompile;\n                            angular.forEach(elements, function (el, i) {\n                                var itemScope;\n                                if (x.scopeFrom) {\n                                    itemScope = x.scopeFrom;\n                                } else {\n                                    var vars = data && data[i];\n                                    if (vars !== undefined) {\n                                        itemScope = $.extend(scope.$new(), vars);\n                                        itemScope.$$kendoScope = true;\n                                    } else {\n                                        itemScope = scope;\n                                    }\n                                }\n                                $(el).data('$$kendoScope', itemScope);\n                                compile(el)(itemScope);\n                            });\n                            digest(scope);\n                            break;\n                        }\n                    }\n                });\n            }\n        });\n        defadvice('ui.Widget', '$angular_getLogicValue', function () {\n            return this.self.value();\n        });\n        defadvice('ui.Widget', '$angular_setLogicValue', function (val) {\n            this.self.value(val);\n        });\n        defadvice('ui.Select', '$angular_getLogicValue', function () {\n            var item = this.self.dataItem(), valueField = this.self.options.dataValueField;\n            if (item) {\n                if (this.self.options.valuePrimitive) {\n                    if (!!valueField) {\n                        return item[valueField];\n                    } else {\n                        return item;\n                    }\n                } else {\n                    return item.toJSON();\n                }\n            } else {\n                return null;\n            }\n        });\n        defadvice('ui.Select', '$angular_setLogicValue', function (val) {\n            var self = this.self;\n            var options = self.options;\n            var valueField = options.dataValueField;\n            var text = options.text || '';\n            if (val === undefined) {\n                val = '';\n            }\n            if (valueField && !options.valuePrimitive && val) {\n                text = val[options.dataTextField] || '';\n                val = val[valueField || options.dataTextField];\n            }\n            if (self.options.autoBind === false && !self.listView.bound()) {\n                if (!text && val && options.valuePrimitive) {\n                    self.value(val);\n                } else {\n                    self._preselect(val, text);\n                }\n            } else {\n                self.value(val);\n            }\n        });\n        defadvice('ui.MultiSelect', '$angular_getLogicValue', function () {\n            var value = this.self.dataItems().slice(0);\n            var valueField = this.self.options.dataValueField;\n            if (valueField && this.self.options.valuePrimitive) {\n                value = $.map(value, function (item) {\n                    return item[valueField];\n                });\n            }\n            return value;\n        });\n        defadvice('ui.MultiSelect', '$angular_setLogicValue', function (val) {\n            if (val == null) {\n                val = [];\n            }\n            var self = this.self;\n            var options = self.options;\n            var valueField = options.dataValueField;\n            var data = val;\n            if (valueField && !options.valuePrimitive) {\n                val = $.map(val, function (item) {\n                    return item[valueField];\n                });\n            }\n            if (options.autoBind === false && !options.valuePrimitive && !self.listView.bound()) {\n                self._preselect(data, val);\n            } else {\n                self.value(val);\n            }\n        });\n        defadvice('ui.Widget', '$angular_init', function (element, options) {\n            var self = this.self;\n            if (options && !$.isArray(options)) {\n                var scope = self.$angular_scope;\n                for (var i = self.events.length; --i >= 0;) {\n                    var event = self.events[i];\n                    var handler = options[event];\n                    if (handler && typeof handler == 'string') {\n                        options[event] = self.$angular_makeEventHandler(event, scope, handler);\n                    }\n                }\n            }\n        });\n        defadvice('ui.Widget', '$angular_makeEventHandler', function (event, scope, handler) {\n            handler = $parse(handler);\n            return function (e) {\n                digest(scope, function () {\n                    handler(scope, { kendoEvent: e });\n                });\n            };\n        });\n        defadvice([\n            'ui.Grid',\n            'ui.ListView',\n            'ui.TreeView',\n            'ui.PanelBar'\n        ], '$angular_makeEventHandler', function (event, scope, handler) {\n            if (event != 'change') {\n                return this.next();\n            }\n            handler = $parse(handler);\n            return function (ev) {\n                var widget = ev.sender;\n                var options = widget.options;\n                var cell, multiple, locals = { kendoEvent: ev }, elems, items, columns, colIdx;\n                if (angular.isString(options.selectable)) {\n                    cell = options.selectable.indexOf('cell') !== -1;\n                    multiple = options.selectable.indexOf('multiple') !== -1;\n                }\n                elems = locals.selected = this.select();\n                items = locals.data = [];\n                columns = locals.columns = [];\n                for (var i = 0; i < elems.length; i++) {\n                    var item = cell ? elems[i].parentNode : elems[i];\n                    var dataItem = widget.dataItem(item);\n                    if (cell) {\n                        if (angular.element.inArray(dataItem, items) < 0) {\n                            items.push(dataItem);\n                        }\n                        colIdx = angular.element(elems[i]).index();\n                        if (angular.element.inArray(colIdx, columns) < 0) {\n                            columns.push(colIdx);\n                        }\n                    } else {\n                        items.push(dataItem);\n                    }\n                }\n                if (!multiple) {\n                    locals.dataItem = locals.data = items[0];\n                    locals.angularDataItem = kendo.proxyModelSetters(locals.dataItem);\n                    locals.selected = elems[0];\n                }\n                digest(scope, function () {\n                    handler(scope, locals);\n                });\n            };\n        });\n        defadvice('ui.Grid', '$angular_init', function (element, options) {\n            this.next();\n            if (options.columns) {\n                var settings = $.extend({}, kendo.Template, options.templateSettings);\n                angular.forEach(options.columns, function (col) {\n                    if (col.field && !col.template && !col.format && !col.values && (col.encoded === undefined || col.encoded)) {\n                        col.template = '<span ng-bind=\\'' + kendo.expr(col.field, 'dataItem') + '\\'>#: ' + kendo.expr(col.field, settings.paramName) + '#</span>';\n                    }\n                });\n            }\n        });\n        {\n            defadvice('mobile.ui.ButtonGroup', 'value', function (mew) {\n                var self = this.self;\n                if (mew != null) {\n                    self.select(self.element.children('li.km-button').eq(mew));\n                    self.trigger('change');\n                    self.trigger('select', { index: self.selectedIndex });\n                }\n                return self.selectedIndex;\n            });\n            defadvice('mobile.ui.ButtonGroup', '_select', function () {\n                this.next();\n                this.self.trigger('change');\n            });\n        }\n        module.directive('kendoMobileApplication', function () {\n            return {\n                terminal: true,\n                link: function (scope, element, attrs) {\n                    createWidget(scope, element, attrs, 'kendoMobileApplication', 'kendoMobileApplication');\n                }\n            };\n        }).directive('kendoMobileView', function () {\n            return {\n                scope: true,\n                link: {\n                    pre: function (scope, element, attrs) {\n                        attrs.defaultOptions = scope.viewOptions;\n                        attrs._instance = createWidget(scope, element, attrs, 'kendoMobileView', 'kendoMobileView');\n                    },\n                    post: function (scope, element, attrs) {\n                        attrs._instance._layout();\n                        attrs._instance._scroller();\n                    }\n                }\n            };\n        }).directive('kendoMobileDrawer', function () {\n            return {\n                scope: true,\n                link: {\n                    pre: function (scope, element, attrs) {\n                        attrs.defaultOptions = scope.viewOptions;\n                        attrs._instance = createWidget(scope, element, attrs, 'kendoMobileDrawer', 'kendoMobileDrawer');\n                    },\n                    post: function (scope, element, attrs) {\n                        attrs._instance._layout();\n                        attrs._instance._scroller();\n                    }\n                }\n            };\n        }).directive('kendoMobileModalView', function () {\n            return {\n                scope: true,\n                link: {\n                    pre: function (scope, element, attrs) {\n                        attrs.defaultOptions = scope.viewOptions;\n                        attrs._instance = createWidget(scope, element, attrs, 'kendoMobileModalView', 'kendoMobileModalView');\n                    },\n                    post: function (scope, element, attrs) {\n                        attrs._instance._layout();\n                        attrs._instance._scroller();\n                    }\n                }\n            };\n        }).directive('kendoMobileSplitView', function () {\n            return {\n                terminal: true,\n                link: {\n                    pre: function (scope, element, attrs) {\n                        attrs.defaultOptions = scope.viewOptions;\n                        attrs._instance = createWidget(scope, element, attrs, 'kendoMobileSplitView', 'kendoMobileSplitView');\n                    },\n                    post: function (scope, element, attrs) {\n                        attrs._instance._layout();\n                    }\n                }\n            };\n        }).directive('kendoMobilePane', function () {\n            return {\n                terminal: true,\n                link: {\n                    pre: function (scope, element, attrs) {\n                        attrs.defaultOptions = scope.viewOptions;\n                        createWidget(scope, element, attrs, 'kendoMobilePane', 'kendoMobilePane');\n                    }\n                }\n            };\n        }).directive('kendoMobileLayout', function () {\n            return {\n                link: {\n                    pre: function (scope, element, attrs) {\n                        createWidget(scope, element, attrs, 'kendoMobileLayout', 'kendoMobileLayout');\n                    }\n                }\n            };\n        }).directive('kendoMobileActionSheet', function () {\n            return {\n                restrict: 'A',\n                link: function (scope, element, attrs) {\n                    element.find('a[k-action]').each(function () {\n                        $(this).attr('data-' + kendo.ns + 'action', $(this).attr('k-action'));\n                    });\n                    createWidget(scope, element, attrs, 'kendoMobileActionSheet', 'kendoMobileActionSheet');\n                }\n            };\n        }).directive('kendoMobilePopOver', function () {\n            return {\n                terminal: true,\n                link: {\n                    pre: function (scope, element, attrs) {\n                        attrs.defaultOptions = scope.viewOptions;\n                        createWidget(scope, element, attrs, 'kendoMobilePopOver', 'kendoMobilePopOver');\n                    }\n                }\n            };\n        }).directive('kendoViewTitle', function () {\n            return {\n                restrict: 'E',\n                replace: true,\n                template: function (element) {\n                    return '<span data-' + kendo.ns + 'role=\\'view-title\\'>' + element.html() + '</span>';\n                }\n            };\n        }).directive('kendoMobileHeader', function () {\n            return {\n                restrict: 'E',\n                link: function (scope, element) {\n                    element.addClass('km-header').attr('data-role', 'header');\n                }\n            };\n        }).directive('kendoMobileFooter', function () {\n            return {\n                restrict: 'E',\n                link: function (scope, element) {\n                    element.addClass('km-footer').attr('data-role', 'footer');\n                }\n            };\n        }).directive('kendoMobileScrollViewPage', function () {\n            return {\n                restrict: 'E',\n                replace: true,\n                template: function (element) {\n                    return '<div data-' + kendo.ns + 'role=\\'page\\'>' + element.html() + '</div>';\n                }\n            };\n        });\n        angular.forEach([\n            'align',\n            'icon',\n            'rel',\n            'transition',\n            'actionsheetContext'\n        ], function (attr) {\n            var kAttr = 'k' + attr.slice(0, 1).toUpperCase() + attr.slice(1);\n            module.directive(kAttr, function () {\n                return {\n                    restrict: 'A',\n                    priority: 2,\n                    link: function (scope, element, attrs) {\n                        element.attr(kendo.attr(kendo.toHyphens(attr)), scope.$eval(attrs[kAttr]));\n                    }\n                };\n            });\n        });\n        var WIDGET_TEMPLATE_OPTIONS = {\n            'TreeMap': ['Template'],\n            'MobileListView': [\n                'HeaderTemplate',\n                'Template'\n            ],\n            'MobileScrollView': [\n                'EmptyTemplate',\n                'Template'\n            ],\n            'Grid': [\n                'AltRowTemplate',\n                'DetailTemplate',\n                'RowTemplate'\n            ],\n            'ListView': [\n                'EditTemplate',\n                'Template',\n                'AltTemplate'\n            ],\n            'Pager': [\n                'SelectTemplate',\n                'LinkTemplate'\n            ],\n            'PivotGrid': [\n                'ColumnHeaderTemplate',\n                'DataCellTemplate',\n                'RowHeaderTemplate'\n            ],\n            'Scheduler': [\n                'AllDayEventTemplate',\n                'DateHeaderTemplate',\n                'EventTemplate',\n                'MajorTimeHeaderTemplate',\n                'MinorTimeHeaderTemplate'\n            ],\n            'PanelBar': ['Template'],\n            'TreeView': ['Template'],\n            'Validator': ['ErrorTemplate']\n        };\n        (function () {\n            var templateDirectives = {};\n            angular.forEach(WIDGET_TEMPLATE_OPTIONS, function (templates, widget) {\n                angular.forEach(templates, function (template) {\n                    if (!templateDirectives[template]) {\n                        templateDirectives[template] = [];\n                    }\n                    templateDirectives[template].push('?^^kendo' + widget);\n                });\n            });\n            angular.forEach(templateDirectives, function (parents, directive) {\n                var templateName = 'k' + directive;\n                var attrName = kendo.toHyphens(templateName);\n                module.directive(templateName, function () {\n                    return {\n                        restrict: 'A',\n                        require: parents,\n                        terminal: true,\n                        compile: function ($element, $attrs) {\n                            if ($attrs[templateName] !== '') {\n                                return;\n                            }\n                            $element.removeAttr(attrName);\n                            var template = $element[0].outerHTML;\n                            return function (scope, element, attrs, controllers) {\n                                var controller;\n                                while (!controller && controllers.length) {\n                                    controller = controllers.shift();\n                                }\n                                if (!controller) {\n                                    $log.warn(attrName + ' without a matching parent widget found. It can be one of the following: ' + parents.join(', '));\n                                } else {\n                                    controller.template(templateName, template);\n                                    element.remove();\n                                }\n                            };\n                        }\n                    };\n                });\n            });\n        }());\n    }(window.kendo.jQuery, window.angular));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.web', [\n        'kendo.core',\n        'kendo.router',\n        'kendo.view',\n        'kendo.fx',\n        'kendo.dom',\n        'kendo.data.odata',\n        'kendo.data.xml',\n        'kendo.data',\n        'kendo.ooxml',\n        'kendo.excel',\n        'kendo.data.signalr',\n        'kendo.binder',\n        'kendo.drawing',\n        'kendo.validator',\n        'kendo.userevents',\n        'kendo.draganddrop',\n        'kendo.mobile.scroller',\n        'kendo.groupable',\n        'kendo.reorderable',\n        'kendo.resizable',\n        'kendo.sortable',\n        'kendo.selectable',\n        'kendo.button',\n        'kendo.pager',\n        'kendo.popup',\n        'kendo.notification',\n        'kendo.tooltip',\n        'kendo.list',\n        'kendo.calendar',\n        'kendo.datepicker',\n        'kendo.dateinput',\n        'kendo.autocomplete',\n        'kendo.dropdownlist',\n        'kendo.combobox',\n        'kendo.multiselect',\n        'kendo.colorpicker',\n        'kendo.columnmenu',\n        'kendo.columnsorter',\n        'kendo.grid',\n        'kendo.listview',\n        'kendo.listbox',\n        'kendo.filebrowser',\n        'kendo.imagebrowser',\n        'kendo.editor',\n        'kendo.numerictextbox',\n        'kendo.maskedtextbox',\n        'kendo.mediaplayer',\n        'kendo.menu',\n        'kendo.editable',\n        'kendo.pivot.fieldmenu',\n        'kendo.filtercell',\n        'kendo.panelbar',\n        'kendo.progressbar',\n        'kendo.responsivepanel',\n        'kendo.tabstrip',\n        'kendo.timepicker',\n        'kendo.toolbar',\n        'kendo.datetimepicker',\n        'kendo.treeview.draganddrop',\n        'kendo.treeview',\n        'kendo.slider',\n        'kendo.splitter',\n        'kendo.upload',\n        'kendo.dialog',\n        'kendo.window',\n        'kendo.virtuallist',\n        'kendo.scheduler.view',\n        'kendo.scheduler.dayview',\n        'kendo.scheduler.agendaview',\n        'kendo.scheduler.monthview',\n        'kendo.scheduler.recurrence',\n        'kendo.scheduler',\n        'kendo.gantt.list',\n        'kendo.gantt.timeline',\n        'kendo.gantt',\n        'kendo.treelist',\n        'kendo.pivotgrid',\n        'kendo.spreadsheet',\n        'kendo.pivot.configurator',\n        'kendo.angular'\n    ], f);\n}(function () {\n    'bundle all';\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));"]}